Mark Wielaard 5330df
commit 9545e9f96beda6e9f2205bdb3c3e96edaf8d9e2b
Mark Wielaard 5330df
Author: Andreas Arnez <arnez@linux.ibm.com>
Mark Wielaard 5330df
Date:   Tue Oct 30 17:06:38 2018 +0100
Mark Wielaard 5330df
Mark Wielaard 5330df
    Bug 400491 s390x: Sign-extend immediate operand of LOCHI and friends
Mark Wielaard 5330df
    
Mark Wielaard 5330df
    The VEX implementation of each of the z/Architecture instructions LOCHI,
Mark Wielaard 5330df
    LOCHHI, and LOCGHI treats the immediate 16-bit operand as an unsigned
Mark Wielaard 5330df
    integer instead of a signed integer.  This is fixed.
Mark Wielaard 5330df
Mark Wielaard 5330df
diff --git a/VEX/priv/guest_s390_toIR.c b/VEX/priv/guest_s390_toIR.c
Mark Wielaard 5330df
index 60b6081..9c4d79b 100644
Mark Wielaard 5330df
--- a/VEX/priv/guest_s390_toIR.c
Mark Wielaard 5330df
+++ b/VEX/priv/guest_s390_toIR.c
Mark Wielaard 5330df
@@ -16307,7 +16307,7 @@ static const HChar *
Mark Wielaard 5330df
 s390_irgen_LOCHHI(UChar r1, UChar m3, UShort i2, UChar unused)
Mark Wielaard 5330df
 {
Mark Wielaard 5330df
    next_insn_if(binop(Iop_CmpEQ32, s390_call_calculate_cond(m3), mkU32(0)));
Mark Wielaard 5330df
-   put_gpr_w0(r1, mkU32(i2));
Mark Wielaard 5330df
+   put_gpr_w0(r1, mkU32((UInt)(Int)(Short)i2));
Mark Wielaard 5330df
 
Mark Wielaard 5330df
    return "lochhi";
Mark Wielaard 5330df
 }
Mark Wielaard 5330df
@@ -16316,7 +16316,7 @@ static const HChar *
Mark Wielaard 5330df
 s390_irgen_LOCHI(UChar r1, UChar m3, UShort i2, UChar unused)
Mark Wielaard 5330df
 {
Mark Wielaard 5330df
    next_insn_if(binop(Iop_CmpEQ32, s390_call_calculate_cond(m3), mkU32(0)));
Mark Wielaard 5330df
-   put_gpr_w1(r1, mkU32(i2));
Mark Wielaard 5330df
+   put_gpr_w1(r1, mkU32((UInt)(Int)(Short)i2));
Mark Wielaard 5330df
 
Mark Wielaard 5330df
    return "lochi";
Mark Wielaard 5330df
 }
Mark Wielaard 5330df
@@ -16325,7 +16325,7 @@ static const HChar *
Mark Wielaard 5330df
 s390_irgen_LOCGHI(UChar r1, UChar m3, UShort i2, UChar unused)
Mark Wielaard 5330df
 {
Mark Wielaard 5330df
    next_insn_if(binop(Iop_CmpEQ32, s390_call_calculate_cond(m3), mkU32(0)));
Mark Wielaard 5330df
-   put_gpr_dw0(r1, mkU64(i2));
Mark Wielaard 5330df
+   put_gpr_dw0(r1, mkU64((UInt)(Int)(Short)i2));
Mark Wielaard 5330df
 
Mark Wielaard 5330df
    return "locghi";
Mark Wielaard 5330df
 }