target-s390x: fix MOVE LONG instruction
authorAurelien Jarno <aurelien@aurel32.net>
Tue, 16 Jun 2015 20:57:47 +0000 (22:57 +0200)
committerAlexander Graf <agraf@suse.de>
Tue, 7 Jul 2015 15:51:47 +0000 (17:51 +0200)
The MOVE LONG instruction should pad the destination operand with the
byte from bit positions 32-39 of the source length (r2 + 1), not with
the same byte in the source address.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Alexander Graf <agraf@suse.de>
target-s390x/mem_helper.c

index 3ccbeb99e49f9ae0b1f831680faa22985ddd1198..9f0eb1e32bb1fc49bdd8b4b802f2850f2b896a2a 100644 (file)
@@ -550,7 +550,7 @@ uint32_t HELPER(mvcl)(CPUS390XState *env, uint32_t r1, uint32_t r2)
     uint64_t dest = get_address_31fix(env, r1);
     uint64_t srclen = env->regs[r2 + 1] & 0xffffff;
     uint64_t src = get_address_31fix(env, r2);
-    uint8_t pad = src >> 24;
+    uint8_t pad = env->regs[r2 + 1] >> 24;
     uint8_t v;
     uint32_t cc;