forked from OSchip/llvm-project
[mips][microMIPS] Implement SLT, SLTI, SLTIU, SLTU microMIPS32r6 instructions
Differential Revision: http://reviews.llvm.org/D19354 llvm-svn: 267137
This commit is contained in:
parent
aa673486c4
commit
5560998250
|
@ -1017,7 +1017,9 @@ class LOAD_WORD_EVA_MMR6_DESC_BASE<string instr_asm, RegisterOperand RO> :
|
|||
class LLE_MMR6_DESC : LOAD_WORD_EVA_MMR6_DESC_BASE<"lle", GPR32Opnd>;
|
||||
class LWE_MMR6_DESC : LOAD_WORD_EVA_MMR6_DESC_BASE<"lwe", GPR32Opnd>;
|
||||
class ADDU16_MMR6_DESC : ArithRMM16<"addu16", GPRMM16Opnd, 1, II_ADDU, add>,
|
||||
MMR6Arch<"addu16">;
|
||||
MMR6Arch<"addu16"> {
|
||||
int AddedComplexity = 1;
|
||||
}
|
||||
class AND16_MMR6_DESC : LogicRMM16<"and16", GPRMM16Opnd, II_AND, and>,
|
||||
MMR6Arch<"and16">;
|
||||
class ANDI16_MMR6_DESC : AndImmMM16<"andi16", GPRMM16Opnd, II_AND>,
|
||||
|
|
|
@ -278,7 +278,6 @@ class MOVEP_FM_MM16 {
|
|||
|
||||
class MMArch {
|
||||
string Arch = "micromips";
|
||||
list<dag> Pattern = [];
|
||||
}
|
||||
|
||||
class ADD_FM_MM<bits<6> op, bits<10> funct> : MMArch {
|
||||
|
|
|
@ -996,6 +996,8 @@ def : MipsPat<(load addrimm4lsl2:$addr),
|
|||
def : MipsPat<(load addr:$addr),
|
||||
(LW_MM addr:$addr)>;
|
||||
|
||||
defm : SeteqPats<GPR32, SLTiu_MM, XOR_MM, SLTu_MM, ZERO>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// MicroMips instruction aliases
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -1034,4 +1036,6 @@ def : MipsInstAlias<"tne $rs, $rt",
|
|||
def : MipsInstAlias<"rotr $rt, $imm",
|
||||
(ROTR_MM GPR32Opnd:$rt, GPR32Opnd:$rt, uimm5:$imm), 0>;
|
||||
def : MipsInstAlias<"syscall", (SYSCALL_MM 0), 1>;
|
||||
def : MipsInstAlias<"slt $rs, $rt, $imm",
|
||||
(SLTi_MM GPR32Opnd:$rs, GPR32Opnd:$rt, simm16:$imm), 0>;
|
||||
}
|
||||
|
|
|
@ -1648,11 +1648,11 @@ def ADDiu : MMRel, StdMMR6Rel, ArithLogicI<"addiu", simm16_relaxed, GPR32Opnd,
|
|||
}
|
||||
def ADDi : MMRel, ArithLogicI<"addi", simm16_relaxed, GPR32Opnd>, ADDI_FM<0x8>,
|
||||
ISA_MIPS1_NOT_32R6_64R6;
|
||||
let AdditionalPredicates = [NotInMicroMips] in {
|
||||
def SLTi : MMRel, SetCC_I<"slti", setlt, simm16, immSExt16, GPR32Opnd>,
|
||||
SLTI_FM<0xa>;
|
||||
def SLTiu : MMRel, SetCC_I<"sltiu", setult, simm16, immSExt16, GPR32Opnd>,
|
||||
SLTI_FM<0xb>;
|
||||
let AdditionalPredicates = [NotInMicroMips] in {
|
||||
def ANDi : MMRel, StdMMR6Rel,
|
||||
ArithLogicI<"andi", uimm16, GPR32Opnd, II_ANDI, immZExt16, and>,
|
||||
ADDI_FM<0xc>;
|
||||
|
@ -1676,8 +1676,10 @@ def MUL : MMRel, ArithLogicR<"mul", GPR32Opnd, 1, II_MUL, mul>,
|
|||
ADD_FM<0x1c, 2>, ISA_MIPS32_NOT_32R6_64R6;
|
||||
def ADD : MMRel, StdMMR6Rel, ArithLogicR<"add", GPR32Opnd>, ADD_FM<0, 0x20>;
|
||||
def SUB : MMRel, ArithLogicR<"sub", GPR32Opnd>, ADD_FM<0, 0x22>;
|
||||
let AdditionalPredicates = [NotInMicroMips] in {
|
||||
def SLT : MMRel, SetCC_R<"slt", setlt, GPR32Opnd>, ADD_FM<0, 0x2a>;
|
||||
def SLTu : MMRel, SetCC_R<"sltu", setult, GPR32Opnd>, ADD_FM<0, 0x2b>;
|
||||
}
|
||||
let AdditionalPredicates = [NotInMicroMips] in {
|
||||
def AND : MMRel, StdMMR6Rel, ArithLogicR<"and", GPR32Opnd, 1, II_AND, and>,
|
||||
ADD_FM<0, 0x24>;
|
||||
|
@ -2190,9 +2192,11 @@ def : MipsInstAlias<"negu $rt",
|
|||
(SUBu GPR32Opnd:$rt, ZERO, GPR32Opnd:$rt), 0>;
|
||||
def : MipsInstAlias<"negu $rt, $rs",
|
||||
(SUBu GPR32Opnd:$rt, ZERO, GPR32Opnd:$rs), 1>;
|
||||
let Predicates = [NotInMicroMips] in {
|
||||
def : MipsInstAlias<
|
||||
"slt $rs, $rt, $imm",
|
||||
(SLTi GPR32Opnd:$rs, GPR32Opnd:$rt, simm32_relaxed:$imm), 0>;
|
||||
}
|
||||
def : MipsInstAlias<
|
||||
"sltu $rt, $rs, $imm",
|
||||
(SLTiu GPR32Opnd:$rt, GPR32Opnd:$rs, simm32_relaxed:$imm), 0>;
|
||||
|
@ -2572,10 +2576,12 @@ multiclass SetgeImmPats<RegisterClass RC, Instruction SLTiOp,
|
|||
(XORi (SLTiuOp RC:$lhs, immSExt16:$rhs), 1)>;
|
||||
}
|
||||
|
||||
let AdditionalPredicates = [NotInMicroMips] in {
|
||||
defm : SeteqPats<GPR32, SLTiu, XOR, SLTu, ZERO>;
|
||||
defm : SetlePats<GPR32, SLT, SLTu>;
|
||||
defm : SetgtPats<GPR32, SLT, SLTu>;
|
||||
defm : SetgePats<GPR32, SLT, SLTu>;
|
||||
}
|
||||
defm : SetgeImmPats<GPR32, SLTi, SLTiu>;
|
||||
|
||||
// bswap pattern
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
; RUN: llc -march=mipsel -mattr=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
; RUN: llc -march=mips -mattr=micromips -mcpu=mips32r6 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=MM32R6
|
||||
|
||||
@i = global i32 5, align 4
|
||||
@j = global i32 10, align 4
|
||||
|
@ -13,6 +14,7 @@ entry:
|
|||
br i1 %cmp, label %if.end, label %if.then
|
||||
|
||||
; 16: slt ${{[0-9]+}}, ${{[0-9]+}}
|
||||
; MM32R6: slt ${{[0-9]+}}, ${{[0-9]+}}
|
||||
; 16: btnez $[[LABEL:[0-9A-Ba-b_]+]]
|
||||
; 16: $[[LABEL]]:
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
; RUN: llc -march=mipsel -mattr=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
; RUN: llc -march=mips -mcpu=mips32r6 -mattr=micromips -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=MMR6
|
||||
|
||||
@i = global i32 1, align 4
|
||||
@j = global i32 10, align 4
|
||||
|
@ -15,6 +16,7 @@ entry:
|
|||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: xor $[[REGISTER:[0-9A-Ba-b_]+]], ${{[0-9]+}}
|
||||
; 16: sltiu $[[REGISTER:[0-9A-Ba-b_]+]], 1
|
||||
; MMR6: sltiu ${{[0-9]+}}, ${{[0-9]+}}, 1
|
||||
; 16: move ${{[0-9]+}}, $24
|
||||
ret void
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
; RUN: llc -march=mipsel -mattr=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
; RUN: llc -march=mips -mattr=micromips -mcpu=mips32r6 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=MM32R6
|
||||
|
||||
@j = global i32 -5, align 4
|
||||
@k = global i32 10, align 4
|
||||
|
@ -14,7 +15,8 @@ entry:
|
|||
%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]], $24
|
||||
; 16: slti $[[REGISTER:[0-9]+]], 10
|
||||
; MM32R6: slti $[[REGISTER:[0-9]+]], $[[REGISTER:[0-9]+]], 10
|
||||
; 16: move $[[REGISTER]], $24
|
||||
ret void
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
; RUN: llc -march=mipsel -mattr=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
|
||||
; RUN: llc -march=mips -mcpu=mips32r6 -mattr=micromips -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=MMR6
|
||||
|
||||
@i = global i32 1, align 4
|
||||
@j = global i32 10, align 4
|
||||
|
@ -15,6 +16,7 @@ entry:
|
|||
store i32 %conv, i32* @r1, align 4
|
||||
; 16: xor $[[REGISTER:[0-9]+]], ${{[0-9]+}}
|
||||
; 16: sltu ${{[0-9]+}}, $[[REGISTER]]
|
||||
; MMR6: sltu ${{[0-9]+}}, $zero, ${{[0-9]+}}
|
||||
; 16: move ${{[0-9]+}}, $24
|
||||
ret void
|
||||
}
|
||||
|
|
|
@ -274,6 +274,10 @@
|
|||
0x55 0x04 0x12 0x38 # CHECK: seleqz.d $f2, $f4, $f8
|
||||
0x54 0x62 0x08 0x78 # CHECK: selnez.s $f1, $f2, $f3
|
||||
0x55 0x04 0x12 0x78 # CHECK: selnez.d $f2, $f4, $f8
|
||||
0x00 0xa4 0x1b 0x50 # CHECK: slt $3, $4, $5
|
||||
0x90 0x64 0x01 0x00 # CHECK: slti $3, $4, 256
|
||||
0xb0 0x64 0x01 0x00 # CHECK: sltiu $3, $4, 256
|
||||
0x00 0xa4 0x1b 0x90 # CHECK: sltu $3, $4, $5
|
||||
0x54 0x62 0x00 0x60 # CHECK: class.s $f2, $f3
|
||||
0x54 0x82 0x02 0x60 # CHECK: class.d $f2, $f4
|
||||
0x00 0x00 0x47 0x7c # CHECK: di
|
||||
|
|
|
@ -288,6 +288,10 @@
|
|||
seleqz.d $f2, $f4, $f8 # CHECK: seleqz.d $f2, $f4, $f8 # encoding: [0x55,0x04,0x12,0x38]
|
||||
selnez.s $f1, $f2, $f3 # CHECK: selnez.s $f1, $f2, $f3 # encoding: [0x54,0x62,0x08,0x78]
|
||||
selnez.d $f2, $f4, $f8 # CHECK: selnez.d $f2, $f4, $f8 # encoding: [0x55,0x04,0x12,0x78]
|
||||
slt $3, $4, $5 # CHECK: slt $3, $4, $5 # encoding: [0x00,0xa4,0x1b,0x50]
|
||||
slti $3, $4, 256 # CHECK: slti $3, $4, 256 # encoding: [0x90,0x64,0x01,0x00]
|
||||
sltiu $3, $4, 256 # CHECK: sltiu $3, $4, 256 # encoding: [0xb0,0x64,0x01,0x00]
|
||||
sltu $3, $4, $5 # CHECK: sltu $3, $4, $5 # encoding: [0x00,0xa4,0x1b,0x90]
|
||||
class.s $f2, $f3 # CHECK: class.s $f2, $f3 # encoding: [0x54,0x62,0x00,0x60]
|
||||
class.d $f2, $f4 # CHECK: class.d $f2, $f4 # encoding: [0x54,0x82,0x02,0x60]
|
||||
deret # CHECK: deret # encoding: [0x00,0x00,0xe3,0x7c]
|
||||
|
|
Loading…
Reference in New Issue