machcap.c 1.2 KB

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