machcap.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. return 1;
  51. case OASADD:
  52. case OASSUB:
  53. case OASAND:
  54. case OASOR:
  55. case OASXOR:
  56. return 1;
  57. case OASASHL:
  58. case OASASHR:
  59. case OASLSHR:
  60. return 1;
  61. case OPOSTINC:
  62. case OPOSTDEC:
  63. case OPREINC:
  64. case OPREDEC:
  65. return 1;
  66. case OEQ:
  67. case ONE:
  68. case OLE:
  69. case OGT:
  70. case OLT:
  71. case OGE:
  72. case OHI:
  73. case OHS:
  74. case OLO:
  75. case OLS:
  76. //print("%O\n", n->op);
  77. return 1;
  78. }
  79. return 0;
  80. }