SparcInstrInfo.td revision 98ca4f2a325f72374a477f9deba7d09e8999c29b
17ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===- SparcInstrInfo.td - Target Description for Sparc Target ------------===// 27ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 37ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// The LLVM Compiler Infrastructure 47ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 57ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This file is distributed under the University of Illinois Open Source 67ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// License. See LICENSE.TXT for details. 77ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 87ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 97ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This file describes the Sparc instructions in TableGen format. 117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// 127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Instruction format superclass 167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmaninclude "SparcInstrFormats.td" 197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Feature predicates. 227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// HasV9 - This predicate is true when the target processor supports V9 257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// instructions. Note that the machine may be running in 32-bit mode. 267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef HasV9 : Predicate<"Subtarget.isV9()">; 277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// HasNoV9 - This predicate is true when the target doesn't have V9 297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// instructions. Use of this is just a hack for the isel not having proper 307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// costs for V8 instructions that are more expensive than their V9 ones. 317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef HasNoV9 : Predicate<"!Subtarget.isV9()">; 327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// HasVIS - This is true when the target processor has VIS extensions. 347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef HasVIS : Predicate<"Subtarget.isVIS()">; 357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// UseDeprecatedInsts - This predicate is true when the target processor is a 377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// V8, or when it is V9 but the V8 deprecated instructions are efficient enough 387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// to use when appropriate. In either of these cases, the instruction selector 397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// will pick deprecated instructions. 407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef UseDeprecatedInsts : Predicate<"Subtarget.useDeprecatedV8Instructions()">; 417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 42e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer//===----------------------------------------------------------------------===// 437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Instruction Pattern Stuff 447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef simm11 : PatLeaf<(imm), [{ 477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // simm11 predicate - True if the imm fits in a 11-bit sign extended field. 487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return (((int)N->getZExtValue() << (32-11)) >> (32-11)) == 497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (int)N->getZExtValue(); 507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}]>; 517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef simm13 : PatLeaf<(imm), [{ 537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // simm13 predicate - True if the imm fits in a 13-bit sign extended field. 547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return (((int)N->getZExtValue() << (32-13)) >> (32-13)) == 557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (int)N->getZExtValue(); 567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}]>; 577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LO10 : SDNodeXForm<imm, [{ 599c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin return CurDAG->getTargetConstant((unsigned)N->getZExtValue() & 1023, 609c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin MVT::i32); 617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}]>; 627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef HI22 : SDNodeXForm<imm, [{ 647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Transformation function: shift the immediate value down into the low bits. 657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return CurDAG->getTargetConstant((unsigned)N->getZExtValue() >> 10, MVT::i32); 667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}]>; 677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef SETHIimm : PatLeaf<(imm), [{ 697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman return (((unsigned)N->getZExtValue() >> 10) << 10) == 707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (unsigned)N->getZExtValue(); 717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman}], HI22>; 727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Addressing modes. 747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ADDRrr : ComplexPattern<i32, 2, "SelectADDRrr", [], []>; 757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ADDRri : ComplexPattern<i32, 2, "SelectADDRri", [frameindex], []>; 767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Address operands 787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef MEMrr : Operand<i32> { 797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman let PrintMethod = "printMemOperand"; 807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman let MIOperandInfo = (ops IntRegs, IntRegs); 817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef MEMri : Operand<i32> { 837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman let PrintMethod = "printMemOperand"; 847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman let MIOperandInfo = (ops IntRegs, i32imm); 857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Branch targets have OtherVT type. 887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef brtarget : Operand<OtherVT>; 897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef calltarget : Operand<i32>; 907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Operand for printing out a condition code. 927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanlet PrintMethod = "printCCOperand" in 937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def CCOp : Operand<i32>; 947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef SDTSPcmpfcc : 967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanSDTypeProfile<0, 2, [SDTCisFP<0>, SDTCisSameAs<0, 1>]>; 979c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskindef SDTSPbrcc : 989c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey YasskinSDTypeProfile<0, 2, [SDTCisVT<0, OtherVT>, SDTCisVT<1, i32>]>; 999c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskindef SDTSPselectcc : 1009c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey YasskinSDTypeProfile<1, 3, [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, SDTCisVT<3, i32>]>; 1019c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskindef SDTSPFTOI : 1029c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey YasskinSDTypeProfile<1, 1, [SDTCisVT<0, f32>, SDTCisFP<1>]>; 1039c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskindef SDTSPITOF : 1049c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey YasskinSDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVT<1, f32>]>; 1059c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin 1069c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskindef SPcmpicc : SDNode<"SPISD::CMPICC", SDTIntBinOp, [SDNPOutFlag]>; 1079c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskindef SPcmpfcc : SDNode<"SPISD::CMPFCC", SDTSPcmpfcc, [SDNPOutFlag]>; 1089c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskindef SPbricc : SDNode<"SPISD::BRICC", SDTSPbrcc, [SDNPHasChain, SDNPInFlag]>; 1099c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskindef SPbrfcc : SDNode<"SPISD::BRFCC", SDTSPbrcc, [SDNPHasChain, SDNPInFlag]>; 1109c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin 1119c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskindef SPhi : SDNode<"SPISD::Hi", SDTIntUnaryOp>; 1129c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskindef SPlo : SDNode<"SPISD::Lo", SDTIntUnaryOp>; 1139c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin 1147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef SPftoi : SDNode<"SPISD::FTOI", SDTSPFTOI>; 1157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef SPitof : SDNode<"SPISD::ITOF", SDTSPITOF>; 1169c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskin 1179c0c3bf1ec2feb861f19867d4091350010b23de6Jeffrey Yasskindef SPselecticc : SDNode<"SPISD::SELECT_ICC", SDTSPselectcc, [SDNPInFlag]>; 1187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef SPselectfcc : SDNode<"SPISD::SELECT_FCC", SDTSPselectcc, [SDNPInFlag]>; 1197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// These are target-independent nodes, but have target-specific formats. 1217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef SDT_SPCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i32> ]>; 1227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef SDT_SPCallSeqEnd : SDCallSeqEnd<[ SDTCisVT<0, i32>, 1237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman SDTCisVT<1, i32> ]>; 124190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 1257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_SPCallSeqStart, 1267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [SDNPHasChain, SDNPOutFlag]>; 1277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_SPCallSeqEnd, 128190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>; 1297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef SDT_SPCall : SDTypeProfile<0, 1, [SDTCisVT<0, i32>]>; 1317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef call : SDNode<"SPISD::CALL", SDT_SPCall, 1327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>; 1337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef retflag : SDNode<"SPISD::RET_FLAG", SDTNone, 1357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [SDNPHasChain, SDNPOptInFlag]>; 1367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 137190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer//===----------------------------------------------------------------------===// 1387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// SPARC Flag Conditions 1397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 1407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Note that these values must be kept in sync with the CCOp::CondCode enum 1427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// values. 1437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass ICC_VAL<int N> : PatLeaf<(i32 N)>; 1447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_NE : ICC_VAL< 9>; // Not Equal 1457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_E : ICC_VAL< 1>; // Equal 1467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_G : ICC_VAL<10>; // Greater 1477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_LE : ICC_VAL< 2>; // Less or Equal 1487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_GE : ICC_VAL<11>; // Greater or Equal 1497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_L : ICC_VAL< 3>; // Less 1507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_GU : ICC_VAL<12>; // Greater Unsigned 1517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_LEU : ICC_VAL< 4>; // Less or Equal Unsigned 1527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_CC : ICC_VAL<13>; // Carry Clear/Great or Equal Unsigned 1537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_CS : ICC_VAL< 5>; // Carry Set/Less Unsigned 1547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_POS : ICC_VAL<14>; // Positive 1557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_NEG : ICC_VAL< 6>; // Negative 1567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_VC : ICC_VAL<15>; // Overflow Clear 1577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ICC_VS : ICC_VAL< 7>; // Overflow Set 1587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass FCC_VAL<int N> : PatLeaf<(i32 N)>; 1607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_U : FCC_VAL<23>; // Unordered 1617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_G : FCC_VAL<22>; // Greater 1627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_UG : FCC_VAL<21>; // Unordered or Greater 1637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_L : FCC_VAL<20>; // Less 1647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_UL : FCC_VAL<19>; // Unordered or Less 1657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_LG : FCC_VAL<18>; // Less or Greater 1667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_NE : FCC_VAL<17>; // Not Equal 1677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_E : FCC_VAL<25>; // Equal 1687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_UE : FCC_VAL<24>; // Unordered or Equal 1697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_GE : FCC_VAL<25>; // Greater or Equal 1707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_UGE : FCC_VAL<26>; // Unordered or Greater or Equal 1717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_LE : FCC_VAL<27>; // Less or Equal 1727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_ULE : FCC_VAL<28>; // Unordered or Less or Equal 1737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCC_O : FCC_VAL<29>; // Ordered 1747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 1767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Instruction Class Templates 1777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 1787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/// F3_12 multiclass - Define a normal F3_1/F3_2 pattern in one shot. 1807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanmulticlass F3_12<string OpcStr, bits<6> Op3Val, SDNode OpNode> { 1817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def rr : F3_1<2, Op3Val, 1827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins IntRegs:$b, IntRegs:$c), 1837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman !strconcat(OpcStr, " $b, $c, $dst"), 1847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (OpNode IntRegs:$b, IntRegs:$c))]>; 1857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def ri : F3_2<2, Op3Val, 1867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins IntRegs:$b, i32imm:$c), 1877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman !strconcat(OpcStr, " $b, $c, $dst"), 1887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (OpNode IntRegs:$b, simm13:$c))]>; 1897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 1907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 1917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/// F3_12np multiclass - Define a normal F3_1/F3_2 pattern in one shot, with no 1927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman/// pattern. 1937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanmulticlass F3_12np<string OpcStr, bits<6> Op3Val> { 1947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def rr : F3_1<2, Op3Val, 1957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins IntRegs:$b, IntRegs:$c), 1967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman !strconcat(OpcStr, " $b, $c, $dst"), []>; 1977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def ri : F3_2<2, Op3Val, 1987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins IntRegs:$b, i32imm:$c), 1997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman !strconcat(OpcStr, " $b, $c, $dst"), []>; 2007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 2017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 2037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Instructions 2047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 2057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Pseudo instructions. 2077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern> 2087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : InstSP<outs, ins, asmstr, pattern>; 2097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanlet Defs = [O6], Uses = [O6] in { 2117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ADJCALLSTACKDOWN : Pseudo<(outs), (ins i32imm:$amt), 2127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "!ADJCALLSTACKDOWN $amt", 2137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(callseq_start timm:$amt)]>; 2147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ADJCALLSTACKUP : Pseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2), 2157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "!ADJCALLSTACKUP $amt1", 2167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(callseq_end timm:$amt1, timm:$amt2)]>; 2177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 2187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// FpMOVD/FpNEGD/FpABSD - These are lowered to single-precision ops by the 2207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// fpmover pass. 2217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanlet Predicates = [HasNoV9] in { // Only emit these in V8 mode. 2227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def FpMOVD : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$src), 2237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "!FpMOVD $src, $dst", []>; 2247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def FpNEGD : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$src), 2257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "!FpNEGD $src, $dst", 2267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (fneg DFPRegs:$src))]>; 2277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def FpABSD : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$src), 2287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "!FpABSD $src, $dst", 229190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer [(set DFPRegs:$dst, (fabs DFPRegs:$src))]>; 2307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 2317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded by the 2337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// scheduler into a branch sequence. This has to handle all permutations of 2347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// selection between i32/f32/f64 on ICC and FCC. 235190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerlet usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler. 2367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def SELECT_CC_Int_ICC 2377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs IntRegs:$dst), (ins IntRegs:$T, IntRegs:$F, i32imm:$Cond), 2387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "; SELECT_CC_Int_ICC PSEUDO!", 2397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (SPselecticc IntRegs:$T, IntRegs:$F, 2407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman imm:$Cond))]>; 2417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def SELECT_CC_Int_FCC 2427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs IntRegs:$dst), (ins IntRegs:$T, IntRegs:$F, i32imm:$Cond), 2437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "; SELECT_CC_Int_FCC PSEUDO!", 2447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (SPselectfcc IntRegs:$T, IntRegs:$F, 2457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman imm:$Cond))]>; 2467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def SELECT_CC_FP_ICC 2477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs FPRegs:$dst), (ins FPRegs:$T, FPRegs:$F, i32imm:$Cond), 2487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "; SELECT_CC_FP_ICC PSEUDO!", 2497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (SPselecticc FPRegs:$T, FPRegs:$F, 2507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman imm:$Cond))]>; 2517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def SELECT_CC_FP_FCC 2527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs FPRegs:$dst), (ins FPRegs:$T, FPRegs:$F, i32imm:$Cond), 2537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "; SELECT_CC_FP_FCC PSEUDO!", 2547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (SPselectfcc FPRegs:$T, FPRegs:$F, 2557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman imm:$Cond))]>; 2567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def SELECT_CC_DFP_ICC 2577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$T, DFPRegs:$F, i32imm:$Cond), 2587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "; SELECT_CC_DFP_ICC PSEUDO!", 2597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (SPselecticc DFPRegs:$T, DFPRegs:$F, 2607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman imm:$Cond))]>; 2617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def SELECT_CC_DFP_FCC 2627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$T, DFPRegs:$F, i32imm:$Cond), 2637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "; SELECT_CC_DFP_FCC PSEUDO!", 2647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (SPselectfcc DFPRegs:$T, DFPRegs:$F, 2657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman imm:$Cond))]>; 2667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 2677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section A.3 - Synthetic Instructions, p. 85 2707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// special cases of JMPL: 2717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanlet isReturn = 1, isTerminator = 1, hasDelaySlot = 1 in { 2727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman let rd = O7.Num, rs1 = G0.Num, simm13 = 8 in 2737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def RETL: F3_2<2, 0b111000, (outs), (ins), "retl", [(retflag)]>; 2747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 2757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 2767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.1 - Load Integer Instructions, p. 90 2777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDSBrr : F3_1<3, 0b001001, 2787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins MEMrr:$addr), 2797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "ldsb [$addr], $dst", 2807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (sextloadi8 ADDRrr:$addr))]>; 2817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDSBri : F3_2<3, 0b001001, 2827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins MEMri:$addr), 2837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "ldsb [$addr], $dst", 2847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (sextloadi8 ADDRri:$addr))]>; 2857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDSHrr : F3_1<3, 0b001010, 2867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins MEMrr:$addr), 2877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "ldsh [$addr], $dst", 2887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (sextloadi16 ADDRrr:$addr))]>; 2897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDSHri : F3_2<3, 0b001010, 2907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins MEMri:$addr), 2917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "ldsh [$addr], $dst", 2927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (sextloadi16 ADDRri:$addr))]>; 2937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDUBrr : F3_1<3, 0b000001, 2947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins MEMrr:$addr), 2957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "ldub [$addr], $dst", 2967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (zextloadi8 ADDRrr:$addr))]>; 2977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDUBri : F3_2<3, 0b000001, 2987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins MEMri:$addr), 2997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "ldub [$addr], $dst", 3007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (zextloadi8 ADDRri:$addr))]>; 3017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDUHrr : F3_1<3, 0b000010, 3027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins MEMrr:$addr), 3037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "lduh [$addr], $dst", 3047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (zextloadi16 ADDRrr:$addr))]>; 3057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDUHri : F3_2<3, 0b000010, 3067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins MEMri:$addr), 3077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "lduh [$addr], $dst", 3087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (zextloadi16 ADDRri:$addr))]>; 3097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDrr : F3_1<3, 0b000000, 3107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins MEMrr:$addr), 3117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "ld [$addr], $dst", 3127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (load ADDRrr:$addr))]>; 3137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDri : F3_2<3, 0b000000, 3147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins MEMri:$addr), 3157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "ld [$addr], $dst", 3167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (load ADDRri:$addr))]>; 3177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.2 - Load Floating-point Instructions, p. 92 3197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDFrr : F3_1<3, 0b100000, 3207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins MEMrr:$addr), 3217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "ld [$addr], $dst", 3227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (load ADDRrr:$addr))]>; 3237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDFri : F3_2<3, 0b100000, 3247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins MEMri:$addr), 3257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "ld [$addr], $dst", 3267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (load ADDRri:$addr))]>; 3277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDDFrr : F3_1<3, 0b100011, 3287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs DFPRegs:$dst), (ins MEMrr:$addr), 3297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "ldd [$addr], $dst", 3307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (load ADDRrr:$addr))]>; 3317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LDDFri : F3_2<3, 0b100011, 3327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs DFPRegs:$dst), (ins MEMri:$addr), 3337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "ldd [$addr], $dst", 3347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (load ADDRri:$addr))]>; 3357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.4 - Store Integer Instructions, p. 95 3377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef STBrr : F3_1<3, 0b000101, 3387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins MEMrr:$addr, IntRegs:$src), 3397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "stb $src, [$addr]", 3407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(truncstorei8 IntRegs:$src, ADDRrr:$addr)]>; 3417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef STBri : F3_2<3, 0b000101, 3427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins MEMri:$addr, IntRegs:$src), 3437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "stb $src, [$addr]", 3447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(truncstorei8 IntRegs:$src, ADDRri:$addr)]>; 3457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef STHrr : F3_1<3, 0b000110, 3467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins MEMrr:$addr, IntRegs:$src), 3477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "sth $src, [$addr]", 3487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(truncstorei16 IntRegs:$src, ADDRrr:$addr)]>; 3497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef STHri : F3_2<3, 0b000110, 3507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins MEMri:$addr, IntRegs:$src), 3517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "sth $src, [$addr]", 3527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(truncstorei16 IntRegs:$src, ADDRri:$addr)]>; 3537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef STrr : F3_1<3, 0b000100, 3547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins MEMrr:$addr, IntRegs:$src), 3557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "st $src, [$addr]", 3567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(store IntRegs:$src, ADDRrr:$addr)]>; 3577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef STri : F3_2<3, 0b000100, 3587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins MEMri:$addr, IntRegs:$src), 3597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "st $src, [$addr]", 3607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(store IntRegs:$src, ADDRri:$addr)]>; 3617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.5 - Store Floating-point Instructions, p. 97 3637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef STFrr : F3_1<3, 0b100100, 3647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins MEMrr:$addr, FPRegs:$src), 3657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "st $src, [$addr]", 3667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(store FPRegs:$src, ADDRrr:$addr)]>; 3677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef STFri : F3_2<3, 0b100100, 3687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins MEMri:$addr, FPRegs:$src), 3697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "st $src, [$addr]", 3707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(store FPRegs:$src, ADDRri:$addr)]>; 3717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef STDFrr : F3_1<3, 0b100111, 3727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins MEMrr:$addr, DFPRegs:$src), 3737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "std $src, [$addr]", 3747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(store DFPRegs:$src, ADDRrr:$addr)]>; 3757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef STDFri : F3_2<3, 0b100111, 3767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins MEMri:$addr, DFPRegs:$src), 3777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "std $src, [$addr]", 3787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(store DFPRegs:$src, ADDRri:$addr)]>; 3797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.9 - SETHI Instruction, p. 104 3817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef SETHIi: F2_1<0b100, 3827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins i32imm:$src), 3837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "sethi $src, $dst", 3847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, SETHIimm:$src)]>; 3857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.10 - NOP Instruction, p. 105 3877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// (It's a special case of SETHI) 3887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanlet rd = 0, imm22 = 0 in 3897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def NOP : F2_1<0b100, (outs), (ins), "nop", []>; 3907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.11 - Logical Instructions, p. 106 3927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm AND : F3_12<"and", 0b000001, and>; 3937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 3947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ANDNrr : F3_1<2, 0b000101, 3957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins IntRegs:$b, IntRegs:$c), 3967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "andn $b, $c, $dst", 3977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (and IntRegs:$b, (not IntRegs:$c)))]>; 3987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ANDNri : F3_2<2, 0b000101, 3997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins IntRegs:$b, i32imm:$c), 4007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "andn $b, $c, $dst", []>; 401190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 4027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm OR : F3_12<"or", 0b000010, or>; 4037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ORNrr : F3_1<2, 0b000110, 4057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins IntRegs:$b, IntRegs:$c), 4067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "orn $b, $c, $dst", 4077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (or IntRegs:$b, (not IntRegs:$c)))]>; 4087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef ORNri : F3_2<2, 0b000110, 4097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins IntRegs:$b, i32imm:$c), 410190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer "orn $b, $c, $dst", []>; 411190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerdefm XOR : F3_12<"xor", 0b000011, xor>; 4127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef XNORrr : F3_1<2, 0b000111, 4147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins IntRegs:$b, IntRegs:$c), 4157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "xnor $b, $c, $dst", 4167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, (not (xor IntRegs:$b, IntRegs:$c)))]>; 4177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef XNORri : F3_2<2, 0b000111, 4187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins IntRegs:$b, i32imm:$c), 4197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "xnor $b, $c, $dst", []>; 4207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.12 - Shift Instructions, p. 107 422190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerdefm SLL : F3_12<"sll", 0b100101, shl>; 4237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm SRL : F3_12<"srl", 0b100110, srl>; 4247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm SRA : F3_12<"sra", 0b100111, sra>; 425190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 4267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.13 - Add Instructions, p. 108 4277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm ADD : F3_12<"add", 0b000000, add>; 428190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 4297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// "LEA" forms of add (patterns to make tblgen happy) 4307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef LEA_ADDri : F3_2<2, 0b000000, 431190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer (outs IntRegs:$dst), (ins MEMri:$addr), 4327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "add ${addr:arith}, $dst", 4337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, ADDRri:$addr)]>; 4347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm ADDCC : F3_12<"addcc", 0b010000, addc>; 4367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm ADDX : F3_12<"addx", 0b001000, adde>; 4377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.15 - Subtract Instructions, p. 110 4397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm SUB : F3_12 <"sub" , 0b000100, sub>; 4407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm SUBX : F3_12 <"subx" , 0b001100, sube>; 4417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm SUBCC : F3_12 <"subcc", 0b010100, SPcmpicc>; 4427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef SUBXCCrr: F3_1<2, 0b011100, 4447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins IntRegs:$b, IntRegs:$c), 4457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "subxcc $b, $c, $dst", []>; 4467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.18 - Multiply Instructions, p. 113 4487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm UMUL : F3_12np<"umul", 0b001010>; 4497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm SMUL : F3_12 <"smul", 0b001011, mul>; 4507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 451190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 452190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Section B.19 - Divide Instructions, p. 115 4537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm UDIV : F3_12np<"udiv", 0b001110>; 4547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandefm SDIV : F3_12np<"sdiv", 0b001111>; 4557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 456190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Section B.20 - SAVE and RESTORE, p. 117 457190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerdefm SAVE : F3_12np<"save" , 0b111100>; 458190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerdefm RESTORE : F3_12np<"restore", 0b111101>; 459190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 460190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer// Section B.21 - Branch on Integer Condition Codes Instructions, p. 119 461190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 4627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// conditional branch class: 4637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass BranchSP<bits<4> cc, dag ins, string asmstr, list<dag> pattern> 4647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : F2_2<cc, 0b010, (outs), ins, asmstr, pattern> { 4657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman let isBranch = 1; 4667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman let isTerminator = 1; 4677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman let hasDelaySlot = 1; 4687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 4697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanlet isBarrier = 1 in 4717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def BA : BranchSP<0b1000, (ins brtarget:$dst), 4727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "ba $dst", 4737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(br bb:$dst)]>; 4747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// FIXME: the encoding for the JIT should look at the condition field. 4767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef BCOND : BranchSP<0, (ins brtarget:$dst, CCOp:$cc), 4777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "b$cc $dst", 4787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(SPbricc bb:$dst, imm:$cc)]>; 4797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.22 - Branch on Floating-point Condition Codes Instructions, p. 121 4827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// floating-point conditional branch class: 4847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanclass FPBranchSP<bits<4> cc, dag ins, string asmstr, list<dag> pattern> 4857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : F2_2<cc, 0b110, (outs), ins, asmstr, pattern> { 4867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman let isBranch = 1; 4877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman let isTerminator = 1; 4887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman let hasDelaySlot = 1; 4897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 4907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 4917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// FIXME: the encoding for the JIT should look at the condition field. 4927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FBCOND : FPBranchSP<0, (ins brtarget:$dst, CCOp:$cc), 4937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fb$cc $dst", 4947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(SPbrfcc bb:$dst, imm:$cc)]>; 4957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 496190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer 4977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.24 - Call and Link Instruction, p. 125 4987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// This is the only Format 1 instruction 4997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanlet Uses = [O0, O1, O2, O3, O4, O5], 5007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman hasDelaySlot = 1, isCall = 1, 5017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman Defs = [O0, O1, O2, O3, O4, O5, O7, G1, G2, G3, G4, G5, G6, G7, 5027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15] in { 5037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def CALL : InstSP<(outs), (ins calltarget:$dst), 5047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "call $dst", []> { 5057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman bits<30> disp; 5067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman let op = 1; 5077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman let Inst{29-0} = disp; 5087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman } 5097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // indirect calls 5117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def JMPLrr : F3_1<2, 0b111000, 5127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins MEMrr:$ptr), 5137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "call $ptr", 5147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(call ADDRrr:$ptr)]>; 5157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def JMPLri : F3_2<2, 0b111000, 5167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins MEMri:$ptr), 5177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "call $ptr", 5187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(call ADDRri:$ptr)]>; 5197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 5207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.28 - Read State Register Instructions 5227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef RDY : F3_1<2, 0b101000, 5237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins), 5247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "rd %y, $dst", []>; 5257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Section B.29 - Write State Register Instructions 5277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef WRYrr : F3_1<2, 0b110000, 5287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins IntRegs:$b, IntRegs:$c), 5297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "wr $b, $c, %y", []>; 5307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef WRYri : F3_2<2, 0b110000, 5317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins IntRegs:$b, i32imm:$c), 5327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "wr $b, $c, %y", []>; 5337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Convert Integer to Floating-point Instructions, p. 141 5357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FITOS : F3_3<2, 0b110100, 0b011000100, 5367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins FPRegs:$src), 5377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fitos $src, $dst", 5387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (SPitof FPRegs:$src))]>; 5397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FITOD : F3_3<2, 0b110100, 0b011001000, 5407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs DFPRegs:$dst), (ins FPRegs:$src), 5417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fitod $src, $dst", 5427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (SPitof FPRegs:$src))]>; 5437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Convert Floating-point to Integer Instructions, p. 142 5457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FSTOI : F3_3<2, 0b110100, 0b011010001, 5467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins FPRegs:$src), 5477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fstoi $src, $dst", 5487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (SPftoi FPRegs:$src))]>; 5497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FDTOI : F3_3<2, 0b110100, 0b011010010, 5507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins DFPRegs:$src), 5517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fdtoi $src, $dst", 5527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (SPftoi DFPRegs:$src))]>; 5537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Convert between Floating-point Formats Instructions, p. 143 5557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FSTOD : F3_3<2, 0b110100, 0b011001001, 5567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs DFPRegs:$dst), (ins FPRegs:$src), 5577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fstod $src, $dst", 5587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (fextend FPRegs:$src))]>; 5597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FDTOS : F3_3<2, 0b110100, 0b011000110, 5607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins DFPRegs:$src), 5617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fdtos $src, $dst", 5627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (fround DFPRegs:$src))]>; 5637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Floating-point Move Instructions, p. 144 5657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FMOVS : F3_3<2, 0b110100, 0b000000001, 5667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins FPRegs:$src), 5677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fmovs $src, $dst", []>; 568e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramerdef FNEGS : F3_3<2, 0b110100, 0b000000101, 5697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins FPRegs:$src), 5707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fnegs $src, $dst", 5717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (fneg FPRegs:$src))]>; 5727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FABSS : F3_3<2, 0b110100, 0b000001001, 5737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins FPRegs:$src), 5747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fabss $src, $dst", 5757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (fabs FPRegs:$src))]>; 5767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Floating-point Square Root Instructions, p.145 5797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FSQRTS : F3_3<2, 0b110100, 0b000101001, 5807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins FPRegs:$src), 5817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fsqrts $src, $dst", 5827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (fsqrt FPRegs:$src))]>; 5837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FSQRTD : F3_3<2, 0b110100, 0b000101010, 5847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs DFPRegs:$dst), (ins DFPRegs:$src), 5857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fsqrtd $src, $dst", 5867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (fsqrt DFPRegs:$src))]>; 5877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 5907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Floating-point Add and Subtract Instructions, p. 146 5917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FADDS : F3_3<2, 0b110100, 0b001000001, 5927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins FPRegs:$src1, FPRegs:$src2), 5937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fadds $src1, $src2, $dst", 5947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (fadd FPRegs:$src1, FPRegs:$src2))]>; 5957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FADDD : F3_3<2, 0b110100, 0b001000010, 5967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs DFPRegs:$dst), (ins DFPRegs:$src1, DFPRegs:$src2), 5977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "faddd $src1, $src2, $dst", 5987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (fadd DFPRegs:$src1, DFPRegs:$src2))]>; 5997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FSUBS : F3_3<2, 0b110100, 0b001000101, 6007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins FPRegs:$src1, FPRegs:$src2), 6017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fsubs $src1, $src2, $dst", 6027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (fsub FPRegs:$src1, FPRegs:$src2))]>; 6037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FSUBD : F3_3<2, 0b110100, 0b001000110, 6047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs DFPRegs:$dst), (ins DFPRegs:$src1, DFPRegs:$src2), 6057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fsubd $src1, $src2, $dst", 6067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (fsub DFPRegs:$src1, DFPRegs:$src2))]>; 6077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Floating-point Multiply and Divide Instructions, p. 147 6097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FMULS : F3_3<2, 0b110100, 0b001001001, 6107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins FPRegs:$src1, FPRegs:$src2), 6117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fmuls $src1, $src2, $dst", 6127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (fmul FPRegs:$src1, FPRegs:$src2))]>; 6137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FMULD : F3_3<2, 0b110100, 0b001001010, 6147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs DFPRegs:$dst), (ins DFPRegs:$src1, DFPRegs:$src2), 6157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fmuld $src1, $src2, $dst", 6167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (fmul DFPRegs:$src1, DFPRegs:$src2))]>; 6177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FSMULD : F3_3<2, 0b110100, 0b001101001, 6187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs DFPRegs:$dst), (ins FPRegs:$src1, FPRegs:$src2), 6197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fsmuld $src1, $src2, $dst", 6207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (fmul (fextend FPRegs:$src1), 6217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (fextend FPRegs:$src2)))]>; 622e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramerdef FDIVS : F3_3<2, 0b110100, 0b001001101, 6237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs FPRegs:$dst), (ins FPRegs:$src1, FPRegs:$src2), 6247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fdivs $src1, $src2, $dst", 6257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, (fdiv FPRegs:$src1, FPRegs:$src2))]>; 6267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FDIVD : F3_3<2, 0b110100, 0b001001110, 6277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs DFPRegs:$dst), (ins DFPRegs:$src1, DFPRegs:$src2), 6287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fdivd $src1, $src2, $dst", 6297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (fdiv DFPRegs:$src1, DFPRegs:$src2))]>; 6307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Floating-point Compare Instructions, p. 148 6327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Note: the 2nd template arg is different for these guys. 6337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Note 2: the result of a FCMP is not available until the 2nd cycle 6347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// after the instr is retired, but there is no interlock. This behavior 6357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// is modelled with a forced noop after the instruction. 6367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCMPS : F3_3<2, 0b110101, 0b001010001, 6377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins FPRegs:$src1, FPRegs:$src2), 638e4b9c93fc1b531fe0cfe25a042f6b81c1e7c15c0Benjamin Kramer "fcmps $src1, $src2\n\tnop", 639190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer [(SPcmpfcc FPRegs:$src1, FPRegs:$src2)]>; 6407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef FCMPD : F3_3<2, 0b110101, 0b001010010, 6417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs), (ins DFPRegs:$src1, DFPRegs:$src2), 6427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fcmpd $src1, $src2\n\tnop", 6437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(SPcmpfcc DFPRegs:$src1, DFPRegs:$src2)]>; 6447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 6477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// V9 Instructions 6487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 6497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// V9 Conditional Moves. 6517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanlet Predicates = [HasV9], isTwoAddress = 1 in { 6527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // Move Integer Register on Condition (MOVcc) p. 194 of the V9 manual. 6537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman // FIXME: Add instruction encodings for the JIT some day. 6547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def MOVICCrr 6557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs IntRegs:$dst), (ins IntRegs:$T, IntRegs:$F, CCOp:$cc), 6567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "mov$cc %icc, $F, $dst", 6577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, 6587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (SPselecticc IntRegs:$F, IntRegs:$T, imm:$cc))]>; 6597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def MOVICCri 6607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs IntRegs:$dst), (ins IntRegs:$T, i32imm:$F, CCOp:$cc), 6617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "mov$cc %icc, $F, $dst", 6627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, 6637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (SPselecticc simm11:$F, IntRegs:$T, imm:$cc))]>; 6647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def MOVFCCrr 6667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs IntRegs:$dst), (ins IntRegs:$T, IntRegs:$F, CCOp:$cc), 6677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "mov$cc %fcc0, $F, $dst", 6687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, 6697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (SPselectfcc IntRegs:$F, IntRegs:$T, imm:$cc))]>; 6707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def MOVFCCri 6717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs IntRegs:$dst), (ins IntRegs:$T, i32imm:$F, CCOp:$cc), 6727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "mov$cc %fcc0, $F, $dst", 6737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set IntRegs:$dst, 6747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (SPselectfcc simm11:$F, IntRegs:$T, imm:$cc))]>; 6757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def FMOVS_ICC 6777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs FPRegs:$dst), (ins FPRegs:$T, FPRegs:$F, CCOp:$cc), 6787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fmovs$cc %icc, $F, $dst", 6797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, 6807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (SPselecticc FPRegs:$F, FPRegs:$T, imm:$cc))]>; 6817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def FMOVD_ICC 6827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$T, DFPRegs:$F, CCOp:$cc), 6837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fmovd$cc %icc, $F, $dst", 6847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, 6857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (SPselecticc DFPRegs:$F, DFPRegs:$T, imm:$cc))]>; 6867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def FMOVS_FCC 6877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs FPRegs:$dst), (ins FPRegs:$T, FPRegs:$F, CCOp:$cc), 6887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fmovs$cc %fcc0, $F, $dst", 6897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set FPRegs:$dst, 6907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (SPselectfcc FPRegs:$F, FPRegs:$T, imm:$cc))]>; 6917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def FMOVD_FCC 6927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman : Pseudo<(outs DFPRegs:$dst), (ins DFPRegs:$T, DFPRegs:$F, CCOp:$cc), 6937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fmovd$cc %fcc0, $F, $dst", 6947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, 6957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (SPselectfcc DFPRegs:$F, DFPRegs:$T, imm:$cc))]>; 6967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 6987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 6997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Floating-Point Move Instructions, p. 164 of the V9 manual. 7007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmanlet Predicates = [HasV9] in { 7017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def FMOVD : F3_3<2, 0b110100, 0b000000010, 7027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs DFPRegs:$dst), (ins DFPRegs:$src), 7037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fmovd $src, $dst", []>; 7047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def FNEGD : F3_3<2, 0b110100, 0b000000110, 7057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs DFPRegs:$dst), (ins DFPRegs:$src), 7067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fnegd $src, $dst", 7077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (fneg DFPRegs:$src))]>; 7087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman def FABSD : F3_3<2, 0b110100, 0b000001010, 7097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs DFPRegs:$dst), (ins DFPRegs:$src), 7107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "fabsd $src, $dst", 7117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman [(set DFPRegs:$dst, (fabs DFPRegs:$src))]>; 7127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman} 7137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// POPCrr - This does a ctpop of a 64-bit register. As such, we have to clear 7157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// the top 32-bits before using it. To do this clearing, we use a SLLri X,0. 7167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef POPCrr : F3_1<2, 0b101110, 7177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (outs IntRegs:$dst), (ins IntRegs:$src), 7187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman "popc $src, $dst", []>, Requires<[HasV9]>; 7197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(ctpop IntRegs:$src), 7207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (POPCrr (SLLri IntRegs:$src, 0))>; 7217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 7237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Non-Instruction Patterns 7247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman//===----------------------------------------------------------------------===// 7257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Small immediates. 7277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(i32 simm13:$val), 7287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (ORri G0, imm:$val)>; 7297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Arbitrary immediates. 7307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(i32 imm:$val), 7317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (ORri (SETHIi (HI22 imm:$val)), (LO10 imm:$val))>; 7327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// subc 7347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(subc IntRegs:$b, IntRegs:$c), 7357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (SUBCCrr IntRegs:$b, IntRegs:$c)>; 7367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(subc IntRegs:$b, simm13:$val), 7377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (SUBCCri IntRegs:$b, imm:$val)>; 7387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Global addresses, constant pool entries 7407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(SPhi tglobaladdr:$in), (SETHIi tglobaladdr:$in)>; 7417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(SPlo tglobaladdr:$in), (ORri G0, tglobaladdr:$in)>; 7427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(SPhi tconstpool:$in), (SETHIi tconstpool:$in)>; 7437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(SPlo tconstpool:$in), (ORri G0, tconstpool:$in)>; 7447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Add reg, lo. This is used when taking the addr of a global/constpool entry. 7467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(add IntRegs:$r, (SPlo tglobaladdr:$in)), 7477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (ADDri IntRegs:$r, tglobaladdr:$in)>; 748190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramerdef : Pat<(add IntRegs:$r, (SPlo tconstpool:$in)), 749190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer (ADDri IntRegs:$r, tconstpool:$in)>; 7507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Calls: 7527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(call tglobaladdr:$dst), 7537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (CALL tglobaladdr:$dst)>; 7547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(call texternalsym:$dst), 7557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman (CALL texternalsym:$dst)>; 7567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// Map integer extload's to zextloads. 7587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(i32 (extloadi1 ADDRrr:$src)), (LDUBrr ADDRrr:$src)>; 7597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(i32 (extloadi1 ADDRri:$src)), (LDUBri ADDRri:$src)>; 7607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(i32 (extloadi8 ADDRrr:$src)), (LDUBrr ADDRrr:$src)>; 7617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(i32 (extloadi8 ADDRri:$src)), (LDUBri ADDRri:$src)>; 7627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(i32 (extloadi16 ADDRrr:$src)), (LDUHrr ADDRrr:$src)>; 7637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(i32 (extloadi16 ADDRri:$src)), (LDUHri ADDRri:$src)>; 7647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman 7657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman// zextload bool -> zextload byte 7667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(i32 (zextloadi1 ADDRrr:$src)), (LDUBrr ADDRrr:$src)>; 7677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmandef : Pat<(i32 (zextloadi1 ADDRri:$src)), (LDUBri ADDRri:$src)>; 768190f8ee25a6977ac6eb71b816498df42f17ad9a7Benjamin Kramer