For a special opcode the address of the next insn was
not computed correctly. It would point to an insn in
the middle of the the pattern that identifies a special opcode.
That didn't hurt much but was confusing. Now fixed.
git-svn-id: svn://svn.valgrind.org/vex/trunk@2187 8f6e269a-dfd6-0310-a8e1-e2731360e62c
diff --git a/priv/guest_s390_toIR.c b/priv/guest_s390_toIR.c
index 8ec201b..ce0722c 100644
--- a/priv/guest_s390_toIR.c
+++ b/priv/guest_s390_toIR.c
@@ -12943,9 +12943,12 @@
/* Handle special instruction that follows that preamble. */
if (0) vex_printf("special function handling...\n");
- bytes += S390_SPECIAL_OP_PREAMBLE_SIZE;
- status = s390_decode_special_and_irgen(bytes);
- insn_length = S390_SPECIAL_OP_SIZE;
+
+ insn_length = S390_SPECIAL_OP_PREAMBLE_SIZE + S390_SPECIAL_OP_SIZE;
+ guest_IA_next_instr = guest_IA_curr_instr + insn_length;
+
+ status =
+ s390_decode_special_and_irgen(bytes + S390_SPECIAL_OP_PREAMBLE_SIZE);
} else {
/* Handle normal instructions. */
switch (insn_length) {