From 5dc644ad893080e2bf3ca3a1a7ecefeea6a7170d Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Wed, 28 Dec 2016 14:13:08 -0500 Subject: [PATCH] Implement LOOP. Allows for while and repeat loops, for example: x = 0 while x < 5 do print(x) x = x + 1 end -- prints: -- 0 -- 1 -- 2 -- 3 -- 4 --- src/vm_s390x.dasc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/vm_s390x.dasc b/src/vm_s390x.dasc index 450fce81..990ae921 100644 --- a/src/vm_s390x.dasc +++ b/src/vm_s390x.dasc @@ -2844,14 +2844,22 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | stg r0, 0(r0) | stg r0, 0(r0) break; + case BC_LOOP: - | stg r0, 0(r0) - | stg r0, 0(r0) + | ins_A // RA = base, RD = target (loop extent) + | // Note: RA/RD is only used by trace recorder to determine scope/extent + | // This opcode does NOT jump, it's only purpose is to detect a hot loop. + |.if JIT + | hotloop RBd + |.endif + | // Fall through. Assumes BC_ILOOP follows and ins_A is a no-op. break; + case BC_ILOOP: - | stg r0, 0(r0) - | stg r0, 0(r0) + | ins_A // RA = base, RD = target (loop extent) + | ins_next break; + case BC_JLOOP: | stg r0, 0(r0) | stg r0, 0(r0)