diff options
| author | Mikhail Maltsev <mikhail.maltsev@arm.com> | 2019-07-31 14:22:45 +0000 |
|---|---|---|
| committer | Mikhail Maltsev <mikhail.maltsev@arm.com> | 2019-07-31 14:22:45 +0000 |
| commit | 806231ecc3964e01a439ecd4d6c38e2fa6b056d1 (patch) | |
| tree | e287ab42a36f7ebdd44d5cff5f6e8f781143b0fd /llvm | |
| parent | 64d7af09f53d125be4bb5af19b7f6389e3ef024e (diff) | |
| download | bcm5719-llvm-806231ecc3964e01a439ecd4d6c38e2fa6b056d1.tar.gz bcm5719-llvm-806231ecc3964e01a439ecd4d6c38e2fa6b056d1.zip | |
[ARM] Reject CSEL instructions with invalid operands
Summary:
According to the Armv8.1-M manual CSEL, CSINC, CSINV and CSNEG are
"constrained unpredictable" when SP is used as the source register Rn.
The assembler should diagnose this case.
Reviewers: momchil.velikov, dmgreen, ostannard, simon_tatham, t.p.northover
Reviewed By: ostannard
Subscribers: javed.absar, kristof.beyls, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D65505
llvm-svn: 367433
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrThumb2.td | 2 | ||||
| -rw-r--r-- | llvm/test/MC/ARM/thumbv8.1m.s | 18 | ||||
| -rw-r--r-- | llvm/test/MC/Disassembler/ARM/thumbv8.1m.s | 25 |
3 files changed, 31 insertions, 14 deletions
diff --git a/llvm/lib/Target/ARM/ARMInstrThumb2.td b/llvm/lib/Target/ARM/ARMInstrThumb2.td index b9691efa3e1..7e74a0a3845 100644 --- a/llvm/lib/Target/ARM/ARMInstrThumb2.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb2.td @@ -5235,7 +5235,7 @@ def t2LoopEnd : } // end isNotDuplicable class CS<string iname, bits<4> opcode, list<dag> pattern=[]> - : V8_1MI<(outs rGPR:$Rd), (ins GPRwithZR:$Rn, GPRwithZRnosp:$Rm, pred_noal:$fcond), + : V8_1MI<(outs rGPR:$Rd), (ins GPRwithZRnosp:$Rn, GPRwithZRnosp:$Rm, pred_noal:$fcond), AddrModeNone, NoItinerary, iname, "$Rd, $Rn, $Rm, $fcond", "", pattern> { bits<4> Rd; bits<4> Rm; diff --git a/llvm/test/MC/ARM/thumbv8.1m.s b/llvm/test/MC/ARM/thumbv8.1m.s index b24f998a1f0..f4f30566642 100644 --- a/llvm/test/MC/ARM/thumbv8.1m.s +++ b/llvm/test/MC/ARM/thumbv8.1m.s @@ -1117,6 +1117,24 @@ csinv lr, r2, r2, mi # CHECK-NOLOB: csel r0, r0, r1, eq @ encoding: [0x50,0xea,0x01,0x80] csel r0, r0, r1, eq +// ERROR: :[[@LINE+1]]:{{[0-9]+}}: error: operand must be a register in range [r0, r12] or r14 +csel sp, r0, r1, eq + +// ERROR: :[[@LINE+1]]:{{[0-9]+}}: error: operand must be a register in range [r0, r12] or r14 or zr +csel r0, sp, r1, eq + +// ERROR: :[[@LINE+1]]:{{[0-9]+}}: error: operand must be a register in range [r0, r12] or r14 or zr +csinc r0, sp, r1, eq + +// ERROR: :[[@LINE+1]]:{{[0-9]+}}: error: operand must be a register in range [r0, r12] or r14 or zr +csinv r0, sp, r1, eq + +// ERROR: :[[@LINE+1]]:{{[0-9]+}}: error: operand must be a register in range [r0, r12] or r14 or zr +csneg r0, sp, r1, eq + +// ERROR: :[[@LINE+1]]:{{[0-9]+}}: error: operand must be a register in range [r0, r12] or r14 or zr +csel r0, r0, sp, eq + // ERROR: :[[@LINE+2]]:{{[0-9]+}}: error: instructions in IT block must be predicable it eq csel r0, r0, r1, eq diff --git a/llvm/test/MC/Disassembler/ARM/thumbv8.1m.s b/llvm/test/MC/Disassembler/ARM/thumbv8.1m.s index 68dcbd23a04..845c50ef9e6 100644 --- a/llvm/test/MC/Disassembler/ARM/thumbv8.1m.s +++ b/llvm/test/MC/Disassembler/ARM/thumbv8.1m.s @@ -42,8 +42,7 @@ # ERROR: [[@LINE-2]]:2: warning: potentially undefined instruction encoding [0x5d,0xea,0x02,0x80] -# CHECK: csel r0, sp, r2, eq @ encoding: [0x5d,0xea,0x02,0x80] -# ERROR: [[@LINE-2]]:2: warning: potentially undefined instruction encoding +# ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding [0x51,0xea,0x0d,0x80] # ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding @@ -52,37 +51,37 @@ # ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding [0x5d 0xea 0x22 0x9e] -# ERROR: [[@LINE-1]]:2: warning: potentially undefined instruction encoding +# ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding [0x5d 0xea 0x47 0x9e] -# ERROR: [[@LINE-1]]:2: warning: potentially undefined instruction encoding +# ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding [0x5d 0xea 0x3c 0xae] -# ERROR: [[@LINE-1]]:2: warning: potentially undefined instruction encoding +# ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding [0x5d 0xea 0x3a 0xbe] -# ERROR: [[@LINE-1]]:2: warning: potentially undefined instruction encoding +# ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding [0x5d 0xea 0x7b 0x89] -# ERROR: [[@LINE-1]]:2: warning: potentially undefined instruction encoding +# ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding [0x5d 0xea 0x1f 0x9e] -# ERROR: [[@LINE-1]]:2: warning: potentially undefined instruction encoding +# ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding [0x5d 0xea 0x3f 0xae] -# ERROR: [[@LINE-1]]:2: warning: potentially undefined instruction encoding +# ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding [0x5d 0xea 0xd7 0x9e] -# ERROR: [[@LINE-1]]:2: warning: potentially undefined instruction encoding +# ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding [0x5d 0xea 0x2f 0xae] -# ERROR: [[@LINE-1]]:2: warning: potentially undefined instruction encoding +# ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding [0x5d 0xea 0x42 0xae] -# ERROR: [[@LINE-1]]:2: warning: potentially undefined instruction encoding +# ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding [0x5d 0xea 0x7b 0xbe] -# ERROR: [[@LINE-1]]:2: warning: potentially undefined instruction encoding +# ERROR: [[@LINE-1]]:2: warning: invalid instruction encoding [0x52 0xea 0x22 0x9d] # ERROR: [[@LINE-1]]:2: warning: potentially undefined instruction encoding |

