mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-04 09:45:00 +00:00
implement setXX patterns
llvm-svn: 166459
This commit is contained in:
parent
7444c92c80
commit
730040c219
@ -20,6 +20,19 @@ def mem16 : Operand<i32> {
|
||||
let EncoderMethod = "getMemEncoding";
|
||||
}
|
||||
|
||||
//
|
||||
// Compare a register and immediate and place result in CC
|
||||
// Implicit use of T8
|
||||
//
|
||||
// EXT-CCRR Instruction format
|
||||
//
|
||||
class FEXT_CCRXI16_ins<bits<5> _op, string asmstr,
|
||||
InstrItinClass itin>:
|
||||
FEXT_RI16<_op, (outs CPU16Regs:$cc), (ins CPU16Regs:$rx, simm16:$imm),
|
||||
!strconcat(asmstr, "\t$rx, $imm\n\tmove\t$cc, $$t8"), [], itin> {
|
||||
let isCodeGenOnly=1;
|
||||
}
|
||||
|
||||
//
|
||||
// EXT-I instruction format
|
||||
//
|
||||
@ -44,6 +57,17 @@ class FEXT_I816_ins<bits<3> _func, string asmstr,
|
||||
// Assembler formats in alphabetical order.
|
||||
// Natural and pseudos are mixed together.
|
||||
//
|
||||
// Compare two registers and place result in CC
|
||||
// Implicit use of T8
|
||||
//
|
||||
// CC-RR Instruction format
|
||||
//
|
||||
class FCCRR16_ins<bits<5> f, string asmstr, InstrItinClass itin> :
|
||||
FRR16<f, (outs CPU16Regs:$cc), (ins CPU16Regs:$rx, CPU16Regs:$ry),
|
||||
!strconcat(asmstr, "\t$rx, $ry\n\tmove\t$cc, $$t8"), [], itin> {
|
||||
let isCodeGenOnly=1;
|
||||
}
|
||||
|
||||
//
|
||||
// EXT-RI instruction format
|
||||
//
|
||||
@ -562,7 +586,36 @@ def SllX16: FEXT_SHIFT16_ins<0b00, "sll", IIAlu>;
|
||||
//
|
||||
def SllvRxRy16 : FRxRxRy16_ins<0b00100, "sllv", IIAlu>;
|
||||
|
||||
//
|
||||
// Format: SLTI rx, immediate MIPS16e
|
||||
// Purpose: Set on Less Than Immediate (Extended)
|
||||
// To record the result of a less-than comparison with a constant.
|
||||
//
|
||||
def SltiCCRxImmX16: FEXT_CCRXI16_ins<0b01010, "slti", IIAlu>;
|
||||
|
||||
//
|
||||
// Format: SLTIU rx, immediate MIPS16e
|
||||
// Purpose: Set on Less Than Immediate Unsigned (Extended)
|
||||
// To record the result of a less-than comparison with a constant.
|
||||
//
|
||||
def SltiuCCRxImmX16: FEXT_CCRXI16_ins<0b01011, "sltiu", IIAlu>;
|
||||
|
||||
//
|
||||
// Format: SLT rx, ry MIPS16e
|
||||
// Purpose: Set on Less Than
|
||||
// To record the result of a less-than comparison.
|
||||
//
|
||||
def SltRxRy16: FRR16_ins<0b00010, "slt", IIAlu>;
|
||||
|
||||
def SltCCRxRy16: FCCRR16_ins<0b00010, "slt", IIAlu>;
|
||||
|
||||
// Format: SLTU rx, ry MIPS16e
|
||||
// Purpose: Set on Less Than Unsigned
|
||||
// To record the result of an unsigned less-than comparison.
|
||||
//
|
||||
|
||||
|
||||
def SltuCCRxRy16: FCCRR16_ins<0b00011, "sltu", IIAlu>;
|
||||
//
|
||||
// Format: SRAV ry, rx MIPS16e
|
||||
// Purpose: Shift Word Right Arithmetic Variable
|
||||
@ -705,6 +758,17 @@ let isReturn=1, isTerminator=1, hasDelaySlot=1, isBarrier=1, hasCtrlDep=1,
|
||||
def RetRA16 : MipsPseudo16<(outs), (ins), "", [(MipsRet)]>;
|
||||
|
||||
|
||||
// setcc patterns
|
||||
|
||||
class SetCC_R16<PatFrag cond_op, Instruction I>:
|
||||
Mips16Pat<(cond_op CPU16Regs:$rx, CPU16Regs:$ry),
|
||||
(I CPU16Regs:$rx, CPU16Regs:$ry)>;
|
||||
|
||||
class SetCC_I16<PatFrag cond_op, PatLeaf imm_type, Instruction I>:
|
||||
Mips16Pat<(cond_op CPU16Regs:$rx, imm_type:$imm16),
|
||||
(I CPU16Regs:$rx, imm_type:$imm16)>;
|
||||
|
||||
|
||||
//
|
||||
// Some branch conditional patterns are not generated by llvm at this time.
|
||||
// Some are for seemingly arbitrary reasons not used: i.e. with signed number
|
||||
@ -757,10 +821,10 @@ def: Mips16Pat
|
||||
|
||||
//
|
||||
// never called because compiler transforms a >= k to a > (k-1)
|
||||
//def: Mips16Pat
|
||||
// <(brcond (i32 (setge CPU16Regs:$rx, immSExt16:$imm)), bb:$imm16),
|
||||
// (BteqzT8SltiX16 CPU16Regs:$rx, immSExt16:$imm, bb:$imm16)
|
||||
// >;
|
||||
def: Mips16Pat
|
||||
<(brcond (i32 (setge CPU16Regs:$rx, immSExt16:$imm)), bb:$imm16),
|
||||
(BteqzT8SltiX16 CPU16Regs:$rx, immSExt16:$imm, bb:$imm16)
|
||||
>;
|
||||
|
||||
//
|
||||
// bcond-setlt
|
||||
@ -859,5 +923,118 @@ def: Mips16Pat
|
||||
(DivuRxRy16 CPU16Regs:$rx, CPU16Regs:$ry)>;
|
||||
|
||||
|
||||
//
|
||||
// When writing C code to test setxx these patterns,
|
||||
// some will be transformed into
|
||||
// other things. So we test using C code but using -O3 and -O0
|
||||
//
|
||||
// seteq
|
||||
//
|
||||
def : Mips16Pat
|
||||
<(seteq CPU16Regs:$lhs,CPU16Regs:$rhs),
|
||||
(SltiuCCRxImmX16 (XorRxRxRy16 CPU16Regs:$lhs, CPU16Regs:$rhs), 1)>;
|
||||
|
||||
def : Mips16Pat
|
||||
<(seteq CPU16Regs:$lhs, 0),
|
||||
(SltiuCCRxImmX16 CPU16Regs:$lhs, 1)>;
|
||||
|
||||
|
||||
//
|
||||
// setge
|
||||
//
|
||||
|
||||
def: Mips16Pat
|
||||
<(setge CPU16Regs:$lhs, CPU16Regs:$rhs),
|
||||
(XorRxRxRy16 (SltCCRxRy16 CPU16Regs:$lhs, CPU16Regs:$rhs),
|
||||
(LiRxImmX16 1))>;
|
||||
|
||||
//
|
||||
// For constants, llvm transforms this to:
|
||||
// x > (k -1) and then reverses the operands to use setlt. So this pattern
|
||||
// is not used now by the compiler. (Presumably checking that k-1 does not
|
||||
// overflow). The compiler never uses this at a the current time, due to
|
||||
// other optimizations.
|
||||
//
|
||||
//def: Mips16Pat
|
||||
// <(setge CPU16Regs:$lhs, immSExt16:$rhs),
|
||||
// (XorRxRxRy16 (SltiCCRxImmX16 CPU16Regs:$lhs, immSExt16:$rhs),
|
||||
// (LiRxImmX16 1))>;
|
||||
|
||||
// This catches the x >= -32768 case by transforming it to x > -32769
|
||||
//
|
||||
def: Mips16Pat
|
||||
<(setgt CPU16Regs:$lhs, -32769),
|
||||
(XorRxRxRy16 (SltiCCRxImmX16 CPU16Regs:$lhs, -32768),
|
||||
(LiRxImmX16 1))>;
|
||||
|
||||
//
|
||||
// setgt
|
||||
//
|
||||
//
|
||||
|
||||
def: Mips16Pat
|
||||
<(setgt CPU16Regs:$lhs, CPU16Regs:$rhs),
|
||||
(SltCCRxRy16 CPU16Regs:$rhs, CPU16Regs:$lhs)>;
|
||||
|
||||
//
|
||||
// setle
|
||||
//
|
||||
def: Mips16Pat
|
||||
<(setle CPU16Regs:$lhs, CPU16Regs:$rhs),
|
||||
(XorRxRxRy16 (SltCCRxRy16 CPU16Regs:$rhs, CPU16Regs:$lhs), (LiRxImmX16 1))>;
|
||||
|
||||
//
|
||||
// setlt
|
||||
//
|
||||
def: SetCC_R16<setlt, SltCCRxRy16>;
|
||||
|
||||
def: SetCC_I16<setlt, immSExt16, SltiCCRxImmX16>;
|
||||
|
||||
//
|
||||
// setne
|
||||
//
|
||||
def : Mips16Pat
|
||||
<(setne CPU16Regs:$lhs,CPU16Regs:$rhs),
|
||||
(SltuCCRxRy16 (LiRxImmX16 0),
|
||||
(XorRxRxRy16 CPU16Regs:$lhs, CPU16Regs:$rhs))>;
|
||||
|
||||
|
||||
//
|
||||
// setuge
|
||||
//
|
||||
def: Mips16Pat
|
||||
<(setuge CPU16Regs:$lhs, CPU16Regs:$rhs),
|
||||
(XorRxRxRy16 (SltuCCRxRy16 CPU16Regs:$lhs, CPU16Regs:$rhs),
|
||||
(LiRxImmX16 1))>;
|
||||
|
||||
// this pattern will never be used because the compiler will transform
|
||||
// x >= k to x > (k - 1) and then use SLT
|
||||
//
|
||||
//def: Mips16Pat
|
||||
// <(setuge CPU16Regs:$lhs, immZExt16:$rhs),
|
||||
// (XorRxRxRy16 (SltiuCCRxImmX16 CPU16Regs:$lhs, immZExt16:$rhs),
|
||||
// (LiRxImmX16 1))>;
|
||||
|
||||
//
|
||||
// setugt
|
||||
//
|
||||
def: Mips16Pat
|
||||
<(setugt CPU16Regs:$lhs, CPU16Regs:$rhs),
|
||||
(SltuCCRxRy16 CPU16Regs:$rhs, CPU16Regs:$lhs)>;
|
||||
|
||||
//
|
||||
// setule
|
||||
//
|
||||
def: Mips16Pat
|
||||
<(setule CPU16Regs:$lhs, CPU16Regs:$rhs),
|
||||
(XorRxRxRy16 (SltuCCRxRy16 CPU16Regs:$rhs, CPU16Regs:$lhs), (LiRxImmX16 1))>;
|
||||
|
||||
//
|
||||
// setult
|
||||
//
|
||||
def: SetCC_R16<setult, SltuCCRxRy16>;
|
||||
|
||||
def: SetCC_I16<setult, immSExt16, SltiuCCRxImmX16>;
|
||||
|
||||
def: Mips16Pat<(add CPU16Regs:$hi, (MipsLo tglobaladdr:$lo)),
|
||||
(AddiuRxRxImmX16 CPU16Regs:$hi, tglobaladdr:$lo)>;
|
||||
|
21
test/CodeGen/Mips/seteq.ll
Normal file
21
test/CodeGen/Mips/seteq.ll
Normal file
@ -0,0 +1,21 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
|
||||
@i = global i32 1, align 4
|
||||
@j = global i32 10, align 4
|
||||
@k = global i32 1, align 4
|
||||
@r1 = common global i32 0, align 4
|
||||
@r2 = common global i32 0, align 4
|
||||
|
||||
define void @test() nounwind {
|
||||
entry:
|
||||
%0 = load i32* @i, align 4
|
||||
%1 = load i32* @k, align 4
|
||||
%cmp = icmp eq i32 %0, %1
|
||||
%conv = zext i1 %cmp to i32
|
||||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: xor $[[REGISTER:[0-9A-Ba-b_]+]], ${{[0-9]+}}
|
||||
; 16: sltiu $[[REGISTER:[0-9A-Ba-b_]+]], 1
|
||||
; 16: move ${{[0-9]+}}, $t8
|
||||
ret void
|
||||
}
|
||||
|
24
test/CodeGen/Mips/seteqz.ll
Normal file
24
test/CodeGen/Mips/seteqz.ll
Normal file
@ -0,0 +1,24 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
|
||||
@i = global i32 0, align 4
|
||||
@j = global i32 99, align 4
|
||||
@r1 = common global i32 0, align 4
|
||||
@r2 = common global i32 0, align 4
|
||||
|
||||
define void @test() nounwind {
|
||||
entry:
|
||||
%0 = load i32* @i, align 4
|
||||
%cmp = icmp eq i32 %0, 0
|
||||
%conv = zext i1 %cmp to i32
|
||||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: sltiu ${{[0-9]+}}, 1
|
||||
; 16: move ${{[0-9]+}}, $t8
|
||||
%1 = load i32* @j, align 4
|
||||
%cmp1 = icmp eq i32 %1, 99
|
||||
%conv2 = zext i1 %cmp1 to i32
|
||||
store i32 %conv2, i32* @r2, align 4
|
||||
; 16: xor $[[REGISTER:[0-9A-Ba-b_]+]], ${{[0-9]+}}
|
||||
; 16: sltiu $[[REGISTER:[0-9A-Ba-b_]+]], 1
|
||||
; 16: move ${{[0-9]+}}, $t8
|
||||
ret void
|
||||
}
|
27
test/CodeGen/Mips/setge.ll
Normal file
27
test/CodeGen/Mips/setge.ll
Normal file
@ -0,0 +1,27 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
|
||||
@j = global i32 -5, align 4
|
||||
@k = global i32 10, align 4
|
||||
@l = global i32 20, align 4
|
||||
@m = global i32 10, align 4
|
||||
@r1 = common global i32 0, align 4
|
||||
@r2 = common global i32 0, align 4
|
||||
@r3 = common global i32 0, align 4
|
||||
@.str = private unnamed_addr constant [22 x i8] c"1 = %i\0A1 = %i\0A0 = %i\0A\00", align 1
|
||||
|
||||
define void @test() nounwind {
|
||||
entry:
|
||||
%0 = load i32* @k, align 4
|
||||
%1 = load i32* @j, align 4
|
||||
%cmp = icmp sge i32 %0, %1
|
||||
%conv = zext i1 %cmp to i32
|
||||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: slt ${{[0-9]+}}, ${{[0-9]+}}
|
||||
; 16: move $[[REGISTER:[0-9]+]], $t8
|
||||
; 16: xor $[[REGISTER]], ${{[0-9]+}}
|
||||
%2 = load i32* @m, align 4
|
||||
%cmp1 = icmp sge i32 %0, %2
|
||||
%conv2 = zext i1 %cmp1 to i32
|
||||
store i32 %conv2, i32* @r2, align 4
|
||||
ret void
|
||||
}
|
18
test/CodeGen/Mips/setgek.ll
Normal file
18
test/CodeGen/Mips/setgek.ll
Normal file
@ -0,0 +1,18 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
|
||||
@k = global i32 10, align 4
|
||||
@r1 = common global i32 0, align 4
|
||||
@r2 = common global i32 0, align 4
|
||||
@r3 = common global i32 0, align 4
|
||||
|
||||
define void @test() nounwind {
|
||||
entry:
|
||||
%0 = load i32* @k, align 4
|
||||
%cmp = icmp sgt i32 %0, -32769
|
||||
%conv = zext i1 %cmp to i32
|
||||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: slti ${{[0-9]+}}, -32768
|
||||
; 16: move $[[REGISTER:[0-9]+]], $t8
|
||||
; 16: xor ${{[0-9]+}}, $[[REGISTER]]
|
||||
ret void
|
||||
}
|
26
test/CodeGen/Mips/setle.ll
Normal file
26
test/CodeGen/Mips/setle.ll
Normal file
@ -0,0 +1,26 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
|
||||
@j = global i32 -5, align 4
|
||||
@k = global i32 10, align 4
|
||||
@l = global i32 20, align 4
|
||||
@m = global i32 10, align 4
|
||||
@r1 = common global i32 0, align 4
|
||||
@r2 = common global i32 0, align 4
|
||||
@r3 = common global i32 0, align 4
|
||||
|
||||
define void @test() nounwind {
|
||||
entry:
|
||||
%0 = load i32* @j, align 4
|
||||
%1 = load i32* @k, align 4
|
||||
%cmp = icmp sle i32 %0, %1
|
||||
%conv = zext i1 %cmp to i32
|
||||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: slt ${{[0-9]+}}, ${{[0-9]+}}
|
||||
; 16: move $[[REGISTER:[0-9]+]], $t8
|
||||
; 16: xor $[[REGISTER]], ${{[0-9]+}}
|
||||
%2 = load i32* @m, align 4
|
||||
%cmp1 = icmp sle i32 %2, %1
|
||||
%conv2 = zext i1 %cmp1 to i32
|
||||
store i32 %conv2, i32* @r2, align 4
|
||||
ret void
|
||||
}
|
21
test/CodeGen/Mips/setlt.ll
Normal file
21
test/CodeGen/Mips/setlt.ll
Normal file
@ -0,0 +1,21 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
|
||||
@j = global i32 -5, align 4
|
||||
@k = global i32 10, align 4
|
||||
@l = global i32 20, align 4
|
||||
@m = global i32 10, align 4
|
||||
@r1 = common global i32 0, align 4
|
||||
@r2 = common global i32 0, align 4
|
||||
@r3 = common global i32 0, align 4
|
||||
|
||||
define void @test() nounwind {
|
||||
entry:
|
||||
%0 = load i32* @j, align 4
|
||||
%1 = load i32* @k, align 4
|
||||
%cmp = icmp slt i32 %0, %1
|
||||
%conv = zext i1 %cmp to i32
|
||||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: slt ${{[0-9]+}}, ${{[0-9]+}}
|
||||
; 16: move ${{[0-9]+}}, $t8
|
||||
ret void
|
||||
}
|
20
test/CodeGen/Mips/setltk.ll
Normal file
20
test/CodeGen/Mips/setltk.ll
Normal file
@ -0,0 +1,20 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
|
||||
@j = global i32 -5, align 4
|
||||
@k = global i32 10, align 4
|
||||
@l = global i32 20, align 4
|
||||
@m = global i32 10, align 4
|
||||
@r1 = common global i32 0, align 4
|
||||
@r2 = common global i32 0, align 4
|
||||
@r3 = common global i32 0, align 4
|
||||
|
||||
define void @test() nounwind {
|
||||
entry:
|
||||
%0 = load i32* @j, align 4
|
||||
%cmp = icmp slt i32 %0, 10
|
||||
%conv = zext i1 %cmp to i32
|
||||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: slti $[[REGISTER:[0-9]+]], 10
|
||||
; 16: move $[[REGISTER]], $t8
|
||||
ret void
|
||||
}
|
20
test/CodeGen/Mips/setne.ll
Normal file
20
test/CodeGen/Mips/setne.ll
Normal file
@ -0,0 +1,20 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
|
||||
@i = global i32 1, align 4
|
||||
@j = global i32 10, align 4
|
||||
@k = global i32 1, align 4
|
||||
@r1 = common global i32 0, align 4
|
||||
@r2 = common global i32 0, align 4
|
||||
|
||||
define void @test() nounwind {
|
||||
entry:
|
||||
%0 = load i32* @i, align 4
|
||||
%1 = load i32* @k, align 4
|
||||
%cmp = icmp ne i32 %0, %1
|
||||
%conv = zext i1 %cmp to i32
|
||||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: xor $[[REGISTER:[0-9]+]], ${{[0-9]+}}
|
||||
; 16: sltu ${{[0-9]+}}, $[[REGISTER]]
|
||||
; 16: move ${{[0-9]+}}, $t8
|
||||
ret void
|
||||
}
|
26
test/CodeGen/Mips/setuge.ll
Normal file
26
test/CodeGen/Mips/setuge.ll
Normal file
@ -0,0 +1,26 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
|
||||
@j = global i32 5, align 4
|
||||
@k = global i32 10, align 4
|
||||
@l = global i32 20, align 4
|
||||
@m = global i32 10, align 4
|
||||
@r1 = common global i32 0, align 4
|
||||
@r2 = common global i32 0, align 4
|
||||
@r3 = common global i32 0, align 4
|
||||
|
||||
define void @test() nounwind {
|
||||
entry:
|
||||
%0 = load i32* @k, align 4
|
||||
%1 = load i32* @j, align 4
|
||||
%cmp = icmp uge i32 %0, %1
|
||||
%conv = zext i1 %cmp to i32
|
||||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: sltu ${{[0-9]+}}, ${{[0-9]+}}
|
||||
; 16: move $[[REGISTER:[0-9]+]], $t8
|
||||
; 16: xor $[[REGISTER]], ${{[0-9]+}}
|
||||
%2 = load i32* @m, align 4
|
||||
%cmp1 = icmp uge i32 %0, %2
|
||||
%conv2 = zext i1 %cmp1 to i32
|
||||
store i32 %conv2, i32* @r2, align 4
|
||||
ret void
|
||||
}
|
21
test/CodeGen/Mips/setugt.ll
Normal file
21
test/CodeGen/Mips/setugt.ll
Normal file
@ -0,0 +1,21 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
|
||||
@j = global i32 5, align 4
|
||||
@k = global i32 10, align 4
|
||||
@l = global i32 20, align 4
|
||||
@m = global i32 10, align 4
|
||||
@r1 = common global i32 0, align 4
|
||||
@r2 = common global i32 0, align 4
|
||||
@r3 = common global i32 0, align 4
|
||||
|
||||
define void @test() nounwind {
|
||||
entry:
|
||||
%0 = load i32* @k, align 4
|
||||
%1 = load i32* @j, align 4
|
||||
%cmp = icmp ugt i32 %0, %1
|
||||
%conv = zext i1 %cmp to i32
|
||||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: sltu ${{[0-9]+}}, ${{[0-9]+}}
|
||||
; 16: move ${{[0-9]+}}, $t8
|
||||
ret void
|
||||
}
|
26
test/CodeGen/Mips/setule.ll
Normal file
26
test/CodeGen/Mips/setule.ll
Normal file
@ -0,0 +1,26 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
|
||||
@j = global i32 5, align 4
|
||||
@k = global i32 10, align 4
|
||||
@l = global i32 20, align 4
|
||||
@m = global i32 10, align 4
|
||||
@r1 = common global i32 0, align 4
|
||||
@r2 = common global i32 0, align 4
|
||||
@r3 = common global i32 0, align 4
|
||||
|
||||
define void @test() nounwind {
|
||||
entry:
|
||||
%0 = load i32* @j, align 4
|
||||
%1 = load i32* @k, align 4
|
||||
%cmp = icmp ule i32 %0, %1
|
||||
%conv = zext i1 %cmp to i32
|
||||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: sltu ${{[0-9]+}}, ${{[0-9]+}}
|
||||
; 16: move $[[REGISTER:[0-9]+]], $t8
|
||||
; 16: xor $[[REGISTER]], ${{[0-9]+}}
|
||||
%2 = load i32* @m, align 4
|
||||
%cmp1 = icmp ule i32 %2, %1
|
||||
%conv2 = zext i1 %cmp1 to i32
|
||||
store i32 %conv2, i32* @r2, align 4
|
||||
ret void
|
||||
}
|
21
test/CodeGen/Mips/setult.ll
Normal file
21
test/CodeGen/Mips/setult.ll
Normal file
@ -0,0 +1,21 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
|
||||
@j = global i32 5, align 4
|
||||
@k = global i32 10, align 4
|
||||
@l = global i32 20, align 4
|
||||
@m = global i32 10, align 4
|
||||
@r1 = common global i32 0, align 4
|
||||
@r2 = common global i32 0, align 4
|
||||
@r3 = common global i32 0, align 4
|
||||
|
||||
define void @test() nounwind {
|
||||
entry:
|
||||
%0 = load i32* @j, align 4
|
||||
%1 = load i32* @k, align 4
|
||||
%cmp = icmp ult i32 %0, %1
|
||||
%conv = zext i1 %cmp to i32
|
||||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: sltu ${{[0-9]+}}, ${{[0-9]+}}
|
||||
; 16: move ${{[0-9]+}}, $t8
|
||||
ret void
|
||||
}
|
20
test/CodeGen/Mips/setultk.ll
Normal file
20
test/CodeGen/Mips/setultk.ll
Normal file
@ -0,0 +1,20 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
|
||||
@j = global i32 5, align 4
|
||||
@k = global i32 10, align 4
|
||||
@l = global i32 20, align 4
|
||||
@m = global i32 10, align 4
|
||||
@r1 = common global i32 0, align 4
|
||||
@r2 = common global i32 0, align 4
|
||||
@r3 = common global i32 0, align 4
|
||||
|
||||
define void @test() nounwind {
|
||||
entry:
|
||||
%0 = load i32* @j, align 4
|
||||
%cmp = icmp ult i32 %0, 10
|
||||
%conv = zext i1 %cmp to i32
|
||||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: sltiu $[[REGISTER:[0-9]+]], 10
|
||||
; 16: move $[[REGISTER]], $t8
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user