mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
[mips] Fix the target specific instruction verifier
Fix an off by one error in the bounds checking for 'dinsu' and update the ranges in the test comments so that they are accurate. Reviewers: atanasyan https://reviews.llvm.org/D41183 llvm-svn: 320974
This commit is contained in:
parent
5db6217e15
commit
91a35077f1
@ -538,15 +538,19 @@ bool MipsInstrInfo::findCommutedOpIndices(MachineInstr &MI, unsigned &SrcOpIdx1,
|
||||
}
|
||||
|
||||
// ins, ext, dext*, dins have the following constraints:
|
||||
// 0 <= pos < X
|
||||
// 0 < size <= X
|
||||
// 0 < pos+size <= x
|
||||
// X <= pos < Y
|
||||
// X < size <= Y
|
||||
// X < pos+size <= Y
|
||||
//
|
||||
// dinsm and dinsm have the following contraints:
|
||||
// 0 <= pos < X
|
||||
// 0 <= size <= X
|
||||
// 0 < pos+size <= x
|
||||
|
||||
// dinsm and dinsu have the following constraints:
|
||||
// X <= pos < Y
|
||||
// X <= size <= Y
|
||||
// X < pos+size <= Y
|
||||
//
|
||||
// The callee of verifyInsExtInstruction however gives the bounds of
|
||||
// dins[um] like the other (d)ins (d)ext(um) instructions, so that this
|
||||
// function doesn't have to vary it's behaviour based on the instruction
|
||||
// being checked.
|
||||
static bool verifyInsExtInstruction(const MachineInstr &MI, StringRef &ErrInfo,
|
||||
const int64_t PosLow, const int64_t PosHigh,
|
||||
const int64_t SizeLow,
|
||||
@ -595,15 +599,18 @@ bool MipsInstrInfo::verifyInstruction(const MachineInstr &MI,
|
||||
case Mips::DINS:
|
||||
return verifyInsExtInstruction(MI, ErrInfo, 0, 32, 0, 32, 0, 32);
|
||||
case Mips::DINSM:
|
||||
// The ISA spec has a subtle difference here in that it says:
|
||||
// 2 <= size <= 64 for 'dinsm', so we change the bounds so that it
|
||||
// is in line with the rest of instructions.
|
||||
// The ISA spec has a subtle difference difference between dinsm and dextm
|
||||
// in that it says:
|
||||
// 2 <= size <= 64 for 'dinsm' but 'dextm' has 32 < size <= 64.
|
||||
// To make the bounds checks similar, the range 1 < size <= 64 is checked
|
||||
// for 'dinsm'.
|
||||
return verifyInsExtInstruction(MI, ErrInfo, 0, 32, 1, 64, 32, 64);
|
||||
case Mips::DINSU:
|
||||
// The ISA spec has a subtle difference here in that it says:
|
||||
// 2 <= size <= 64 for 'dinsm', so we change the bounds so that it
|
||||
// is in line with the rest of instructions.
|
||||
return verifyInsExtInstruction(MI, ErrInfo, 32, 64, 1, 32, 32, 64);
|
||||
// The ISA spec has a subtle difference between dinsu and dextu in that
|
||||
// the size range of dinsu is specified as 1 <= size <= 32 whereas size
|
||||
// for dextu is 0 < size <= 32. The range checked for dinsu here is
|
||||
// 0 < size <= 32, which is equivalent and similar to dextu.
|
||||
return verifyInsExtInstruction(MI, ErrInfo, 32, 64, 0, 32, 32, 64);
|
||||
case Mips::DEXT:
|
||||
return verifyInsExtInstruction(MI, ErrInfo, 0, 32, 0, 32, 0, 63);
|
||||
case Mips::DEXTM:
|
||||
|
@ -1,9 +1,9 @@
|
||||
; RUN: llc < %s -march=mips64el -mcpu=mips4 -target-abi=n64 | \
|
||||
; RUN: FileCheck %s -check-prefixes=ALL,64
|
||||
; RUN: llc < %s -march=mips64el -mcpu=mips64 -target-abi=n64 | \
|
||||
; RUN: FileCheck %s -check-prefixes=ALL,64
|
||||
; RUN: llc < %s -march=mips64el -mcpu=mips64r2 -target-abi=n64 | \
|
||||
; RUN: FileCheck %s -check-prefixes=ALL,64R2
|
||||
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips4 \
|
||||
; RUN: -target-abi=n64 | FileCheck %s -check-prefixes=ALL,64
|
||||
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips64 \
|
||||
; RUN: -target-abi=n64 | FileCheck %s -check-prefixes=ALL,64
|
||||
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips64r2 \
|
||||
; RUN: -target-abi=n64 | FileCheck %s -check-prefixes=ALL,64R2
|
||||
|
||||
declare double @copysign(double, double) nounwind readnone
|
||||
|
||||
|
@ -1,8 +1,13 @@
|
||||
; RUN: llc < %s -march=mipsel -mcpu=mips32 | FileCheck %s -check-prefix=32
|
||||
; RUN: llc < %s -march=mipsel -mcpu=mips32r2 | FileCheck %s -check-prefix=32R2
|
||||
; RUN: llc < %s -march=mips64el -mcpu=mips4 -target-abi=n64 | FileCheck %s -check-prefix=64
|
||||
; RUN: llc < %s -march=mips64el -mcpu=mips64 -target-abi=n64 | FileCheck %s -check-prefix=64
|
||||
; RUN: llc < %s -march=mips64el -mcpu=mips64r2 -target-abi=n64 | FileCheck %s -check-prefix=64R2
|
||||
; RUN: llc < %s -verify-machineinstrs -march=mipsel -mcpu=mips32 \
|
||||
; RUN: | FileCheck %s -check-prefix=32
|
||||
; RUN: llc < %s -verify-machineinstrs -march=mipsel -mcpu=mips32r2 \
|
||||
; RUN: | FileCheck %s -check-prefix=32R2
|
||||
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips4 -target-abi=n64 \
|
||||
; RUN: | FileCheck %s -check-prefix=64
|
||||
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips64 -target-abi=n64 \
|
||||
; RUN: | FileCheck %s -check-prefix=64
|
||||
; RUN: llc < %s -verify-machineinstrs -march=mips64el -mcpu=mips64r2 -target-abi=n64 \
|
||||
; RUN: | FileCheck %s -check-prefix=64R2
|
||||
|
||||
define double @func0(double %d0, double %d1) nounwind readnone {
|
||||
entry:
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the position operand is in range 0..31
|
||||
# Check that the machine verifier checks the position operand is in the range 0..31
|
||||
---
|
||||
name: dext
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Size operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the size operand is in range 0..32
|
||||
# Check that the machine verifier checks the size operand is in the range 1..32
|
||||
---
|
||||
name: dext
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position + Size is out of range!
|
||||
|
||||
# Check that the machine verifier checks the pos + size is in range 32..64
|
||||
# Check that the machine verifier checks the pos + size is in the range 33..64
|
||||
---
|
||||
name: dextm
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the position operand is in range 0..31
|
||||
# Check that the machine verifier checks the position operand is in the range 0..31
|
||||
---
|
||||
name: dextm
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Size operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the size operand is in range 32..64
|
||||
# Check that the machine verifier checks the size operand is in the range 33..64
|
||||
---
|
||||
name: dextm
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position + Size is out of range!
|
||||
|
||||
# Check that the machine verifier checks the pos + size is in range 32..64
|
||||
# Check that the machine verifier checks the pos + size is in the range 33..64
|
||||
---
|
||||
name: dextu
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the position operand is in range 32..63
|
||||
# Check that the machine verifier checks the position operand is in the range 32..63
|
||||
---
|
||||
name: dextu
|
||||
alignment: 3
|
||||
@ -42,7 +42,7 @@ body: |
|
||||
liveins: %a0_64
|
||||
|
||||
%0 = COPY %a0_64
|
||||
%1 = DEXTU %0, 65, 5
|
||||
%1 = DEXTU %0, 64, 5
|
||||
%v0_64 = COPY %1
|
||||
RetRA implicit %v0_64
|
||||
|
||||
|
49
test/CodeGen/Mips/instverify/dextu-size-valid.mir
Normal file
49
test/CodeGen/Mips/instverify/dextu-size-valid.mir
Normal file
@ -0,0 +1,49 @@
|
||||
# RUN: llc -march=mips64 -mcpu=mips64r2 -start-after=expand-isel-pseudos -stop-after=expand-isel-pseudos \
|
||||
# RUN: -verify-machineinstrs %s -o - 2>&1 | FileCheck %s
|
||||
|
||||
# CHECK-NOT: Size operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the size operand is in the range 1..32
|
||||
---
|
||||
name: dextu
|
||||
alignment: 3
|
||||
exposesReturnsTwice: false
|
||||
legalized: false
|
||||
regBankSelected: false
|
||||
selected: false
|
||||
tracksRegLiveness: true
|
||||
registers:
|
||||
- { id: 0, class: gpr64, preferred-register: '' }
|
||||
- { id: 1, class: gpr64, preferred-register: '' }
|
||||
liveins:
|
||||
- { reg: '%a0_64', virtual-reg: '%0' }
|
||||
frameInfo:
|
||||
isFrameAddressTaken: false
|
||||
isReturnAddressTaken: false
|
||||
hasStackMap: false
|
||||
hasPatchPoint: false
|
||||
stackSize: 0
|
||||
offsetAdjustment: 0
|
||||
maxAlignment: 1
|
||||
adjustsStack: false
|
||||
hasCalls: false
|
||||
stackProtector: ''
|
||||
maxCallFrameSize: 4294967295
|
||||
hasOpaqueSPAdjustment: false
|
||||
hasVAStart: false
|
||||
hasMustTailInVarArgFunc: false
|
||||
savePoint: ''
|
||||
restorePoint: ''
|
||||
fixedStack:
|
||||
stack:
|
||||
constants:
|
||||
body: |
|
||||
bb.0.entry:
|
||||
liveins: %a0_64
|
||||
|
||||
%0 = COPY %a0_64
|
||||
%1 = DEXTU %0, 63, 1
|
||||
%v0_64 = COPY %1
|
||||
RetRA implicit %v0_64
|
||||
|
||||
...
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Size operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the size operand is in range 0..32
|
||||
# Check that the machine verifier checks the size operand is in the range 1..32
|
||||
---
|
||||
name: dextu
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position + Size is out of range!
|
||||
|
||||
# Check that the machine verifier checks the pos + size is in range 0..32
|
||||
# Check that the machine verifier checks the pos + size is in the range 1..32
|
||||
---
|
||||
name: dins
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the position operand is in range 0..31
|
||||
# Check that the machine verifier checks the position operand is in the range 0..31
|
||||
---
|
||||
name: dins
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Size operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the size operand is in range 0..32
|
||||
# Check that the machine verifier checks the size operand is in the range 1..32
|
||||
---
|
||||
name: dins
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position + Size is out of range!
|
||||
|
||||
# Check that the machine verifier checks the pos + size is in range 32..64
|
||||
# Check that the machine verifier checks the pos + size is in the range 33..64
|
||||
---
|
||||
name: dinsu
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the position operand is in range 0..31
|
||||
# Check that the machine verifier checks the position operand is in the range 0..31
|
||||
---
|
||||
name: dinsm
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Size operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the size operand is in range 2..64
|
||||
# Check that the machine verifier checks the size operand is in the range 2..64
|
||||
---
|
||||
name: dinsm
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position + Size is out of range!
|
||||
|
||||
# Check that the machine verifier checks the pos + size is in range 32..64
|
||||
# Check that the machine verifier checks the pos + size is in the range 33..64
|
||||
---
|
||||
name: dinsu
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the position operand is in range 32..63
|
||||
# Check that the machine verifier checks the position operand is in the range 32..63
|
||||
---
|
||||
name: dinsu
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Size operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the size operand is in range 0..32
|
||||
# Check that the machine verifier checks the size operand is in the range 1..32
|
||||
---
|
||||
name: dinsu
|
||||
alignment: 3
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position + Size is out of range!
|
||||
|
||||
# Check that the machine verifier checks the pos + size is in range 0..32
|
||||
# Check that the machine verifier checks the pos + size is in the range 1..32
|
||||
---
|
||||
name: f
|
||||
alignment: 2
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the position operand is in range 0..31
|
||||
# Check that the machine verifier checks the position operand is in the range 0..31
|
||||
---
|
||||
name: f
|
||||
alignment: 2
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Size operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the size operand is in range 0..32
|
||||
# Check that the machine verifier checks the size operand is in the range 1..32
|
||||
---
|
||||
name: f
|
||||
alignment: 2
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position + Size is out of range!
|
||||
|
||||
# Check that the machine verifier checks the pos + size is in range 0..32
|
||||
# Check that the machine verifier checks the pos + size is in the range 1..32
|
||||
---
|
||||
name: f
|
||||
alignment: 2
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Position operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the position operand is in range 0..31
|
||||
# Check that the machine verifier checks the position operand is in the range 0..31
|
||||
---
|
||||
name: f
|
||||
alignment: 2
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
# CHECK: Size operand is out of range!
|
||||
|
||||
# Check that the machine verifier checks the size operand is in range 0..32
|
||||
# Check that the machine verifier checks the size operand is in the range 1..32
|
||||
---
|
||||
name: f
|
||||
alignment: 2
|
||||
|
Loading…
Reference in New Issue
Block a user