Aarch64: mask shift-amounts incorporated into reg-reg-shift ALU insts.

We had previously fixed a bug in which constant shift amounts should be
masked to modulo the number of bits in the operand; however, we did not
fix the analogous case for shifts incorporated into the second register
argument of ALU instructions that support integrated shifts.  This
failure to mask resulted in illegal instructions being generated, e.g.
in https://bugzilla.mozilla.org/show_bug.cgi?id=1653502. This PR fixes
the issue by masking the amount, as the shift semantics require.
This commit is contained in:
Chris Fallin
2020-07-17 14:51:33 -07:00
parent 8dd4ab2f1e
commit 9bd9c628aa
3 changed files with 26 additions and 2 deletions

View File

@@ -365,3 +365,18 @@ block0(v0: i64, v1: i64):
; nextln: mov sp, fp
; nextln: ldp fp, lr, [sp], #16
; nextln: ret
function %f25(i32, i32) -> i32 {
block0(v0: i32, v1: i32):
v2 = iconst.i32 53
v3 = ishl.i32 v0, v2
v4 = isub.i32 v1, v3
return v4
}
; check: stp fp, lr, [sp, #-16]!
; nextln: mov fp, sp
; nextln: sub w0, w1, w0, LSL 21
; nextln: mov sp, fp
; nextln: ldp fp, lr, [sp], #16
; nextln: ret