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