diff options
author | Ilya Leoshkevich <iii@linux.ibm.com> | 2022-01-12 17:50:15 +0100 |
---|---|---|
committer | Thomas Huth <thuth@redhat.com> | 2022-01-17 08:36:33 +0100 |
commit | 6da170beda33f3e7f1d9242814acd9f428f0f0fb (patch) | |
tree | 2c7f85c0db55a58be39a94a9ecd9467d7bf79ea8 /target/s390x/s390x-internal.h | |
parent | df103c09bc2f549d36ba6313a69c18fc003ef1ee (diff) | |
download | qemu-6da170beda33f3e7f1d9242814acd9f428f0f0fb.zip qemu-6da170beda33f3e7f1d9242814acd9f428f0f0fb.tar.gz qemu-6da170beda33f3e7f1d9242814acd9f428f0f0fb.tar.bz2 |
target/s390x: Fix shifting 32-bit values for more than 31 bits
According to PoP, both 32- and 64-bit shifts use lowest 6 address
bits. The current code special-cases 32-bit shifts to use only 5 bits,
which is not correct. For example, shifting by 32 bits currently
preserves the initial value, however, it's supposed zero it out
instead.
Fix by merging sh32 and sh64 and adapting CC calculation to shift
values greater than 31.
Fixes: cbe24bfa91d2 ("target-s390: Convert SHIFT, ROTATE SINGLE")
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Message-Id: <20220112165016.226996-5-iii@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Diffstat (limited to 'target/s390x/s390x-internal.h')
-rw-r--r-- | target/s390x/s390x-internal.h | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/target/s390x/s390x-internal.h b/target/s390x/s390x-internal.h index 1a178ae..6fc8cad 100644 --- a/target/s390x/s390x-internal.h +++ b/target/s390x/s390x-internal.h @@ -193,8 +193,7 @@ enum cc_op { CC_OP_NZ_F128, /* FP dst != 0 (128bit) */ CC_OP_ICM, /* insert characters under mask */ - CC_OP_SLA_32, /* Calculate shift left signed (32bit) */ - CC_OP_SLA_64, /* Calculate shift left signed (64bit) */ + CC_OP_SLA, /* Calculate shift left signed */ CC_OP_FLOGR, /* find leftmost one */ CC_OP_LCBB, /* load count to block boundary */ CC_OP_VC, /* vector compare result */ |