Commit 21f78bb1 by Jaydeep Patil Committed by Jim Stichnoth

[SubZero] Utilize instructions with immediate operands

This patch optimizes code generation of instructions with 16-bit immediate operands R=stichnot@chromium.org Review URL: https://codereview.chromium.org/2478113003 . Patch from Jaydeep Patil <jaydeep.patil@imgtec.com>.
parent 3da9f657
...@@ -2553,30 +2553,75 @@ void TargetMIPS32::lowerArithmetic(const InstArithmetic *Instr) { ...@@ -2553,30 +2553,75 @@ void TargetMIPS32::lowerArithmetic(const InstArithmetic *Instr) {
Variable *T = makeReg(Dest->getType()); Variable *T = makeReg(Dest->getType());
Variable *Src0R = legalizeToReg(Src0); Variable *Src0R = legalizeToReg(Src0);
Variable *Src1R = legalizeToReg(Src1); Variable *Src1R = nullptr;
uint32_t Value = 0;
bool IsSrc1Imm16 = false;
switch (Instr->getOp()) {
case InstArithmetic::Add:
case InstArithmetic::And:
case InstArithmetic::Or:
case InstArithmetic::Xor:
case InstArithmetic::Sub:
case InstArithmetic::Shl:
case InstArithmetic::Lshr:
case InstArithmetic::Ashr: {
auto *Const32 = llvm::dyn_cast<ConstantInteger32>(Src1);
if (Const32 != nullptr && isInt<16>(int32_t(Const32->getValue()))) {
IsSrc1Imm16 = true;
Value = Const32->getValue();
} else {
Src1R = legalizeToReg(Src1);
}
break;
}
default:
Src1R = legalizeToReg(Src1);
break;
}
constexpr uint32_t DivideByZeroTrapCode = 7; constexpr uint32_t DivideByZeroTrapCode = 7;
switch (Instr->getOp()) { switch (Instr->getOp()) {
case InstArithmetic::_num: case InstArithmetic::_num:
break; break;
case InstArithmetic::Add: case InstArithmetic::Add:
_addu(T, Src0R, Src1R); if (IsSrc1Imm16) {
_addiu(T, Src0R, Value);
} else {
_addu(T, Src0R, Src1R);
}
_mov(Dest, T); _mov(Dest, T);
return; return;
case InstArithmetic::And: case InstArithmetic::And:
_and(T, Src0R, Src1R); if (IsSrc1Imm16) {
_andi(T, Src0R, Value);
} else {
_and(T, Src0R, Src1R);
}
_mov(Dest, T); _mov(Dest, T);
return; return;
case InstArithmetic::Or: case InstArithmetic::Or:
_or(T, Src0R, Src1R); if (IsSrc1Imm16) {
_ori(T, Src0R, Value);
} else {
_or(T, Src0R, Src1R);
}
_mov(Dest, T); _mov(Dest, T);
return; return;
case InstArithmetic::Xor: case InstArithmetic::Xor:
_xor(T, Src0R, Src1R); if (IsSrc1Imm16) {
_xori(T, Src0R, Value);
} else {
_xor(T, Src0R, Src1R);
}
_mov(Dest, T); _mov(Dest, T);
return; return;
case InstArithmetic::Sub: case InstArithmetic::Sub:
_subu(T, Src0R, Src1R); if (IsSrc1Imm16) {
_addiu(T, Src0R, -Value);
} else {
_subu(T, Src0R, Src1R);
}
_mov(Dest, T); _mov(Dest, T);
return; return;
case InstArithmetic::Mul: { case InstArithmetic::Mul: {
...@@ -2585,7 +2630,11 @@ void TargetMIPS32::lowerArithmetic(const InstArithmetic *Instr) { ...@@ -2585,7 +2630,11 @@ void TargetMIPS32::lowerArithmetic(const InstArithmetic *Instr) {
return; return;
} }
case InstArithmetic::Shl: { case InstArithmetic::Shl: {
_sllv(T, Src0R, Src1R); if (IsSrc1Imm16) {
_sll(T, Src0R, Value);
} else {
_sllv(T, Src0R, Src1R);
}
_mov(Dest, T); _mov(Dest, T);
return; return;
} }
...@@ -2595,15 +2644,25 @@ void TargetMIPS32::lowerArithmetic(const InstArithmetic *Instr) { ...@@ -2595,15 +2644,25 @@ void TargetMIPS32::lowerArithmetic(const InstArithmetic *Instr) {
if (Dest->getType() != IceType_i32) { if (Dest->getType() != IceType_i32) {
T0R = makeReg(IceType_i32); T0R = makeReg(IceType_i32);
lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R)); lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R));
T1R = makeReg(IceType_i32); if (!IsSrc1Imm16) {
lowerCast(InstCast::create(Func, InstCast::Zext, T1R, Src1R)); T1R = makeReg(IceType_i32);
lowerCast(InstCast::create(Func, InstCast::Zext, T1R, Src1R));
}
}
if (IsSrc1Imm16) {
_srl(T, T0R, Value);
} else {
_srlv(T, T0R, T1R);
} }
_srlv(T, T0R, T1R);
_mov(Dest, T); _mov(Dest, T);
return; return;
} }
case InstArithmetic::Ashr: { case InstArithmetic::Ashr: {
_srav(T, Src0R, Src1R); if (IsSrc1Imm16) {
_sra(T, Src0R, Value);
} else {
_srav(T, Src0R, Src1R);
}
_mov(Dest, T); _mov(Dest, T);
return; return;
} }
......
...@@ -32,68 +32,40 @@ define internal i32 @test_01(i32 %a) { ...@@ -32,68 +32,40 @@ define internal i32 @test_01(i32 %a) {
; ASM-LABEL: test_01: ; ASM-LABEL: test_01:
; ASM-NEXT: .Ltest_01$__0: ; ASM-NEXT: .Ltest_01$__0:
; ASM-NEXT: # $zero = def.pseudo ; ASM-NEXT: addiu $a0, $a0, 1
; ASM-NEXT: addiu $v0, $zero, 1 ; ASM-NEXT: andi $a0, $a0, 1
; ASM-NEXT: addu $a0, $a0, $v0 ; ASM-NEXT: ori $a0, $a0, 1
; ASM-NEXT: # $zero = def.pseudo ; ASM-NEXT: xori $a0, $a0, 1
; ASM-NEXT: addiu $v0, $zero, 1
; ASM-NEXT: and $a0, $a0, $v0
; ASM-NEXT: # $zero = def.pseudo
; ASM-NEXT: addiu $v0, $zero, 1
; ASM-NEXT: or $a0, $a0, $v0
; ASM-NEXT: # $zero = def.pseudo
; ASM-NEXT: addiu $v0, $zero, 1
; ASM-NEXT: xor $a0, $a0, $v0
; ASM-NEXT: move $v0, $a0 ; ASM-NEXT: move $v0, $a0
; ASM-NEXT: jr $ra ; ASM-NEXT: jr $ra
; DIS-LABEL:00000000 <test_01>: ; DIS-LABEL:00000000 <test_01>:
; DIS-NEXT: 0: 24020001 li v0,1 ; DIS-NEXT: 0: 24840001 addiu a0,a0,1
; DIS-NEXT: 4: 00822021 addu a0,a0,v0 ; DIS-NEXT: 4: 30840001 andi a0,a0,0x1
; DIS-NEXT: 8: 24020001 li v0,1 ; DIS-NEXT: 8: 34840001 ori a0,a0,0x1
; DIS-NEXT: c: 00822024 and a0,a0,v0 ; DIS-NEXT: c: 38840001 xori a0,a0,0x1
; DIS-NEXT: 10: 24020001 li v0,1 ; DIS-NEXT: 10: 00801021 move v0,a0
; DIS-NEXT: 14: 00822025 or a0,a0,v0 ; DIS-NEXT: 14: 03e00008 jr ra
; DIS-NEXT: 18: 24020001 li v0,1 ; DIS-NEXT: 18: 00000000 nop
; DIS-NEXT: 1c: 00822026 xor a0,a0,v0
; DIS-NEXT: 20: 00801021 move v0,a0
; DIS-NEXT: 24: 03e00008 jr ra
; DIS-NEXT: 28: 00000000 nop
; IASM-LABEL: test_01: ; IASM-LABEL: test_01:
; IASM-LABEL: .Ltest_01$__0: ; IASM-LABEL: .Ltest_01$__0:
; IASM-NEXT: .byte 0x1 ; IASM-NEXT: .byte 0x1
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x2 ; IASM-NEXT: .byte 0x84
; IASM-NEXT: .byte 0x24 ; IASM-NEXT: .byte 0x24
; IASM-NEXT: .byte 0x21
; IASM-NEXT: .byte 0x20
; IASM-NEXT: .byte 0x82
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x1 ; IASM-NEXT: .byte 0x1
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x2 ; IASM-NEXT: .byte 0x84
; IASM-NEXT: .byte 0x24 ; IASM-NEXT: .byte 0x30
; IASM-NEXT: .byte 0x24
; IASM-NEXT: .byte 0x20
; IASM-NEXT: .byte 0x82
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x1 ; IASM-NEXT: .byte 0x1
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x2 ; IASM-NEXT: .byte 0x84
; IASM-NEXT: .byte 0x24 ; IASM-NEXT: .byte 0x34
; IASM-NEXT: .byte 0x25
; IASM-NEXT: .byte 0x20
; IASM-NEXT: .byte 0x82
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x1 ; IASM-NEXT: .byte 0x1
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x2 ; IASM-NEXT: .byte 0x84
; IASM-NEXT: .byte 0x24 ; IASM-NEXT: .byte 0x38
; IASM-NEXT: .byte 0x26
; IASM-NEXT: .byte 0x20
; IASM-NEXT: .byte 0x82
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x21 ; IASM-NEXT: .byte 0x21
; IASM-NEXT: .byte 0x10 ; IASM-NEXT: .byte 0x10
; IASM-NEXT: .byte 0x80 ; IASM-NEXT: .byte 0x80
...@@ -123,14 +95,14 @@ define internal i32 @test_02(i32 %a) { ...@@ -123,14 +95,14 @@ define internal i32 @test_02(i32 %a) {
; ASM-NEXT: move $v0, $a0 ; ASM-NEXT: move $v0, $a0
; ASM-NEXT: jr $ra ; ASM-NEXT: jr $ra
; DIS-LABEL:00000030 <test_02>: ; DIS-LABEL:00000020 <test_02>:
; DIS-NEXT: 30: 24020009 li v0,9 ; DIS-NEXT: 20: 24020009 li v0,9
; DIS-NEXT: 34: 00822026 xor a0,a0,v0 ; DIS-NEXT: 24: 00822026 xor a0,a0,v0
; DIS-NEXT: 38: 2c840001 sltiu a0,a0,1 ; DIS-NEXT: 28: 2c840001 sltiu a0,a0,1
; DIS-NEXT: 3c: 30840001 andi a0,a0,0x1 ; DIS-NEXT: 2c: 30840001 andi a0,a0,0x1
; DIS-NEXT: 40: 00801021 move v0,a0 ; DIS-NEXT: 30: 00801021 move v0,a0
; DIS-NEXT: 44: 03e00008 jr ra ; DIS-NEXT: 34: 03e00008 jr ra
; DIS-NEXT: 48: 00000000 nop ; DIS-NEXT: 38: 00000000 nop
; IASM-LABEL: test_02: ; IASM-LABEL: test_02:
; IASM-LABEL: .Ltest_02$__0: ; IASM-LABEL: .Ltest_02$__0:
...@@ -182,15 +154,19 @@ entry: ...@@ -182,15 +154,19 @@ entry:
; IASM-LABEL: ashrImm: ; IASM-LABEL: ashrImm:
; IASM-NEXT: .LashrImm$entry: ; IASM-NEXT: .LashrImm$entry:
; IASM-NEXT: .byte 0x7 ; IASM-NEXT: .byte 0x7
; IASM-NEXT: .byte 0x20 ; IASM-NEXT: .byte 0x20
; IASM-NEXT: .byte 0xa4 ; IASM-NEXT: .byte 0xa4
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x21 ; IASM-NEXT: .byte 0x21
; IASM-NEXT: .byte 0x10 ; IASM-NEXT: .byte 0x10
; IASM-NEXT: .byte 0x80 ; IASM-NEXT: .byte 0x80
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x8 ; IASM-NEXT: .byte 0x8
; IASM-NEXT: .byte 0x0 ; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0xe0 ; IASM-NEXT: .byte 0xe0
; IASM-NEXT: .byte 0x3 ; IASM-NEXT: .byte 0x3
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x0
; IASM-NEXT: .byte 0x0
...@@ -49,8 +49,7 @@ entry: ...@@ -49,8 +49,7 @@ entry:
; CHECK-LABEL: add8BitConst ; CHECK-LABEL: add8BitConst
; CHECK: add {{[abcd]l}} ; CHECK: add {{[abcd]l}}
; MIPS32-LABEL: add8BitConst ; MIPS32-LABEL: add8BitConst
; MIPS32: li ; MIPS32: addiu
; MIPS32: addu
; MIPS32: andi {{.*}},0xff ; MIPS32: andi {{.*}},0xff
; MIPS32: move ; MIPS32: move
; MIPS32: jr ; MIPS32: jr
...@@ -83,8 +82,7 @@ entry: ...@@ -83,8 +82,7 @@ entry:
; CHECK-LABEL: sub8BitConst ; CHECK-LABEL: sub8BitConst
; CHECK: sub {{[abcd]l}} ; CHECK: sub {{[abcd]l}}
; MIPS32-LABEL: sub8BitConst ; MIPS32-LABEL: sub8BitConst
; MIPS32: li ; MIPS32: addiu {{.*}},-123
; MIPS32: subu
; MIPS32: andi {{.*}},0xff ; MIPS32: andi {{.*}},0xff
; MIPS32: move ; MIPS32: move
; MIPS32: jr ; MIPS32: jr
...@@ -306,8 +304,7 @@ entry: ...@@ -306,8 +304,7 @@ entry:
; CHECK-LABEL: shl8BitConst ; CHECK-LABEL: shl8BitConst
; CHECK: shl {{[abcd]l|BYTE PTR}},0x6 ; CHECK: shl {{[abcd]l|BYTE PTR}},0x6
; MIPS32-LABEL: shl8BitConst ; MIPS32-LABEL: shl8BitConst
; MIPS32: li ; MIPS32: sll
; MIPS32: sllv
; MIPS32: andi {{.*}},0xff ; MIPS32: andi {{.*}},0xff
; MIPS32: move ; MIPS32: move
; MIPS32: jr ; MIPS32: jr
...@@ -340,8 +337,7 @@ entry: ...@@ -340,8 +337,7 @@ entry:
; CHECK-LABEL: lshr8BitConst ; CHECK-LABEL: lshr8BitConst
; CHECK: shr {{[abcd]l|BYTE PTR}},0x6 ; CHECK: shr {{[abcd]l|BYTE PTR}},0x6
; MIPS32-LABEL: lshr8BitConst ; MIPS32-LABEL: lshr8BitConst
; MIPS32: li ; MIPS32: srl
; MIPS32: srlv
; MIPS32: andi {{.*}},0xff ; MIPS32: andi {{.*}},0xff
; MIPS32: move ; MIPS32: move
; MIPS32: jr ; MIPS32: jr
...@@ -374,8 +370,7 @@ entry: ...@@ -374,8 +370,7 @@ entry:
; CHECK-LABEL: ashr8BitConst ; CHECK-LABEL: ashr8BitConst
; CHECK: sar {{[abcd]l|BYTE PTR}},0x6 ; CHECK: sar {{[abcd]l|BYTE PTR}},0x6
; MIPS32-LABEL: ashr8BitConst ; MIPS32-LABEL: ashr8BitConst
; MIPS32: li ; MIPS32: sra
; MIPS32: srav
; MIPS32: andi {{.*}},0xff ; MIPS32: andi {{.*}},0xff
; MIPS32: move ; MIPS32: move
; MIPS32: jr ; MIPS32: jr
...@@ -577,8 +572,7 @@ entry: ...@@ -577,8 +572,7 @@ entry:
; CHECK: mov {{[a-d]l}},BYTE PTR ; CHECK: mov {{[a-d]l}},BYTE PTR
; MIPS32-LABEL: load_i8 ; MIPS32-LABEL: load_i8
; MIPS32: lb ; MIPS32: lb
; MIPS32: li ; MIPS32: addiu {{.*}},0
; MIPS32: subu
; MIPS32: andi {{.*}},0xff ; MIPS32: andi {{.*}},0xff
; MIPS32: move ; MIPS32: move
; MIPS32: jr ; MIPS32: jr
...@@ -598,8 +592,7 @@ entry: ...@@ -598,8 +592,7 @@ entry:
; MIPS32: lui ; MIPS32: lui
; MIPS32: addiu ; MIPS32: addiu
; MIPS32: lb ; MIPS32: lb
; MIPS32: li ; MIPS32: addiu {{.*}},0
; MIPS32: subu
; MIPS32: andi {{.*}},0xff ; MIPS32: andi {{.*}},0xff
; MIPS32: jr ; MIPS32: jr
; MIPS32: nop ; MIPS32: nop
......
...@@ -55,19 +55,19 @@ sw.epilog: ...@@ -55,19 +55,19 @@ sw.epilog:
; MIPS32: beq [[REG1]],[[REG2]],6c <.LtestJumpTable$sw.default> ; MIPS32: beq [[REG1]],[[REG2]],6c <.LtestJumpTable$sw.default>
; MIPS32: nop ; MIPS32: nop
; MIPS32: li [[REG2:.*]],92 ; MIPS32: li [[REG2:.*]],92
; MIPS32: beq [[REG1]],[[REG2]],7c <.LtestJumpTable$sw.bb1> ; MIPS32: beq [[REG1]],[[REG2]],78 <.LtestJumpTable$sw.bb1>
; MIPS32: nop ; MIPS32: nop
; MIPS32: li [[REG2:.*]],93 ; MIPS32: li [[REG2:.*]],93
; MIPS32: beq [[REG1]],[[REG2]],6c <.LtestJumpTable$sw.default> ; MIPS32: beq [[REG1]],[[REG2]],6c <.LtestJumpTable$sw.default>
; MIPS32: nop ; MIPS32: nop
; MIPS32: li [[REG2:.*]],99 ; MIPS32: li [[REG2:.*]],99
; MIPS32: beq [[REG1]],[[REG2]],7c <.LtestJumpTable$sw.bb1> ; MIPS32: beq [[REG1]],[[REG2]],78 <.LtestJumpTable$sw.bb1>
; MIPS32: nop ; MIPS32: nop
; MIPS32: li [[REG2:.*]],98 ; MIPS32: li [[REG2:.*]],98
; MIPS32: beq [[REG1]],[[REG2]],6c <.LtestJumpTable$sw.default> ; MIPS32: beq [[REG1]],[[REG2]],6c <.LtestJumpTable$sw.default>
; MIPS32: nop ; MIPS32: nop
; MIPS32: li [[REG2:.*]],96 ; MIPS32: li [[REG2:.*]],96
; MIPS32: beq [[REG1]],[[REG2]],7c <.LtestJumpTable$sw.bb1> ; MIPS32: beq [[REG1]],[[REG2]],78 <.LtestJumpTable$sw.bb1>
; MIPS32: nop ; MIPS32: nop
; MIPS32: li [[REG2:.*]],97 ; MIPS32: li [[REG2:.*]],97
; MIPS32: beq [[REG1]],[[REG2]],60 <.LtestJumpTable$split_entry_sw.epilog_0> ; MIPS32: beq [[REG1]],[[REG2]],60 <.LtestJumpTable$split_entry_sw.epilog_0>
......
...@@ -32,47 +32,36 @@ entry: ...@@ -32,47 +32,36 @@ entry:
; MIPS32P50N1: nop ; MIPS32P50N1: nop
; MIPS32P50N1: sw {{.*}} ; MIPS32P50N1: sw {{.*}}
; MIPS32P50N1: lw {{.*}} ; MIPS32P50N1: lw {{.*}}
; MIPS32P50N1: li {{.*}} ; MIPS32P50N1: addiu {{.*}},1
; MIPS32P50N1: nop ; MIPS32P50N1: nop
; MIPS32P50N1: addu {{.*}}
; MIPS32P50N1: sw {{.*}} ; MIPS32P50N1: sw {{.*}}
; MIPS32P50N1: nop
; MIPS32P50N1: lw {{.*}} ; MIPS32P50N1: lw {{.*}}
; MIPS32P50N1: nop ; MIPS32P50N1: nop
; MIPS32P50N1: li {{.*}} ; MIPS32P50N1: addiu {{.*}},2
; MIPS32P50N1: nop
; MIPS32P50N1: addu {{.*}}
; MIPS32P50N1: nop ; MIPS32P50N1: nop
; MIPS32P50N1: sw {{.*}} ; MIPS32P50N1: sw {{.*}}
; MIPS32P50N1: lw {{.*}}
; MIPS32P50N1: nop ; MIPS32P50N1: nop
; MIPS32P50N1: li {{.*}} ; MIPS32P50N1: lw {{.*}}
; MIPS32P50N1: addu {{.*}}
; MIPS32P50N1: nop ; MIPS32P50N1: nop
; MIPS32P50N1: addiu {{.*}},3
; MIPS32P50N1: sw {{.*}} ; MIPS32P50N1: sw {{.*}}
; MIPS32P50N1: lw {{.*}}
; MIPS32P50N1: nop ; MIPS32P50N1: nop
; MIPS32P50N1: li {{.*}} ; MIPS32P50N1: lw {{.*}}
; MIPS32P50N1: addiu {{.*}},-1
; MIPS32P50N1: nop ; MIPS32P50N1: nop
; MIPS32P50N1: subu {{.*}}
; MIPS32P50N1: sw {{.*}} ; MIPS32P50N1: sw {{.*}}
; MIPS32P50N1: lw {{.*}} ; MIPS32P50N1: lw {{.*}}
; MIPS32P50N1: li {{.*}}
; MIPS32P50N1: subu {{.*}}
; MIPS32P50N1: sw {{.*}}
; MIPS32P50N1: nop ; MIPS32P50N1: nop
; MIPS32P50N1: lw {{.*}} ; MIPS32P50N1: addiu {{.*}},-2
; MIPS32P50N1: li {{.*}}
; MIPS32P50N1: subu {{.*}}
; MIPS32P50N1: nop ; MIPS32P50N1: nop
; MIPS32P50N1: sw {{.*}} ; MIPS32P50N1: sw {{.*}}
; MIPS32P50N1: nop
; MIPS32P50N1: lw {{.*}} ; MIPS32P50N1: lw {{.*}}
; MIPS32P50N1: nop ; MIPS32P50N1: addiu {{.*}},-3
; MIPS32P50N1: sw {{.*}}
; MIPS32P50N1: lw {{.*}}
; MIPS32P50N1: lw {{.*}} ; MIPS32P50N1: lw {{.*}}
; MIPS32P50N1: nop ; MIPS32P50N1: nop
; MIPS32P50N1: mul {{.*}} ; MIPS32P50N1: mul {{.*}}
; MIPS32P50N1: nop
; MIPS32P50N1: sw {{.*}} ; MIPS32P50N1: sw {{.*}}
; MIPS32P50N1: lw {{.*}} ; MIPS32P50N1: lw {{.*}}
; MIPS32P50N1: nop ; MIPS32P50N1: nop
...@@ -81,7 +70,9 @@ entry: ...@@ -81,7 +70,9 @@ entry:
; MIPS32P50N1: mul {{.*}} ; MIPS32P50N1: mul {{.*}}
; MIPS32P50N1: nop ; MIPS32P50N1: nop
; MIPS32P50N1: sw {{.*}} ; MIPS32P50N1: sw {{.*}}
; MIPS32P50N1: nop
; MIPS32P50N1: lw {{.*}} ; MIPS32P50N1: lw {{.*}}
; MIPS32P50N1: nop
; MIPS32P50N1: addiu {{.*}} ; MIPS32P50N1: addiu {{.*}}
; MIPS32P50N1: jr ra ; MIPS32P50N1: jr ra
; MIPS32P50N1: nop ; MIPS32P50N1: nop
...@@ -104,10 +95,7 @@ entry: ...@@ -104,10 +95,7 @@ entry:
; MIPS32P110N2: lw {{.*}} ; MIPS32P110N2: lw {{.*}}
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: li {{.*}} ; MIPS32P110N2: addiu {{.*}},1
; MIPS32P110N2: nop
; MIPS32P110N2: nop
; MIPS32P110N2: addu {{.*}}
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: sw {{.*}} ; MIPS32P110N2: sw {{.*}}
...@@ -116,10 +104,7 @@ entry: ...@@ -116,10 +104,7 @@ entry:
; MIPS32P110N2: lw {{.*}} ; MIPS32P110N2: lw {{.*}}
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: li {{.*}} ; MIPS32P110N2: addiu {{.*}},2
; MIPS32P110N2: nop
; MIPS32P110N2: nop
; MIPS32P110N2: addu {{.*}}
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: sw {{.*}} ; MIPS32P110N2: sw {{.*}}
...@@ -128,10 +113,7 @@ entry: ...@@ -128,10 +113,7 @@ entry:
; MIPS32P110N2: lw {{.*}} ; MIPS32P110N2: lw {{.*}}
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: li {{.*}} ; MIPS32P110N2: addiu {{.*}},3
; MIPS32P110N2: nop
; MIPS32P110N2: nop
; MIPS32P110N2: addu {{.*}}
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: sw {{.*}} ; MIPS32P110N2: sw {{.*}}
...@@ -140,10 +122,7 @@ entry: ...@@ -140,10 +122,7 @@ entry:
; MIPS32P110N2: lw {{.*}} ; MIPS32P110N2: lw {{.*}}
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: li {{.*}} ; MIPS32P110N2: addiu {{.*}},-1
; MIPS32P110N2: nop
; MIPS32P110N2: nop
; MIPS32P110N2: subu {{.*}}
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: sw {{.*}} ; MIPS32P110N2: sw {{.*}}
...@@ -152,10 +131,7 @@ entry: ...@@ -152,10 +131,7 @@ entry:
; MIPS32P110N2: lw {{.*}} ; MIPS32P110N2: lw {{.*}}
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: li {{.*}} ; MIPS32P110N2: addiu {{.*}},-2
; MIPS32P110N2: nop
; MIPS32P110N2: nop
; MIPS32P110N2: subu {{.*}}
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: sw {{.*}} ; MIPS32P110N2: sw {{.*}}
...@@ -164,10 +140,7 @@ entry: ...@@ -164,10 +140,7 @@ entry:
; MIPS32P110N2: lw {{.*}} ; MIPS32P110N2: lw {{.*}}
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: li {{.*}} ; MIPS32P110N2: addiu {{.*}},-3
; MIPS32P110N2: nop
; MIPS32P110N2: nop
; MIPS32P110N2: subu {{.*}}
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: nop ; MIPS32P110N2: nop
; MIPS32P110N2: sw {{.*}} ; MIPS32P110N2: sw {{.*}}
......
...@@ -82,7 +82,7 @@ entry: ...@@ -82,7 +82,7 @@ entry:
; CHECK: shl {{.*}},0x1 ; CHECK: shl {{.*}},0x1
; MIPS32-LABEL: shlImmLarge ; MIPS32-LABEL: shlImmLarge
; MIPS32: sllv ; MIPS32: sll
define internal i32 @shlImmNeg(i32 %val) { define internal i32 @shlImmNeg(i32 %val) {
entry: entry:
...@@ -93,7 +93,7 @@ entry: ...@@ -93,7 +93,7 @@ entry:
; CHECK: shl {{.*}},0xff ; CHECK: shl {{.*}},0xff
; MIPS32-LABEL: shlImmNeg ; MIPS32-LABEL: shlImmNeg
; MIPS32: sllv ; MIPS32: sll
define internal i32 @lshrImmLarge(i32 %val) { define internal i32 @lshrImmLarge(i32 %val) {
entry: entry:
...@@ -104,7 +104,7 @@ entry: ...@@ -104,7 +104,7 @@ entry:
; CHECK: shr {{.*}},0x1 ; CHECK: shr {{.*}},0x1
; MIPS32-LABEL: lshrImmLarge ; MIPS32-LABEL: lshrImmLarge
; MIPS32: srlv ; MIPS32: srl
define internal i32 @lshrImmNeg(i32 %val) { define internal i32 @lshrImmNeg(i32 %val) {
entry: entry:
...@@ -115,7 +115,7 @@ entry: ...@@ -115,7 +115,7 @@ entry:
; CHECK: shr {{.*}},0xff ; CHECK: shr {{.*}},0xff
; MIPS32-LABEL: lshrImmNeg ; MIPS32-LABEL: lshrImmNeg
; MIPS32: srlv ; MIPS32: srl
define internal i32 @ashrImmLarge(i32 %val) { define internal i32 @ashrImmLarge(i32 %val) {
entry: entry:
...@@ -126,7 +126,7 @@ entry: ...@@ -126,7 +126,7 @@ entry:
; CHECK: sar {{.*}},0x1 ; CHECK: sar {{.*}},0x1
; MIPS32-LABEL: ashrImmLarge ; MIPS32-LABEL: ashrImmLarge
; MIPS32: srav ; MIPS32: sra
define internal i32 @ashrImmNeg(i32 %val) { define internal i32 @ashrImmNeg(i32 %val) {
entry: entry:
...@@ -137,7 +137,7 @@ entry: ...@@ -137,7 +137,7 @@ entry:
; CHECK: sar {{.*}},0xff ; CHECK: sar {{.*}},0xff
; MIPS32-LABEL: ashrImmNeg ; MIPS32-LABEL: ashrImmNeg
; MIPS32: srav ; MIPS32: sra
define internal i64 @shlImm64One(i64 %val) { define internal i64 @shlImm64One(i64 %val) {
entry: entry:
......
...@@ -66,7 +66,7 @@ sw.epilog: ; preds = %sw.bb2, %sw.default ...@@ -66,7 +66,7 @@ sw.epilog: ; preds = %sw.bb2, %sw.default
; MIPS32: beq {{.*}},{{.*}},{{.*}} <[[SW_BB2]]> ; MIPS32: beq {{.*}},{{.*}},{{.*}} <[[SW_BB2]]>
; MIPS32: b {{.*}} <[[SW_DEFAULT:.*]]> ; MIPS32: b {{.*}} <[[SW_DEFAULT:.*]]>
; MIPS32: <[[SW_DEFAULT]]> ; MIPS32: <[[SW_DEFAULT]]>
; MIPS32: li {{.*}},27 ; MIPS32: addiu {{.*}},27
; MIPS32: b {{.*}} <[[SW_EPILOG]]> ; MIPS32: b {{.*}} <[[SW_EPILOG]]>
; MIPS32: <[[SW_BB1]]> ; MIPS32: <[[SW_BB1]]>
; MIPS32: li {{.*}},21 ; MIPS32: li {{.*}},21
......
...@@ -34,8 +34,7 @@ entry: ...@@ -34,8 +34,7 @@ entry:
; ARM32-LABEL: testAndTrue ; ARM32-LABEL: testAndTrue
; ARM32: and {{.*}}, #1 ; ARM32: and {{.*}}, #1
; MIPS32-LABEL: testAndTrue ; MIPS32-LABEL: testAndTrue
; MIPS32: li [[REG:.*]],1 ; MIPS32: andi {{.*}},0x1
; MIPS32: and {{.*}},[[REG]]
; Test that or with true uses immediate 1, not -1. ; Test that or with true uses immediate 1, not -1.
define internal i32 @testOrTrue(i32 %arg) { define internal i32 @testOrTrue(i32 %arg) {
...@@ -50,8 +49,7 @@ entry: ...@@ -50,8 +49,7 @@ entry:
; ARM32-LABEL: testOrTrue ; ARM32-LABEL: testOrTrue
; ARM32: orr {{.*}}, #1 ; ARM32: orr {{.*}}, #1
; MIPS32-LABEL: testOrTrue ; MIPS32-LABEL: testOrTrue
; MIPS32: li [[REG:.*]],1 ; MIPS32: ori {{.*}},0x1
; MIPS32: or {{.*}},[[REG]]
; Test that xor with true uses immediate 1, not -1. ; Test that xor with true uses immediate 1, not -1.
define internal i32 @testXorTrue(i32 %arg) { define internal i32 @testXorTrue(i32 %arg) {
...@@ -66,8 +64,7 @@ entry: ...@@ -66,8 +64,7 @@ entry:
; ARM32-LABEL: testXorTrue ; ARM32-LABEL: testXorTrue
; ARM32: eor {{.*}}, #1 ; ARM32: eor {{.*}}, #1
; MIPS32-LABEL: testXorTrue ; MIPS32-LABEL: testXorTrue
; MIPS32: li [[REG:.*]],1 ; MIPS32: xori {{.*}},0x1
; MIPS32: xor {{.*}},[[REG]]
; Test that trunc to i1 masks correctly. ; Test that trunc to i1 masks correctly.
define internal i32 @testTrunc(i32 %arg) { define internal i32 @testTrunc(i32 %arg) {
......
...@@ -22,6 +22,5 @@ target: ...@@ -22,6 +22,5 @@ target:
; MIPS32-LABEL: uncond1 ; MIPS32-LABEL: uncond1
; MIPS32: <.Luncond1$target>: ; MIPS32: <.Luncond1$target>:
; MIPS32: li ; MIPS32: addiu {{.*}},1
; MIPS32: addu
; MIPS32: b {{[0-9a-f]+}} <.Luncond1$target> ; MIPS32: b {{[0-9a-f]+}} <.Luncond1$target>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment