From a3bb1cee5d2b7c9b1ea1cfe4c89fe39f77a5e64e Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Wed, 11 Jan 2017 16:38:35 -0500 Subject: [PATCH] Add and use branch on count instructions where possible. --- dynasm/dasm_s390x.lua | 2 ++ src/vm_s390x.dasc | 24 ++++++------------------ 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/dynasm/dasm_s390x.lua b/dynasm/dasm_s390x.lua index bff135b3..8bf7084d 100644 --- a/dynasm/dasm_s390x.lua +++ b/dynasm/dasm_s390x.lua @@ -1240,6 +1240,8 @@ map_op = { mghi_2 = "0000a70d0000RI-a", -- RI-b mode instructions bras_2 = "0000a7050000RI-b", + brct_2 = "0000a7060000RI-b", + brctg_2 = "0000a7070000RI-b", -- RI-c mode instructions brc_2 = "0000a7040000RI-c", -- RIL-c diff --git a/src/vm_s390x.dasc b/src/vm_s390x.dasc index 404c4b32..918a52f7 100644 --- a/src/vm_s390x.dasc +++ b/src/vm_s390x.dasc @@ -1085,9 +1085,7 @@ static void build_subroutines(BuildCtx *ctx) | la RA, 8(RA) | lg RB, 0(RA) | stg RB, -16(RA) - | ahi RD, -1 - | jne <1 - | // TODO: replace with branch on count (brctg). + | brct RD, <1 |2: | llgf RD, SAVE_MULTRES | j ->fff_res_ @@ -3392,9 +3390,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | la RA, 8(RA) | stg RB, 0(TMPR1) | la TMPR1, 8(TMPR1) - | aghi RD, -1 - | jne <3 - | // TODO: replace decrement/branch with branch on count. + | brctg RD, <3 |4: | ins_next | @@ -3458,9 +3454,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | la RA, 8(RA) | stg RB, 0(KBASE) | la KBASE, 8(KBASE) - | // TODO: replace decrement/branch with brctg - | aghi NARGS:RD, -1 - | jne <2 + | brctg NARGS:RD, <2 | | lg LFUNC:RB, -16(BASE) |3: @@ -3698,9 +3692,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | lg RB, 0(KBASE, RA) | stg RB, -16(KBASE) | la KBASE, 8(KBASE) - | // TODO: replace with brctg RD, <2 once supported. - | aghi RD, -1 - | jne <2 + | brctg RD, <2 |3: | llgf RD, SAVE_MULTRES // Note: MULTRES may be >256. | llgc RB, PC_RB @@ -4037,9 +4029,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | stg KBASE, 0(RD) | la RD, 8(RD) | stg TMPR1, -16(RA) // Clear old fixarg slot (help the GC). - | aghi RB, -1 - | jne <1 - | // TODO: brctg instead of decrement/branch + | brctg RB, <1 |2: if (op == BC_JFUNCV) { | llgh RD, PC_RD @@ -4052,9 +4042,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) |3: // Clear missing parameters. | stg TMPR1, 0(RD) // TMPR1=LJ_TNIL (-1) here. | la RD, 8(RD) - | aghi RB, -1 - | jne <3 - | // TODO: brctg instead of decrement/branch + | brctg RB, <3 | j <2 break;