From 998800cb874fcdc1f671f17a000787e518326e81 Mon Sep 17 00:00:00 2001 From: Misha Brukman Date: Tue, 27 May 2003 20:03:29 +0000 Subject: [PATCH] Added definitions for a bunch of floating-point instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6356 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/SparcV9/SparcV9.td | 446 +++++++++++++++++++++++++++++----- 1 file changed, 381 insertions(+), 65 deletions(-) diff --git a/lib/Target/SparcV9/SparcV9.td b/lib/Target/SparcV9/SparcV9.td index 8979e385126..581156460b4 100644 --- a/lib/Target/SparcV9/SparcV9.td +++ b/lib/Target/SparcV9/SparcV9.td @@ -1,5 +1,5 @@ //===- Sparc.td - Target Description for Sparc V9 Target --------*- C++ -*-===// -// +// vim:ft=cpp //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// @@ -35,7 +35,15 @@ class V9Reg : Register { set Namespace = "SparcV9"; } // Ri - One of the 32 64 bit integer registers class Ri num> : V9Reg { set Size = 64; field bits<5> Num = num; } -def G0 : Ri<0>; def G1 : Ri<1>; def G2 : Ri<2>; def G3 : Ri<3>; +def G0 : Ri< 0>; def G1 : Ri< 1>; def G2 : Ri< 2>; def G3 : Ri< 3>; +def G4 : Ri< 4>; def G5 : Ri< 5>; def G6 : Ri< 6>; def G7 : Ri< 7>; +def O0 : Ri< 8>; def O1 : Ri< 9>; def O2 : Ri<10>; def O3 : Ri<11>; +def O4 : Ri<12>; def O5 : Ri<13>; def O6 : Ri<14>; def O7 : Ri<15>; +def L0 : Ri<16>; def L1 : Ri<17>; def L2 : Ri<18>; def L3 : Ri<19>; +def L4 : Ri<20>; def L5 : Ri<21>; def L6 : Ri<22>; def L7 : Ri<23>; +def I0 : Ri<24>; def I1 : Ri<25>; def I2 : Ri<26>; def I3 : Ri<27>; +def I4 : Ri<28>; def I5 : Ri<29>; def I6 : Ri<30>; def I7 : Ri<31>; +// Floating-point registers? // ... @@ -67,6 +75,16 @@ class F2 : InstV9 { // Format 2 instructions set Inst{24-22} = op2; } +// Format 2.1 instructions +class F2_1 : F2 { + bits<5> rd; + bits<22> imm; + + set Name = name; + set Inst{29-25} = rd; + set Inst{21-0} = imm; +} + class F2_br : F2 { // Format 2 Branch instruction bit annul; // All branches have an annul bit set Inst{29} = annul; @@ -129,13 +147,17 @@ class F3_rs1 : F3 { } // F3_rs1rd - Common superclass of instructions that use rs1 & rd... -class F3_rs1rd : F3_rs1 { +class F3_rs1rd : F3 { + // Added rs1 here manually to have rd appear before rs1 + // Formerly inherited directly from F3_rs1 bits<5> rd; + bits<5> rs1; set Inst{29-25} = rd; + set Inst{18-14} = rs1; } // F3_rs1rdrs2 - Common superclass of instructions with rs1, rd, & rs2 fields -class F3_rs1rdrs2 : F3_rs1 { +class F3_rs1rdrs2 : F3_rs1rd { bits<5> rs2; set Inst{4-0} = rs2; } @@ -172,18 +194,55 @@ class F3_3 opVal, bits<6> op3val, string name> : F3_rs1 { set Inst{4-0} = rs2; } -class F3_4 opVal, bits<6> op3val, string name> : F3_rs1 { +class F3_4 opVal, bits<6> op3Val, string name> : F3_rs1 { bits<13> simm; set op = opVal; - set op3 = op3val; + set op3 = op3Val; set Name = name; //set Inst{29-25} = dontcare; set Inst{13} = 1; set Inst{12-0} = simm; } +class F3_11 opVal, bits<6> op3Val, string name> : F3_rs1rdrs2 { + bit x; + set op = opVal; + set op3 = op3Val; + set Name = name; + set Inst{13} = 0; // i field = 0 + set Inst{12} = x; + //set Inst{11-5} = dontcare; +} +class F3_12 opVal, bits<6> op3Val, string name> : F3 { + bits<5> shcnt; + set Name = name; + set Inst{13} = 1; // i field = 1 + set Inst{12} = 0; // x field = 0 + //set Inst{11-5} = dontcare; + set Inst{4-0} = shcnt; +} + +class F3_13 opVal, bits<6> op3Val, string name> : F3 { + bits<6> shcnt; + + set Name = name; + set Inst{13} = 1; // i field = 1 + set Inst{12} = 1; // x field = 1 + //set Inst{11-6} = dontcare; + set Inst{5-0} = shcnt; +} + +class F3_14 opVal, bits<6> op3val, + bits<9> opfval, string name> : F3_rs1rdrs2 { + set op = opVal; + set op3 = op3val; + set Name = name; + //set Inst{18-14} = dontcare; + set Inst{13-5} = opfval; +} + class F3_16 opVal, bits<6> op3val, bits<9> opfval, string name> : F3_rs1rdrs2 { set op = opVal; @@ -207,12 +266,12 @@ class F3_18 fcn, string name> : F3 { // Section A.2: p161 def ADDr : F3_1<2, 0b000000, "add">; // add r, r, r def ADDi : F3_2<2, 0b000000, "add">; // add r, r, i -def ADDCCr : F3_1<2, 0b010000, "addcc">; // addcc r, r, r -def ADDCCi : F3_2<2, 0b010000, "addcc">; // addcc r, r, i +def ADDccr : F3_1<2, 0b010000, "addcc">; // addcc r, r, r +def ADDcci : F3_2<2, 0b010000, "addcc">; // addcc r, r, i def ADDCr : F3_1<2, 0b001000, "addC">; // addC r, r, r def ADDCi : F3_2<2, 0b001000, "addC">; // addC r, r, i -def ADDCCCr : F3_1<2, 0b011000, "addCcc">; // addCcc r, r, r -def ADDCCCi : F3_2<2, 0b011000, "addCcc">; // addCcc r, r, i +def ADDCccr : F3_1<2, 0b011000, "addCcc">; // addCcc r, r, r +def ADDCcci : F3_2<2, 0b011000, "addCcc">; // addCcc r, r, i // Section A.3: p162 set op2 = 0b011 in { @@ -247,24 +306,24 @@ set isDeprecated = 1 in { } // Section A.5: p167 -set op2 = 0b101 in { - def FBPA : F2_3<0b1000, "fbpa">; // Branch always - def FBPN : F2_3<0b0000, "fbpn">; // Branch never - def FBPU : F2_3<0b0111, "fbpu">; // Branch on unordered - def FBPG : F2_3<0b0110, "fbpg">; // Branch > - def FBPUG : F2_3<0b0101, "fbpug">; // Branch on unordered or > - def FBPL : F2_3<0b0100, "fbpl">; // Branch < - def FBPUL : F2_3<0b0011, "fbpul">; // Branch on unordered or < - def FBPLG : F2_3<0b0010, "fbplg">; // Branch < or > - def FBPNE : F2_3<0b0001, "fbpne">; // Branch != - def FBPE : F2_3<0b1001, "fbpe">; // Branch == - def FBPUE : F2_3<0b1010, "fbpue">; // Branch on unordered or == - def FBPGE : F2_3<0b1011, "fbpge">; // Branch > or == - def FBPUGE : F2_3<0b1100, "fbpuge">; // Branch unord or > or == - def FBPLE : F2_3<0b1101, "fbple">; // Branch < or == - def FBPULE : F2_3<0b1110, "fbpule">; // Branch unord or < or == - def FBPO : F2_3<0b1111, "fbpo">; // Branch on ordered -} +//set op2 = 0b101 in { + //def FBPA : F2_3<0b1000, "fbpa">; // Branch always + //def FBPN : F2_3<0b0000, "fbpn">; // Branch never + //def FBPU : F2_3<0b0111, "fbpu">; // Branch on unordered + //def FBPG : F2_3<0b0110, "fbpg">; // Branch > + //def FBPUG : F2_3<0b0101, "fbpug">; // Branch on unordered or > + //def FBPL : F2_3<0b0100, "fbpl">; // Branch < + //def FBPUL : F2_3<0b0011, "fbpul">; // Branch on unordered or < + //def FBPLG : F2_3<0b0010, "fbplg">; // Branch < or > + //def FBPNE : F2_3<0b0001, "fbpne">; // Branch != + //def FBPE : F2_3<0b1001, "fbpe">; // Branch == + //def FBPUE : F2_3<0b1010, "fbpue">; // Branch on unordered or == + //def FBPGE : F2_3<0b1011, "fbpge">; // Branch > or == + //def FBPUGE : F2_3<0b1100, "fbpuge">; // Branch unord or > or == + //def FBPLE : F2_3<0b1101, "fbple">; // Branch < or == + //def FBPULE : F2_3<0b1110, "fbpule">; // Branch unord or < or == + //def FBPO : F2_3<0b1111, "fbpo">; // Branch on ordered +//} // Section A.6: p170: Bicc set isDeprecated = 1 in { @@ -289,25 +348,24 @@ set isDeprecated = 1 in { } // Section A.7: p172 -set op2 = 0b001 in { - def BPA : F2_3<0b1000, "bpa">; // Branch always - def BPN : F2_3<0b0000, "bpn">; // Branch never - def BPNE : F2_3<0b1001, "bpne">; // Branch != - def BPE : F2_3<0b0001, "bpe">; // Branch == - def BPG : F2_3<0b1010, "bpg">; // Branch > - def BPLE : F2_3<0b0010, "bple">; // Branch <= - def BPGE : F2_3<0b1011, "bpge">; // Branch >= - def BPL : F2_3<0b0011, "bpl">; // Branch < - def BPGU : F2_3<0b1100, "bpgu">; // Branch unsigned > - - def BPLEU : F2_3<0b0100, "bpleu">; // Branch unsigned <= - def BPCC : F2_3<0b1101, "bpcc">; // Branch unsigned >= - def BPCS : F2_3<0b0101, "bpcs">; // Branch unsigned <= - def BPPOS : F2_3<0b1110, "bppos">; // Branch on positive - def BPNEG : F2_3<0b0110, "bpneg">; // Branch on negative - def BPVC : F2_3<0b1111, "bpvc">; // Branch on overflow clear - def BPVS : F2_3<0b0111, "bpvs">; // Branch on overflow set -} +//set op2 = 0b001 in { +// def BPA : F2_3<0b1000, "bpa">; // Branch always +// def BPN : F2_3<0b0000, "bpn">; // Branch never +// def BPNE : F2_3<0b1001, "bpne">; // Branch != +// def BPE : F2_3<0b0001, "bpe">; // Branch == +// def BPG : F2_3<0b1010, "bpg">; // Branch > +// def BPLE : F2_3<0b0010, "bple">; // Branch <= +// def BPGE : F2_3<0b1011, "bpge">; // Branch >= +// def BPL : F2_3<0b0011, "bpl">; // Branch < +// def BPGU : F2_3<0b1100, "bpgu">; // Branch unsigned > +// def BPLEU : F2_3<0b0100, "bpleu">; // Branch unsigned <= +// def BPCC : F2_3<0b1101, "bpcc">; // Branch unsigned >= +// def BPCS : F2_3<0b0101, "bpcs">; // Branch unsigned <= +// def BPPOS : F2_3<0b1110, "bppos">; // Branch on positive +// def BPNEG : F2_3<0b0110, "bpneg">; // Branch on negative +// def BPVC : F2_3<0b1111, "bpvc">; // Branch on overflow clear +// def BPVS : F2_3<0b0111, "bpvs">; // Branch on overflow set +//} // Section A.8: p175 - CALL - the only Format #1 instruction def CALL : InstV9 { @@ -323,22 +381,23 @@ def CALL : InstV9 { // Section A.10: Divide (64-bit / 32-bit) - p178 -set isDeprecated = 1 in { - def UDIVr : F3_1<2, 0b001110, "udiv">; // udiv r, r, r - def UDIVi : F3_2<2, 0b001110, "udiv">; // udiv r, r, i - def SDIVr : F3_1<2, 0b001111, "sdiv">; // sdiv r, r, r - def SDIVi : F3_2<2, 0b001111, "sdiv">; // sdiv r, r, i - def UDIVCCr : F3_1<2, 0b011110, "udivcc">; // udivcc r, r, r - def UDIVCCi : F3_2<2, 0b011110, "udivcc">; // udivcc r, r, i - def SDIVCCr : F3_1<2, 0b011111, "sdivcc">; // sdivcc r, r, r - def SDIVCCi : F3_2<2, 0b011111, "sdivcc">; // sdivcc r, r, i -} +// Not used in the Sparc backend +//set isDeprecated = 1 in { + //def UDIVr : F3_1<2, 0b001110, "udiv">; // udiv r, r, r + //def UDIVi : F3_2<2, 0b001110, "udiv">; // udiv r, r, i + //def SDIVr : F3_1<2, 0b001111, "sdiv">; // sdiv r, r, r + //def SDIVi : F3_2<2, 0b001111, "sdiv">; // sdiv r, r, i + //def UDIVCCr : F3_1<2, 0b011110, "udivcc">; // udivcc r, r, r + //def UDIVCCi : F3_2<2, 0b011110, "udivcc">; // udivcc r, r, i + //def SDIVCCr : F3_1<2, 0b011111, "sdivcc">; // sdivcc r, r, r + //def SDIVCCi : F3_2<2, 0b011111, "sdivcc">; // sdivcc r, r, i +//} // Section A.11: DONE and RETRY - p181 -set isPrivileged = 1 in { - def DONE : F3_18<0, "done">; // done - def RETRY : F3_18<1, "retry">; // retry -} +//set isPrivileged = 1 in { + //def DONE : F3_18<0, "done">; // done + //def RETRY : F3_18<1, "retry">; // retry +//} // Section A.12: Floating-Point Add and Subtract - p182 def FADDS : F3_16<2, 0b110100, 0x41, "fadds">; // fadds f, f, f @@ -348,12 +407,269 @@ def FSUBS : F3_16<2, 0b110100, 0x45, "fsubs">; // fsubs f, f, f def FSUBD : F3_16<2, 0b110100, 0x46, "fsubd">; // fsubd f, f, f def FSUBQ : F3_16<2, 0b110100, 0x47, "fsubq">; // fsubq f, f, f -// -// ... -// +// Section A.17: Floating-Point Move - p164 +def FMOVS : F3_14<2, 0b110100, 0b000000001, "fmovs">; // fmovs r, r +def FMOVD : F3_14<2, 0b110100, 0b000000010, "fmovs">; // fmovd r, r +//def FMOVQ : F3_14<2, 0b110100, 0b000000011, "fmovs">; // fmovq r, r +def FNEGS : F3_14<2, 0b110100, 0b000000101, "fnegs">; // fnegs r, r +def FNEGD : F3_14<2, 0b110100, 0b000000110, "fnegs">; // fnegs r, r +//def FNEGQ : F3_14<2, 0b110100, 0b000000111, "fnegs">; // fnegs r, r +def FABSS : F3_14<2, 0b110100, 0b000001001, "fabss">; // fabss r, r +def FABSD : F3_14<2, 0b110100, 0b000001010, "fabss">; // fabss r, r +//def FABSQ : F3_14<2, 0b110100, 0b000001011, "fabss">; // fabss r, r + +// Section A.18: Floating-Point Multiply and Divide - p165 +def FMULS : F3_16<2, 0b110100, 0b001001001, "fmuls">; // fmuls r, r, r +def FMULD : F3_16<2, 0b110100, 0b001001010, "fmuld">; // fmuld r, r, r +def FMULQ : F3_16<2, 0b110100, 0b001001011, "fmulq">; // fmulq r, r, r +def FSMULD : F3_16<2, 0b110100, 0b001101001, "fsmuld">; // fsmuls r, r, r +def FDMULQ : F3_16<2, 0b110100, 0b001101110, "fdmulq">; // fdmuls r, r, r +def FDIVS : F3_16<2, 0b110100, 0b001001101, "fdivs">; // fdivs r, r, r +def FDIVD : F3_16<2, 0b110100, 0b001001110, "fdivs">; // fdivd r, r, r +def FDIVQ : F3_16<2, 0b110100, 0b001001111, "fdivs">; // fdivq r, r, r + +// Section A.19: Floating-Point Square Root - p166 +def FSQRTS : F3_14<2, 0b110100, 0b000101001, "fsqrts">; // fsqrts r, r +def FSQRTD : F3_14<2, 0b110100, 0b000101010, "fsqrts">; // fsqrts r, r +def FSQRTQ : F3_14<2, 0b110100, 0b000101011, "fsqrts">; // fsqrts r, r + +// Section A.24: Jump and Link +// Mimicking the Sparc's instr def... +def JMPLCALLr : F3_1<2, 0b111000, "jmpl">; // jmpl [r+r], r +def JMPLCALLi : F3_1<2, 0b111000, "jmpl">; // jmpl [r+i], r +def JMPLRETr : F3_1<2, 0b111000, "jmpl">; // jmpl [r+r], r +def JMPLRETi : F3_1<2, 0b111000, "jmpl">; // jmpl [r+i], r + +// FIXME: FCMPS, FCMPD, FCMPQ !!! +// FIXME: FMULS, FMULD, FMULQ, ... + +// Section A.25: Load Floating-Point - p173 +def LDFr : F3_1<3, 0b100000, "ld">; // ld [r+r], r +def LDFi : F3_2<3, 0b100000, "ld">; // ld [r+i], r +def LDDFr : F3_1<3, 0b100011, "ldd">; // ldd [r+r], r +def LDDFi : F3_2<3, 0b100011, "ldd">; // ldd [r+i], r +def LDQFr : F3_1<3, 0b100010, "ldq">; // ldq [r+r], r +def LDQFi : F3_2<3, 0b100010, "ldq">; // ldq [r+i], r +set isDeprecated = 1 in { + set rd = 0 in { + def LDFSRr : F3_1<3, 0b100001, "ld">; // ld [r+r], r + def LDFSRi : F3_2<3, 0b100001, "ld">; // ld [r+i], r + } +} +set rd = 1 in { + def LDXFSRr : F3_1<3, 0b100001, "ldx">; // ldx [r+r], r + def LDXFSRi : F3_2<3, 0b100001, "ldx">; // ldx [r+i], r +} -// Section A.45: RETURN - p240 +// Section A.27: Load Integer - p178 +def LDSBr : F3_1<3, 0b001001, "ldsb">; // ldsb [r+r], r +def LDSBi : F3_2<3, 0b001001, "ldsb">; // ldsb [r+i], r +def LDSHr : F3_1<3, 0b001010, "ldsh">; // ldsh [r+r], r +def LDSHi : F3_2<3, 0b001010, "ldsh">; // ldsh [r+i], r +def LDSWr : F3_1<3, 0b001000, "ldsw">; // ldsh [r+r], r +def LDSWi : F3_2<3, 0b001000, "ldsw">; // ldsh [r+i], r +def LDUBr : F3_1<3, 0b000001, "ldub">; // ldub [r+r], r +def LDUBi : F3_2<3, 0b000001, "ldub">; // ldub [r+i], r +def LDUHr : F3_1<3, 0b000010, "lduh">; // lduh [r+r], r +def LDUHi : F3_2<3, 0b000010, "lduh">; // lduh [r+i], r +// synonym: LD +def LDUWr : F3_1<3, 0b000000, "lduw">; // lduw [r+r], r +def LDUWi : F3_2<3, 0b000000, "lduw">; // lduw [r+i], r +// LDD should no longer be used, LDX should be used instead +def LDXr : F3_1<3, 0b001011, "ldx">; // ldx [r+r], r +def LDXi : F3_2<3, 0b001011, "ldx">; // ldx [r+i], r +//set isDeprecated = 1 in { +// def LDDr : F3_1<3, 0b000011, "ldd">; // ldd [r+r], r +// def LDDi : F3_2<3, 0b000011, "ldd">; // ldd [r+i], r +//} + +// Section A.31: Logical operations +def ANDr : F3_1<2, 0b000001, "and">; // and r, r, r +def ANDi : F3_2<2, 0b000001, "and">; // and r, r, i +def ANDccr : F3_1<2, 0b010001, "andcc">; // andcc r, r, r +def ANDcci : F3_2<2, 0b010001, "andcc">; // andcc r, r, i +def ANDNr : F3_1<2, 0b000101, "andn">; // andn r, r, r +def ANDNi : F3_2<2, 0b000101, "andn">; // andn r, r, i +def ANDNccr : F3_1<2, 0b010101, "andncc">; // andncc r, r, r +def ANDNcci : F3_2<2, 0b010101, "andncc">; // andncc r, r, i + +def ORr : F3_1<2, 0b000010, "or">; // or r, r, r +def ORi : F3_2<2, 0b000010, "or">; // or r, r, i +def ORccr : F3_1<2, 0b010010, "orcc">; // orcc r, r, r +def ORcci : F3_2<2, 0b010010, "orcc">; // orcc r, r, i +def ORNr : F3_1<2, 0b000110, "orn">; // orn r, r, r +def ORNi : F3_2<2, 0b000110, "orn">; // orn r, r, i +def ORNccr : F3_1<2, 0b010110, "orncc">; // orncc r, r, r +def ORNcci : F3_2<2, 0b010110, "orncc">; // orncc r, r, i + +def XORr : F3_1<2, 0b000011, "xor">; // xor r, r, r +def XORi : F3_2<2, 0b000011, "xor">; // xor r, r, i +def XORccr : F3_1<2, 0b010011, "xorcc">; // xorcc r, r, r +def XORcci : F3_2<2, 0b010011, "xorcc">; // xorcc r, r, i +def XNORr : F3_1<2, 0b000111, "xnor">; // xnor r, r, r +def XNORi : F3_2<2, 0b000111, "xnor">; // xnor r, r, i +def XNORccr : F3_1<2, 0b010111, "xnorcc">; // xnorcc r, r, r +def XNORcci : F3_2<2, 0b010111, "xnorcc">; // xnorcc r, r, i + +#if 0 +// Section A.33: Move Floating-Point Register on Condition (FMOVcc) +// For integer condition codes +def FMOVA : F4_7<2, 0b110101, 0b1000, "fmova">; // fmova r, r +def FMOVN : F4_7<2, 0b110101, 0b0000, "fmovn">; // fmovn r, r +def FMOVNE : F4_7<2, 0b110101, 0b1001, "fmovne">; // fmovne r, r +def FMOVE : F4_7<2, 0b110101, 0b0000, "fmove">; // fmove r, r +def FMOVG : F4_7<2, 0b110101, 0b1010, "fmovg">; // fmovg r, r +def FMOVLE : F4_7<2, 0b110101, 0b0000, "fmovle">; // fmovle r, r +def FMOVGE : F4_7<2, 0b110101, 0b1011, "fmovge">; // fmovge r, r +def FMOVL : F4_7<2, 0b110101, 0b0011, "fmovl">; // fmovl r, r +def FMOVGU : F4_7<2, 0b110101, 0b1100, "fmovgu">; // fmovgu r, r +def FMOVLEU : F4_7<2, 0b110101, 0b0100, "fmovleu">; // fmovleu r, r +def FMOVCC : F4_7<2, 0b110101, 0b1101, "fmovcc">; // fmovcc r, r +def FMOVCS : F4_7<2, 0b110101, 0b0101, "fmovcs">; // fmovcs r, r +def FMOVPOS : F4_7<2, 0b110101, 0b1110, "fmovpos">; // fmovpos r, r +def FMOVNEG : F4_7<2, 0b110101, 0b0110, "fmovneg">; // fmovneg r, r +def FMOVVC : F4_7<2, 0b110101, 0b1111, "fmovvc">; // fmovvc r, r +def FMOVVS : F4_7<2, 0b110101, 0b0111, "fmovvs">; // fmovvs r, r + +// For floating-point condition codes +def FMOVFA : F4_7<2, 0b110101, 0b0100, "fmovfa">; // fmovfa r, r +def FMOVFN : F4_7<2, 0b110101, 0b0000, "fmovfn">; // fmovfa r, r +def FMOVFU : F4_7<2, 0b110101, 0b0111, "fmovfu">; // fmovfu r, r +def FMOVFG : F4_7<2, 0b110101, 0b0110, "fmovfg">; // fmovfg r, r +def FMOVFUG : F4_7<2, 0b110101, 0b0101, "fmovfug">; // fmovfug r, r +def FMOVFL : F4_7<2, 0b110101, 0b0100, "fmovfl">; // fmovfl r, r +def FMOVFUL : F4_7<2, 0b110101, 0b0011, "fmovful">; // fmovful r, r +def FMOVFLG : F4_7<2, 0b110101, 0b0010, "fmovflg">; // fmovflg r, r +def FMOVFNE : F4_7<2, 0b110101, 0b0001, "fmovfne">; // fmovfne r, r +def FMOVFE : F4_7<2, 0b110101, 0b1001, "fmovfe">; // fmovfe r, r +def FMOVFUE : F4_7<2, 0b110101, 0b1010, "fmovfue">; // fmovfue r, r +def FMOVGE : F4_7<2, 0b110101, 0b1011, "fmovge">; // fmovge r, r +def FMOVFUGE : F4_7<2, 0b110101, 0b1100, "fmovfuge">; // fmovfuge r, r +def FMOVFLE : F4_7<2, 0b110101, 0b1101, "fmovfle">; // fmovfle r, r +def FMOVFULE : F4_7<2, 0b110101, 0b1110, "fmovfule">; // fmovfule r, r +def FMOVFO : F4_7<2, 0b110101, 0b1111, "fmovfo">; // fmovfo r, r +#endif + +// Section A.37: Multiply and Divide (64-bit) - p199 +def MULXr : F3_1<2, 0b001001, "mulx">; // mulx r, r, r +def SDIVXr : F3_1<2, 0b101101, "sdivx">; // mulx r, r, r +def UDIVXr : F3_1<2, 0b001101, "udivx">; // mulx r, r, r +def MULXi : F3_2<2, 0b001001, "mulx">; // mulx r, i, r +def SDIVXi : F3_2<2, 0b101101, "sdivx">; // mulx r, i, r +def UDIVXi : F3_2<2, 0b001101, "udivx">; // mulx r, i, r + +// Section A.38: Multiply (32-bit) - p200 +// Not used in the Sparc backend? +//set Inst{13} = 0 in { +// def UMULr : F3_1<2, 0b001010, "umul">; // umul r, r, r +// def SMULr : F3_1<2, 0b001011, "smul">; // smul r, r, r +// def UMULCCr : F3_1<2, 0b011010, "umulcc">; // mulcc r, r, r +// def SMULCCr : F3_1<2, 0b011011, "smulcc">; // smulcc r, r, r +//} +//set Inst{13} = 1 in { +// def UMULi : F3_1<2, 0b001010, "umul">; // umul r, i, r +// def SMULi : F3_1<2, 0b001011, "smul">; // smul r, i, r +// def UMULCCi : F3_1<2, 0b011010, "umulcc">; // umulcc r, i, r +// def SMULCCi : F3_1<2, 0b011011, "smulcc">; // smulcc r, i, r +//} + +// Section A.40: No operation - p204 +// NOP is really a pseudo-instruction (special case of SETHI) +set op2 = 0b100 in { + set rd = 0 in { + set imm = 0 in { + def NOP : F2_1<"nop">; // nop + } + } +} + +// Section A.45: RETURN - p216 set isReturn = 1 in { def RETURNr : F3_3<2, 0b111001, "return">; // return def RETURNi : F3_4<2, 0b111001, "return">; // return } + +// Section A.46: SAVE and RESTORE - p217 +def SAVEr : F3_1<2, 0b111100, "save">; // save r, r, r +def SAVEi : F3_2<2, 0b111100, "save">; // save r, i, r +def RESTOREr : F3_1<2, 0b111101, "restore">; // restore r, r, r +def RESTOREi : F3_2<2, 0b111101, "restore">; // restore r, i, r + +// Section A.47: SAVED and RESTORED - p219 +// FIXME: add these instrs + +// Section A.48: SETHI - p220 +set op2 = 0b100 in { + def SETHI : F2_1<"sethi">; // sethi +} + +// Section A.49: Shift - p221 +// uses 5 least significant bits of rs2 +//set x = 0 in { +// def SLLr5 : F3_11<2, 0b100101, "sll">; // sll r, r, r +// def SRLr5 : F3_11<2, 0b100110, "srl">; // srl r, r, r +// def SRAr5 : F3_11<2, 0b100111, "sra">; // sra r, r, r +// def SLLXr5 : F3_11<2, 0b100101, "sllx">; // sllx r, r, r +// def SRLXr5 : F3_11<2, 0b100110, "srlx">; // srlx r, r, r +// def SRAXr5 : F3_11<2, 0b100111, "srax">; // srax r, r, r +//} +// uses 6 least significant bits of rs2 +set x = 1 in { + // def SLLr6 : F3_11<2, 0b100101, "sll">; // sll r, r, r + // def SRLr6 : F3_11<2, 0b100110, "srl">; // srl r, r, r + // def SRAr6 : F3_11<2, 0b100111, "sra">; // sra r, r, r + def SLLXr6 : F3_11<2, 0b100101, "sllx">; // sllx r, r, r + def SRLXr6 : F3_11<2, 0b100110, "srlx">; // srlx r, r, r + def SRAXr6 : F3_11<2, 0b100111, "srax">; // srax r, r, r +} + +//def SLLi5 : F3_12<2, 0b100101, "sll">; // sll r, shcnt32, r +//def SRLi5 : F3_12<2, 0b100110, "srl">; // srl r, shcnt32, r +//def SRAi5 : F3_12<2, 0b100111, "sra">; // sra r, shcnt32, r +//def SLLXi5 : F3_12<2, 0b100101, "sllx">; // sllx r, shcnt32, r +//def SRLXi5 : F3_12<2, 0b100110, "srlx">; // srlx r, shcnt32, r +//def SRAXi5 : F3_12<2, 0b100111, "srax">; // srax r, shcnt32, r + +//def SLLi6 : F3_13<2, 0b100101, "sll">; // sll r, shcnt64, r +//def SRLi6 : F3_13<2, 0b100110, "srl">; // srl r, shcnt64, r +//def SRAi6 : F3_13<2, 0b100111, "sra">; // sra r, shcnt64, r +def SLLXi6 : F3_13<2, 0b100101, "sllx">; // sllx r, shcnt64, r +def SRLXi6 : F3_13<2, 0b100110, "srlx">; // srlx r, shcnt64, r +def SRAXi6 : F3_13<2, 0b100111, "srax">; // srax r, shcnt64, r + +// Section A.52: Store Floating-point -p225 +def STFr : F3_1<3, 0b100100, "st">; // st r, [r+r] +def STFi : F3_2<3, 0b100100, "st">; // st r, [r+i] +def STDFr : F3_1<3, 0b100111, "std">; // std r, [r+r] +def STDFi : F3_2<3, 0b100111, "std">; // std r, [r+i] +// Not currently used in the Sparc backend +//def STQFr : F3_1<3, 0b100110, "stq">; // stq r, [r+r] +//def STQFi : F3_2<3, 0b100110, "stq">; // stq r, [r+i] +set isDeprecated = 1 in { + def STFSRr : F3_1<3, 0b100101, "st">; // st r, [r+r] + def STFSRi : F3_2<3, 0b100101, "st">; // st r, [r+i] +} +def STXFSRr : F3_1<3, 0b100101, "stq">; // stx r, [r+r] +def STXFSRi : F3_2<3, 0b100101, "stq">; // stx r, [r+i] + +// Section A.54: Store Integer - p229 +def STBr : F3_1<3, 0b000101, "stb">; // stb r, [r+r] +def STBi : F3_2<3, 0b000101, "stb">; // stb r, [r+i] +def STHr : F3_1<3, 0b000110, "stb">; // stb r, [r+r] +def STHi : F3_2<3, 0b000110, "stb">; // stb r, [r+i] +def STWr : F3_1<3, 0b000100, "stb">; // stb r, [r+r] +def STWi : F3_2<3, 0b000100, "stb">; // stb r, [r+i] +def STXr : F3_1<3, 0b001110, "stb">; // stb r, [r+r] +def STXi : F3_2<3, 0b001110, "stb">; // stb r, [r+i] + +// Floating point store... + +// Section A.56: Subtract - p233 +def SUBr : F3_1<2, 0b000100, "sub">; // sub r, r, r +def SUBi : F3_1<2, 0b000100, "sub">; // sub r, i, r +def SUBccr : F3_1<2, 0b010100, "subcc">; // subcc r, r, r +def SUBcci : F3_1<2, 0b010100, "subcc">; // subcc r, i, r +def SUBCr : F3_1<2, 0b001100, "subc">; // subc r, r, r +def SUBCi : F3_1<2, 0b001100, "subc">; // subc r, i, r +def SUBCccr : F3_1<2, 0b011100, "subccc">; // subccc r, r, r +def SUBCcci : F3_1<2, 0b011100, "subccc">; // subccc r, i, r -- 2.34.1