13e12c5d1SDavid du Colombier #include "gc.h" 23e12c5d1SDavid du Colombier 33e12c5d1SDavid du Colombier void 43e12c5d1SDavid du Colombier cgen(Node *n, Node *nn) 53e12c5d1SDavid du Colombier { 63e12c5d1SDavid du Colombier Node *l, *r; 73e12c5d1SDavid du Colombier Prog *p1; 83e12c5d1SDavid du Colombier Node nod, nod1, nod2, nod3, nod4; 93e12c5d1SDavid du Colombier int o; 103e12c5d1SDavid du Colombier long v, curs; 113e12c5d1SDavid du Colombier 123e12c5d1SDavid du Colombier if(debug['g']) { 133e12c5d1SDavid du Colombier prtree(nn, "cgen lhs"); 143e12c5d1SDavid du Colombier prtree(n, "cgen"); 153e12c5d1SDavid du Colombier } 163e12c5d1SDavid du Colombier if(n == Z || n->type == T) 173e12c5d1SDavid du Colombier return; 187dd7cddfSDavid du Colombier if(typesuv[n->type->etype]) { 193e12c5d1SDavid du Colombier sugen(n, nn, n->type->width); 203e12c5d1SDavid du Colombier return; 213e12c5d1SDavid du Colombier } 227dd7cddfSDavid du Colombier l = n->left; 237dd7cddfSDavid du Colombier r = n->right; 247dd7cddfSDavid du Colombier o = n->op; 257dd7cddfSDavid du Colombier if(n->addable >= INDEXED) { 267dd7cddfSDavid du Colombier if(nn == Z) { 277dd7cddfSDavid du Colombier switch(o) { 287dd7cddfSDavid du Colombier default: 297dd7cddfSDavid du Colombier nullwarn(Z, Z); 307dd7cddfSDavid du Colombier break; 317dd7cddfSDavid du Colombier case OINDEX: 327dd7cddfSDavid du Colombier nullwarn(l, r); 337dd7cddfSDavid du Colombier break; 347dd7cddfSDavid du Colombier } 357dd7cddfSDavid du Colombier return; 367dd7cddfSDavid du Colombier } 373e12c5d1SDavid du Colombier gmove(n, nn); 383e12c5d1SDavid du Colombier return; 393e12c5d1SDavid du Colombier } 403e12c5d1SDavid du Colombier curs = cursafe; 413e12c5d1SDavid du Colombier 423e12c5d1SDavid du Colombier if(n->complex >= FNX) 433e12c5d1SDavid du Colombier if(l->complex >= FNX) 443e12c5d1SDavid du Colombier if(r != Z && r->complex >= FNX) 453e12c5d1SDavid du Colombier switch(o) { 463e12c5d1SDavid du Colombier default: 473e12c5d1SDavid du Colombier regret(&nod, r); 483e12c5d1SDavid du Colombier cgen(r, &nod); 493e12c5d1SDavid du Colombier 503e12c5d1SDavid du Colombier regsalloc(&nod1, r); 513e12c5d1SDavid du Colombier gopcode(OAS, &nod, Z, &nod1); 523e12c5d1SDavid du Colombier 533e12c5d1SDavid du Colombier regfree(&nod); 543e12c5d1SDavid du Colombier nod = *n; 553e12c5d1SDavid du Colombier nod.right = &nod1; 563e12c5d1SDavid du Colombier cgen(&nod, nn); 573e12c5d1SDavid du Colombier return; 583e12c5d1SDavid du Colombier 593e12c5d1SDavid du Colombier case OFUNC: 603e12c5d1SDavid du Colombier case OCOMMA: 613e12c5d1SDavid du Colombier case OANDAND: 623e12c5d1SDavid du Colombier case OOROR: 633e12c5d1SDavid du Colombier case OCOND: 643e12c5d1SDavid du Colombier case ODOT: 653e12c5d1SDavid du Colombier break; 663e12c5d1SDavid du Colombier } 673e12c5d1SDavid du Colombier 683e12c5d1SDavid du Colombier switch(o) { 693e12c5d1SDavid du Colombier default: 703e12c5d1SDavid du Colombier diag(n, "unknown op in cgen: %O", o); 713e12c5d1SDavid du Colombier break; 723e12c5d1SDavid du Colombier 733e12c5d1SDavid du Colombier case OAS: 743e12c5d1SDavid du Colombier if(l->op == OBIT) 753e12c5d1SDavid du Colombier goto bitas; 763e12c5d1SDavid du Colombier if(l->addable >= INDEXED && l->complex < FNX) { 773e12c5d1SDavid du Colombier if(nn != Z || r->addable < INDEXED) { 787dd7cddfSDavid du Colombier if(r->complex >= FNX && nn == Z) 797dd7cddfSDavid du Colombier regret(&nod, r); 807dd7cddfSDavid du Colombier else 813e12c5d1SDavid du Colombier regalloc(&nod, r, nn); 823e12c5d1SDavid du Colombier cgen(r, &nod); 833e12c5d1SDavid du Colombier gmove(&nod, l); 847dd7cddfSDavid du Colombier if(nn != Z) 857dd7cddfSDavid du Colombier gmove(&nod, nn); 863e12c5d1SDavid du Colombier regfree(&nod); 873e12c5d1SDavid du Colombier } else 883e12c5d1SDavid du Colombier gmove(r, l); 893e12c5d1SDavid du Colombier break; 903e12c5d1SDavid du Colombier } 913e12c5d1SDavid du Colombier if(l->complex >= r->complex) { 923e12c5d1SDavid du Colombier reglcgen(&nod1, l, Z); 933e12c5d1SDavid du Colombier if(r->addable >= INDEXED) { 943e12c5d1SDavid du Colombier gmove(r, &nod1); 953e12c5d1SDavid du Colombier if(nn != Z) 963e12c5d1SDavid du Colombier gmove(r, nn); 973e12c5d1SDavid du Colombier regfree(&nod1); 983e12c5d1SDavid du Colombier break; 993e12c5d1SDavid du Colombier } 1003e12c5d1SDavid du Colombier regalloc(&nod, r, nn); 1013e12c5d1SDavid du Colombier cgen(r, &nod); 1023e12c5d1SDavid du Colombier } else { 1033e12c5d1SDavid du Colombier regalloc(&nod, r, nn); 1043e12c5d1SDavid du Colombier cgen(r, &nod); 1053e12c5d1SDavid du Colombier reglcgen(&nod1, l, Z); 1063e12c5d1SDavid du Colombier } 1073e12c5d1SDavid du Colombier gmove(&nod, &nod1); 1083e12c5d1SDavid du Colombier regfree(&nod); 1093e12c5d1SDavid du Colombier regfree(&nod1); 1103e12c5d1SDavid du Colombier break; 1113e12c5d1SDavid du Colombier 1123e12c5d1SDavid du Colombier bitas: 1133e12c5d1SDavid du Colombier n = l->left; 1143e12c5d1SDavid du Colombier regalloc(&nod, r, nn); 1153e12c5d1SDavid du Colombier if(l->complex >= r->complex) { 1163e12c5d1SDavid du Colombier reglcgen(&nod1, n, Z); 1173e12c5d1SDavid du Colombier cgen(r, &nod); 1183e12c5d1SDavid du Colombier } else { 1193e12c5d1SDavid du Colombier cgen(r, &nod); 1203e12c5d1SDavid du Colombier reglcgen(&nod1, n, Z); 1213e12c5d1SDavid du Colombier } 1223e12c5d1SDavid du Colombier regalloc(&nod2, n, Z); 1233e12c5d1SDavid du Colombier gopcode(OAS, &nod1, Z, &nod2); 1243e12c5d1SDavid du Colombier bitstore(l, &nod, &nod1, &nod2, nn); 1253e12c5d1SDavid du Colombier break; 1263e12c5d1SDavid du Colombier 1273e12c5d1SDavid du Colombier case OBIT: 1283e12c5d1SDavid du Colombier if(nn == Z) { 1293e12c5d1SDavid du Colombier nullwarn(l, Z); 1303e12c5d1SDavid du Colombier break; 1313e12c5d1SDavid du Colombier } 1323e12c5d1SDavid du Colombier bitload(n, &nod, Z, Z, nn); 1333e12c5d1SDavid du Colombier gopcode(OAS, &nod, Z, nn); 1343e12c5d1SDavid du Colombier regfree(&nod); 1353e12c5d1SDavid du Colombier break; 1363e12c5d1SDavid du Colombier 1373e12c5d1SDavid du Colombier case OADD: 1383e12c5d1SDavid du Colombier case OSUB: 1393e12c5d1SDavid du Colombier case OAND: 1403e12c5d1SDavid du Colombier case OOR: 1413e12c5d1SDavid du Colombier case OXOR: 1423e12c5d1SDavid du Colombier case OLSHR: 1433e12c5d1SDavid du Colombier case OASHL: 1443e12c5d1SDavid du Colombier case OASHR: 1453e12c5d1SDavid du Colombier /* 1463e12c5d1SDavid du Colombier * immediate operands 1473e12c5d1SDavid du Colombier */ 1483e12c5d1SDavid du Colombier if(nn != Z) 1493e12c5d1SDavid du Colombier if(r->op == OCONST) 150219b2ee8SDavid du Colombier if(!typefd[n->type->etype]) { 1513e12c5d1SDavid du Colombier cgen(l, nn); 152219b2ee8SDavid du Colombier if(r->vconst == 0) 1533e12c5d1SDavid du Colombier if(o != OAND) 1543e12c5d1SDavid du Colombier break; 1553e12c5d1SDavid du Colombier if(nn != Z) 1563e12c5d1SDavid du Colombier gopcode(o, r, Z, nn); 1573e12c5d1SDavid du Colombier break; 1583e12c5d1SDavid du Colombier } 1593e12c5d1SDavid du Colombier 1603e12c5d1SDavid du Colombier case OLMUL: 1613e12c5d1SDavid du Colombier case OLDIV: 1623e12c5d1SDavid du Colombier case OLMOD: 1633e12c5d1SDavid du Colombier case OMUL: 1643e12c5d1SDavid du Colombier case ODIV: 1653e12c5d1SDavid du Colombier case OMOD: 1663e12c5d1SDavid du Colombier if(nn == Z) { 1673e12c5d1SDavid du Colombier nullwarn(l, r); 1683e12c5d1SDavid du Colombier break; 1693e12c5d1SDavid du Colombier } 170219b2ee8SDavid du Colombier if(o == OMUL || o == OLMUL) { 171219b2ee8SDavid du Colombier if(mulcon(n, nn)) 172219b2ee8SDavid du Colombier break; 173219b2ee8SDavid du Colombier } 1743e12c5d1SDavid du Colombier if(l->complex >= r->complex) { 1753e12c5d1SDavid du Colombier regalloc(&nod, l, nn); 1763e12c5d1SDavid du Colombier cgen(l, &nod); 1773e12c5d1SDavid du Colombier regalloc(&nod1, r, Z); 1783e12c5d1SDavid du Colombier cgen(r, &nod1); 1793e12c5d1SDavid du Colombier gopcode(o, &nod1, Z, &nod); 1803e12c5d1SDavid du Colombier } else { 1813e12c5d1SDavid du Colombier regalloc(&nod, r, nn); 1823e12c5d1SDavid du Colombier cgen(r, &nod); 1833e12c5d1SDavid du Colombier regalloc(&nod1, l, Z); 1843e12c5d1SDavid du Colombier cgen(l, &nod1); 1853e12c5d1SDavid du Colombier gopcode(o, &nod, &nod1, &nod); 1863e12c5d1SDavid du Colombier } 1873e12c5d1SDavid du Colombier gopcode(OAS, &nod, Z, nn); 1883e12c5d1SDavid du Colombier regfree(&nod); 1893e12c5d1SDavid du Colombier regfree(&nod1); 1903e12c5d1SDavid du Colombier break; 1913e12c5d1SDavid du Colombier 1923e12c5d1SDavid du Colombier case OASLSHR: 1933e12c5d1SDavid du Colombier case OASASHL: 1943e12c5d1SDavid du Colombier case OASASHR: 1953e12c5d1SDavid du Colombier case OASAND: 1963e12c5d1SDavid du Colombier case OASADD: 1973e12c5d1SDavid du Colombier case OASSUB: 1983e12c5d1SDavid du Colombier case OASXOR: 1993e12c5d1SDavid du Colombier case OASOR: 2003e12c5d1SDavid du Colombier if(l->op == OBIT) 2013e12c5d1SDavid du Colombier goto asbitop; 2023e12c5d1SDavid du Colombier if(r->op == OCONST) 203fc375d71SDavid du Colombier if(!typefd[r->type->etype]) 204219b2ee8SDavid du Colombier if(!typefd[n->type->etype]) { 2053e12c5d1SDavid du Colombier if(l->addable < INDEXED) 2063e12c5d1SDavid du Colombier reglcgen(&nod2, l, Z); 2073e12c5d1SDavid du Colombier else 2083e12c5d1SDavid du Colombier nod2 = *l; 2093e12c5d1SDavid du Colombier regalloc(&nod, r, nn); 2103e12c5d1SDavid du Colombier gopcode(OAS, &nod2, Z, &nod); 2113e12c5d1SDavid du Colombier gopcode(o, r, Z, &nod); 2123e12c5d1SDavid du Colombier gopcode(OAS, &nod, Z, &nod2); 2133e12c5d1SDavid du Colombier 2143e12c5d1SDavid du Colombier regfree(&nod); 2153e12c5d1SDavid du Colombier if(l->addable < INDEXED) 2163e12c5d1SDavid du Colombier regfree(&nod2); 2173e12c5d1SDavid du Colombier break; 2183e12c5d1SDavid du Colombier } 2193e12c5d1SDavid du Colombier 2203e12c5d1SDavid du Colombier case OASLMUL: 2213e12c5d1SDavid du Colombier case OASLDIV: 2223e12c5d1SDavid du Colombier case OASLMOD: 2233e12c5d1SDavid du Colombier case OASMUL: 2243e12c5d1SDavid du Colombier case OASDIV: 2253e12c5d1SDavid du Colombier case OASMOD: 2263e12c5d1SDavid du Colombier if(l->op == OBIT) 2273e12c5d1SDavid du Colombier goto asbitop; 2283e12c5d1SDavid du Colombier if(l->complex >= r->complex) { 2293e12c5d1SDavid du Colombier if(l->addable < INDEXED) 2303e12c5d1SDavid du Colombier reglcgen(&nod2, l, Z); 2313e12c5d1SDavid du Colombier else 2323e12c5d1SDavid du Colombier nod2 = *l; 2333e12c5d1SDavid du Colombier regalloc(&nod1, r, Z); 2343e12c5d1SDavid du Colombier cgen(r, &nod1); 2353e12c5d1SDavid du Colombier } else { 2363e12c5d1SDavid du Colombier regalloc(&nod1, r, Z); 2373e12c5d1SDavid du Colombier cgen(r, &nod1); 2383e12c5d1SDavid du Colombier if(l->addable < INDEXED) 2393e12c5d1SDavid du Colombier reglcgen(&nod2, l, Z); 2403e12c5d1SDavid du Colombier else 2413e12c5d1SDavid du Colombier nod2 = *l; 2423e12c5d1SDavid du Colombier } 2433e12c5d1SDavid du Colombier 2443e12c5d1SDavid du Colombier regalloc(&nod, n, nn); 2453e12c5d1SDavid du Colombier gmove(&nod2, &nod); 2463e12c5d1SDavid du Colombier gopcode(o, &nod1, Z, &nod); 2473e12c5d1SDavid du Colombier gmove(&nod, &nod2); 2483e12c5d1SDavid du Colombier if(nn != Z) 2493e12c5d1SDavid du Colombier gopcode(OAS, &nod, Z, nn); 2503e12c5d1SDavid du Colombier regfree(&nod); 2513e12c5d1SDavid du Colombier regfree(&nod1); 2523e12c5d1SDavid du Colombier if(l->addable < INDEXED) 2533e12c5d1SDavid du Colombier regfree(&nod2); 2543e12c5d1SDavid du Colombier break; 2553e12c5d1SDavid du Colombier 2563e12c5d1SDavid du Colombier asbitop: 2573e12c5d1SDavid du Colombier regalloc(&nod4, n, nn); 2583e12c5d1SDavid du Colombier if(l->complex >= r->complex) { 2593e12c5d1SDavid du Colombier bitload(l, &nod, &nod1, &nod2, &nod4); 2603e12c5d1SDavid du Colombier regalloc(&nod3, r, Z); 2613e12c5d1SDavid du Colombier cgen(r, &nod3); 2623e12c5d1SDavid du Colombier } else { 2633e12c5d1SDavid du Colombier regalloc(&nod3, r, Z); 2643e12c5d1SDavid du Colombier cgen(r, &nod3); 2653e12c5d1SDavid du Colombier bitload(l, &nod, &nod1, &nod2, &nod4); 2663e12c5d1SDavid du Colombier } 2673e12c5d1SDavid du Colombier gmove(&nod, &nod4); 2683e12c5d1SDavid du Colombier gopcode(o, &nod3, Z, &nod4); 2693e12c5d1SDavid du Colombier regfree(&nod3); 2703e12c5d1SDavid du Colombier gmove(&nod4, &nod); 2713e12c5d1SDavid du Colombier regfree(&nod4); 2723e12c5d1SDavid du Colombier bitstore(l, &nod, &nod1, &nod2, nn); 2733e12c5d1SDavid du Colombier break; 2743e12c5d1SDavid du Colombier 2753e12c5d1SDavid du Colombier case OADDR: 2763e12c5d1SDavid du Colombier if(nn == Z) { 2773e12c5d1SDavid du Colombier nullwarn(l, Z); 2783e12c5d1SDavid du Colombier break; 2793e12c5d1SDavid du Colombier } 2803e12c5d1SDavid du Colombier lcgen(l, nn); 2813e12c5d1SDavid du Colombier break; 2823e12c5d1SDavid du Colombier 2833e12c5d1SDavid du Colombier case OFUNC: 2843e12c5d1SDavid du Colombier if(l->complex >= FNX) { 2853e12c5d1SDavid du Colombier if(l->op != OIND) 2863e12c5d1SDavid du Colombier diag(n, "bad function call"); 2873e12c5d1SDavid du Colombier 2883e12c5d1SDavid du Colombier regret(&nod, l->left); 2893e12c5d1SDavid du Colombier cgen(l->left, &nod); 2903e12c5d1SDavid du Colombier regsalloc(&nod1, l->left); 2913e12c5d1SDavid du Colombier gopcode(OAS, &nod, Z, &nod1); 2923e12c5d1SDavid du Colombier regfree(&nod); 2933e12c5d1SDavid du Colombier 2943e12c5d1SDavid du Colombier nod = *n; 2953e12c5d1SDavid du Colombier nod.left = &nod2; 2963e12c5d1SDavid du Colombier nod2 = *l; 2973e12c5d1SDavid du Colombier nod2.left = &nod1; 2983e12c5d1SDavid du Colombier nod2.complex = 1; 2993e12c5d1SDavid du Colombier cgen(&nod, nn); 3003e12c5d1SDavid du Colombier 3013e12c5d1SDavid du Colombier return; 3023e12c5d1SDavid du Colombier } 3033e12c5d1SDavid du Colombier o = reg[REGARG]; 3043e12c5d1SDavid du Colombier gargs(r, &nod, &nod1); 3053e12c5d1SDavid du Colombier if(l->addable < INDEXED) { 3063e12c5d1SDavid du Colombier reglcgen(&nod, l, Z); 3073e12c5d1SDavid du Colombier gopcode(OFUNC, Z, Z, &nod); 3083e12c5d1SDavid du Colombier regfree(&nod); 3093e12c5d1SDavid du Colombier } else 3103e12c5d1SDavid du Colombier gopcode(OFUNC, Z, Z, l); 3113e12c5d1SDavid du Colombier if(REGARG) 3123e12c5d1SDavid du Colombier if(o != reg[REGARG]) 3133e12c5d1SDavid du Colombier reg[REGARG]--; 3143e12c5d1SDavid du Colombier if(nn != Z) { 3153e12c5d1SDavid du Colombier regret(&nod, n); 3163e12c5d1SDavid du Colombier gopcode(OAS, &nod, Z, nn); 3173e12c5d1SDavid du Colombier regfree(&nod); 3183e12c5d1SDavid du Colombier } 3193e12c5d1SDavid du Colombier break; 3203e12c5d1SDavid du Colombier 3213e12c5d1SDavid du Colombier case OIND: 3223e12c5d1SDavid du Colombier if(nn == Z) { 3233e12c5d1SDavid du Colombier nullwarn(l, Z); 3243e12c5d1SDavid du Colombier break; 3253e12c5d1SDavid du Colombier } 3263e12c5d1SDavid du Colombier regialloc(&nod, n, nn); 3273e12c5d1SDavid du Colombier r = l; 3283e12c5d1SDavid du Colombier while(r->op == OADD) 3293e12c5d1SDavid du Colombier r = r->right; 3303e12c5d1SDavid du Colombier if(sconst(r)) { 331219b2ee8SDavid du Colombier v = r->vconst; 332219b2ee8SDavid du Colombier r->vconst = 0; 3333e12c5d1SDavid du Colombier cgen(l, &nod); 334219b2ee8SDavid du Colombier nod.xoffset += v; 335219b2ee8SDavid du Colombier r->vconst = v; 3363e12c5d1SDavid du Colombier } else 3373e12c5d1SDavid du Colombier cgen(l, &nod); 3383e12c5d1SDavid du Colombier regind(&nod, n); 3393e12c5d1SDavid du Colombier gopcode(OAS, &nod, Z, nn); 3403e12c5d1SDavid du Colombier regfree(&nod); 3413e12c5d1SDavid du Colombier break; 3423e12c5d1SDavid du Colombier 3433e12c5d1SDavid du Colombier case OEQ: 3443e12c5d1SDavid du Colombier case ONE: 3453e12c5d1SDavid du Colombier case OLE: 3463e12c5d1SDavid du Colombier case OLT: 3473e12c5d1SDavid du Colombier case OGE: 3483e12c5d1SDavid du Colombier case OGT: 3493e12c5d1SDavid du Colombier case OLO: 3503e12c5d1SDavid du Colombier case OLS: 3513e12c5d1SDavid du Colombier case OHI: 3523e12c5d1SDavid du Colombier case OHS: 3533e12c5d1SDavid du Colombier if(nn == Z) { 3543e12c5d1SDavid du Colombier nullwarn(l, r); 3553e12c5d1SDavid du Colombier break; 3563e12c5d1SDavid du Colombier } 3573e12c5d1SDavid du Colombier boolgen(n, 1, nn); 3583e12c5d1SDavid du Colombier break; 3593e12c5d1SDavid du Colombier 3603e12c5d1SDavid du Colombier case OANDAND: 3613e12c5d1SDavid du Colombier case OOROR: 3623e12c5d1SDavid du Colombier boolgen(n, 1, nn); 3633e12c5d1SDavid du Colombier if(nn == Z) 3643e12c5d1SDavid du Colombier patch(p, pc); 3653e12c5d1SDavid du Colombier break; 3663e12c5d1SDavid du Colombier 3673e12c5d1SDavid du Colombier case ONOT: 3683e12c5d1SDavid du Colombier if(nn == Z) { 3693e12c5d1SDavid du Colombier nullwarn(l, Z); 3703e12c5d1SDavid du Colombier break; 3713e12c5d1SDavid du Colombier } 3723e12c5d1SDavid du Colombier boolgen(n, 1, nn); 3733e12c5d1SDavid du Colombier break; 3743e12c5d1SDavid du Colombier 3753e12c5d1SDavid du Colombier case OCOMMA: 3763e12c5d1SDavid du Colombier cgen(l, Z); 3773e12c5d1SDavid du Colombier cgen(r, nn); 3783e12c5d1SDavid du Colombier break; 3793e12c5d1SDavid du Colombier 3803e12c5d1SDavid du Colombier case OCAST: 3813e12c5d1SDavid du Colombier if(nn == Z) { 3823e12c5d1SDavid du Colombier nullwarn(l, Z); 3833e12c5d1SDavid du Colombier break; 3843e12c5d1SDavid du Colombier } 3853e12c5d1SDavid du Colombier /* 3863e12c5d1SDavid du Colombier * convert from types l->n->nn 3873e12c5d1SDavid du Colombier */ 3883e12c5d1SDavid du Colombier if(nocast(l->type, n->type)) { 3893e12c5d1SDavid du Colombier if(nocast(n->type, nn->type)) { 3903e12c5d1SDavid du Colombier cgen(l, nn); 3913e12c5d1SDavid du Colombier break; 3923e12c5d1SDavid du Colombier } 3933e12c5d1SDavid du Colombier } 3943e12c5d1SDavid du Colombier regalloc(&nod, l, nn); 3953e12c5d1SDavid du Colombier cgen(l, &nod); 3963e12c5d1SDavid du Colombier regalloc(&nod1, n, &nod); 3973e12c5d1SDavid du Colombier gopcode(OAS, &nod, Z, &nod1); 3983e12c5d1SDavid du Colombier gopcode(OAS, &nod1, Z, nn); 3993e12c5d1SDavid du Colombier regfree(&nod1); 4003e12c5d1SDavid du Colombier regfree(&nod); 4013e12c5d1SDavid du Colombier break; 4023e12c5d1SDavid du Colombier 4033e12c5d1SDavid du Colombier case ODOT: 4043e12c5d1SDavid du Colombier sugen(l, nodrat, l->type->width); 4053e12c5d1SDavid du Colombier if(nn != Z) { 4063e12c5d1SDavid du Colombier warn(n, "non-interruptable temporary"); 4073e12c5d1SDavid du Colombier nod = *nodrat; 4083e12c5d1SDavid du Colombier if(!r || r->op != OCONST) { 4093e12c5d1SDavid du Colombier diag(n, "DOT and no offset"); 4103e12c5d1SDavid du Colombier break; 4113e12c5d1SDavid du Colombier } 412219b2ee8SDavid du Colombier nod.xoffset += (long)r->vconst; 4133e12c5d1SDavid du Colombier nod.type = n->type; 4143e12c5d1SDavid du Colombier cgen(&nod, nn); 4153e12c5d1SDavid du Colombier } 4163e12c5d1SDavid du Colombier break; 4173e12c5d1SDavid du Colombier 4183e12c5d1SDavid du Colombier case OCOND: 4193e12c5d1SDavid du Colombier bcgen(l, 1); 4203e12c5d1SDavid du Colombier p1 = p; 4213e12c5d1SDavid du Colombier cgen(r->left, nn); 4223e12c5d1SDavid du Colombier gbranch(OGOTO); 4233e12c5d1SDavid du Colombier patch(p1, pc); 4243e12c5d1SDavid du Colombier p1 = p; 4253e12c5d1SDavid du Colombier cgen(r->right, nn); 4263e12c5d1SDavid du Colombier patch(p1, pc); 4273e12c5d1SDavid du Colombier break; 4283e12c5d1SDavid du Colombier 4293e12c5d1SDavid du Colombier case OPOSTINC: 4303e12c5d1SDavid du Colombier case OPOSTDEC: 4313e12c5d1SDavid du Colombier v = 1; 4323e12c5d1SDavid du Colombier if(l->type->etype == TIND) 4333e12c5d1SDavid du Colombier v = l->type->link->width; 4343e12c5d1SDavid du Colombier if(o == OPOSTDEC) 4353e12c5d1SDavid du Colombier v = -v; 4363e12c5d1SDavid du Colombier if(l->op == OBIT) 4373e12c5d1SDavid du Colombier goto bitinc; 4383e12c5d1SDavid du Colombier if(nn == Z) 4393e12c5d1SDavid du Colombier goto pre; 4403e12c5d1SDavid du Colombier 4413e12c5d1SDavid du Colombier if(l->addable < INDEXED) 4423e12c5d1SDavid du Colombier reglcgen(&nod2, l, Z); 4433e12c5d1SDavid du Colombier else 4443e12c5d1SDavid du Colombier nod2 = *l; 4453e12c5d1SDavid du Colombier 4463e12c5d1SDavid du Colombier regalloc(&nod, l, nn); 4473e12c5d1SDavid du Colombier gopcode(OAS, &nod2, Z, &nod); 4483e12c5d1SDavid du Colombier regalloc(&nod1, l, Z); 449219b2ee8SDavid du Colombier if(typefd[l->type->etype]) { 4503e12c5d1SDavid du Colombier regalloc(&nod3, l, Z); 4513e12c5d1SDavid du Colombier if(v < 0) { 4523e12c5d1SDavid du Colombier gopcode(OAS, nodfconst(-v), Z, &nod3); 4533e12c5d1SDavid du Colombier gopcode(OSUB, &nod3, &nod, &nod1); 4543e12c5d1SDavid du Colombier } else { 4553e12c5d1SDavid du Colombier gopcode(OAS, nodfconst(v), Z, &nod3); 4563e12c5d1SDavid du Colombier gopcode(OADD, &nod3, &nod, &nod1); 4573e12c5d1SDavid du Colombier } 4583e12c5d1SDavid du Colombier regfree(&nod3); 4593e12c5d1SDavid du Colombier } else 4603e12c5d1SDavid du Colombier gopcode(OADD, nodconst(v), &nod, &nod1); 4613e12c5d1SDavid du Colombier gopcode(OAS, &nod1, Z, &nod2); 4623e12c5d1SDavid du Colombier 4633e12c5d1SDavid du Colombier regfree(&nod); 4643e12c5d1SDavid du Colombier regfree(&nod1); 4653e12c5d1SDavid du Colombier if(l->addable < INDEXED) 4663e12c5d1SDavid du Colombier regfree(&nod2); 4673e12c5d1SDavid du Colombier break; 4683e12c5d1SDavid du Colombier 4693e12c5d1SDavid du Colombier case OPREINC: 4703e12c5d1SDavid du Colombier case OPREDEC: 4713e12c5d1SDavid du Colombier v = 1; 4723e12c5d1SDavid du Colombier if(l->type->etype == TIND) 4733e12c5d1SDavid du Colombier v = l->type->link->width; 4743e12c5d1SDavid du Colombier if(o == OPREDEC) 4753e12c5d1SDavid du Colombier v = -v; 4763e12c5d1SDavid du Colombier if(l->op == OBIT) 4773e12c5d1SDavid du Colombier goto bitinc; 4783e12c5d1SDavid du Colombier 4793e12c5d1SDavid du Colombier pre: 4803e12c5d1SDavid du Colombier if(l->addable < INDEXED) 4813e12c5d1SDavid du Colombier reglcgen(&nod2, l, Z); 4823e12c5d1SDavid du Colombier else 4833e12c5d1SDavid du Colombier nod2 = *l; 4843e12c5d1SDavid du Colombier 4853e12c5d1SDavid du Colombier regalloc(&nod, l, nn); 4863e12c5d1SDavid du Colombier gopcode(OAS, &nod2, Z, &nod); 487219b2ee8SDavid du Colombier if(typefd[l->type->etype]) { 4883e12c5d1SDavid du Colombier regalloc(&nod3, l, Z); 4893e12c5d1SDavid du Colombier if(v < 0) { 4903e12c5d1SDavid du Colombier gopcode(OAS, nodfconst(-v), Z, &nod3); 4913e12c5d1SDavid du Colombier gopcode(OSUB, &nod3, Z, &nod); 4923e12c5d1SDavid du Colombier } else { 4933e12c5d1SDavid du Colombier gopcode(OAS, nodfconst(v), Z, &nod3); 4943e12c5d1SDavid du Colombier gopcode(OADD, &nod3, Z, &nod); 4953e12c5d1SDavid du Colombier } 4963e12c5d1SDavid du Colombier regfree(&nod3); 4973e12c5d1SDavid du Colombier } else 4983e12c5d1SDavid du Colombier gopcode(OADD, nodconst(v), Z, &nod); 4993e12c5d1SDavid du Colombier gopcode(OAS, &nod, Z, &nod2); 500*4ac975e2SDavid du Colombier if(nn && l->op == ONAME) /* in x=++i, emit USED(i) */ 501*4ac975e2SDavid du Colombier gins(ANOP, l, Z); 5023e12c5d1SDavid du Colombier 5033e12c5d1SDavid du Colombier regfree(&nod); 5043e12c5d1SDavid du Colombier if(l->addable < INDEXED) 5053e12c5d1SDavid du Colombier regfree(&nod2); 5063e12c5d1SDavid du Colombier break; 5073e12c5d1SDavid du Colombier 5083e12c5d1SDavid du Colombier bitinc: 5093e12c5d1SDavid du Colombier if(nn != Z && (o == OPOSTINC || o == OPOSTDEC)) { 5103e12c5d1SDavid du Colombier bitload(l, &nod, &nod1, &nod2, Z); 5113e12c5d1SDavid du Colombier gopcode(OAS, &nod, Z, nn); 5123e12c5d1SDavid du Colombier gopcode(OADD, nodconst(v), Z, &nod); 5133e12c5d1SDavid du Colombier bitstore(l, &nod, &nod1, &nod2, Z); 5143e12c5d1SDavid du Colombier break; 5153e12c5d1SDavid du Colombier } 5163e12c5d1SDavid du Colombier bitload(l, &nod, &nod1, &nod2, nn); 5173e12c5d1SDavid du Colombier gopcode(OADD, nodconst(v), Z, &nod); 5183e12c5d1SDavid du Colombier bitstore(l, &nod, &nod1, &nod2, nn); 5193e12c5d1SDavid du Colombier break; 5203e12c5d1SDavid du Colombier } 5213e12c5d1SDavid du Colombier cursafe = curs; 5223e12c5d1SDavid du Colombier } 5233e12c5d1SDavid du Colombier 5243e12c5d1SDavid du Colombier void 5253e12c5d1SDavid du Colombier reglcgen(Node *t, Node *n, Node *nn) 5263e12c5d1SDavid du Colombier { 5273e12c5d1SDavid du Colombier Node *r; 5283e12c5d1SDavid du Colombier long v; 5293e12c5d1SDavid du Colombier 5303e12c5d1SDavid du Colombier regialloc(t, n, nn); 5313e12c5d1SDavid du Colombier if(n->op == OIND) { 5323e12c5d1SDavid du Colombier r = n->left; 5333e12c5d1SDavid du Colombier while(r->op == OADD) 5343e12c5d1SDavid du Colombier r = r->right; 5353e12c5d1SDavid du Colombier if(sconst(r)) { 536219b2ee8SDavid du Colombier v = r->vconst; 537219b2ee8SDavid du Colombier r->vconst = 0; 5383e12c5d1SDavid du Colombier lcgen(n, t); 539219b2ee8SDavid du Colombier t->xoffset += v; 540219b2ee8SDavid du Colombier r->vconst = v; 5413e12c5d1SDavid du Colombier regind(t, n); 5423e12c5d1SDavid du Colombier return; 5433e12c5d1SDavid du Colombier } 5443e12c5d1SDavid du Colombier } 5453e12c5d1SDavid du Colombier lcgen(n, t); 5463e12c5d1SDavid du Colombier regind(t, n); 5473e12c5d1SDavid du Colombier } 5483e12c5d1SDavid du Colombier 5493e12c5d1SDavid du Colombier void 5503e12c5d1SDavid du Colombier lcgen(Node *n, Node *nn) 5513e12c5d1SDavid du Colombier { 5523e12c5d1SDavid du Colombier Prog *p1; 5533e12c5d1SDavid du Colombier Node nod; 5543e12c5d1SDavid du Colombier 5553e12c5d1SDavid du Colombier if(debug['g']) { 5563e12c5d1SDavid du Colombier prtree(nn, "lcgen lhs"); 5573e12c5d1SDavid du Colombier prtree(n, "lcgen"); 5583e12c5d1SDavid du Colombier } 5593e12c5d1SDavid du Colombier if(n == Z || n->type == T) 5603e12c5d1SDavid du Colombier return; 5613e12c5d1SDavid du Colombier if(nn == Z) { 5623e12c5d1SDavid du Colombier nn = &nod; 5633e12c5d1SDavid du Colombier regalloc(&nod, n, Z); 5643e12c5d1SDavid du Colombier } 5653e12c5d1SDavid du Colombier switch(n->op) { 5663e12c5d1SDavid du Colombier default: 5673e12c5d1SDavid du Colombier if(n->addable < INDEXED) { 5683e12c5d1SDavid du Colombier diag(n, "unknown op in lcgen: %O", n->op); 5693e12c5d1SDavid du Colombier break; 5703e12c5d1SDavid du Colombier } 5713e12c5d1SDavid du Colombier nod = *n; 5723e12c5d1SDavid du Colombier nod.op = OADDR; 5733e12c5d1SDavid du Colombier nod.left = n; 5743e12c5d1SDavid du Colombier nod.right = Z; 5753e12c5d1SDavid du Colombier nod.type = types[TIND]; 5763e12c5d1SDavid du Colombier gopcode(OAS, &nod, Z, nn); 5773e12c5d1SDavid du Colombier break; 5783e12c5d1SDavid du Colombier 5793e12c5d1SDavid du Colombier case OCOMMA: 5803e12c5d1SDavid du Colombier cgen(n->left, n->left); 5813e12c5d1SDavid du Colombier lcgen(n->right, nn); 5823e12c5d1SDavid du Colombier break; 5833e12c5d1SDavid du Colombier 5843e12c5d1SDavid du Colombier case OIND: 5853e12c5d1SDavid du Colombier cgen(n->left, nn); 5863e12c5d1SDavid du Colombier break; 5873e12c5d1SDavid du Colombier 5883e12c5d1SDavid du Colombier case OCOND: 5893e12c5d1SDavid du Colombier bcgen(n->left, 1); 5903e12c5d1SDavid du Colombier p1 = p; 5913e12c5d1SDavid du Colombier lcgen(n->right->left, nn); 5923e12c5d1SDavid du Colombier gbranch(OGOTO); 5933e12c5d1SDavid du Colombier patch(p1, pc); 5943e12c5d1SDavid du Colombier p1 = p; 5953e12c5d1SDavid du Colombier lcgen(n->right->right, nn); 5963e12c5d1SDavid du Colombier patch(p1, pc); 5973e12c5d1SDavid du Colombier break; 5983e12c5d1SDavid du Colombier } 5993e12c5d1SDavid du Colombier } 6003e12c5d1SDavid du Colombier 6013e12c5d1SDavid du Colombier void 6023e12c5d1SDavid du Colombier bcgen(Node *n, int true) 6033e12c5d1SDavid du Colombier { 6043e12c5d1SDavid du Colombier 6053e12c5d1SDavid du Colombier if(n->type == T) 6063e12c5d1SDavid du Colombier gbranch(OGOTO); 6073e12c5d1SDavid du Colombier else 6083e12c5d1SDavid du Colombier boolgen(n, true, Z); 6093e12c5d1SDavid du Colombier } 6103e12c5d1SDavid du Colombier 6113e12c5d1SDavid du Colombier void 6123e12c5d1SDavid du Colombier boolgen(Node *n, int true, Node *nn) 6133e12c5d1SDavid du Colombier { 6143e12c5d1SDavid du Colombier int o; 6153e12c5d1SDavid du Colombier Prog *p1, *p2; 6163e12c5d1SDavid du Colombier Node *l, *r, nod, nod1; 6173e12c5d1SDavid du Colombier long curs; 6183e12c5d1SDavid du Colombier 6193e12c5d1SDavid du Colombier if(debug['g']) { 6203e12c5d1SDavid du Colombier prtree(nn, "boolgen lhs"); 6213e12c5d1SDavid du Colombier prtree(n, "boolgen"); 6223e12c5d1SDavid du Colombier } 6233e12c5d1SDavid du Colombier curs = cursafe; 6243e12c5d1SDavid du Colombier l = n->left; 6253e12c5d1SDavid du Colombier r = n->right; 6263e12c5d1SDavid du Colombier switch(n->op) { 6273e12c5d1SDavid du Colombier 6283e12c5d1SDavid du Colombier default: 6293e12c5d1SDavid du Colombier regalloc(&nod, n, nn); 6303e12c5d1SDavid du Colombier cgen(n, &nod); 6317dd7cddfSDavid du Colombier if(nn == Z || typefd[n->type->etype]) { 6323e12c5d1SDavid du Colombier o = ONE; 6333e12c5d1SDavid du Colombier if(true) 6343e12c5d1SDavid du Colombier o = comrel[relindex(o)]; 635219b2ee8SDavid du Colombier if(typefd[n->type->etype]) { 6363e12c5d1SDavid du Colombier nodreg(&nod1, n, NREG+FREGZERO); 6373e12c5d1SDavid du Colombier gopcode(o, &nod, &nod1, Z); 6383e12c5d1SDavid du Colombier } else 6393e12c5d1SDavid du Colombier gopcode(o, &nod, Z, Z); 6403e12c5d1SDavid du Colombier regfree(&nod); 6413e12c5d1SDavid du Colombier goto com; 6427dd7cddfSDavid du Colombier } 6437dd7cddfSDavid du Colombier if(true) 6447dd7cddfSDavid du Colombier gopcode(OCOND, &nod, nodconst(0), &nod); 6457dd7cddfSDavid du Colombier else 6467dd7cddfSDavid du Colombier gopcode(OCOND, nodconst(1), &nod, &nod); 6477dd7cddfSDavid du Colombier gopcode(OAS, &nod, Z, nn); 6487dd7cddfSDavid du Colombier regfree(&nod); 6497dd7cddfSDavid du Colombier break; 6503e12c5d1SDavid du Colombier 6513e12c5d1SDavid du Colombier case OCONST: 6523e12c5d1SDavid du Colombier o = vconst(n); 6533e12c5d1SDavid du Colombier if(!true) 6543e12c5d1SDavid du Colombier o = !o; 6553e12c5d1SDavid du Colombier gbranch(OGOTO); 6563e12c5d1SDavid du Colombier if(o) { 6573e12c5d1SDavid du Colombier p1 = p; 6583e12c5d1SDavid du Colombier gbranch(OGOTO); 6593e12c5d1SDavid du Colombier patch(p1, pc); 6603e12c5d1SDavid du Colombier } 6613e12c5d1SDavid du Colombier goto com; 6623e12c5d1SDavid du Colombier 6633e12c5d1SDavid du Colombier case OCOMMA: 6643e12c5d1SDavid du Colombier cgen(l, Z); 6653e12c5d1SDavid du Colombier boolgen(r, true, nn); 6663e12c5d1SDavid du Colombier break; 6673e12c5d1SDavid du Colombier 6683e12c5d1SDavid du Colombier case ONOT: 6693e12c5d1SDavid du Colombier boolgen(l, !true, nn); 6703e12c5d1SDavid du Colombier break; 6713e12c5d1SDavid du Colombier 6723e12c5d1SDavid du Colombier case OCOND: 6733e12c5d1SDavid du Colombier bcgen(l, 1); 6743e12c5d1SDavid du Colombier p1 = p; 6753e12c5d1SDavid du Colombier bcgen(r->left, true); 6763e12c5d1SDavid du Colombier p2 = p; 6773e12c5d1SDavid du Colombier gbranch(OGOTO); 6783e12c5d1SDavid du Colombier patch(p1, pc); 6793e12c5d1SDavid du Colombier p1 = p; 6803e12c5d1SDavid du Colombier bcgen(r->right, !true); 6813e12c5d1SDavid du Colombier patch(p2, pc); 6823e12c5d1SDavid du Colombier p2 = p; 6833e12c5d1SDavid du Colombier gbranch(OGOTO); 6843e12c5d1SDavid du Colombier patch(p1, pc); 6853e12c5d1SDavid du Colombier patch(p2, pc); 6863e12c5d1SDavid du Colombier goto com; 6873e12c5d1SDavid du Colombier 6883e12c5d1SDavid du Colombier case OANDAND: 6893e12c5d1SDavid du Colombier if(!true) 6903e12c5d1SDavid du Colombier goto caseor; 6913e12c5d1SDavid du Colombier 6923e12c5d1SDavid du Colombier caseand: 6933e12c5d1SDavid du Colombier bcgen(l, true); 6943e12c5d1SDavid du Colombier p1 = p; 6953e12c5d1SDavid du Colombier bcgen(r, !true); 6963e12c5d1SDavid du Colombier p2 = p; 6973e12c5d1SDavid du Colombier patch(p1, pc); 6983e12c5d1SDavid du Colombier gbranch(OGOTO); 6993e12c5d1SDavid du Colombier patch(p2, pc); 7003e12c5d1SDavid du Colombier goto com; 7013e12c5d1SDavid du Colombier 7023e12c5d1SDavid du Colombier case OOROR: 7033e12c5d1SDavid du Colombier if(!true) 7043e12c5d1SDavid du Colombier goto caseand; 7053e12c5d1SDavid du Colombier 7063e12c5d1SDavid du Colombier caseor: 7073e12c5d1SDavid du Colombier bcgen(l, !true); 7083e12c5d1SDavid du Colombier p1 = p; 7093e12c5d1SDavid du Colombier bcgen(r, !true); 7103e12c5d1SDavid du Colombier p2 = p; 7113e12c5d1SDavid du Colombier gbranch(OGOTO); 7123e12c5d1SDavid du Colombier patch(p1, pc); 7133e12c5d1SDavid du Colombier patch(p2, pc); 7143e12c5d1SDavid du Colombier goto com; 7153e12c5d1SDavid du Colombier 7163e12c5d1SDavid du Colombier case OEQ: 7173e12c5d1SDavid du Colombier case ONE: 7183e12c5d1SDavid du Colombier case OLE: 7193e12c5d1SDavid du Colombier case OLT: 7203e12c5d1SDavid du Colombier case OGE: 7213e12c5d1SDavid du Colombier case OGT: 7223e12c5d1SDavid du Colombier case OHI: 7233e12c5d1SDavid du Colombier case OHS: 7243e12c5d1SDavid du Colombier case OLO: 7253e12c5d1SDavid du Colombier case OLS: 7263e12c5d1SDavid du Colombier o = n->op; 7273e12c5d1SDavid du Colombier if(true) 7283e12c5d1SDavid du Colombier o = comrel[relindex(o)]; 7293e12c5d1SDavid du Colombier if(l->complex >= FNX && r->complex >= FNX) { 7303e12c5d1SDavid du Colombier regret(&nod, r); 7313e12c5d1SDavid du Colombier cgen(r, &nod); 7323e12c5d1SDavid du Colombier regsalloc(&nod1, r); 7333e12c5d1SDavid du Colombier gopcode(OAS, &nod, Z, &nod1); 7343e12c5d1SDavid du Colombier regfree(&nod); 7353e12c5d1SDavid du Colombier nod = *n; 7363e12c5d1SDavid du Colombier nod.right = &nod1; 7373e12c5d1SDavid du Colombier boolgen(&nod, true, nn); 7383e12c5d1SDavid du Colombier break; 7393e12c5d1SDavid du Colombier } 7407dd7cddfSDavid du Colombier if(nn != Z && !typefd[l->type->etype]) { 7417dd7cddfSDavid du Colombier if(l->complex >= r->complex) { 7427dd7cddfSDavid du Colombier regalloc(&nod1, l, nn); 7437dd7cddfSDavid du Colombier cgen(l, &nod1); 7447dd7cddfSDavid du Colombier regalloc(&nod, r, Z); 7457dd7cddfSDavid du Colombier cgen(r, &nod); 7467dd7cddfSDavid du Colombier } else { 7477dd7cddfSDavid du Colombier regalloc(&nod, r, nn); 7487dd7cddfSDavid du Colombier cgen(r, &nod); 7497dd7cddfSDavid du Colombier regalloc(&nod1, l, Z); 7507dd7cddfSDavid du Colombier cgen(l, &nod1); 7517dd7cddfSDavid du Colombier } 7527dd7cddfSDavid du Colombier switch(o) { 7537dd7cddfSDavid du Colombier case OEQ: 7547dd7cddfSDavid du Colombier gopcode(OSUB, &nod1, &nod, &nod); 7557dd7cddfSDavid du Colombier gopcode(OCOND, &nod, nodconst(0), &nod); 7567dd7cddfSDavid du Colombier break; 7577dd7cddfSDavid du Colombier case ONE: 7587dd7cddfSDavid du Colombier gopcode(OSUB, &nod1, &nod, &nod); 7597dd7cddfSDavid du Colombier gopcode(OCOND, nodconst(1), &nod, &nod); 7607dd7cddfSDavid du Colombier break; 7617dd7cddfSDavid du Colombier case OLE: 7627dd7cddfSDavid du Colombier gopcode(OCOMMA, &nod1, &nod, &nod); 7637dd7cddfSDavid du Colombier break; 7647dd7cddfSDavid du Colombier case OGT: 7657dd7cddfSDavid du Colombier gopcode(OCOMMA, &nod1, &nod, &nod); 7667dd7cddfSDavid du Colombier gopcode(OXOR, nodconst(1), &nod, &nod); 7677dd7cddfSDavid du Colombier break; 7687dd7cddfSDavid du Colombier case OLT: 7697dd7cddfSDavid du Colombier gopcode(OCOMMA, &nod, &nod1, &nod); 7707dd7cddfSDavid du Colombier gopcode(OXOR, nodconst(1), &nod, &nod); 7717dd7cddfSDavid du Colombier break; 7727dd7cddfSDavid du Colombier case OGE: 7737dd7cddfSDavid du Colombier gopcode(OCOMMA, &nod, &nod1, &nod); 7747dd7cddfSDavid du Colombier break; 7757dd7cddfSDavid du Colombier case OLS: 7767dd7cddfSDavid du Colombier gopcode(OCOND, &nod1, &nod, &nod); 7777dd7cddfSDavid du Colombier break; 7787dd7cddfSDavid du Colombier case OHI: 7797dd7cddfSDavid du Colombier gopcode(OCOND, &nod1, &nod, &nod); 7807dd7cddfSDavid du Colombier gopcode(OXOR, nodconst(1), &nod, &nod); 7817dd7cddfSDavid du Colombier break; 7827dd7cddfSDavid du Colombier case OLO: 7837dd7cddfSDavid du Colombier gopcode(OCOND, &nod, &nod1, &nod); 7847dd7cddfSDavid du Colombier gopcode(OXOR, nodconst(1), &nod, &nod); 7857dd7cddfSDavid du Colombier break; 7867dd7cddfSDavid du Colombier case OHS: 7877dd7cddfSDavid du Colombier gopcode(OCOND, &nod, &nod1, &nod); 7887dd7cddfSDavid du Colombier break; 7897dd7cddfSDavid du Colombier } 7907dd7cddfSDavid du Colombier gopcode(OAS, &nod, Z, nn); 7917dd7cddfSDavid du Colombier regfree(&nod); 7927dd7cddfSDavid du Colombier regfree(&nod1); 7937dd7cddfSDavid du Colombier break; 7947dd7cddfSDavid du Colombier } 7953e12c5d1SDavid du Colombier if(sconst(l)) { 7963e12c5d1SDavid du Colombier switch(o) { 7973e12c5d1SDavid du Colombier default: 798219b2ee8SDavid du Colombier if(l->vconst != 0) 7993e12c5d1SDavid du Colombier break; 8003e12c5d1SDavid du Colombier 8013e12c5d1SDavid du Colombier case OGT: 8023e12c5d1SDavid du Colombier case OHI: 8033e12c5d1SDavid du Colombier case OLE: 8043e12c5d1SDavid du Colombier case OLS: 8053e12c5d1SDavid du Colombier regalloc(&nod, r, nn); 8063e12c5d1SDavid du Colombier cgen(r, &nod); 8073e12c5d1SDavid du Colombier gopcode(o, l, &nod, Z); 8083e12c5d1SDavid du Colombier regfree(&nod); 8093e12c5d1SDavid du Colombier goto com; 8103e12c5d1SDavid du Colombier } 8113e12c5d1SDavid du Colombier } 8123e12c5d1SDavid du Colombier if(sconst(r)) { 8133e12c5d1SDavid du Colombier switch(o) { 8143e12c5d1SDavid du Colombier default: 815219b2ee8SDavid du Colombier if(r->vconst != 0) 8163e12c5d1SDavid du Colombier break; 8173e12c5d1SDavid du Colombier 8183e12c5d1SDavid du Colombier case OGE: 8193e12c5d1SDavid du Colombier case OHS: 8203e12c5d1SDavid du Colombier case OLT: 8213e12c5d1SDavid du Colombier case OLO: 8223e12c5d1SDavid du Colombier regalloc(&nod, l, nn); 8233e12c5d1SDavid du Colombier cgen(l, &nod); 8243e12c5d1SDavid du Colombier gopcode(o, &nod, r, Z); 8253e12c5d1SDavid du Colombier regfree(&nod); 8263e12c5d1SDavid du Colombier goto com; 8273e12c5d1SDavid du Colombier } 8283e12c5d1SDavid du Colombier } 8293e12c5d1SDavid du Colombier if(l->complex >= r->complex) { 8303e12c5d1SDavid du Colombier regalloc(&nod1, l, nn); 8313e12c5d1SDavid du Colombier cgen(l, &nod1); 8323e12c5d1SDavid du Colombier regalloc(&nod, r, Z); 8333e12c5d1SDavid du Colombier cgen(r, &nod); 8343e12c5d1SDavid du Colombier } else { 8353e12c5d1SDavid du Colombier regalloc(&nod, r, nn); 8363e12c5d1SDavid du Colombier cgen(r, &nod); 8373e12c5d1SDavid du Colombier regalloc(&nod1, l, Z); 8383e12c5d1SDavid du Colombier cgen(l, &nod1); 8393e12c5d1SDavid du Colombier } 8403e12c5d1SDavid du Colombier gopcode(o, &nod1, &nod, Z); 8413e12c5d1SDavid du Colombier regfree(&nod); 8423e12c5d1SDavid du Colombier regfree(&nod1); 8433e12c5d1SDavid du Colombier 8443e12c5d1SDavid du Colombier com: 8453e12c5d1SDavid du Colombier if(nn != Z) { 8463e12c5d1SDavid du Colombier p1 = p; 847219b2ee8SDavid du Colombier gopcode(OAS, nodconst(1), Z, nn); 8483e12c5d1SDavid du Colombier gbranch(OGOTO); 8493e12c5d1SDavid du Colombier p2 = p; 8503e12c5d1SDavid du Colombier patch(p1, pc); 851219b2ee8SDavid du Colombier gopcode(OAS, nodconst(0), Z, nn); 8523e12c5d1SDavid du Colombier patch(p2, pc); 8533e12c5d1SDavid du Colombier } 8543e12c5d1SDavid du Colombier break; 8553e12c5d1SDavid du Colombier } 8563e12c5d1SDavid du Colombier cursafe = curs; 8573e12c5d1SDavid du Colombier } 8583e12c5d1SDavid du Colombier 8593e12c5d1SDavid du Colombier void 8603e12c5d1SDavid du Colombier sugen(Node *n, Node *nn, long w) 8613e12c5d1SDavid du Colombier { 8623e12c5d1SDavid du Colombier Prog *p1; 8633e12c5d1SDavid du Colombier Node nod0, nod1, nod2, nod3, nod4, *l, *r; 8643e12c5d1SDavid du Colombier Type *t; 8653e12c5d1SDavid du Colombier long pc1; 8663e12c5d1SDavid du Colombier int i, m, c; 8673e12c5d1SDavid du Colombier 8683e12c5d1SDavid du Colombier if(n == Z || n->type == T) 8693e12c5d1SDavid du Colombier return; 8703e12c5d1SDavid du Colombier if(debug['g']) { 8713e12c5d1SDavid du Colombier prtree(nn, "sugen lhs"); 8723e12c5d1SDavid du Colombier prtree(n, "sugen"); 8733e12c5d1SDavid du Colombier } 8743e12c5d1SDavid du Colombier if(nn == nodrat) 8753e12c5d1SDavid du Colombier if(w > nrathole) 8763e12c5d1SDavid du Colombier nrathole = w; 8773e12c5d1SDavid du Colombier switch(n->op) { 8783e12c5d1SDavid du Colombier case OIND: 8793e12c5d1SDavid du Colombier if(nn == Z) { 8803e12c5d1SDavid du Colombier nullwarn(n->left, Z); 8813e12c5d1SDavid du Colombier break; 8823e12c5d1SDavid du Colombier } 8833e12c5d1SDavid du Colombier 8843e12c5d1SDavid du Colombier default: 8853e12c5d1SDavid du Colombier goto copy; 8863e12c5d1SDavid du Colombier 887219b2ee8SDavid du Colombier case OCONST: 888219b2ee8SDavid du Colombier if(n->type && typev[n->type->etype]) { 889219b2ee8SDavid du Colombier if(nn == Z) { 890219b2ee8SDavid du Colombier nullwarn(n->left, Z); 891219b2ee8SDavid du Colombier break; 892219b2ee8SDavid du Colombier } 893219b2ee8SDavid du Colombier 894219b2ee8SDavid du Colombier t = nn->type; 895219b2ee8SDavid du Colombier nn->type = types[TLONG]; 896219b2ee8SDavid du Colombier reglcgen(&nod1, nn, Z); 897219b2ee8SDavid du Colombier nn->type = t; 898219b2ee8SDavid du Colombier 89980ee5cbfSDavid du Colombier if(align(0, types[TCHAR], Aarg1)) /* isbigendian */ 900219b2ee8SDavid du Colombier gopcode(OAS, nod32const(n->vconst>>32), Z, &nod1); 90180ee5cbfSDavid du Colombier else 902219b2ee8SDavid du Colombier gopcode(OAS, nod32const(n->vconst), Z, &nod1); 90380ee5cbfSDavid du Colombier nod1.xoffset += SZ_LONG; 90480ee5cbfSDavid du Colombier if(align(0, types[TCHAR], Aarg1)) /* isbigendian */ 90580ee5cbfSDavid du Colombier gopcode(OAS, nod32const(n->vconst), Z, &nod1); 90680ee5cbfSDavid du Colombier else 90780ee5cbfSDavid du Colombier gopcode(OAS, nod32const(n->vconst>>32), Z, &nod1); 908219b2ee8SDavid du Colombier 909219b2ee8SDavid du Colombier regfree(&nod1); 910219b2ee8SDavid du Colombier break; 911219b2ee8SDavid du Colombier } 912219b2ee8SDavid du Colombier goto copy; 913219b2ee8SDavid du Colombier 9143e12c5d1SDavid du Colombier case ODOT: 9153e12c5d1SDavid du Colombier l = n->left; 9163e12c5d1SDavid du Colombier sugen(l, nodrat, l->type->width); 9173e12c5d1SDavid du Colombier if(nn != Z) { 9183e12c5d1SDavid du Colombier warn(n, "non-interruptable temporary"); 9193e12c5d1SDavid du Colombier nod1 = *nodrat; 9203e12c5d1SDavid du Colombier r = n->right; 9213e12c5d1SDavid du Colombier if(!r || r->op != OCONST) { 9223e12c5d1SDavid du Colombier diag(n, "DOT and no offset"); 9233e12c5d1SDavid du Colombier break; 9243e12c5d1SDavid du Colombier } 925219b2ee8SDavid du Colombier nod1.xoffset += (long)r->vconst; 9263e12c5d1SDavid du Colombier nod1.type = n->type; 9273e12c5d1SDavid du Colombier sugen(&nod1, nn, w); 9283e12c5d1SDavid du Colombier } 9293e12c5d1SDavid du Colombier break; 9303e12c5d1SDavid du Colombier 9313e12c5d1SDavid du Colombier case OSTRUCT: 932219b2ee8SDavid du Colombier /* 933219b2ee8SDavid du Colombier * rewrite so lhs has no fn call 934219b2ee8SDavid du Colombier */ 935219b2ee8SDavid du Colombier if(nn != Z && nn->complex >= FNX) { 936219b2ee8SDavid du Colombier nod1 = *n; 937219b2ee8SDavid du Colombier nod1.type = typ(TIND, n->type); 938219b2ee8SDavid du Colombier regret(&nod2, &nod1); 939219b2ee8SDavid du Colombier lcgen(nn, &nod2); 940219b2ee8SDavid du Colombier regsalloc(&nod0, &nod1); 941219b2ee8SDavid du Colombier gopcode(OAS, &nod2, Z, &nod0); 942219b2ee8SDavid du Colombier regfree(&nod2); 943219b2ee8SDavid du Colombier 944219b2ee8SDavid du Colombier nod1 = *n; 945219b2ee8SDavid du Colombier nod1.op = OIND; 946219b2ee8SDavid du Colombier nod1.left = &nod0; 947219b2ee8SDavid du Colombier nod1.right = Z; 948219b2ee8SDavid du Colombier nod1.complex = 1; 949219b2ee8SDavid du Colombier 950219b2ee8SDavid du Colombier sugen(n, &nod1, w); 951219b2ee8SDavid du Colombier return; 952219b2ee8SDavid du Colombier } 953219b2ee8SDavid du Colombier 9543e12c5d1SDavid du Colombier r = n->left; 9553e12c5d1SDavid du Colombier for(t = n->type->link; t != T; t = t->down) { 9563e12c5d1SDavid du Colombier l = r; 9573e12c5d1SDavid du Colombier if(r->op == OLIST) { 9583e12c5d1SDavid du Colombier l = r->left; 9593e12c5d1SDavid du Colombier r = r->right; 9603e12c5d1SDavid du Colombier } 9613e12c5d1SDavid du Colombier if(nn == Z) { 9623e12c5d1SDavid du Colombier cgen(l, nn); 9633e12c5d1SDavid du Colombier continue; 9643e12c5d1SDavid du Colombier } 9653e12c5d1SDavid du Colombier /* 9663e12c5d1SDavid du Colombier * hand craft *(&nn + o) = l 9673e12c5d1SDavid du Colombier */ 9683e12c5d1SDavid du Colombier nod0 = znode; 9693e12c5d1SDavid du Colombier nod0.op = OAS; 9703e12c5d1SDavid du Colombier nod0.type = t; 9713e12c5d1SDavid du Colombier nod0.left = &nod1; 9723e12c5d1SDavid du Colombier nod0.right = l; 9733e12c5d1SDavid du Colombier 9743e12c5d1SDavid du Colombier nod1 = znode; 9753e12c5d1SDavid du Colombier nod1.op = OIND; 9763e12c5d1SDavid du Colombier nod1.type = t; 9773e12c5d1SDavid du Colombier nod1.left = &nod2; 9783e12c5d1SDavid du Colombier 9793e12c5d1SDavid du Colombier nod2 = znode; 9803e12c5d1SDavid du Colombier nod2.op = OADD; 9813e12c5d1SDavid du Colombier nod2.type = typ(TIND, t); 9823e12c5d1SDavid du Colombier nod2.left = &nod3; 9833e12c5d1SDavid du Colombier nod2.right = &nod4; 9843e12c5d1SDavid du Colombier 9853e12c5d1SDavid du Colombier nod3 = znode; 9863e12c5d1SDavid du Colombier nod3.op = OADDR; 9873e12c5d1SDavid du Colombier nod3.type = nod2.type; 9883e12c5d1SDavid du Colombier nod3.left = nn; 9893e12c5d1SDavid du Colombier 9903e12c5d1SDavid du Colombier nod4 = znode; 9913e12c5d1SDavid du Colombier nod4.op = OCONST; 9923e12c5d1SDavid du Colombier nod4.type = nod2.type; 993219b2ee8SDavid du Colombier nod4.vconst = t->offset; 9943e12c5d1SDavid du Colombier 9953e12c5d1SDavid du Colombier ccom(&nod0); 9963e12c5d1SDavid du Colombier acom(&nod0); 9973e12c5d1SDavid du Colombier xcom(&nod0); 9983e12c5d1SDavid du Colombier nod0.addable = 0; 9993e12c5d1SDavid du Colombier 10003e12c5d1SDavid du Colombier cgen(&nod0, Z); 10013e12c5d1SDavid du Colombier } 10023e12c5d1SDavid du Colombier break; 10033e12c5d1SDavid du Colombier 10043e12c5d1SDavid du Colombier case OAS: 10053e12c5d1SDavid du Colombier if(nn == Z) { 10063e12c5d1SDavid du Colombier if(n->addable < INDEXED) 10073e12c5d1SDavid du Colombier sugen(n->right, n->left, w); 10083e12c5d1SDavid du Colombier break; 10093e12c5d1SDavid du Colombier } 10103e12c5d1SDavid du Colombier sugen(n->right, nodrat, w); 10113e12c5d1SDavid du Colombier warn(n, "non-interruptable temporary"); 10123e12c5d1SDavid du Colombier sugen(nodrat, n->left, w); 10133e12c5d1SDavid du Colombier sugen(nodrat, nn, w); 10143e12c5d1SDavid du Colombier break; 10153e12c5d1SDavid du Colombier 10163e12c5d1SDavid du Colombier case OFUNC: 10173e12c5d1SDavid du Colombier if(nn == Z) { 10183e12c5d1SDavid du Colombier sugen(n, nodrat, w); 10193e12c5d1SDavid du Colombier break; 10203e12c5d1SDavid du Colombier } 10213e12c5d1SDavid du Colombier if(nn->op != OIND) { 10223e12c5d1SDavid du Colombier nn = new1(OADDR, nn, Z); 10233e12c5d1SDavid du Colombier nn->type = types[TIND]; 10243e12c5d1SDavid du Colombier nn->addable = 0; 10253e12c5d1SDavid du Colombier } else 10263e12c5d1SDavid du Colombier nn = nn->left; 10273e12c5d1SDavid du Colombier n = new(OFUNC, n->left, new(OLIST, nn, n->right)); 10283e12c5d1SDavid du Colombier n->type = types[TVOID]; 10293e12c5d1SDavid du Colombier n->left->type = types[TVOID]; 10303e12c5d1SDavid du Colombier cgen(n, Z); 10313e12c5d1SDavid du Colombier break; 10323e12c5d1SDavid du Colombier 10333e12c5d1SDavid du Colombier case OCOND: 10343e12c5d1SDavid du Colombier bcgen(n->left, 1); 10353e12c5d1SDavid du Colombier p1 = p; 10363e12c5d1SDavid du Colombier sugen(n->right->left, nn, w); 10373e12c5d1SDavid du Colombier gbranch(OGOTO); 10383e12c5d1SDavid du Colombier patch(p1, pc); 10393e12c5d1SDavid du Colombier p1 = p; 10403e12c5d1SDavid du Colombier sugen(n->right->right, nn, w); 10413e12c5d1SDavid du Colombier patch(p1, pc); 10423e12c5d1SDavid du Colombier break; 10433e12c5d1SDavid du Colombier 10443e12c5d1SDavid du Colombier case OCOMMA: 10453e12c5d1SDavid du Colombier cgen(n->left, Z); 10463e12c5d1SDavid du Colombier sugen(n->right, nn, w); 10473e12c5d1SDavid du Colombier break; 10483e12c5d1SDavid du Colombier } 10493e12c5d1SDavid du Colombier return; 10503e12c5d1SDavid du Colombier 10513e12c5d1SDavid du Colombier copy: 10523e12c5d1SDavid du Colombier if(nn == Z) 10533e12c5d1SDavid du Colombier return; 10543e12c5d1SDavid du Colombier if(n->complex >= FNX && nn->complex >= FNX) { 1055219b2ee8SDavid du Colombier t = nn->type; 1056219b2ee8SDavid du Colombier nn->type = types[TLONG]; 1057219b2ee8SDavid du Colombier regialloc(&nod1, nn, Z); 1058219b2ee8SDavid du Colombier lcgen(nn, &nod1); 1059219b2ee8SDavid du Colombier regsalloc(&nod2, nn); 1060219b2ee8SDavid du Colombier nn->type = t; 1061219b2ee8SDavid du Colombier 1062219b2ee8SDavid du Colombier gopcode(OAS, &nod1, Z, &nod2); 1063219b2ee8SDavid du Colombier regfree(&nod1); 1064219b2ee8SDavid du Colombier 1065219b2ee8SDavid du Colombier nod2.type = typ(TIND, t); 1066219b2ee8SDavid du Colombier 1067219b2ee8SDavid du Colombier nod1 = nod2; 1068219b2ee8SDavid du Colombier nod1.op = OIND; 1069219b2ee8SDavid du Colombier nod1.left = &nod2; 1070219b2ee8SDavid du Colombier nod1.right = Z; 1071219b2ee8SDavid du Colombier nod1.complex = 1; 1072219b2ee8SDavid du Colombier nod1.type = t; 1073219b2ee8SDavid du Colombier 1074219b2ee8SDavid du Colombier sugen(n, &nod1, w); 10753e12c5d1SDavid du Colombier return; 10763e12c5d1SDavid du Colombier } 10773e12c5d1SDavid du Colombier 10783e12c5d1SDavid du Colombier if(n->complex > nn->complex) { 10793e12c5d1SDavid du Colombier t = n->type; 10803e12c5d1SDavid du Colombier n->type = types[TLONG]; 10813e12c5d1SDavid du Colombier reglcgen(&nod1, n, Z); 10823e12c5d1SDavid du Colombier n->type = t; 10833e12c5d1SDavid du Colombier 10843e12c5d1SDavid du Colombier t = nn->type; 10853e12c5d1SDavid du Colombier nn->type = types[TLONG]; 10863e12c5d1SDavid du Colombier reglcgen(&nod2, nn, Z); 10873e12c5d1SDavid du Colombier nn->type = t; 10883e12c5d1SDavid du Colombier } else { 10893e12c5d1SDavid du Colombier t = nn->type; 10903e12c5d1SDavid du Colombier nn->type = types[TLONG]; 10913e12c5d1SDavid du Colombier reglcgen(&nod2, nn, Z); 10923e12c5d1SDavid du Colombier nn->type = t; 10933e12c5d1SDavid du Colombier 10943e12c5d1SDavid du Colombier t = n->type; 10953e12c5d1SDavid du Colombier n->type = types[TLONG]; 10963e12c5d1SDavid du Colombier reglcgen(&nod1, n, Z); 10973e12c5d1SDavid du Colombier n->type = t; 10983e12c5d1SDavid du Colombier } 10993e12c5d1SDavid du Colombier 11003e12c5d1SDavid du Colombier w /= SZ_LONG; 11013e12c5d1SDavid du Colombier if(w <= 5) { 11023e12c5d1SDavid du Colombier layout(&nod1, &nod2, w, 0, Z); 11033e12c5d1SDavid du Colombier goto out; 11043e12c5d1SDavid du Colombier } 11053e12c5d1SDavid du Colombier 11063e12c5d1SDavid du Colombier /* 11073e12c5d1SDavid du Colombier * minimize space for unrolling loop 11083e12c5d1SDavid du Colombier * 3,4,5 times. (6 or more is never minimum) 11093e12c5d1SDavid du Colombier * if small structure, try 2 also. 11103e12c5d1SDavid du Colombier */ 11113e12c5d1SDavid du Colombier c = 0; /* set */ 11123e12c5d1SDavid du Colombier m = 100; 11133e12c5d1SDavid du Colombier i = 3; 11143e12c5d1SDavid du Colombier if(w <= 15) 11153e12c5d1SDavid du Colombier i = 2; 11163e12c5d1SDavid du Colombier for(; i<=5; i++) 11173e12c5d1SDavid du Colombier if(i + w%i <= m) { 11183e12c5d1SDavid du Colombier c = i; 11193e12c5d1SDavid du Colombier m = c + w%c; 11203e12c5d1SDavid du Colombier } 11213e12c5d1SDavid du Colombier 11223e12c5d1SDavid du Colombier regalloc(&nod3, ®node, Z); 11233e12c5d1SDavid du Colombier layout(&nod1, &nod2, w%c, w/c, &nod3); 11243e12c5d1SDavid du Colombier 11253e12c5d1SDavid du Colombier pc1 = pc; 11263e12c5d1SDavid du Colombier layout(&nod1, &nod2, c, 0, Z); 11273e12c5d1SDavid du Colombier 1128219b2ee8SDavid du Colombier gopcode(OSUB, nodconst(1), Z, &nod3); 11293e12c5d1SDavid du Colombier nod1.op = OREGISTER; 11303e12c5d1SDavid du Colombier gopcode(OADD, nodconst(c*SZ_LONG), Z, &nod1); 11313e12c5d1SDavid du Colombier nod2.op = OREGISTER; 11323e12c5d1SDavid du Colombier gopcode(OADD, nodconst(c*SZ_LONG), Z, &nod2); 11333e12c5d1SDavid du Colombier 11343e12c5d1SDavid du Colombier gopcode(OEQ, &nod3, Z, Z); 11353e12c5d1SDavid du Colombier p->as = ABGTZ; 11363e12c5d1SDavid du Colombier patch(p, pc1); 11373e12c5d1SDavid du Colombier 11383e12c5d1SDavid du Colombier regfree(&nod3); 11393e12c5d1SDavid du Colombier out: 11403e12c5d1SDavid du Colombier regfree(&nod1); 11413e12c5d1SDavid du Colombier regfree(&nod2); 11423e12c5d1SDavid du Colombier } 11433e12c5d1SDavid du Colombier 11443e12c5d1SDavid du Colombier void 11453e12c5d1SDavid du Colombier layout(Node *f, Node *t, int c, int cv, Node *cn) 11463e12c5d1SDavid du Colombier { 11473e12c5d1SDavid du Colombier Node t1, t2; 11483e12c5d1SDavid du Colombier 11493e12c5d1SDavid du Colombier while(c > 3) { 11503e12c5d1SDavid du Colombier layout(f, t, 2, 0, Z); 11513e12c5d1SDavid du Colombier c -= 2; 11523e12c5d1SDavid du Colombier } 11533e12c5d1SDavid du Colombier 11543e12c5d1SDavid du Colombier regalloc(&t1, ®node, Z); 11553e12c5d1SDavid du Colombier regalloc(&t2, ®node, Z); 11567dd7cddfSDavid du Colombier t1.type = types[TLONG]; 11577dd7cddfSDavid du Colombier t2.type = types[TLONG]; 11583e12c5d1SDavid du Colombier if(c > 0) { 11593e12c5d1SDavid du Colombier gopcode(OAS, f, Z, &t1); 1160219b2ee8SDavid du Colombier f->xoffset += SZ_LONG; 11613e12c5d1SDavid du Colombier } 11623e12c5d1SDavid du Colombier if(cn != Z) 11633e12c5d1SDavid du Colombier gopcode(OAS, nodconst(cv), Z, cn); 11643e12c5d1SDavid du Colombier if(c > 1) { 11653e12c5d1SDavid du Colombier gopcode(OAS, f, Z, &t2); 1166219b2ee8SDavid du Colombier f->xoffset += SZ_LONG; 11673e12c5d1SDavid du Colombier } 11683e12c5d1SDavid du Colombier if(c > 0) { 11693e12c5d1SDavid du Colombier gopcode(OAS, &t1, Z, t); 1170219b2ee8SDavid du Colombier t->xoffset += SZ_LONG; 11713e12c5d1SDavid du Colombier } 11723e12c5d1SDavid du Colombier if(c > 2) { 11733e12c5d1SDavid du Colombier gopcode(OAS, f, Z, &t1); 1174219b2ee8SDavid du Colombier f->xoffset += SZ_LONG; 11753e12c5d1SDavid du Colombier } 11763e12c5d1SDavid du Colombier if(c > 1) { 11773e12c5d1SDavid du Colombier gopcode(OAS, &t2, Z, t); 1178219b2ee8SDavid du Colombier t->xoffset += SZ_LONG; 11793e12c5d1SDavid du Colombier } 11803e12c5d1SDavid du Colombier if(c > 2) { 11813e12c5d1SDavid du Colombier gopcode(OAS, &t1, Z, t); 1182219b2ee8SDavid du Colombier t->xoffset += SZ_LONG; 11833e12c5d1SDavid du Colombier } 11843e12c5d1SDavid du Colombier regfree(&t1); 11853e12c5d1SDavid du Colombier regfree(&t2); 11863e12c5d1SDavid du Colombier } 1187