machcap.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "gc.h"
  2. int
  3. machcap(Node *n)
  4. {
  5. if(n == Z)
  6. return 1; /* test */
  7. switch(n->op){
  8. case OADD:
  9. case OAND:
  10. case OOR:
  11. case OSUB:
  12. case OXOR:
  13. if(typev[n->left->type->etype])
  14. return 1;
  15. break;
  16. case OMUL:
  17. case OLMUL:
  18. case OASMUL:
  19. case OASLMUL:
  20. return 1;
  21. case OLSHR:
  22. case OASHR:
  23. case OASHL:
  24. case OASASHL:
  25. case OASASHR:
  26. case OASLSHR:
  27. return 1;
  28. case OCAST:
  29. if(typev[n->type->etype]) {
  30. if(!typefd[n->left->type->etype])
  31. return 1;
  32. } else if(!typefd[n->type->etype]) {
  33. if(typev[n->left->type->etype])
  34. return 1;
  35. }
  36. break;
  37. case OCOMMA:
  38. case OCOND:
  39. case OLIST:
  40. case OANDAND:
  41. case OOROR:
  42. case ONOT:
  43. return 1;
  44. case OCOM:
  45. case ONEG:
  46. if(typechl[n->left->type->etype])
  47. return 1;
  48. if(typev[n->left->type->etype])
  49. return 1;
  50. return 0;
  51. case OASADD:
  52. case OASSUB:
  53. case OASAND:
  54. case OASOR:
  55. case OASXOR:
  56. return 1;
  57. case OPOSTINC:
  58. case OPOSTDEC:
  59. case OPREINC:
  60. case OPREDEC:
  61. return 1;
  62. case OEQ:
  63. case ONE:
  64. case OLE:
  65. case OGT:
  66. case OLT:
  67. case OGE:
  68. case OHI:
  69. case OHS:
  70. case OLO:
  71. case OLS:
  72. return 1;
  73. case ODIV:
  74. case OLDIV:
  75. case OLMOD:
  76. case OMOD:
  77. return 0;
  78. case OASDIV:
  79. case OASLDIV:
  80. case OASLMOD:
  81. case OASMOD:
  82. return 0;
  83. }
  84. return 0;
  85. }