From 29223bb979d87be2623cf34f3500a011e183fc93 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Thu, 29 Dec 2016 11:10:18 -0500 Subject: [PATCH] Implement POW. Allows use of the '^' operator, for example: x = 2 y = 3 print(x ^ y) -- prints 8 --- src/vm_s390x.dasc | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) 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)