s390x TCG shift instruction fixes
Cherry-pick the following upstream commits: 521130f267 target/s390x: Fix SLDA sign bit index 57556b28af target/s390x: Fix SRDA CC calculation df103c09bc target/s390x: Fix cc_calc_sla_64() missing overflows 6da170beda target/s390x: Fix shifting 32-bit values for more than 31 bits
This commit is contained in:
@@ -339,36 +339,9 @@ static uint32_t cc_calc_icm(uint64_t mask, uint64_t val)
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t cc_calc_sla_32(uint32_t src, int shift)
|
||||
static uint32_t cc_calc_sla(uint64_t src, int shift)
|
||||
{
|
||||
uint32_t mask = ((1U << shift) - 1U) << (32 - shift);
|
||||
uint32_t sign = 1U << 31;
|
||||
uint32_t match;
|
||||
int32_t r;
|
||||
|
||||
/* Check if the sign bit stays the same. */
|
||||
if (src & sign) {
|
||||
match = mask;
|
||||
} else {
|
||||
match = 0;
|
||||
}
|
||||
if ((src & mask) != match) {
|
||||
/* Overflow. */
|
||||
return 3;
|
||||
}
|
||||
|
||||
r = ((src << shift) & ~sign) | (src & sign);
|
||||
if (r == 0) {
|
||||
return 0;
|
||||
} else if (r < 0) {
|
||||
return 1;
|
||||
}
|
||||
return 2;
|
||||
}
|
||||
|
||||
static uint32_t cc_calc_sla_64(uint64_t src, int shift)
|
||||
{
|
||||
uint64_t mask = ((1ULL << shift) - 1ULL) << (64 - shift);
|
||||
uint64_t mask = -1ULL << (63 - shift);
|
||||
uint64_t sign = 1ULL << 63;
|
||||
uint64_t match;
|
||||
int64_t r;
|
||||
@@ -516,11 +489,8 @@ static uint32_t do_calc_cc(CPUS390XState *env, uint32_t cc_op,
|
||||
case CC_OP_ICM:
|
||||
r = cc_calc_icm(src, dst);
|
||||
break;
|
||||
case CC_OP_SLA_32:
|
||||
r = cc_calc_sla_32(src, dst);
|
||||
break;
|
||||
case CC_OP_SLA_64:
|
||||
r = cc_calc_sla_64(src, dst);
|
||||
case CC_OP_SLA:
|
||||
r = cc_calc_sla(src, dst);
|
||||
break;
|
||||
case CC_OP_FLOGR:
|
||||
r = cc_calc_flogr(dst);
|
||||
|
||||
Reference in New Issue
Block a user