Index: lib/Target/Mips/MipsInstrInfo.cpp =================================================================== --- lib/Target/Mips/MipsInstrInfo.cpp +++ lib/Target/Mips/MipsInstrInfo.cpp @@ -538,15 +538,19 @@ } // 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, @@ -597,16 +601,19 @@ return verifyInsExtInstruction(MI, ErrInfo, 0, 32, 0, 32, 0, 32); case Mips::DINSM: case Mips::DINSM_MM64R6: - // 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: case Mips::DINSU_MM64R6: - // 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: case Mips::DEXT_MM64R6: return verifyInsExtInstruction(MI, ErrInfo, 0, 32, 0, 32, 0, 63); Index: test/CodeGen/Mips/fcopysign-f32-f64.ll =================================================================== --- test/CodeGen/Mips/fcopysign-f32-f64.ll +++ test/CodeGen/Mips/fcopysign-f32-f64.ll @@ -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 Index: test/CodeGen/Mips/fcopysign.ll =================================================================== --- test/CodeGen/Mips/fcopysign.ll +++ test/CodeGen/Mips/fcopysign.ll @@ -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: Index: test/CodeGen/Mips/instverify/dext-pos.mir =================================================================== --- test/CodeGen/Mips/instverify/dext-pos.mir +++ test/CodeGen/Mips/instverify/dext-pos.mir @@ -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 Index: test/CodeGen/Mips/instverify/dext-size.mir =================================================================== --- test/CodeGen/Mips/instverify/dext-size.mir +++ test/CodeGen/Mips/instverify/dext-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/dextm-pos-size.mir =================================================================== --- test/CodeGen/Mips/instverify/dextm-pos-size.mir +++ test/CodeGen/Mips/instverify/dextm-pos-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/dextm-pos.mir =================================================================== --- test/CodeGen/Mips/instverify/dextm-pos.mir +++ test/CodeGen/Mips/instverify/dextm-pos.mir @@ -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 Index: test/CodeGen/Mips/instverify/dextm-size.mir =================================================================== --- test/CodeGen/Mips/instverify/dextm-size.mir +++ test/CodeGen/Mips/instverify/dextm-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/dextu-pos-size.mir =================================================================== --- test/CodeGen/Mips/instverify/dextu-pos-size.mir +++ test/CodeGen/Mips/instverify/dextu-pos-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/dextu-pos.mir =================================================================== --- test/CodeGen/Mips/instverify/dextu-pos.mir +++ test/CodeGen/Mips/instverify/dextu-pos.mir @@ -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 @@ 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 Index: test/CodeGen/Mips/instverify/dextu-size-vaild.mir =================================================================== --- test/CodeGen/Mips/instverify/dextu-size-vaild.mir +++ test/CodeGen/Mips/instverify/dextu-size-vaild.mir @@ -1,9 +1,9 @@ -# RUN: not llc -march=mips64 -mcpu=mips64r2 -start-after=expand-isel-pseudos -stop-after=expand-isel-pseudos \ -# RUN: -verify-machineinstrs %s -o - 2>&1 | FileCheck %s +# 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: Size operand is out of range! +# CHECK-NOT: 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 @@ -42,7 +42,7 @@ liveins: %a0_64 %0 = COPY %a0_64 - %1 = DEXTU %0, 33, 67 + %1 = DEXTU %0, 63, 1 %v0_64 = COPY %1 RetRA implicit %v0_64 Index: test/CodeGen/Mips/instverify/dextu-size.mir =================================================================== --- test/CodeGen/Mips/instverify/dextu-size.mir +++ test/CodeGen/Mips/instverify/dextu-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/dins-pos-size.mir =================================================================== --- test/CodeGen/Mips/instverify/dins-pos-size.mir +++ test/CodeGen/Mips/instverify/dins-pos-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/dins-pos.mir =================================================================== --- test/CodeGen/Mips/instverify/dins-pos.mir +++ test/CodeGen/Mips/instverify/dins-pos.mir @@ -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 Index: test/CodeGen/Mips/instverify/dins-size.mir =================================================================== --- test/CodeGen/Mips/instverify/dins-size.mir +++ test/CodeGen/Mips/instverify/dins-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/dinsm-pos-size.mir =================================================================== --- test/CodeGen/Mips/instverify/dinsm-pos-size.mir +++ test/CodeGen/Mips/instverify/dinsm-pos-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/dinsm-pos.mir =================================================================== --- test/CodeGen/Mips/instverify/dinsm-pos.mir +++ test/CodeGen/Mips/instverify/dinsm-pos.mir @@ -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 Index: test/CodeGen/Mips/instverify/dinsm-size.mir =================================================================== --- test/CodeGen/Mips/instverify/dinsm-size.mir +++ test/CodeGen/Mips/instverify/dinsm-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/dinsu-pos-size.mir =================================================================== --- test/CodeGen/Mips/instverify/dinsu-pos-size.mir +++ test/CodeGen/Mips/instverify/dinsu-pos-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/dinsu-pos.mir =================================================================== --- test/CodeGen/Mips/instverify/dinsu-pos.mir +++ test/CodeGen/Mips/instverify/dinsu-pos.mir @@ -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 Index: test/CodeGen/Mips/instverify/dinsu-size.mir =================================================================== --- test/CodeGen/Mips/instverify/dinsu-size.mir +++ test/CodeGen/Mips/instverify/dinsu-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/ext-pos-size.mir =================================================================== --- test/CodeGen/Mips/instverify/ext-pos-size.mir +++ test/CodeGen/Mips/instverify/ext-pos-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/ext-pos.mir =================================================================== --- test/CodeGen/Mips/instverify/ext-pos.mir +++ test/CodeGen/Mips/instverify/ext-pos.mir @@ -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 Index: test/CodeGen/Mips/instverify/ext-size.mir =================================================================== --- test/CodeGen/Mips/instverify/ext-size.mir +++ test/CodeGen/Mips/instverify/ext-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/ins-pos-size.mir =================================================================== --- test/CodeGen/Mips/instverify/ins-pos-size.mir +++ test/CodeGen/Mips/instverify/ins-pos-size.mir @@ -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 Index: test/CodeGen/Mips/instverify/ins-pos.mir =================================================================== --- test/CodeGen/Mips/instverify/ins-pos.mir +++ test/CodeGen/Mips/instverify/ins-pos.mir @@ -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 Index: test/CodeGen/Mips/instverify/ins-size.mir =================================================================== --- test/CodeGen/Mips/instverify/ins-size.mir +++ test/CodeGen/Mips/instverify/ins-size.mir @@ -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