[PowerPC] Add the SUBFUS instruction to Future CPU.
authorStefan Pintilie <stefanp@ca.ibm.com>
Wed, 9 Nov 2022 21:09:31 +0000 (15:09 -0600)
committerStefan Pintilie <stefanp@ca.ibm.com>
Thu, 10 Nov 2022 14:32:29 +0000 (08:32 -0600)
Add a new instruction called SUBUFS that does saturating subtract.
This instruction is only for Future CPU.

Reviewed By: amyk

Differential Revision: https://reviews.llvm.org/D137643

llvm/lib/Target/PowerPC/PPCInstrFuture.td
llvm/test/MC/Disassembler/PowerPC/ppc-encoding-ISAFuture.txt
llvm/test/MC/Disassembler/PowerPC/ppc64le-encoding-ISAFuture.txt
llvm/test/MC/PowerPC/ppc-encoding-ISAFuture.s

index 63b77e4..0d3ac80 100644 (file)
 //
 //===----------------------------------------------------------------------===//
 
+class XOForm_RTAB5_L1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL,
+                      string asmstr, list<dag> pattern>
+         : I<opcode, OOL, IOL, asmstr, NoItinerary> {
+  bits<5> RT;
+  bits<5> RA;
+  bits<5> RB;
+  bit L;
+
+  let Pattern = pattern;
+
+  bit RC = 0;    // set by isRecordForm
+
+  let Inst{6-10}  = RT;
+  let Inst{11-15} = RA;
+  let Inst{16-20} = RB;
+  let Inst{21}    = L;
+  let Inst{22-30} = xo;
+  let Inst{31}    = RC;
+}
+
+multiclass XOForm_RTAB5_L1r<bits<6> opcode, bits<9> xo, dag OOL, dag IOL,
+                            string asmbase, string asmstr,
+                            list<dag> pattern> {
+  let BaseName = asmbase in {
+    def NAME : XOForm_RTAB5_L1<opcode, xo, OOL, IOL,
+                               !strconcat(asmbase, !strconcat(" ", asmstr)),
+                               pattern>, RecFormRel;
+    let Defs = [CR0] in
+    def _rec : XOForm_RTAB5_L1<opcode, xo, OOL, IOL,
+                               !strconcat(asmbase, !strconcat(". ", asmstr)),
+                               []>, isRecordForm, RecFormRel;
+  }
+}
+
+let Predicates = [IsISAFuture] in {
+defm SUBFUS : XOForm_RTAB5_L1r<31, 72, (outs g8rc:$RT),
+                               (ins g8rc:$RA, g8rc:$RB, u1imm:$L),
+                               "subfus",  "$RT, $L, $RA, $RB", []>;
+}
 
index 87059b9..ceca437 100644 (file)
 
 #CHECK: dmxor 6, 7
 0x7f 0x07 0xe1 0x62
+
+#CHECK: subfus 3, 0, 4, 5
+0x7c 0x64 0x28 0x90
+
+#CHECK: subfus 3, 1, 4, 5
+0x7c 0x64 0x2c 0x90
+
+#CHECK: subfus. 3, 0, 4, 5
+0x7c 0x64 0x28 0x91
+
+#CHECK: subfus. 3, 1, 4, 5
+0x7c 0x64 0x2c 0x91
index 32dfcb2..6052888 100644 (file)
 
 #CHECK: dmxor 6, 7
 0x62 0xe1 0x07 0x7f
+
+#CHECK: subfus 3, 0, 4, 5
+0x90 0x28 0x64 0x7c
+
+#CHECK: subfus 3, 1, 4, 5
+0x90 0x2c 0x64 0x7c
+
+#CHECK: subfus. 3, 0, 4, 5
+0x91 0x28 0x64 0x7c
+
+#CHECK: subfus. 3, 1, 4, 5
+0x91 0x2c 0x64 0x7c
index 2f7986f..192a570 100644 (file)
 # CHECK-BE: dmxor 6, 7                    # encoding: [0x7f,0x07,0xe1,0x62]
 # CHECK-LE: dmxor 6, 7                    # encoding: [0x62,0xe1,0x07,0x7f]
             dmxor 6, 7
+
+# CHECK-BE: subfus 3, 0, 4, 5          # encoding: [0x7c,0x64,0x28,0x90]
+# CHECK-LE: subfus 3, 0, 4, 5          # encoding: [0x90,0x28,0x64,0x7c]
+            subfus 3, 0, 4, 5
+
+# CHECK-BE: subfus 3, 1, 4, 5          # encoding: [0x7c,0x64,0x2c,0x90]
+# CHECK-LE: subfus 3, 1, 4, 5          # encoding: [0x90,0x2c,0x64,0x7c]
+            subfus 3, 1, 4, 5
+
+# CHECK-BE: subfus. 3, 0, 4, 5         # encoding: [0x7c,0x64,0x28,0x91]
+# CHECK-LE: subfus. 3, 0, 4, 5         # encoding: [0x91,0x28,0x64,0x7c]
+            subfus. 3, 0, 4, 5
+
+# CHECK-BE: subfus. 3, 1, 4, 5         # encoding: [0x7c,0x64,0x2c,0x91]
+# CHECK-LE: subfus. 3, 1, 4, 5         # encoding: [0x91,0x2c,0x64,0x7c]
+            subfus. 3, 1, 4, 5