/** * add the primary and secondary registers * if lval2 is int pointer and lval is not, scale lval * @param lval * @param lval2 */ void gen_add(LVALUE *lval, LVALUE *lval2) { gen_pop (); if (dbltest (lval2, lval)) { gen_swap (); gen_multiply_by_two (); gen_swap (); } output_line ("dad \td"); }
/** * add the primary and secondary registers * if lval2 is int pointer and lval is not, scale lval * @param lval * @param lval2 */ void gen_add(LVALUE *lval, LVALUE *lval2) { if (dbltest (lval2, lval)) { gen_swap (); gen_multiply_by_two(); gen_swap (); } output_line ("popadd r1 r2"); stkp = stkp + INTSIZE; }
/** * fetch the specified object type indirect through the primary * register into the primary register * @param typeobj object type */ void gen_get_indirect(char typeobj, int reg) { if (typeobj == CCHAR) { if (reg & DE_REG) { gen_swap(); } output_line("loadsb r1 (r1)"); } else if (typeobj == UCHAR) { if (reg & DE_REG) { gen_swap(); } //gen_call("cguchar"); output_line("loadub r1 (r1)"); } else { // int output_line("load r1 (r1)"); } }
/** * modify the stack pointer to the new value indicated * @param newstkp new value */ int gen_modify_stack(int newstkp) { int k; k = newstkp - stkp; if (k == 0) return (newstkp); if (k > 0) { if (k < 7) { if (k & 1) { output_line ("inx \tsp"); k--; } while (k) { output_line ("pop \tb"); k = k - INTSIZE; } return (newstkp); } } else { if (k > -7) { if (k & 1) { output_line ("dcx \tsp"); k++; } while (k) { output_line ("push\tb"); k = k + INTSIZE; } return (newstkp); } } gen_swap (); gen_immediate (); output_number (k); newline (); output_line ("dad \tsp"); output_line ("sphl"); gen_swap (); return (newstkp); }
/** * fetch the specified object type indirect through the primary * register into the primary register * @param typeobj object type */ void gen_get_indirect(char typeobj, int reg) { if (typeobj == CCHAR) { if (reg & DE_REG) { gen_swap(); } gen_call("ccgchar"); } else if (typeobj == UCHAR) { if (reg & DE_REG) { gen_swap(); } //gen_call("cguchar"); output_line("mov \tl,m"); output_line("mvi \th,0"); } else { // int if (uflag) { if (reg & HL_REG) { gen_swap(); } output_line("lhlx"); } else { gen_call("ccgint"); } } }
/** * compute the remainder (mod) of the secondary register * divided by the primary register * (remainder in primary, quotient in secondary) */ void gen_umod(void) { gen_udiv (); gen_swap (); }
/** * compute the remainder (mod) of the secondary register * divided by the primary register * (remainder in primary, quotient in secondary) */ void gen_mod(void) { gen_div (); gen_swap (); }