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