diff options
Diffstat (limited to 'lib/Target/MBlaze/MBlazeInstrFPU.td')
-rw-r--r-- | lib/Target/MBlaze/MBlazeInstrFPU.td | 253 |
1 files changed, 127 insertions, 126 deletions
diff --git a/lib/Target/MBlaze/MBlazeInstrFPU.td b/lib/Target/MBlaze/MBlazeInstrFPU.td index 657b1d4940a70..094de5c0c1a8f 100644 --- a/lib/Target/MBlaze/MBlazeInstrFPU.td +++ b/lib/Target/MBlaze/MBlazeInstrFPU.td @@ -19,72 +19,72 @@ // Memory Access Instructions //===----------------------------------------------------------------------===// class LoadFM<bits<6> op, string instr_asm, PatFrag OpNode> : - TA<op, 0x000, (outs FGR32:$dst), (ins memrr:$addr), + TA<op, 0x000, (outs GPR:$dst), (ins memrr:$addr), !strconcat(instr_asm, " $dst, $addr"), - [(set FGR32:$dst, (OpNode xaddr:$addr))], IILoad>; + [(set (f32 GPR:$dst), (OpNode xaddr:$addr))], IILoad>; class LoadFMI<bits<6> op, string instr_asm, PatFrag OpNode> : - TAI<op, (outs FGR32:$dst), (ins memri:$addr), - !strconcat(instr_asm, " $dst, $addr"), - [(set FGR32:$dst, (OpNode iaddr:$addr))], IILoad>; + TB<op, (outs GPR:$dst), (ins memri:$addr), + !strconcat(instr_asm, " $dst, $addr"), + [(set (f32 GPR:$dst), (OpNode iaddr:$addr))], IILoad>; class StoreFM<bits<6> op, string instr_asm, PatFrag OpNode> : - TA<op, 0x000, (outs), (ins FGR32:$dst, memrr:$addr), + TA<op, 0x000, (outs), (ins GPR:$dst, memrr:$addr), !strconcat(instr_asm, " $dst, $addr"), - [(OpNode FGR32:$dst, xaddr:$addr)], IIStore>; + [(OpNode (f32 GPR:$dst), xaddr:$addr)], IIStore>; class StoreFMI<bits<6> op, string instr_asm, PatFrag OpNode> : - TAI<op, (outs), (ins FGR32:$dst, memrr:$addr), - !strconcat(instr_asm, " $dst, $addr"), - [(OpNode FGR32:$dst, iaddr:$addr)], IIStore>; + TB<op, (outs), (ins GPR:$dst, memrr:$addr), + !strconcat(instr_asm, " $dst, $addr"), + [(OpNode (f32 GPR:$dst), iaddr:$addr)], IIStore>; class ArithF<bits<6> op, bits<11> flags, string instr_asm, SDNode OpNode, InstrItinClass itin> : - TA<op, flags, (outs FGR32:$dst), (ins FGR32:$b, FGR32:$c), + TA<op, flags, (outs GPR:$dst), (ins GPR:$b, GPR:$c), !strconcat(instr_asm, " $dst, $b, $c"), - [(set FGR32:$dst, (OpNode FGR32:$b, FGR32:$c))], itin>; + [(set GPR:$dst, (OpNode GPR:$b, GPR:$c))], itin>; class CmpFN<bits<6> op, bits<11> flags, string instr_asm, InstrItinClass itin> : - TA<op, flags, (outs CPURegs:$dst), (ins FGR32:$b, FGR32:$c), + TA<op, flags, (outs GPR:$dst), (ins GPR:$b, GPR:$c), !strconcat(instr_asm, " $dst, $b, $c"), [], itin>; class ArithFR<bits<6> op, bits<11> flags, string instr_asm, SDNode OpNode, InstrItinClass itin> : - TA<op, flags, (outs FGR32:$dst), (ins FGR32:$b, FGR32:$c), - !strconcat(instr_asm, " $dst, $c, $b"), - [(set FGR32:$dst, (OpNode FGR32:$b, FGR32:$c))], itin>; - -class ArithF2<bits<6> op, bits<11> flags, string instr_asm, - InstrItinClass itin> : - TF<op, flags, (outs FGR32:$dst), (ins FGR32:$b), - !strconcat(instr_asm, " $dst, $b"), - [], itin>; - -class ArithIF<bits<6> op, bits<11> flags, string instr_asm, - InstrItinClass itin> : - TF<op, flags, (outs FGR32:$dst), (ins CPURegs:$b), - !strconcat(instr_asm, " $dst, $b"), - [], itin>; - -class ArithFI<bits<6> op, bits<11> flags, string instr_asm, - InstrItinClass itin> : - TF<op, flags, (outs CPURegs:$dst), (ins FGR32:$b), - !strconcat(instr_asm, " $dst, $b"), - [], itin>; + TAR<op, flags, (outs GPR:$dst), (ins GPR:$b, GPR:$c), + !strconcat(instr_asm, " $dst, $c, $b"), + [(set GPR:$dst, (OpNode GPR:$b, GPR:$c))], itin>; class LogicF<bits<6> op, string instr_asm> : - TAI<op, (outs FGR32:$dst), (ins FGR32:$b, FGR32:$c), - !strconcat(instr_asm, " $dst, $b, $c"), - [], - IIAlu>; + TB<op, (outs GPR:$dst), (ins GPR:$b, GPR:$c), + !strconcat(instr_asm, " $dst, $b, $c"), + [], IIAlu>; class LogicFI<bits<6> op, string instr_asm> : - TAI<op, (outs FGR32:$dst), (ins FGR32:$b, fimm:$c), - !strconcat(instr_asm, " $dst, $b, $c"), - [], - IIAlu>; + TB<op, (outs GPR:$dst), (ins GPR:$b, fimm:$c), + !strconcat(instr_asm, " $dst, $b, $c"), + [], IIAlu>; + +let rb=0 in { + class ArithF2<bits<6> op, bits<11> flags, string instr_asm, + InstrItinClass itin> : + TA<op, flags, (outs GPR:$dst), (ins GPR:$b), + !strconcat(instr_asm, " $dst, $b"), + [], itin>; + + class ArithIF<bits<6> op, bits<11> flags, string instr_asm, + InstrItinClass itin> : + TA<op, flags, (outs GPR:$dst), (ins GPR:$b), + !strconcat(instr_asm, " $dst, $b"), + [], itin>; + + class ArithFI<bits<6> op, bits<11> flags, string instr_asm, + InstrItinClass itin> : + TA<op, flags, (outs GPR:$dst), (ins GPR:$b), + !strconcat(instr_asm, " $dst, $b"), + [], itin>; +} //===----------------------------------------------------------------------===// // Pseudo instructions @@ -94,24 +94,25 @@ class LogicFI<bits<6> op, string instr_asm> : // FPU Arithmetic Instructions //===----------------------------------------------------------------------===// let Predicates=[HasFPU] in { - def FOR : LogicF<0x28, "or ">; def FORI : LogicFI<0x28, "ori ">; def FADD : ArithF<0x16, 0x000, "fadd ", fadd, IIAlu>; def FRSUB : ArithFR<0x16, 0x080, "frsub ", fsub, IIAlu>; def FMUL : ArithF<0x16, 0x100, "fmul ", fmul, IIAlu>; def FDIV : ArithF<0x16, 0x180, "fdiv ", fdiv, IIAlu>; +} - def LWF : LoadFM<0x32, "lw ", load>; - def LWFI : LoadFMI<0x32, "lwi ", load>; +let Predicates=[HasFPU], isCodeGenOnly=1 in { + def LWF : LoadFM<0x32, "lw ", load>; + def LWFI : LoadFMI<0x3A, "lwi ", load>; - def SWF : StoreFM<0x32, "sw ", store>; - def SWFI : StoreFMI<0x32, "swi ", store>; + def SWF : StoreFM<0x36, "sw ", store>; + def SWFI : StoreFMI<0x3E, "swi ", store>; } let Predicates=[HasFPU,HasSqrt] in { def FLT : ArithIF<0x16, 0x280, "flt ", IIAlu>; def FINT : ArithFI<0x16, 0x300, "fint ", IIAlu>; - def FSQRT : ArithF2<0x16, 0x300, "fsqrt ", IIAlu>; + def FSQRT : ArithF2<0x16, 0x380, "fsqrt ", IIAlu>; } let isAsCheapAsAMove = 1 in { @@ -126,98 +127,98 @@ let isAsCheapAsAMove = 1 in { let usesCustomInserter = 1 in { - def Select_FCC : MBlazePseudo<(outs FGR32:$dst), - (ins FGR32:$T, FGR32:$F, CPURegs:$CMP, i32imm:$CC), + def Select_FCC : MBlazePseudo<(outs GPR:$dst), + (ins GPR:$T, GPR:$F, GPR:$CMP, i32imm:$CC), "; SELECT_FCC PSEUDO!", []>; } // Floating point conversions let Predicates=[HasFPU] in { - def : Pat<(sint_to_fp CPURegs:$V), (FLT CPURegs:$V)>; - def : Pat<(fp_to_sint FGR32:$V), (FINT FGR32:$V)>; - def : Pat<(fsqrt FGR32:$V), (FSQRT FGR32:$V)>; + def : Pat<(sint_to_fp GPR:$V), (FLT GPR:$V)>; + def : Pat<(fp_to_sint GPR:$V), (FINT GPR:$V)>; + def : Pat<(fsqrt GPR:$V), (FSQRT GPR:$V)>; } // SET_CC operations let Predicates=[HasFPU] in { - def : Pat<(setcc FGR32:$L, FGR32:$R, SETEQ), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_EQ FGR32:$L, FGR32:$R), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETNE), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_EQ FGR32:$L, FGR32:$R), 1)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETOEQ), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_EQ FGR32:$L, FGR32:$R), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETONE), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (XOR (FCMP_UN FGR32:$L, FGR32:$R), - (FCMP_EQ FGR32:$L, FGR32:$R)), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETONE), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (OR (FCMP_UN FGR32:$L, FGR32:$R), - (FCMP_EQ FGR32:$L, FGR32:$R)), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETGT), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_GT FGR32:$L, FGR32:$R), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETLT), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_LT FGR32:$L, FGR32:$R), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETGE), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_GE FGR32:$L, FGR32:$R), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETLE), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_LE FGR32:$L, FGR32:$R), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETOGT), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_GT FGR32:$L, FGR32:$R), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETOLT), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_LT FGR32:$L, FGR32:$R), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETOGE), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_GE FGR32:$L, FGR32:$R), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETOLE), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_LE FGR32:$L, FGR32:$R), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETUEQ), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (OR (FCMP_UN FGR32:$L, FGR32:$R), - (FCMP_EQ FGR32:$L, FGR32:$R)), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETUNE), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_NE FGR32:$L, FGR32:$R), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETUGT), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (OR (FCMP_UN FGR32:$L, FGR32:$R), - (FCMP_GT FGR32:$L, FGR32:$R)), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETULT), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (OR (FCMP_UN FGR32:$L, FGR32:$R), - (FCMP_LT FGR32:$L, FGR32:$R)), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETUGE), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (OR (FCMP_UN FGR32:$L, FGR32:$R), - (FCMP_GE FGR32:$L, FGR32:$R)), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETULE), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (OR (FCMP_UN FGR32:$L, FGR32:$R), - (FCMP_LE FGR32:$L, FGR32:$R)), 2)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETO), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_UN FGR32:$L, FGR32:$R), 1)>; - def : Pat<(setcc FGR32:$L, FGR32:$R, SETUO), - (Select_CC (ADDI R0, 1), (ADDI R0, 0), - (FCMP_UN FGR32:$L, FGR32:$R), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETEQ), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_EQ GPR:$L, GPR:$R), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETNE), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_EQ GPR:$L, GPR:$R), 1)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETOEQ), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_EQ GPR:$L, GPR:$R), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETONE), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (XOR (FCMP_UN GPR:$L, GPR:$R), + (FCMP_EQ GPR:$L, GPR:$R)), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETONE), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (OR (FCMP_UN GPR:$L, GPR:$R), + (FCMP_EQ GPR:$L, GPR:$R)), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETGT), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_GT GPR:$L, GPR:$R), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETLT), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_LT GPR:$L, GPR:$R), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETGE), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_GE GPR:$L, GPR:$R), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETLE), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_LE GPR:$L, GPR:$R), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETOGT), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_GT GPR:$L, GPR:$R), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETOLT), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_LT GPR:$L, GPR:$R), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETOGE), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_GE GPR:$L, GPR:$R), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETOLE), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_LE GPR:$L, GPR:$R), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETUEQ), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (OR (FCMP_UN GPR:$L, GPR:$R), + (FCMP_EQ GPR:$L, GPR:$R)), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETUNE), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_NE GPR:$L, GPR:$R), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETUGT), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (OR (FCMP_UN GPR:$L, GPR:$R), + (FCMP_GT GPR:$L, GPR:$R)), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETULT), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (OR (FCMP_UN GPR:$L, GPR:$R), + (FCMP_LT GPR:$L, GPR:$R)), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETUGE), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (OR (FCMP_UN GPR:$L, GPR:$R), + (FCMP_GE GPR:$L, GPR:$R)), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETULE), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (OR (FCMP_UN GPR:$L, GPR:$R), + (FCMP_LE GPR:$L, GPR:$R)), 2)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETO), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_UN GPR:$L, GPR:$R), 1)>; + def : Pat<(setcc (f32 GPR:$L), (f32 GPR:$R), SETUO), + (Select_CC (ADDIK (i32 R0), 1), (ADDIK (i32 R0), 0), + (FCMP_UN GPR:$L, GPR:$R), 2)>; } // SELECT operations -def : Pat<(select CPURegs:$C, FGR32:$T, FGR32:$F), - (Select_FCC FGR32:$T, FGR32:$F, CPURegs:$C, 2)>; +def : Pat<(select (i32 GPR:$C), (f32 GPR:$T), (f32 GPR:$F)), + (Select_FCC GPR:$T, GPR:$F, GPR:$C, 2)>; //===----------------------------------------------------------------------===// // Patterns for Floating Point Instructions //===----------------------------------------------------------------------===// -def : Pat<(f32 fpimm:$imm), (FORI F0, fpimm:$imm)>; +def : Pat<(f32 fpimm:$imm), (FORI (i32 R0), fpimm:$imm)>; |