17 /* welcome to commute */
25 if(r->complex > l->complex) {
36 if(!typechlpv[n->type->etype])
39 if(n->op == OASHL && n->right->op == OCONST){
47 * calculate addressability as follows
48 * NAME ==> 10/11 name+value(SB/SP)
49 * REGISTER ==> 12 register
52 * &(10) ==> 13 $name+value(SB)
53 * &(11) ==> 1 $name+value(SP)
54 * (13) + (20) ==> 13 fold constants
55 * (1) + (20) ==> 1 fold constants
56 * *(13) ==> 10 back to name
57 * *(1) ==> 11 back to name
59 * (20) * (X) ==> 7 multiplier in indexing
60 * (X,7) + (13,1) ==> 8 adder in indexing (addresses)
61 * (8) ==> &9(OINDEX) index, almost addressable
63 * calculate complexity (number of registers)
84 if(n->class == CPARAM || n->class == CAUTO)
108 if(n->type->etype != TIND &&
109 !(l->type->etype == TIND && r->type->etype == TIND))
122 l->xoffset += r->vconst;
132 /* l is the base, r is the index */
154 /* r is the base, l is the index */
159 if(n->addable == 8 && !side(n)) {
161 l = new1(OINDEX, idx.basetree, idx.regtree);
162 l->scale = idx.scale;
164 l->complex = l->right->complex;
167 l->type = l->left->type;
223 r->type = types[TINT];
237 r->type = types[TINT];
248 r->type = types[TINT];
311 n->complex = l->complex;
313 if(r->complex == n->complex)
314 n->complex = r->complex+1;
316 if(r->complex > n->complex)
317 n->complex = r->complex;
329 if(l != Z && l->type->etype == TUVLONG && typefd[n->type->etype])
345 if(r->complex >= l->complex) {
346 n->complex = l->complex + 3;
347 if(r->complex > n->complex)
348 n->complex = r->complex;
350 n->complex = r->complex + 3;
351 if(l->complex > n->complex)
352 n->complex = l->complex;
363 if(r->complex >= l->complex) {
364 n->complex = l->complex + 2;
365 if(r->complex > n->complex)
366 n->complex = r->complex;
368 n->complex = r->complex + 2;
369 if(l->complex > n->complex)
370 n->complex = l->complex;
379 * immediate operators, make const on right
381 if(l->op == OCONST) {
398 * compare operators, make const on left
400 if(r->op == OCONST) {
403 n->op = invrel[relindex(n->op)];
419 if(l->addable == 1 || l->addable == 13 || r->complex > l->complex) {
425 if(l->addable != 7) {
429 if(l->right->addable == 20) {
430 idx.regtree = l->left;
431 idx.scale = 1 << l->right->vconst;
433 if(l->left->addable == 20) {
434 idx.regtree = l->right;
435 idx.scale = 1 << l->left->vconst;
437 diag(n, "bad index");
441 print("scale = %d\n", idx.scale);
442 prtree(idx.regtree, "index");
443 prtree(idx.basetree, "base");