int gensub(int p1, int p2, int swapped) { int rp = PINT; gentext(); if (cgload2() || !swapped) cgswap(); if (!inttype(p1) && !inttype(p2) && p1 != p2) error("incompatible pointer types in binary '-'", NULL); if (ptr(p1) && !ptr(p2)) { if (needscale(p1)) { if ( (p1 & STCMASK) == STCPTR || (p1 & STCMASK) == UNIPTR ) cgscale2by(objsize(deref(p1), TVARIABLE, 1)); else cgscale2(); } rp = p1; } cgsub(); if (needscale(p1) && needscale(p2)) { if ( (p1 & STCMASK) == STCPTR || (p1 & STCMASK) == UNIPTR ) cgunscaleby(objsize(deref(p1), TVARIABLE, 1)); else cgunscale(); } return rp; }
int genadd(int p1, int p2, int swapped) { int rp = PINT, t; gentext(); if (cgload2() || !swapped) { t = p1; p1 = p2; p2 = t; } if (ptr(p1)) { if (needscale(p1)) { if ( (p1 & STCMASK) == STCPTR || (p1 & STCMASK) == UNIPTR ) cgscale2by(objsize(deref(p1), TVARIABLE, 1)); else cgscale2(); } rp = p1; } else if (ptr(p2)) { if (needscale(p2)) { if ( (p2 & STCMASK) == STCPTR || (p2 & STCMASK) == UNIPTR ) cgscaleby(objsize(deref(p2), TVARIABLE, 1)); else cgscale(); } rp = p2; } cgadd(); return rp; }
void geninc(int *lv, int inc, int pre) { int y, b; gentext(); y = lv[LVSYM]; if (needscale(lv[LVPRIM])) { genincptr(lv, inc, pre); return; } b = PCHAR == lv[LVPRIM]; /* will duplicate move to aux register in (*char)++ */ commit(); if (!y && !pre) cgldinc(); if (!pre) { genrval(lv); commit(); } if (!y) { if (pre) if (inc) b? cginc1ib(): cginc1iw(); else b? cgdec1ib(): cgdec1iw(); else if (inc) b? cginc2ib(): cginc2iw(); else b? cgdec2ib(): cgdec2iw(); } else if (CAUTO == Stcls[y]) { if (inc) b? cginclb(Vals[y]): cginclw(Vals[y]); else b? cgdeclb(Vals[y]): cgdeclw(Vals[y]); } else if (CLSTATC == Stcls[y]) { if (inc) b? cgincsb(Vals[y]): cgincsw(Vals[y]); else b? cgdecsb(Vals[y]): cgdecsw(Vals[y]); } else { if (inc) b? cgincgb(gsym(Names[y])): cgincgw(gsym(Names[y])); else b? cgdecgb(gsym(Names[y])): cgdecgw(gsym(Names[y])); } if (pre) genrval(lv); }
void geninc(int *lv, int inc, int pre) { int y, b; gentext(); y = lv[LVSYM]; if (needscale(lv[LVPRIM])) { genincptr(lv, inc, pre); return; } b = PCHAR == lv[LVPRIM]; commit(); if (!y && !pre) cgldinc(); if (!pre) { rvalue(lv); commit(); } if (!y) { if (pre) { if (inc) b ? cginc1ib() : cginc1iw(); else b ? cgdec1ib() : cgdec1iw(); } else { if (inc) b ? cginc2ib() : cginc2iw(); else b ? cgdec2ib() : cgdec2iw(); } } else if (CAUTO == symbols[y].stcl) { if (inc) b ? cginclb(symbols[y].value) : cginclw(symbols[y].value); else b ? cgdeclb(symbols[y].value) : cgdeclw(symbols[y].value); } else if (CLSTATC == symbols[y].stcl) { if (inc) b ? cgincsb(symbols[y].value) : cgincsw(symbols[y].value); else b ? cgdecsb(symbols[y].value) : cgdecsw(symbols[y].value); } else { if (inc) b ? cgincgb(gsym(symbols[y].name)) : cgincgw(gsym(symbols[y].name)); else b ? cgdecgb(gsym(symbols[y].name)) : cgdecgw(gsym(symbols[y].name)); } if (pre) rvalue(lv); }