diff --git a/src/vm_s390x.dasc b/src/vm_s390x.dasc index f5055a40..99200bc6 100644 --- a/src/vm_s390x.dasc +++ b/src/vm_s390x.dasc @@ -2059,9 +2059,24 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | j ->vmeta_arith_vvo break; case BC_POW: - | stg r0, 0(r0) - | stg r0, 0(r0) + | ins_ABC + | sllg RB, RB, 3(r0) + | sllg RC, RC, 3(r0) + | ld FARG1, 0(RB, BASE) + | ld FARG2, 0(RC, BASE) + | lg TMPR2, 0(RB, BASE) + | checknumtp TMPR2, ->vmeta_arith_vvo + | lg TMPR2, 0(RC, BASE) + | checknumtp TMPR2, ->vmeta_arith_vvo + | lgr RB, BASE // TODO: redundant, BASE is currently callee-saved. + | brasl r14, extern pow // double pow(double x, double y), result in f0. + | llgc RA, PC_RA + | lgr BASE, RB + | sllg RA, RA, 3(r0) + | std f0, 0(RA, BASE) + | ins_next break; + case BC_CAT: | stg r0, 0(r0) | stg r0, 0(r0)