|
@@ -1160,17 +1160,50 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
|
|
|
|
|
|
/* -- Binary ops -------------------------------------------------------- */
|
|
/* -- Binary ops -------------------------------------------------------- */
|
|
|
|
|
|
|
|
+ |.macro ins_arithpre, t0, t1
|
|
|
|
+ | // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8
|
|
|
|
+ ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN);
|
|
|
|
+ ||switch (vk) {
|
|
|
|
+ ||case 0:
|
|
|
|
+ | evlddx t0, BASE, RB
|
|
|
|
+ | checknum t0
|
|
|
|
+ | evlddx t1, KBASE, RC
|
|
|
|
+ | checkfail ->vmeta_arith_vn
|
|
|
|
+ || break;
|
|
|
|
+ ||case 1:
|
|
|
|
+ | evlddx t1, BASE, RB
|
|
|
|
+ | checknum t1
|
|
|
|
+ | evlddx t0, KBASE, RC
|
|
|
|
+ | checkfail ->vmeta_arith_nv
|
|
|
|
+ || break;
|
|
|
|
+ ||default:
|
|
|
|
+ | evlddx t0, BASE, RB
|
|
|
|
+ | evlddx t1, BASE, RC
|
|
|
|
+ | evmergehi TMP2, t0, t1
|
|
|
|
+ | checknum TMP2
|
|
|
|
+ | checkanyfail ->vmeta_arith_vv
|
|
|
|
+ || break;
|
|
|
|
+ ||}
|
|
|
|
+ |.endmacro
|
|
|
|
+ |
|
|
|
|
+ |.macro ins_arith, ins
|
|
|
|
+ | ins_arithpre TMP0, TMP1
|
|
|
|
+ | ins TMP0, TMP0, TMP1
|
|
|
|
+ | evstddx TMP0, BASE, RA
|
|
|
|
+ | ins_next
|
|
|
|
+ |.endmacro
|
|
|
|
+
|
|
case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:
|
|
case BC_ADDVN: case BC_ADDNV: case BC_ADDVV:
|
|
- | NYI
|
|
|
|
|
|
+ | ins_arith efdadd
|
|
break;
|
|
break;
|
|
case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:
|
|
case BC_SUBVN: case BC_SUBNV: case BC_SUBVV:
|
|
- | NYI
|
|
|
|
|
|
+ | ins_arith efdsub
|
|
break;
|
|
break;
|
|
case BC_MULVN: case BC_MULNV: case BC_MULVV:
|
|
case BC_MULVN: case BC_MULNV: case BC_MULVV:
|
|
- | NYI
|
|
|
|
|
|
+ | ins_arith efdmul
|
|
break;
|
|
break;
|
|
case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:
|
|
case BC_DIVVN: case BC_DIVNV: case BC_DIVVV:
|
|
- | NYI
|
|
|
|
|
|
+ | ins_arith efddiv
|
|
break;
|
|
break;
|
|
case BC_MODVN:
|
|
case BC_MODVN:
|
|
| NYI
|
|
| NYI
|
|
@@ -1179,7 +1212,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
|
|
| NYI
|
|
| NYI
|
|
break;
|
|
break;
|
|
case BC_POW:
|
|
case BC_POW:
|
|
- | NYI
|
|
|
|
|
|
+ | evlddx CARG2, BASE, RB
|
|
|
|
+ | evlddx CARG4, BASE, RC
|
|
|
|
+ | evmergehi CARG1, CARG4, CARG2
|
|
|
|
+ | checknum CARG1
|
|
|
|
+ | evmergehi CARG3, CARG4, CARG4
|
|
|
|
+ | checkanyfail ->vmeta_arith_vv
|
|
|
|
+ | bl extern pow
|
|
|
|
+ | evmergelo CRET2, CRET1, CRET2
|
|
|
|
+ | evstddx CRET2, BASE, RA
|
|
|
|
+ | ins_next
|
|
break;
|
|
break;
|
|
|
|
|
|
case BC_CAT:
|
|
case BC_CAT:
|