1//===-- PPCInstrDFP.td - PowerPC Decimal Floating Point ----*- tablegen -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file describes the PowerPC Decimal Floating Point (DFP) instructions.
10//
11//===----------------------------------------------------------------------===//
12
13// We provide no scheduling info for the DFP instructions.
14// While they are not pseudo instructions we don't intend on scheduling them.
15let hasNoSchedulingInfo = 1 in {
16let mayRaiseFPException = 1, hasSideEffects = 0 in {
17
18let isCommutable = 1 in {
19defm DADD : XForm_28r<59, 2, (outs f8rc:$RST), (ins f8rc:$RA, f8rc:$RB),
20                      "dadd",  "$RST, $RA, $RB", IIC_FPGeneral, []>;
21
22defm DADDQ : XForm_28r<63, 2, (outs fpairrc:$RST), (ins fpairrc:$RA, fpairrc:$RB),
23                       "daddq",  "$RST, $RA, $RB", IIC_FPGeneral, []>;
24}
25
26defm DSUB : XForm_28r<59, 514, (outs f8rc:$RST), (ins f8rc:$RA, f8rc:$RB),
27                      "dsub",  "$RST, $RA, $RB", IIC_FPGeneral, []>;
28
29defm DSUBQ : XForm_28r<63, 514, (outs fpairrc:$RST), (ins fpairrc:$RA, fpairrc:$RB),
30                       "dsubq",  "$RST, $RA, $RB", IIC_FPGeneral, []>;
31
32let isCommutable = 1 in {
33defm DMUL : XForm_28r<59, 34, (outs f8rc:$RST), (ins f8rc:$RA, f8rc:$RB),
34                      "dmul",  "$RST, $RA, $RB", IIC_FPGeneral, []>;
35
36defm DMULQ : XForm_28r<63, 34, (outs fpairrc:$RST), (ins fpairrc:$RA, fpairrc:$RB),
37                       "dmulq",  "$RST, $RA, $RB", IIC_FPGeneral, []>;
38}
39
40defm DDIV : XForm_28r<59, 546, (outs f8rc:$RST), (ins f8rc:$RA, f8rc:$RB),
41                      "ddiv",  "$RST, $RA, $RB", IIC_FPGeneral, []>;
42
43defm DDIVQ : XForm_28r<63, 546, (outs fpairrc:$RST), (ins fpairrc:$RA, fpairrc:$RB),
44                       "ddivq",  "$RST, $RA, $RB", IIC_FPGeneral, []>;
45
46let isCompare = 1 in {
47  def DCMPU : XForm_17<59, 642, (outs crrc:$BF), (ins f8rc:$RA, f8rc:$RB),
48                       "dcmpu $BF, $RA, $RB", IIC_FPCompare>;
49
50  def DCMPUQ : XForm_17<63, 642, (outs crrc:$BF), (ins fpairrc:$RA, fpairrc:$RB),
51                        "dcmpuq $BF, $RA, $RB", IIC_FPCompare>;
52
53  def DCMPO : XForm_17<59, 130, (outs crrc:$BF), (ins f8rc:$RA, f8rc:$RB),
54                       "dcmpo $BF, $RA, $RB", IIC_FPCompare>;
55
56  def DCMPOQ : XForm_17<63, 130, (outs crrc:$BF), (ins fpairrc:$RA, fpairrc:$RB),
57                        "dcmpoq $BF, $RA, $RB", IIC_FPCompare>;
58}
59
60// 5.6.4 DFP Quantum Adjustment Instructions
61defm DQUAI: Z23Form_TE5_FRTB5_RMC2r<59, 67, (outs f8rc:$FRT),
62                                    (ins s5imm:$TE, f8rc:$FRB, u2imm:$RMC),
63                                    "dquai", "$TE, $FRT, $FRB, $RMC", []>;
64defm DQUAIQ: Z23Form_TE5_FRTB5_RMC2r<63, 67, (outs fpairrc:$FRT),
65                                     (ins s5imm:$TE, fpairrc:$FRB, u2imm:$RMC),
66                                     "dquaiq", "$TE, $FRT, $FRB, $RMC", []>;
67defm DQUA: Z23Form_FRTAB5_RMC2r<59, 3, (outs f8rc:$FRT),
68                                (ins f8rc:$FRA, f8rc:$FRB, u2imm:$RMC),
69                                "dqua", "$FRT, $FRA, $FRB, $RMC", []>;
70defm DQUAQ: Z23Form_FRTAB5_RMC2r<63, 3, (outs fpairrc:$FRT),
71                                 (ins fpairrc:$FRA, fpairrc:$FRB, u2imm:$RMC),
72                                 "dquaq", "$FRT, $FRA, $FRB, $RMC", []>;
73defm DRRND: Z23Form_FRTAB5_RMC2r<59, 35, (outs f8rc:$FRT),
74                                (ins f8rc:$FRA, f8rc:$FRB, u2imm:$RMC),
75                                "drrnd", "$FRT, $FRA, $FRB, $RMC", []>;
76defm DRRNDQ: Z23Form_FRTAB5_RMC2r<63, 35, (outs fpairrc:$FRT),
77                                 (ins f8rc:$FRA, fpairrc:$FRB, u2imm:$RMC),
78                                 "drrndq", "$FRT, $FRA, $FRB, $RMC", []>;
79defm DRINTX: Z23Form_FRTB5_R1_RMC2r<59, 99, (outs f8rc:$FRT),
80                                    (ins u1imm:$R, f8rc:$FRB, u2imm:$RMC),
81                                    "drintx", "$R, $FRT, $FRB, $RMC", []>;
82defm DRINTXQ: Z23Form_FRTB5_R1_RMC2r<63, 99, (outs fpairrc:$FRT),
83                                     (ins u1imm:$R, fpairrc:$FRB, u2imm:$RMC),
84                                     "drintxq", "$R, $FRT, $FRB, $RMC", []>;
85defm DRINTN: Z23Form_FRTB5_R1_RMC2r<59, 227, (outs f8rc:$FRT),
86                                    (ins u1imm:$R, f8rc:$FRB, u2imm:$RMC),
87                                    "drintn", "$R, $FRT, $FRB, $RMC", []>;
88defm DRINTNQ: Z23Form_FRTB5_R1_RMC2r<63, 227, (outs fpairrc:$FRT),
89                                     (ins u1imm:$R, fpairrc:$FRB, u2imm:$RMC),
90                                     "drintnq", "$R, $FRT, $FRB, $RMC", []>;
91
92// 5.6.5 DFP Conversion Instructions
93defm DCTDP: XForm_26r<59, 258, (outs f8rc:$RST), (ins f8rc:$RB),
94                      "dctdp", "$RST, $RB", IIC_FPGeneral, []>;
95defm DCTQPQ: XForm_26r<63, 258, (outs fpairrc:$RST), (ins f8rc:$RB),
96                       "dctqpq", "$RST, $RB", IIC_FPGeneral, []>;
97defm DRSP: XForm_26r<59, 770, (outs f8rc:$RST), (ins f8rc:$RB),
98                     "drsp", "$RST, $RB", IIC_FPGeneral, []>;
99defm DRDPQ: XForm_26r<63, 770, (outs fpairrc:$RST), (ins fpairrc:$RB),
100                      "drdpq", "$RST, $RB", IIC_FPGeneral, []>;
101defm DCFFIX: XForm_26r<59, 802, (outs f8rc:$RST), (ins f8rc:$RB),
102                       "dcffix", "$RST, $RB", IIC_FPGeneral, []>;
103defm DCFFIXQ: XForm_26r<63, 802, (outs fpairrc:$RST), (ins f8rc:$RB),
104                        "dcffixq", "$RST, $RB", IIC_FPGeneral, []>;
105defm DCTFIX: XForm_26r<59, 290, (outs f8rc:$RST), (ins f8rc:$RB),
106                       "dctfix", "$RST, $RB", IIC_FPGeneral, []>;
107defm DCTFIXQ: XForm_26r<63, 290, (outs f8rc:$RST), (ins fpairrc:$RB),
108                        "dctfixq", "$RST, $RB", IIC_FPGeneral, []>;
109let Predicates = [HasP10Vector] in {
110  def DCFFIXQQ: XForm_26<63, 994, (outs fpairrc:$RST), (ins vrrc:$RB),
111                         "dcffixqq $RST, $RB", IIC_FPGeneral, []>;
112let RA = 1 in
113  def DCTFIXQQ: XForm_base_r3xo<63, 994, (outs vrrc:$RST), (ins fpairrc:$RB),
114                                "dctfixqq $RST, $RB", IIC_FPGeneral, []>;
115} // HasP10Vector
116
117// 5.6.6 DFP Format Instructions
118defm DENBCD: XForm_S1_FRTB5r<59, 834, (outs f8rc:$FRT),
119                              (ins u1imm:$S, f8rc:$FRB),
120                              "denbcd", "$S, $FRT, $FRB", []>;
121defm DENBCDQ: XForm_S1_FRTB5r<63, 834, (outs fpairrc:$FRT),
122                               (ins u1imm:$S, fpairrc:$FRB),
123                               "denbcdq", "$S, $FRT, $FRB", []>;
124} // mayRaiseFPException
125
126// 5.6.6 DFP none exception raising format instructions.
127defm DDEDPD: XForm_SP2_FRTB5r<59, 322, (outs f8rc:$FRT),
128                              (ins u2imm:$SP, f8rc:$FRB),
129                              "ddedpd", "$SP, $FRT, $FRB", []>;
130defm DDEDPDQ: XForm_SP2_FRTB5r<63, 322, (outs fpairrc:$FRT),
131                               (ins u2imm:$SP, fpairrc:$FRB),
132                               "ddedpdq", "$SP, $FRT, $FRB", []>;
133defm DXEX: XForm_26r<59, 354, (outs f8rc:$RST), (ins f8rc:$RB),
134                     "dxex", "$RST, $RB", NoItinerary, []>;
135defm DXEXQ: XForm_26r<63, 354, (outs f8rc:$RST), (ins fpairrc:$RB),
136                      "dxexq", "$RST, $RB", NoItinerary, []>;
137defm DIEX: XForm_base_r3xo_r<59, 866, (outs f8rc:$RST),
138                             (ins f8rc:$RA, f8rc:$RB),
139                             "diex", "$RST, $RA, $RB", []>;
140defm DIEXQ: XForm_base_r3xo_r<63, 866, (outs fpairrc:$RST),
141                              (ins f8rc:$RA, fpairrc:$RB),
142                              "diexq", "$RST, $RA, $RB", []>;
143defm DSCLI: Z22Form_FRTA5_SH6r<59, 66, (outs f8rc:$FRT),
144                               (ins f8rc:$FRA, u6imm:$SH),
145                               "dscli", "$FRT, $FRA, $SH", []>;
146defm DSCLIQ: Z22Form_FRTA5_SH6r<63, 66, (outs fpairrc:$FRT),
147                                (ins fpairrc:$FRA, u6imm:$SH),
148                                "dscliq", "$FRT, $FRA, $SH", []>;
149defm DSCRI: Z22Form_FRTA5_SH6r<59, 98, (outs f8rc:$FRT),
150                               (ins f8rc:$FRA, u6imm:$SH),
151                               "dscri", "$FRT, $FRA, $SH", []>;
152defm DSCRIQ: Z22Form_FRTA5_SH6r<63, 98, (outs fpairrc:$FRT),
153                                (ins fpairrc:$FRA, u6imm:$SH),
154                                "dscriq", "$FRT, $FRA, $SH", []>;
155
156// 5.6.3 DFP Test Instructions
157def DTSTDC : Z22Form_BF3_FRA5_DCM6<59, 194, (outs crrc:$BF),
158                                   (ins f8rc:$FRA, u6imm:$DCM),
159                                   "dtstdc $BF, $FRA, $DCM", IIC_FPCompare, []>;
160
161def DTSTDCQ : Z22Form_BF3_FRA5_DCM6<63, 194, (outs crrc:$BF),
162                                    (ins fpairrc:$FRA, u6imm:$DCM),
163                                    "dtstdcq $BF, $FRA, $DCM", IIC_FPCompare, []>;
164
165def DTSTDG : Z22Form_BF3_FRA5_DCM6<59, 226, (outs crrc:$BF),
166                                   (ins f8rc:$FRA, u6imm:$DCM),
167                                   "dtstdg $BF, $FRA, $DCM", IIC_FPCompare, []>;
168
169def DTSTDGQ : Z22Form_BF3_FRA5_DCM6<63, 226, (outs crrc:$BF),
170                                    (ins fpairrc:$FRA, u6imm:$DCM),
171                                    "dtstdgq $BF, $FRA, $DCM", IIC_FPCompare, []>;
172
173def DTSTEX : XForm_17<59, 162, (outs crrc:$BF), (ins f8rc:$RA, f8rc:$RB),
174                      "dtstex $BF, $RA, $RB", IIC_FPCompare>;
175
176def DTSTEXQ : XForm_17<63, 162, (outs crrc:$BF), (ins fpairrc:$RA, fpairrc:$RB),
177                       "dtstexq $BF, $RA, $RB", IIC_FPCompare>;
178
179def DTSTSF : XForm_17<59, 674, (outs crrc:$BF), (ins f8rc:$RA, f8rc:$RB),
180                      "dtstsf $BF, $RA, $RB", IIC_FPCompare>;
181
182def DTSTSFQ : XForm_17<63, 674, (outs crrc:$BF), (ins f8rc:$RA, fpairrc:$RB),
183                       "dtstsfq $BF, $RA, $RB", IIC_FPCompare>;
184
185def DTSTSFI : XForm_BF3_UIM6_FRB5<59, 675, (outs crrc:$BF),
186                                  (ins u6imm:$UIM, f8rc:$FRB),
187                                  "dtstsfi $BF, $UIM, $FRB", IIC_FPCompare, []>;
188
189def DTSTSFIQ : XForm_BF3_UIM6_FRB5<63, 675, (outs crrc:$BF),
190                                   (ins u6imm:$UIM, fpairrc:$FRB),
191                                   "dtstsfiq $BF, $UIM, $FRB", IIC_FPCompare, []>;
192
193} // hasNoSchedulingInfo
194