xref: /aosp_15_r20/external/llvm/lib/Target/PowerPC/PPCInstrQPX.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===- PPCInstrQPX.td - The PowerPC QPX Extension --*- tablegen -*-===//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker//
10*9880d681SAndroid Build Coastguard Worker// This file describes the QPX extension to the PowerPC instruction set.
11*9880d681SAndroid Build Coastguard Worker// Reference:
12*9880d681SAndroid Build Coastguard Worker// Book Q: QPX Architecture Definition. IBM (as updated in) 2011.
13*9880d681SAndroid Build Coastguard Worker//
14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdef PPCRegQFRCAsmOperand : AsmOperandClass {
17*9880d681SAndroid Build Coastguard Worker  let Name = "RegQFRC"; let PredicateMethod = "isRegNumber";
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Workerdef qfrc : RegisterOperand<QFRC> {
20*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegQFRCAsmOperand;
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Workerdef PPCRegQSRCAsmOperand : AsmOperandClass {
23*9880d681SAndroid Build Coastguard Worker  let Name = "RegQSRC"; let PredicateMethod = "isRegNumber";
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Workerdef qsrc : RegisterOperand<QSRC> {
26*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegQSRCAsmOperand;
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Workerdef PPCRegQBRCAsmOperand : AsmOperandClass {
29*9880d681SAndroid Build Coastguard Worker  let Name = "RegQBRC"; let PredicateMethod = "isRegNumber";
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Workerdef qbrc : RegisterOperand<QBRC> {
32*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegQBRCAsmOperand;
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
36*9880d681SAndroid Build Coastguard Worker// Helpers for defining instructions that directly correspond to intrinsics.
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker// QPXA1_Int - A AForm_1 intrinsic definition.
39*9880d681SAndroid Build Coastguard Workerclass QPXA1_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID>
40*9880d681SAndroid Build Coastguard Worker  : AForm_1<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC),
41*9880d681SAndroid Build Coastguard Worker              !strconcat(opc, " $FRT, $FRA, $FRC, $FRB"), IIC_FPFused,
42*9880d681SAndroid Build Coastguard Worker                       [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRB, v4f64:$FRC))]>;
43*9880d681SAndroid Build Coastguard Worker// QPXA1s_Int - A AForm_1 intrinsic definition (simple instructions).
44*9880d681SAndroid Build Coastguard Workerclass QPXA1s_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID>
45*9880d681SAndroid Build Coastguard Worker  : AForm_1<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC),
46*9880d681SAndroid Build Coastguard Worker              !strconcat(opc, " $FRT, $FRA, $FRC, $FRB"), IIC_VecPerm,
47*9880d681SAndroid Build Coastguard Worker                       [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRB, v4f64:$FRC))]>;
48*9880d681SAndroid Build Coastguard Worker// QPXA2_Int - A AForm_2 intrinsic definition.
49*9880d681SAndroid Build Coastguard Workerclass QPXA2_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID>
50*9880d681SAndroid Build Coastguard Worker  : AForm_2<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB),
51*9880d681SAndroid Build Coastguard Worker              !strconcat(opc, " $FRT, $FRA, $FRB"), IIC_FPGeneral,
52*9880d681SAndroid Build Coastguard Worker                       [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRB))]>;
53*9880d681SAndroid Build Coastguard Worker// QPXA3_Int - A AForm_3 intrinsic definition.
54*9880d681SAndroid Build Coastguard Workerclass QPXA3_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID>
55*9880d681SAndroid Build Coastguard Worker  : AForm_3<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRC),
56*9880d681SAndroid Build Coastguard Worker              !strconcat(opc, " $FRT, $FRA, $FRC"), IIC_FPGeneral,
57*9880d681SAndroid Build Coastguard Worker                       [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRC))]>;
58*9880d681SAndroid Build Coastguard Worker// QPXA4_Int - A AForm_4a intrinsic definition.
59*9880d681SAndroid Build Coastguard Workerclass QPXA4_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID>
60*9880d681SAndroid Build Coastguard Worker  : AForm_4a<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRB),
61*9880d681SAndroid Build Coastguard Worker              !strconcat(opc, " $FRT, $FRB"), IIC_FPGeneral,
62*9880d681SAndroid Build Coastguard Worker                       [(set v4f64:$FRT, (IntID v4f64:$FRB))]>;
63*9880d681SAndroid Build Coastguard Worker// QPXX18_Int - A XForm_18 intrinsic definition.
64*9880d681SAndroid Build Coastguard Workerclass QPXX18_Int<bits<6> opcode, bits<10> xo, string opc, Intrinsic IntID>
65*9880d681SAndroid Build Coastguard Worker  : XForm_18<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB),
66*9880d681SAndroid Build Coastguard Worker              !strconcat(opc, " $FRT, $FRA, $FRB"), IIC_FPCompare,
67*9880d681SAndroid Build Coastguard Worker                       [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRB))]>;
68*9880d681SAndroid Build Coastguard Worker// QPXX19_Int - A XForm_19 intrinsic definition.
69*9880d681SAndroid Build Coastguard Workerclass QPXX19_Int<bits<6> opcode, bits<10> xo, string opc, Intrinsic IntID>
70*9880d681SAndroid Build Coastguard Worker  : XForm_19<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRB),
71*9880d681SAndroid Build Coastguard Worker              !strconcat(opc, " $FRT, $FRB"), IIC_FPGeneral,
72*9880d681SAndroid Build Coastguard Worker                       [(set v4f64:$FRT, (IntID v4f64:$FRB))]>;
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
75*9880d681SAndroid Build Coastguard Worker// Pattern Frags.
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdef extloadv4f32 : PatFrag<(ops node:$ptr), (extload node:$ptr), [{
78*9880d681SAndroid Build Coastguard Worker  return cast<LoadSDNode>(N)->getMemoryVT() == MVT::v4f32;
79*9880d681SAndroid Build Coastguard Worker}]>;
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdef truncstorev4f32 : PatFrag<(ops node:$val, node:$ptr),
82*9880d681SAndroid Build Coastguard Worker                            (truncstore node:$val, node:$ptr), [{
83*9880d681SAndroid Build Coastguard Worker  return cast<StoreSDNode>(N)->getMemoryVT() == MVT::v4f32;
84*9880d681SAndroid Build Coastguard Worker}]>;
85*9880d681SAndroid Build Coastguard Workerdef pre_truncstv4f32 : PatFrag<(ops node:$val, node:$base, node:$offset),
86*9880d681SAndroid Build Coastguard Worker                               (pre_truncst node:$val,
87*9880d681SAndroid Build Coastguard Worker                                            node:$base, node:$offset), [{
88*9880d681SAndroid Build Coastguard Worker  return cast<StoreSDNode>(N)->getMemoryVT() == MVT::v4f32;
89*9880d681SAndroid Build Coastguard Worker}]>;
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdef fround_inexact : PatFrag<(ops node:$val), (fround node:$val), [{
92*9880d681SAndroid Build Coastguard Worker  return cast<ConstantSDNode>(N->getOperand(1))->getZExtValue() == 0;
93*9880d681SAndroid Build Coastguard Worker}]>;
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdef fround_exact : PatFrag<(ops node:$val), (fround node:$val), [{
96*9880d681SAndroid Build Coastguard Worker  return cast<ConstantSDNode>(N->getOperand(1))->getZExtValue() == 1;
97*9880d681SAndroid Build Coastguard Worker}]>;
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerlet FastIselShouldIgnore = 1 in // FastIsel should ignore all u12 instrs.
100*9880d681SAndroid Build Coastguard Worker  def u12 : ImmLeaf<i32, [{ return (Imm & 0xFFF) == Imm; }]>;
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
103*9880d681SAndroid Build Coastguard Worker// Instruction Definitions.
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdef HasQPX : Predicate<"PPCSubTarget->hasQPX()">;
106*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasQPX] in {
107*9880d681SAndroid Build Coastguard Workerlet DecoderNamespace = "QPX" in {
108*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in { // QPX instructions don't have side effects.
109*9880d681SAndroid Build Coastguard Workerlet Uses = [RM] in {
110*9880d681SAndroid Build Coastguard Worker  // Add Instructions
111*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in {
112*9880d681SAndroid Build Coastguard Worker    def QVFADD : AForm_2<4, 21,
113*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB),
114*9880d681SAndroid Build Coastguard Worker                        "qvfadd $FRT, $FRA, $FRB", IIC_FPGeneral,
115*9880d681SAndroid Build Coastguard Worker                        [(set v4f64:$FRT, (fadd v4f64:$FRA, v4f64:$FRB))]>;
116*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in
117*9880d681SAndroid Build Coastguard Worker      def QVFADDS : QPXA2_Int<0, 21, "qvfadds", int_ppc_qpx_qvfadds>;
118*9880d681SAndroid Build Coastguard Worker    def QVFADDSs : AForm_2<0, 21,
119*9880d681SAndroid Build Coastguard Worker                          (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB),
120*9880d681SAndroid Build Coastguard Worker                          "qvfadds $FRT, $FRA, $FRB", IIC_FPGeneral,
121*9880d681SAndroid Build Coastguard Worker                          [(set v4f32:$FRT, (fadd v4f32:$FRA, v4f32:$FRB))]>;
122*9880d681SAndroid Build Coastguard Worker  }
123*9880d681SAndroid Build Coastguard Worker  def QVFSUB : AForm_2<4, 20,
124*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB),
125*9880d681SAndroid Build Coastguard Worker                      "qvfsub $FRT, $FRA, $FRB", IIC_FPGeneral,
126*9880d681SAndroid Build Coastguard Worker                      [(set v4f64:$FRT, (fsub v4f64:$FRA, v4f64:$FRB))]>;
127*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
128*9880d681SAndroid Build Coastguard Worker    def QVFSUBS : QPXA2_Int<0, 20, "qvfsubs", int_ppc_qpx_qvfsubs>;
129*9880d681SAndroid Build Coastguard Worker  def QVFSUBSs : AForm_2<0, 20,
130*9880d681SAndroid Build Coastguard Worker                        (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB),
131*9880d681SAndroid Build Coastguard Worker                        "qvfsubs $FRT, $FRA, $FRB", IIC_FPGeneral,
132*9880d681SAndroid Build Coastguard Worker                        [(set v4f32:$FRT, (fsub v4f32:$FRA, v4f32:$FRB))]>;
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker  // Estimate Instructions
135*9880d681SAndroid Build Coastguard Worker  def QVFRE : AForm_4a<4, 24, (outs qfrc:$FRT), (ins qfrc:$FRB),
136*9880d681SAndroid Build Coastguard Worker                       "qvfre $FRT, $FRB", IIC_FPGeneral,
137*9880d681SAndroid Build Coastguard Worker                       [(set v4f64:$FRT, (PPCfre v4f64:$FRB))]>;
138*9880d681SAndroid Build Coastguard Worker  def QVFRES : QPXA4_Int<0, 24, "qvfres", int_ppc_qpx_qvfres>;
139*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
140*9880d681SAndroid Build Coastguard Worker  def QVFRESs : AForm_4a<0, 24, (outs qsrc:$FRT), (ins qsrc:$FRB),
141*9880d681SAndroid Build Coastguard Worker                         "qvfres $FRT, $FRB", IIC_FPGeneral,
142*9880d681SAndroid Build Coastguard Worker                         [(set v4f32:$FRT, (PPCfre v4f32:$FRB))]>;
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker  def QVFRSQRTE : AForm_4a<4, 26, (outs qfrc:$FRT), (ins qfrc:$FRB),
145*9880d681SAndroid Build Coastguard Worker                           "qvfrsqrte $FRT, $FRB", IIC_FPGeneral,
146*9880d681SAndroid Build Coastguard Worker                           [(set v4f64:$FRT, (PPCfrsqrte v4f64:$FRB))]>;
147*9880d681SAndroid Build Coastguard Worker  def QVFRSQRTES : QPXA4_Int<0, 26, "qvfrsqrtes", int_ppc_qpx_qvfrsqrtes>;
148*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
149*9880d681SAndroid Build Coastguard Worker  def QVFRSQRTESs : AForm_4a<0, 26, (outs qsrc:$FRT), (ins qsrc:$FRB),
150*9880d681SAndroid Build Coastguard Worker                             "qvfrsqrtes $FRT, $FRB", IIC_FPGeneral,
151*9880d681SAndroid Build Coastguard Worker                             [(set v4f32:$FRT, (PPCfrsqrte v4f32:$FRB))]>;
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker  // Multiply Instructions
154*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in {
155*9880d681SAndroid Build Coastguard Worker    def QVFMUL : AForm_3<4, 25,
156*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRC),
157*9880d681SAndroid Build Coastguard Worker                        "qvfmul $FRT, $FRA, $FRC", IIC_FPGeneral,
158*9880d681SAndroid Build Coastguard Worker                        [(set v4f64:$FRT, (fmul v4f64:$FRA, v4f64:$FRC))]>;
159*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in
160*9880d681SAndroid Build Coastguard Worker      def QVFMULS : QPXA3_Int<0, 25, "qvfmuls", int_ppc_qpx_qvfmuls>;
161*9880d681SAndroid Build Coastguard Worker    def QVFMULSs : AForm_3<0, 25,
162*9880d681SAndroid Build Coastguard Worker                          (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRC),
163*9880d681SAndroid Build Coastguard Worker                          "qvfmuls $FRT, $FRA, $FRC", IIC_FPGeneral,
164*9880d681SAndroid Build Coastguard Worker                          [(set v4f32:$FRT, (fmul v4f32:$FRA, v4f32:$FRC))]>;
165*9880d681SAndroid Build Coastguard Worker  }
166*9880d681SAndroid Build Coastguard Worker  def QVFXMUL : QPXA3_Int<4, 17, "qvfxmul", int_ppc_qpx_qvfxmul>;
167*9880d681SAndroid Build Coastguard Worker  def QVFXMULS : QPXA3_Int<0, 17, "qvfxmuls", int_ppc_qpx_qvfxmuls>;
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker  // Multiply-add instructions
170*9880d681SAndroid Build Coastguard Worker  def QVFMADD : AForm_1<4, 29,
171*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC),
172*9880d681SAndroid Build Coastguard Worker                      "qvfmadd $FRT, $FRA, $FRC, $FRB", IIC_FPFused,
173*9880d681SAndroid Build Coastguard Worker                      [(set v4f64:$FRT, (fma v4f64:$FRA, v4f64:$FRC, v4f64:$FRB))]>;
174*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
175*9880d681SAndroid Build Coastguard Worker    def QVFMADDS : QPXA1_Int<0, 29, "qvfmadds", int_ppc_qpx_qvfmadds>;
176*9880d681SAndroid Build Coastguard Worker  def QVFMADDSs : AForm_1<0, 29,
177*9880d681SAndroid Build Coastguard Worker                        (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qsrc:$FRC),
178*9880d681SAndroid Build Coastguard Worker                        "qvfmadds $FRT, $FRA, $FRC, $FRB", IIC_FPFused,
179*9880d681SAndroid Build Coastguard Worker                        [(set v4f32:$FRT, (fma v4f32:$FRA, v4f32:$FRC, v4f32:$FRB))]>;
180*9880d681SAndroid Build Coastguard Worker  def QVFNMADD : AForm_1<4, 31,
181*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC),
182*9880d681SAndroid Build Coastguard Worker                      "qvfnmadd $FRT, $FRA, $FRC, $FRB", IIC_FPFused,
183*9880d681SAndroid Build Coastguard Worker                      [(set v4f64:$FRT, (fneg (fma v4f64:$FRA, v4f64:$FRC,
184*9880d681SAndroid Build Coastguard Worker                                                   v4f64:$FRB)))]>;
185*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
186*9880d681SAndroid Build Coastguard Worker    def QVFNMADDS : QPXA1_Int<0, 31, "qvfnmadds", int_ppc_qpx_qvfnmadds>;
187*9880d681SAndroid Build Coastguard Worker  def QVFNMADDSs : AForm_1<0, 31,
188*9880d681SAndroid Build Coastguard Worker                        (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qsrc:$FRC),
189*9880d681SAndroid Build Coastguard Worker                        "qvfnmadds $FRT, $FRA, $FRC, $FRB", IIC_FPFused,
190*9880d681SAndroid Build Coastguard Worker                        [(set v4f32:$FRT, (fneg (fma v4f32:$FRA, v4f32:$FRC,
191*9880d681SAndroid Build Coastguard Worker                                                     v4f32:$FRB)))]>;
192*9880d681SAndroid Build Coastguard Worker  def QVFMSUB : AForm_1<4, 28,
193*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC),
194*9880d681SAndroid Build Coastguard Worker                      "qvfmsub $FRT, $FRA, $FRC, $FRB", IIC_FPFused,
195*9880d681SAndroid Build Coastguard Worker                      [(set v4f64:$FRT, (fma v4f64:$FRA, v4f64:$FRC,
196*9880d681SAndroid Build Coastguard Worker                                             (fneg v4f64:$FRB)))]>;
197*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
198*9880d681SAndroid Build Coastguard Worker    def QVFMSUBS : QPXA1_Int<0, 28, "qvfmsubs", int_ppc_qpx_qvfmsubs>;
199*9880d681SAndroid Build Coastguard Worker  def QVFMSUBSs : AForm_1<0, 28,
200*9880d681SAndroid Build Coastguard Worker                      (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qsrc:$FRC),
201*9880d681SAndroid Build Coastguard Worker                      "qvfmsubs $FRT, $FRA, $FRC, $FRB", IIC_FPFused,
202*9880d681SAndroid Build Coastguard Worker                      [(set v4f32:$FRT, (fma v4f32:$FRA, v4f32:$FRC,
203*9880d681SAndroid Build Coastguard Worker                                             (fneg v4f32:$FRB)))]>;
204*9880d681SAndroid Build Coastguard Worker  def QVFNMSUB : AForm_1<4, 30,
205*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC),
206*9880d681SAndroid Build Coastguard Worker                      "qvfnmsub $FRT, $FRA, $FRC, $FRB", IIC_FPFused,
207*9880d681SAndroid Build Coastguard Worker                      [(set v4f64:$FRT, (fneg (fma v4f64:$FRA, v4f64:$FRC,
208*9880d681SAndroid Build Coastguard Worker                                              (fneg v4f64:$FRB))))]>;
209*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
210*9880d681SAndroid Build Coastguard Worker    def QVFNMSUBS : QPXA1_Int<0, 30, "qvfnmsubs", int_ppc_qpx_qvfnmsubs>;
211*9880d681SAndroid Build Coastguard Worker  def QVFNMSUBSs : AForm_1<0, 30,
212*9880d681SAndroid Build Coastguard Worker                      (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qsrc:$FRC),
213*9880d681SAndroid Build Coastguard Worker                      "qvfnmsubs $FRT, $FRA, $FRC, $FRB", IIC_FPFused,
214*9880d681SAndroid Build Coastguard Worker                      [(set v4f32:$FRT, (fneg (fma v4f32:$FRA, v4f32:$FRC,
215*9880d681SAndroid Build Coastguard Worker                                              (fneg v4f32:$FRB))))]>;
216*9880d681SAndroid Build Coastguard Worker  def QVFXMADD : QPXA1_Int<4, 9, "qvfxmadd", int_ppc_qpx_qvfxmadd>;
217*9880d681SAndroid Build Coastguard Worker  def QVFXMADDS : QPXA1_Int<0, 9, "qvfxmadds", int_ppc_qpx_qvfxmadds>;
218*9880d681SAndroid Build Coastguard Worker  def QVFXXNPMADD : QPXA1_Int<4, 11, "qvfxxnpmadd", int_ppc_qpx_qvfxxnpmadd>;
219*9880d681SAndroid Build Coastguard Worker  def QVFXXNPMADDS : QPXA1_Int<0, 11, "qvfxxnpmadds", int_ppc_qpx_qvfxxnpmadds>;
220*9880d681SAndroid Build Coastguard Worker  def QVFXXCPNMADD : QPXA1_Int<4, 3, "qvfxxcpnmadd", int_ppc_qpx_qvfxxcpnmadd>;
221*9880d681SAndroid Build Coastguard Worker  def QVFXXCPNMADDS : QPXA1_Int<0, 3, "qvfxxcpnmadds", int_ppc_qpx_qvfxxcpnmadds>;
222*9880d681SAndroid Build Coastguard Worker  def QVFXXMADD : QPXA1_Int<4, 1, "qvfxxmadd", int_ppc_qpx_qvfxxmadd>;
223*9880d681SAndroid Build Coastguard Worker  def QVFXXMADDS : QPXA1_Int<0, 1, "qvfxxmadds", int_ppc_qpx_qvfxxmadds>;
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker  // Select Instruction
226*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
227*9880d681SAndroid Build Coastguard Worker    def QVFSEL : QPXA1s_Int<4, 23, "qvfsel", int_ppc_qpx_qvfsel>;
228*9880d681SAndroid Build Coastguard Worker  def QVFSELb : AForm_1<4, 23, (outs qfrc:$FRT),
229*9880d681SAndroid Build Coastguard Worker                        (ins qbrc:$FRA, qfrc:$FRB, qfrc:$FRC),
230*9880d681SAndroid Build Coastguard Worker                        "qvfsel $FRT, $FRA, $FRC, $FRB", IIC_VecPerm,
231*9880d681SAndroid Build Coastguard Worker                        [(set v4f64:$FRT, (vselect v4i1:$FRA,
232*9880d681SAndroid Build Coastguard Worker                                                   v4f64:$FRC, v4f64:$FRB))]>;
233*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
234*9880d681SAndroid Build Coastguard Worker  def QVFSELbs : AForm_1<4, 23, (outs qsrc:$FRT),
235*9880d681SAndroid Build Coastguard Worker                        (ins qbrc:$FRA, qsrc:$FRB, qsrc:$FRC),
236*9880d681SAndroid Build Coastguard Worker                        "qvfsel $FRT, $FRA, $FRC, $FRB", IIC_VecPerm,
237*9880d681SAndroid Build Coastguard Worker                        [(set v4f32:$FRT, (vselect v4i1:$FRA,
238*9880d681SAndroid Build Coastguard Worker                                                   v4f32:$FRC, v4f32:$FRB))]>;
239*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
240*9880d681SAndroid Build Coastguard Worker  def QVFSELbb: AForm_1<4, 23, (outs qbrc:$FRT),
241*9880d681SAndroid Build Coastguard Worker                        (ins qbrc:$FRA, qbrc:$FRB, qbrc:$FRC),
242*9880d681SAndroid Build Coastguard Worker                        "qvfsel $FRT, $FRA, $FRC, $FRB", IIC_VecPerm,
243*9880d681SAndroid Build Coastguard Worker                        [(set v4i1:$FRT, (vselect v4i1:$FRA,
244*9880d681SAndroid Build Coastguard Worker                                                  v4i1:$FRC, v4i1:$FRB))]>;
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Worker  // SELECT_CC_* - Used to implement the SELECT_CC DAG operation.  Expanded after
247*9880d681SAndroid Build Coastguard Worker  // instruction selection into a branch sequence.
248*9880d681SAndroid Build Coastguard Worker  let usesCustomInserter = 1 in {
249*9880d681SAndroid Build Coastguard Worker    def SELECT_CC_QFRC: Pseudo<(outs qfrc:$dst), (ins crrc:$cond, qfrc:$T, qfrc:$F,
250*9880d681SAndroid Build Coastguard Worker                                i32imm:$BROPC), "#SELECT_CC_QFRC",
251*9880d681SAndroid Build Coastguard Worker                                []>;
252*9880d681SAndroid Build Coastguard Worker    def SELECT_CC_QSRC: Pseudo<(outs qsrc:$dst), (ins crrc:$cond, qsrc:$T, qsrc:$F,
253*9880d681SAndroid Build Coastguard Worker                                i32imm:$BROPC), "#SELECT_CC_QSRC",
254*9880d681SAndroid Build Coastguard Worker                                []>;
255*9880d681SAndroid Build Coastguard Worker    def SELECT_CC_QBRC: Pseudo<(outs qbrc:$dst), (ins crrc:$cond, qbrc:$T, qbrc:$F,
256*9880d681SAndroid Build Coastguard Worker                                i32imm:$BROPC), "#SELECT_CC_QBRC",
257*9880d681SAndroid Build Coastguard Worker                                []>;
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Worker    // SELECT_* pseudo instructions, like SELECT_CC_* but taking condition
260*9880d681SAndroid Build Coastguard Worker    // register bit directly.
261*9880d681SAndroid Build Coastguard Worker    def SELECT_QFRC: Pseudo<(outs qfrc:$dst), (ins crbitrc:$cond,
262*9880d681SAndroid Build Coastguard Worker                            qfrc:$T, qfrc:$F), "#SELECT_QFRC",
263*9880d681SAndroid Build Coastguard Worker                            [(set v4f64:$dst,
264*9880d681SAndroid Build Coastguard Worker                                  (select i1:$cond, v4f64:$T, v4f64:$F))]>;
265*9880d681SAndroid Build Coastguard Worker    def SELECT_QSRC: Pseudo<(outs qsrc:$dst), (ins crbitrc:$cond,
266*9880d681SAndroid Build Coastguard Worker                            qsrc:$T, qsrc:$F), "#SELECT_QSRC",
267*9880d681SAndroid Build Coastguard Worker                            [(set v4f32:$dst,
268*9880d681SAndroid Build Coastguard Worker                                  (select i1:$cond, v4f32:$T, v4f32:$F))]>;
269*9880d681SAndroid Build Coastguard Worker    def SELECT_QBRC: Pseudo<(outs qbrc:$dst), (ins crbitrc:$cond,
270*9880d681SAndroid Build Coastguard Worker                            qbrc:$T, qbrc:$F), "#SELECT_QBRC",
271*9880d681SAndroid Build Coastguard Worker                            [(set v4i1:$dst,
272*9880d681SAndroid Build Coastguard Worker                                  (select i1:$cond, v4i1:$T, v4i1:$F))]>;
273*9880d681SAndroid Build Coastguard Worker  }
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Worker  // Convert and Round Instructions
276*9880d681SAndroid Build Coastguard Worker  def QVFCTID : QPXX19_Int<4, 814, "qvfctid", int_ppc_qpx_qvfctid>;
277*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
278*9880d681SAndroid Build Coastguard Worker    def QVFCTIDb : XForm_19<4, 814, (outs qbrc:$FRT), (ins qbrc:$FRB),
279*9880d681SAndroid Build Coastguard Worker                            "qvfctid $FRT, $FRB", IIC_FPGeneral, []>;
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Worker  def QVFCTIDU : QPXX19_Int<4, 942, "qvfctidu", int_ppc_qpx_qvfctidu>;
282*9880d681SAndroid Build Coastguard Worker  def QVFCTIDZ : QPXX19_Int<4, 815, "qvfctidz", int_ppc_qpx_qvfctidz>;
283*9880d681SAndroid Build Coastguard Worker  def QVFCTIDUZ : QPXX19_Int<4, 943, "qvfctiduz", int_ppc_qpx_qvfctiduz>;
284*9880d681SAndroid Build Coastguard Worker  def QVFCTIW : QPXX19_Int<4, 14, "qvfctiw", int_ppc_qpx_qvfctiw>;
285*9880d681SAndroid Build Coastguard Worker  def QVFCTIWU : QPXX19_Int<4, 142, "qvfctiwu", int_ppc_qpx_qvfctiwu>;
286*9880d681SAndroid Build Coastguard Worker  def QVFCTIWZ : QPXX19_Int<4, 15, "qvfctiwz", int_ppc_qpx_qvfctiwz>;
287*9880d681SAndroid Build Coastguard Worker  def QVFCTIWUZ : QPXX19_Int<4, 143, "qvfctiwuz", int_ppc_qpx_qvfctiwuz>;
288*9880d681SAndroid Build Coastguard Worker  def QVFCFID : QPXX19_Int<4, 846, "qvfcfid", int_ppc_qpx_qvfcfid>;
289*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
290*9880d681SAndroid Build Coastguard Worker    def QVFCFIDb : XForm_19<4, 846, (outs qbrc:$FRT), (ins qbrc:$FRB),
291*9880d681SAndroid Build Coastguard Worker                            "qvfcfid $FRT, $FRB", IIC_FPGeneral, []>;
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Worker  def QVFCFIDU : QPXX19_Int<4, 974, "qvfcfidu", int_ppc_qpx_qvfcfidu>;
294*9880d681SAndroid Build Coastguard Worker  def QVFCFIDS : QPXX19_Int<0, 846, "qvfcfids", int_ppc_qpx_qvfcfids>;
295*9880d681SAndroid Build Coastguard Worker  def QVFCFIDUS : QPXX19_Int<0, 974, "qvfcfidus", int_ppc_qpx_qvfcfidus>;
296*9880d681SAndroid Build Coastguard Worker
297*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
298*9880d681SAndroid Build Coastguard Worker    def QVFRSP : QPXX19_Int<4, 12, "qvfrsp", int_ppc_qpx_qvfrsp>;
299*9880d681SAndroid Build Coastguard Worker  def QVFRSPs : XForm_19<4, 12,
300*9880d681SAndroid Build Coastguard Worker                      (outs qsrc:$FRT), (ins qfrc:$FRB),
301*9880d681SAndroid Build Coastguard Worker                      "qvfrsp $FRT, $FRB", IIC_FPGeneral,
302*9880d681SAndroid Build Coastguard Worker                      [(set v4f32:$FRT, (fround_inexact v4f64:$FRB))]>;
303*9880d681SAndroid Build Coastguard Worker
304*9880d681SAndroid Build Coastguard Worker  def QVFRIZ : XForm_19<4, 424, (outs qfrc:$FRT), (ins qfrc:$FRB),
305*9880d681SAndroid Build Coastguard Worker                        "qvfriz $FRT, $FRB", IIC_FPGeneral,
306*9880d681SAndroid Build Coastguard Worker                        [(set v4f64:$FRT, (ftrunc v4f64:$FRB))]>;
307*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
308*9880d681SAndroid Build Coastguard Worker    def QVFRIZs : XForm_19<4, 424, (outs qsrc:$FRT), (ins qsrc:$FRB),
309*9880d681SAndroid Build Coastguard Worker                           "qvfriz $FRT, $FRB", IIC_FPGeneral,
310*9880d681SAndroid Build Coastguard Worker                           [(set v4f32:$FRT, (ftrunc v4f32:$FRB))]>;
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Worker  def QVFRIN : XForm_19<4, 392, (outs qfrc:$FRT), (ins qfrc:$FRB),
313*9880d681SAndroid Build Coastguard Worker                        "qvfrin $FRT, $FRB", IIC_FPGeneral,
314*9880d681SAndroid Build Coastguard Worker                        [(set v4f64:$FRT, (frnd v4f64:$FRB))]>;
315*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
316*9880d681SAndroid Build Coastguard Worker    def QVFRINs : XForm_19<4, 392, (outs qsrc:$FRT), (ins qsrc:$FRB),
317*9880d681SAndroid Build Coastguard Worker                           "qvfrin $FRT, $FRB", IIC_FPGeneral,
318*9880d681SAndroid Build Coastguard Worker                           [(set v4f32:$FRT, (frnd v4f32:$FRB))]>;
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Worker  def QVFRIP : XForm_19<4, 456, (outs qfrc:$FRT), (ins qfrc:$FRB),
321*9880d681SAndroid Build Coastguard Worker                        "qvfrip $FRT, $FRB", IIC_FPGeneral,
322*9880d681SAndroid Build Coastguard Worker                        [(set v4f64:$FRT, (fceil v4f64:$FRB))]>;
323*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
324*9880d681SAndroid Build Coastguard Worker    def QVFRIPs : XForm_19<4, 456, (outs qsrc:$FRT), (ins qsrc:$FRB),
325*9880d681SAndroid Build Coastguard Worker                           "qvfrip $FRT, $FRB", IIC_FPGeneral,
326*9880d681SAndroid Build Coastguard Worker                           [(set v4f32:$FRT, (fceil v4f32:$FRB))]>;
327*9880d681SAndroid Build Coastguard Worker
328*9880d681SAndroid Build Coastguard Worker  def QVFRIM : XForm_19<4, 488, (outs qfrc:$FRT), (ins qfrc:$FRB),
329*9880d681SAndroid Build Coastguard Worker                        "qvfrim $FRT, $FRB", IIC_FPGeneral,
330*9880d681SAndroid Build Coastguard Worker                        [(set v4f64:$FRT, (ffloor v4f64:$FRB))]>;
331*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
332*9880d681SAndroid Build Coastguard Worker    def QVFRIMs : XForm_19<4, 488, (outs qsrc:$FRT), (ins qsrc:$FRB),
333*9880d681SAndroid Build Coastguard Worker                           "qvfrim $FRT, $FRB", IIC_FPGeneral,
334*9880d681SAndroid Build Coastguard Worker                           [(set v4f32:$FRT, (ffloor v4f32:$FRB))]>;
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Worker  // Move Instructions
337*9880d681SAndroid Build Coastguard Worker  def QVFMR : XForm_19<4, 72,
338*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRB),
339*9880d681SAndroid Build Coastguard Worker                      "qvfmr $FRT, $FRB", IIC_VecPerm,
340*9880d681SAndroid Build Coastguard Worker                      [/* (set v4f64:$FRT, v4f64:$FRB) */]>;
341*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in {
342*9880d681SAndroid Build Coastguard Worker    def QVFMRs : XForm_19<4, 72,
343*9880d681SAndroid Build Coastguard Worker                         (outs qsrc:$FRT), (ins qsrc:$FRB),
344*9880d681SAndroid Build Coastguard Worker                         "qvfmr $FRT, $FRB", IIC_VecPerm,
345*9880d681SAndroid Build Coastguard Worker                         [/* (set v4f32:$FRT, v4f32:$FRB) */]>;
346*9880d681SAndroid Build Coastguard Worker    def QVFMRb : XForm_19<4, 72,
347*9880d681SAndroid Build Coastguard Worker                         (outs qbrc:$FRT), (ins qbrc:$FRB),
348*9880d681SAndroid Build Coastguard Worker                         "qvfmr $FRT, $FRB", IIC_VecPerm,
349*9880d681SAndroid Build Coastguard Worker                         [/* (set v4i1:$FRT, v4i1:$FRB) */]>;
350*9880d681SAndroid Build Coastguard Worker  }
351*9880d681SAndroid Build Coastguard Worker  def QVFNEG : XForm_19<4, 40,
352*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRB),
353*9880d681SAndroid Build Coastguard Worker                      "qvfneg $FRT, $FRB", IIC_VecPerm,
354*9880d681SAndroid Build Coastguard Worker                      [(set v4f64:$FRT, (fneg v4f64:$FRB))]>;
355*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
356*9880d681SAndroid Build Coastguard Worker    def QVFNEGs : XForm_19<4, 40,
357*9880d681SAndroid Build Coastguard Worker                         (outs qsrc:$FRT), (ins qsrc:$FRB),
358*9880d681SAndroid Build Coastguard Worker                         "qvfneg $FRT, $FRB", IIC_VecPerm,
359*9880d681SAndroid Build Coastguard Worker                         [(set v4f32:$FRT, (fneg v4f32:$FRB))]>;
360*9880d681SAndroid Build Coastguard Worker  def QVFABS : XForm_19<4, 264,
361*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRB),
362*9880d681SAndroid Build Coastguard Worker                      "qvfabs $FRT, $FRB", IIC_VecPerm,
363*9880d681SAndroid Build Coastguard Worker                      [(set v4f64:$FRT, (fabs v4f64:$FRB))]>;
364*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
365*9880d681SAndroid Build Coastguard Worker    def QVFABSs : XForm_19<4, 264,
366*9880d681SAndroid Build Coastguard Worker                         (outs qsrc:$FRT), (ins qsrc:$FRB),
367*9880d681SAndroid Build Coastguard Worker                         "qvfabs $FRT, $FRB", IIC_VecPerm,
368*9880d681SAndroid Build Coastguard Worker                         [(set v4f32:$FRT, (fabs v4f32:$FRB))]>;
369*9880d681SAndroid Build Coastguard Worker  def QVFNABS : XForm_19<4, 136,
370*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRB),
371*9880d681SAndroid Build Coastguard Worker                      "qvfnabs $FRT, $FRB", IIC_VecPerm,
372*9880d681SAndroid Build Coastguard Worker                      [(set v4f64:$FRT, (fneg (fabs v4f64:$FRB)))]>;
373*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
374*9880d681SAndroid Build Coastguard Worker    def QVFNABSs : XForm_19<4, 136,
375*9880d681SAndroid Build Coastguard Worker                         (outs qsrc:$FRT), (ins qsrc:$FRB),
376*9880d681SAndroid Build Coastguard Worker                         "qvfnabs $FRT, $FRB", IIC_VecPerm,
377*9880d681SAndroid Build Coastguard Worker                         [(set v4f32:$FRT, (fneg (fabs v4f32:$FRB)))]>;
378*9880d681SAndroid Build Coastguard Worker  def QVFCPSGN : XForm_18<4, 8,
379*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB),
380*9880d681SAndroid Build Coastguard Worker                      "qvfcpsgn $FRT, $FRA, $FRB", IIC_VecPerm,
381*9880d681SAndroid Build Coastguard Worker                      [(set v4f64:$FRT, (fcopysign v4f64:$FRB, v4f64:$FRA))]>;
382*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
383*9880d681SAndroid Build Coastguard Worker    def QVFCPSGNs : XForm_18<4, 8,
384*9880d681SAndroid Build Coastguard Worker                         (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB),
385*9880d681SAndroid Build Coastguard Worker                         "qvfcpsgn $FRT, $FRA, $FRB", IIC_VecPerm,
386*9880d681SAndroid Build Coastguard Worker                         [(set v4f32:$FRT, (fcopysign v4f32:$FRB, v4f32:$FRA))]>;
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Worker  def QVALIGNI : Z23Form_1<4, 5,
389*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, u2imm:$idx),
390*9880d681SAndroid Build Coastguard Worker                      "qvaligni $FRT, $FRA, $FRB, $idx", IIC_VecPerm,
391*9880d681SAndroid Build Coastguard Worker                      [(set v4f64:$FRT,
392*9880d681SAndroid Build Coastguard Worker                            (PPCqvaligni v4f64:$FRA, v4f64:$FRB,
393*9880d681SAndroid Build Coastguard Worker                                         (i32 imm:$idx)))]>;
394*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
395*9880d681SAndroid Build Coastguard Worker     def QVALIGNIs : Z23Form_1<4, 5,
396*9880d681SAndroid Build Coastguard Worker                         (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, u2imm:$idx),
397*9880d681SAndroid Build Coastguard Worker                         "qvaligni $FRT, $FRA, $FRB, $idx", IIC_VecPerm,
398*9880d681SAndroid Build Coastguard Worker                         [(set v4f32:$FRT,
399*9880d681SAndroid Build Coastguard Worker                               (PPCqvaligni v4f32:$FRA, v4f32:$FRB,
400*9880d681SAndroid Build Coastguard Worker                                            (i32 imm:$idx)))]>;
401*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
402*9880d681SAndroid Build Coastguard Worker     def QVALIGNIb : Z23Form_1<4, 5,
403*9880d681SAndroid Build Coastguard Worker                         (outs qbrc:$FRT), (ins qbrc:$FRA, qbrc:$FRB, u2imm:$idx),
404*9880d681SAndroid Build Coastguard Worker                         "qvaligni $FRT, $FRA, $FRB, $idx", IIC_VecPerm,
405*9880d681SAndroid Build Coastguard Worker                         [(set v4i1:$FRT,
406*9880d681SAndroid Build Coastguard Worker                               (PPCqvaligni v4i1:$FRA, v4i1:$FRB,
407*9880d681SAndroid Build Coastguard Worker                                            (i32 imm:$idx)))]>;
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Worker  def QVESPLATI : Z23Form_2<4, 37,
410*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRA, u2imm:$idx),
411*9880d681SAndroid Build Coastguard Worker                      "qvesplati $FRT, $FRA, $idx", IIC_VecPerm,
412*9880d681SAndroid Build Coastguard Worker                      [(set v4f64:$FRT,
413*9880d681SAndroid Build Coastguard Worker                            (PPCqvesplati v4f64:$FRA, (i32 imm:$idx)))]>;
414*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
415*9880d681SAndroid Build Coastguard Worker     def QVESPLATIs : Z23Form_2<4, 37,
416*9880d681SAndroid Build Coastguard Worker                         (outs qsrc:$FRT), (ins qsrc:$FRA, u2imm:$idx),
417*9880d681SAndroid Build Coastguard Worker                         "qvesplati $FRT, $FRA, $idx", IIC_VecPerm,
418*9880d681SAndroid Build Coastguard Worker                         [(set v4f32:$FRT,
419*9880d681SAndroid Build Coastguard Worker                               (PPCqvesplati v4f32:$FRA, (i32 imm:$idx)))]>;
420*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
421*9880d681SAndroid Build Coastguard Worker     def QVESPLATIb : Z23Form_2<4, 37,
422*9880d681SAndroid Build Coastguard Worker                         (outs qbrc:$FRT), (ins qbrc:$FRA, u2imm:$idx),
423*9880d681SAndroid Build Coastguard Worker                         "qvesplati $FRT, $FRA, $idx", IIC_VecPerm,
424*9880d681SAndroid Build Coastguard Worker                         [(set v4i1:$FRT,
425*9880d681SAndroid Build Coastguard Worker                               (PPCqvesplati v4i1:$FRA, (i32 imm:$idx)))]>;
426*9880d681SAndroid Build Coastguard Worker
427*9880d681SAndroid Build Coastguard Worker  def QVFPERM : AForm_1<4, 6,
428*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC),
429*9880d681SAndroid Build Coastguard Worker                      "qvfperm $FRT, $FRA, $FRB, $FRC", IIC_VecPerm,
430*9880d681SAndroid Build Coastguard Worker                      [(set v4f64:$FRT,
431*9880d681SAndroid Build Coastguard Worker                            (PPCqvfperm v4f64:$FRA, v4f64:$FRB, v4f64:$FRC))]>;
432*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
433*9880d681SAndroid Build Coastguard Worker     def QVFPERMs : AForm_1<4, 6,
434*9880d681SAndroid Build Coastguard Worker                         (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qfrc:$FRC),
435*9880d681SAndroid Build Coastguard Worker                         "qvfperm $FRT, $FRA, $FRB, $FRC", IIC_VecPerm,
436*9880d681SAndroid Build Coastguard Worker                         [(set v4f32:$FRT,
437*9880d681SAndroid Build Coastguard Worker                               (PPCqvfperm v4f32:$FRA, v4f32:$FRB, v4f64:$FRC))]>;
438*9880d681SAndroid Build Coastguard Worker
439*9880d681SAndroid Build Coastguard Worker  let isReMaterializable = 1, isAsCheapAsAMove = 1 in
440*9880d681SAndroid Build Coastguard Worker  def QVGPCI : Z23Form_3<4, 133,
441*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins u12imm:$idx),
442*9880d681SAndroid Build Coastguard Worker                      "qvgpci $FRT, $idx", IIC_VecPerm,
443*9880d681SAndroid Build Coastguard Worker                      [(set v4f64:$FRT, (PPCqvgpci (u12:$idx)))]>;
444*9880d681SAndroid Build Coastguard Worker
445*9880d681SAndroid Build Coastguard Worker  // Compare Instruction
446*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
447*9880d681SAndroid Build Coastguard Worker    def QVFTSTNAN : QPXX18_Int<4, 64, "qvftstnan", int_ppc_qpx_qvftstnan>;
448*9880d681SAndroid Build Coastguard Worker  def QVFTSTNANb : XForm_18<4, 64, (outs qbrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB),
449*9880d681SAndroid Build Coastguard Worker                           "qvftstnan $FRT, $FRA, $FRB", IIC_FPCompare,
450*9880d681SAndroid Build Coastguard Worker                           [(set v4i1:$FRT,
451*9880d681SAndroid Build Coastguard Worker                                 (setcc v4f64:$FRA, v4f64:$FRB, SETUO))]>;
452*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
453*9880d681SAndroid Build Coastguard Worker  def QVFTSTNANbs : XForm_18<4, 64, (outs qbrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB),
454*9880d681SAndroid Build Coastguard Worker                            "qvftstnan $FRT, $FRA, $FRB", IIC_FPCompare,
455*9880d681SAndroid Build Coastguard Worker                            [(set v4i1:$FRT,
456*9880d681SAndroid Build Coastguard Worker                                  (setcc v4f32:$FRA, v4f32:$FRB, SETUO))]>;
457*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
458*9880d681SAndroid Build Coastguard Worker    def QVFCMPLT : QPXX18_Int<4, 96, "qvfcmplt", int_ppc_qpx_qvfcmplt>;
459*9880d681SAndroid Build Coastguard Worker  def QVFCMPLTb : XForm_18<4, 96, (outs qbrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB),
460*9880d681SAndroid Build Coastguard Worker                           "qvfcmplt $FRT, $FRA, $FRB", IIC_FPCompare,
461*9880d681SAndroid Build Coastguard Worker                           [(set v4i1:$FRT,
462*9880d681SAndroid Build Coastguard Worker                                 (setcc v4f64:$FRA, v4f64:$FRB, SETOLT))]>;
463*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
464*9880d681SAndroid Build Coastguard Worker  def QVFCMPLTbs : XForm_18<4, 96, (outs qbrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB),
465*9880d681SAndroid Build Coastguard Worker                            "qvfcmplt $FRT, $FRA, $FRB", IIC_FPCompare,
466*9880d681SAndroid Build Coastguard Worker                            [(set v4i1:$FRT,
467*9880d681SAndroid Build Coastguard Worker                                  (setcc v4f32:$FRA, v4f32:$FRB, SETOLT))]>;
468*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
469*9880d681SAndroid Build Coastguard Worker    def QVFCMPGT : QPXX18_Int<4, 32, "qvfcmpgt", int_ppc_qpx_qvfcmpgt>;
470*9880d681SAndroid Build Coastguard Worker  def QVFCMPGTb : XForm_18<4, 32, (outs qbrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB),
471*9880d681SAndroid Build Coastguard Worker                           "qvfcmpgt $FRT, $FRA, $FRB", IIC_FPCompare,
472*9880d681SAndroid Build Coastguard Worker                           [(set v4i1:$FRT,
473*9880d681SAndroid Build Coastguard Worker                                 (setcc v4f64:$FRA, v4f64:$FRB, SETOGT))]>;
474*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
475*9880d681SAndroid Build Coastguard Worker  def QVFCMPGTbs : XForm_18<4, 32, (outs qbrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB),
476*9880d681SAndroid Build Coastguard Worker                            "qvfcmpgt $FRT, $FRA, $FRB", IIC_FPCompare,
477*9880d681SAndroid Build Coastguard Worker                            [(set v4i1:$FRT,
478*9880d681SAndroid Build Coastguard Worker                                  (setcc v4f32:$FRA, v4f32:$FRB, SETOGT))]>;
479*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
480*9880d681SAndroid Build Coastguard Worker    def QVFCMPEQ : QPXX18_Int<4, 0, "qvfcmpeq", int_ppc_qpx_qvfcmpeq>;
481*9880d681SAndroid Build Coastguard Worker  def QVFCMPEQb : XForm_18<4, 0, (outs qbrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB),
482*9880d681SAndroid Build Coastguard Worker                           "qvfcmpeq $FRT, $FRA, $FRB", IIC_FPCompare,
483*9880d681SAndroid Build Coastguard Worker                           [(set v4i1:$FRT,
484*9880d681SAndroid Build Coastguard Worker                                 (setcc v4f64:$FRA, v4f64:$FRB, SETOEQ))]>;
485*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
486*9880d681SAndroid Build Coastguard Worker  def QVFCMPEQbs : XForm_18<4, 0, (outs qbrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB),
487*9880d681SAndroid Build Coastguard Worker                            "qvfcmpeq $FRT, $FRA, $FRB", IIC_FPCompare,
488*9880d681SAndroid Build Coastguard Worker                            [(set v4i1:$FRT,
489*9880d681SAndroid Build Coastguard Worker                                  (setcc v4f32:$FRA, v4f32:$FRB, SETOEQ))]>;
490*9880d681SAndroid Build Coastguard Worker
491*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
492*9880d681SAndroid Build Coastguard Worker  def QVFLOGICAL : XForm_20<4, 4,
493*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, u12imm:$tttt),
494*9880d681SAndroid Build Coastguard Worker                      "qvflogical $FRT, $FRA, $FRB, $tttt", IIC_VecPerm, []>;
495*9880d681SAndroid Build Coastguard Worker  def QVFLOGICALb : XForm_20<4, 4,
496*9880d681SAndroid Build Coastguard Worker                      (outs qbrc:$FRT), (ins qbrc:$FRA, qbrc:$FRB, u12imm:$tttt),
497*9880d681SAndroid Build Coastguard Worker                      "qvflogical $FRT, $FRA, $FRB, $tttt", IIC_VecPerm, []>;
498*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
499*9880d681SAndroid Build Coastguard Worker  def QVFLOGICALs : XForm_20<4, 4,
500*9880d681SAndroid Build Coastguard Worker                      (outs qbrc:$FRT), (ins qbrc:$FRA, qbrc:$FRB, u12imm:$tttt),
501*9880d681SAndroid Build Coastguard Worker                      "qvflogical $FRT, $FRA, $FRB, $tttt", IIC_VecPerm, []>;
502*9880d681SAndroid Build Coastguard Worker
503*9880d681SAndroid Build Coastguard Worker  // Load indexed instructions
504*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1 in {
505*9880d681SAndroid Build Coastguard Worker    def QVLFDX : XForm_1<31, 583,
506*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
507*9880d681SAndroid Build Coastguard Worker                        "qvlfdx $FRT, $src", IIC_LdStLFD,
508*9880d681SAndroid Build Coastguard Worker                        [(set v4f64:$FRT, (load xoaddr:$src))]>;
509*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in
510*9880d681SAndroid Build Coastguard Worker    def QVLFDXb : XForm_1<31, 583,
511*9880d681SAndroid Build Coastguard Worker                        (outs qbrc:$FRT), (ins memrr:$src),
512*9880d681SAndroid Build Coastguard Worker                        "qvlfdx $FRT, $src", IIC_LdStLFD, []>;
513*9880d681SAndroid Build Coastguard Worker
514*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
515*9880d681SAndroid Build Coastguard Worker    def QVLFDXA : XForm_1<31, 583,
516*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
517*9880d681SAndroid Build Coastguard Worker                        "qvlfdxa $FRT, $src", IIC_LdStLFD, []>;
518*9880d681SAndroid Build Coastguard Worker
519*9880d681SAndroid Build Coastguard Worker    def QVLFDUX : XForm_1<31, 615,
520*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT, ptr_rc_nor0:$ea_result),
521*9880d681SAndroid Build Coastguard Worker                        (ins memrr:$src),
522*9880d681SAndroid Build Coastguard Worker                        "qvlfdux $FRT, $src", IIC_LdStLFDU, []>,
523*9880d681SAndroid Build Coastguard Worker                        RegConstraint<"$src.ptrreg = $ea_result">,
524*9880d681SAndroid Build Coastguard Worker                        NoEncode<"$ea_result">;
525*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
526*9880d681SAndroid Build Coastguard Worker    def QVLFDUXA : XForm_1<31, 615,
527*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
528*9880d681SAndroid Build Coastguard Worker                        "qvlfduxa $FRT, $src", IIC_LdStLFD, []>;
529*9880d681SAndroid Build Coastguard Worker
530*9880d681SAndroid Build Coastguard Worker    def QVLFSX : XForm_1<31, 519,
531*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
532*9880d681SAndroid Build Coastguard Worker                        "qvlfsx $FRT, $src", IIC_LdStLFD,
533*9880d681SAndroid Build Coastguard Worker                        [(set v4f64:$FRT, (extloadv4f32 xoaddr:$src))]>;
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in
536*9880d681SAndroid Build Coastguard Worker    def QVLFSXb : XForm_1<31, 519,
537*9880d681SAndroid Build Coastguard Worker                        (outs qbrc:$FRT), (ins memrr:$src),
538*9880d681SAndroid Build Coastguard Worker                        "qvlfsx $FRT, $src", IIC_LdStLFD,
539*9880d681SAndroid Build Coastguard Worker                        [(set v4i1:$FRT, (PPCqvlfsb xoaddr:$src))]>;
540*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in
541*9880d681SAndroid Build Coastguard Worker    def QVLFSXs : XForm_1<31, 519,
542*9880d681SAndroid Build Coastguard Worker                        (outs qsrc:$FRT), (ins memrr:$src),
543*9880d681SAndroid Build Coastguard Worker                        "qvlfsx $FRT, $src", IIC_LdStLFD,
544*9880d681SAndroid Build Coastguard Worker                        [(set v4f32:$FRT, (load xoaddr:$src))]>;
545*9880d681SAndroid Build Coastguard Worker
546*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
547*9880d681SAndroid Build Coastguard Worker    def QVLFSXA : XForm_1<31, 519,
548*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
549*9880d681SAndroid Build Coastguard Worker                        "qvlfsxa $FRT, $src", IIC_LdStLFD, []>;
550*9880d681SAndroid Build Coastguard Worker
551*9880d681SAndroid Build Coastguard Worker    def QVLFSUX : XForm_1<31, 551,
552*9880d681SAndroid Build Coastguard Worker                        (outs qsrc:$FRT, ptr_rc_nor0:$ea_result),
553*9880d681SAndroid Build Coastguard Worker                        (ins memrr:$src),
554*9880d681SAndroid Build Coastguard Worker                        "qvlfsux $FRT, $src", IIC_LdStLFDU, []>,
555*9880d681SAndroid Build Coastguard Worker                        RegConstraint<"$src.ptrreg = $ea_result">,
556*9880d681SAndroid Build Coastguard Worker                        NoEncode<"$ea_result">;
557*9880d681SAndroid Build Coastguard Worker
558*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
559*9880d681SAndroid Build Coastguard Worker    def QVLFSUXA : XForm_1<31, 551,
560*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
561*9880d681SAndroid Build Coastguard Worker                        "qvlfsuxa $FRT, $src", IIC_LdStLFD, []>;
562*9880d681SAndroid Build Coastguard Worker
563*9880d681SAndroid Build Coastguard Worker    def QVLFCDX : XForm_1<31, 71,
564*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
565*9880d681SAndroid Build Coastguard Worker                        "qvlfcdx $FRT, $src", IIC_LdStLFD, []>;
566*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
567*9880d681SAndroid Build Coastguard Worker    def QVLFCDXA : XForm_1<31, 71,
568*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
569*9880d681SAndroid Build Coastguard Worker                        "qvlfcdxa $FRT, $src", IIC_LdStLFD, []>;
570*9880d681SAndroid Build Coastguard Worker
571*9880d681SAndroid Build Coastguard Worker    def QVLFCDUX : XForm_1<31, 103,
572*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
573*9880d681SAndroid Build Coastguard Worker                        "qvlfcdux $FRT, $src", IIC_LdStLFD, []>;
574*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
575*9880d681SAndroid Build Coastguard Worker    def QVLFCDUXA : XForm_1<31, 103,
576*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
577*9880d681SAndroid Build Coastguard Worker                        "qvlfcduxa $FRT, $src", IIC_LdStLFD, []>;
578*9880d681SAndroid Build Coastguard Worker
579*9880d681SAndroid Build Coastguard Worker    def QVLFCSX : XForm_1<31, 7,
580*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
581*9880d681SAndroid Build Coastguard Worker                        "qvlfcsx $FRT, $src", IIC_LdStLFD, []>;
582*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in
583*9880d681SAndroid Build Coastguard Worker    def QVLFCSXs : XForm_1<31, 7,
584*9880d681SAndroid Build Coastguard Worker                         (outs qsrc:$FRT), (ins memrr:$src),
585*9880d681SAndroid Build Coastguard Worker                         "qvlfcsx $FRT, $src", IIC_LdStLFD, []>;
586*9880d681SAndroid Build Coastguard Worker
587*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
588*9880d681SAndroid Build Coastguard Worker    def QVLFCSXA : XForm_1<31, 7,
589*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
590*9880d681SAndroid Build Coastguard Worker                        "qvlfcsxa $FRT, $src", IIC_LdStLFD, []>;
591*9880d681SAndroid Build Coastguard Worker
592*9880d681SAndroid Build Coastguard Worker    def QVLFCSUX : XForm_1<31, 39,
593*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
594*9880d681SAndroid Build Coastguard Worker                        "qvlfcsux $FRT, $src", IIC_LdStLFD, []>;
595*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
596*9880d681SAndroid Build Coastguard Worker    def QVLFCSUXA : XForm_1<31, 39,
597*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
598*9880d681SAndroid Build Coastguard Worker                        "qvlfcsuxa $FRT, $src", IIC_LdStLFD, []>;
599*9880d681SAndroid Build Coastguard Worker
600*9880d681SAndroid Build Coastguard Worker    def QVLFIWAX : XForm_1<31, 871,
601*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
602*9880d681SAndroid Build Coastguard Worker                        "qvlfiwax $FRT, $src", IIC_LdStLFD, []>;
603*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
604*9880d681SAndroid Build Coastguard Worker    def QVLFIWAXA : XForm_1<31, 871,
605*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
606*9880d681SAndroid Build Coastguard Worker                        "qvlfiwaxa $FRT, $src", IIC_LdStLFD, []>;
607*9880d681SAndroid Build Coastguard Worker
608*9880d681SAndroid Build Coastguard Worker    def QVLFIWZX : XForm_1<31, 839,
609*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
610*9880d681SAndroid Build Coastguard Worker                        "qvlfiwzx $FRT, $src", IIC_LdStLFD, []>;
611*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
612*9880d681SAndroid Build Coastguard Worker    def QVLFIWZXA : XForm_1<31, 839,
613*9880d681SAndroid Build Coastguard Worker                        (outs qfrc:$FRT), (ins memrr:$src),
614*9880d681SAndroid Build Coastguard Worker                        "qvlfiwzxa $FRT, $src", IIC_LdStLFD, []>;
615*9880d681SAndroid Build Coastguard Worker  }
616*9880d681SAndroid Build Coastguard Worker
617*9880d681SAndroid Build Coastguard Worker
618*9880d681SAndroid Build Coastguard Worker  def QVLPCLDX : XForm_1<31, 582,
619*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins memrr:$src),
620*9880d681SAndroid Build Coastguard Worker                      "qvlpcldx $FRT, $src", IIC_LdStLFD, []>;
621*9880d681SAndroid Build Coastguard Worker  def QVLPCLSX : XForm_1<31, 518,
622*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins memrr:$src),
623*9880d681SAndroid Build Coastguard Worker                      "qvlpclsx $FRT, $src", IIC_LdStLFD, []>;
624*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
625*9880d681SAndroid Build Coastguard Worker    def QVLPCLSXint : XForm_11<31, 518,
626*9880d681SAndroid Build Coastguard Worker                              (outs qfrc:$FRT), (ins G8RC:$src),
627*9880d681SAndroid Build Coastguard Worker                              "qvlpclsx $FRT, 0, $src", IIC_LdStLFD, []>;
628*9880d681SAndroid Build Coastguard Worker  def QVLPCRDX : XForm_1<31, 70,
629*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins memrr:$src),
630*9880d681SAndroid Build Coastguard Worker                      "qvlpcrdx $FRT, $src", IIC_LdStLFD, []>;
631*9880d681SAndroid Build Coastguard Worker  def QVLPCRSX : XForm_1<31, 6,
632*9880d681SAndroid Build Coastguard Worker                      (outs qfrc:$FRT), (ins memrr:$src),
633*9880d681SAndroid Build Coastguard Worker                      "qvlpcrsx $FRT, $src", IIC_LdStLFD, []>;
634*9880d681SAndroid Build Coastguard Worker
635*9880d681SAndroid Build Coastguard Worker  // Store indexed instructions
636*9880d681SAndroid Build Coastguard Worker  let mayStore = 1 in {
637*9880d681SAndroid Build Coastguard Worker    def QVSTFDX : XForm_8<31, 711,
638*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
639*9880d681SAndroid Build Coastguard Worker                        "qvstfdx $FRT, $dst", IIC_LdStSTFD,
640*9880d681SAndroid Build Coastguard Worker                        [(store qfrc:$FRT, xoaddr:$dst)]>;
641*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in
642*9880d681SAndroid Build Coastguard Worker    def QVSTFDXb : XForm_8<31, 711,
643*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qbrc:$FRT, memrr:$dst),
644*9880d681SAndroid Build Coastguard Worker                        "qvstfdx $FRT, $dst", IIC_LdStSTFD, []>;
645*9880d681SAndroid Build Coastguard Worker
646*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
647*9880d681SAndroid Build Coastguard Worker    def QVSTFDXA : XForm_8<31, 711,
648*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
649*9880d681SAndroid Build Coastguard Worker                        "qvstfdxa $FRT, $dst", IIC_LdStSTFD, []>;
650*9880d681SAndroid Build Coastguard Worker
651*9880d681SAndroid Build Coastguard Worker    def QVSTFDUX : XForm_8<31, 743, (outs ptr_rc_nor0:$ea_res),
652*9880d681SAndroid Build Coastguard Worker                           (ins qfrc:$FRT, memrr:$dst),
653*9880d681SAndroid Build Coastguard Worker                           "qvstfdux $FRT, $dst", IIC_LdStSTFDU, []>,
654*9880d681SAndroid Build Coastguard Worker                           RegConstraint<"$dst.ptrreg = $ea_res">,
655*9880d681SAndroid Build Coastguard Worker                           NoEncode<"$ea_res">;
656*9880d681SAndroid Build Coastguard Worker
657*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
658*9880d681SAndroid Build Coastguard Worker    def QVSTFDUXA : XForm_8<31, 743,
659*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
660*9880d681SAndroid Build Coastguard Worker                        "qvstfduxa $FRT, $dst", IIC_LdStSTFD, []>;
661*9880d681SAndroid Build Coastguard Worker
662*9880d681SAndroid Build Coastguard Worker    def QVSTFDXI : XForm_8<31, 709,
663*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
664*9880d681SAndroid Build Coastguard Worker                        "qvstfdxi $FRT, $dst", IIC_LdStSTFD, []>;
665*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
666*9880d681SAndroid Build Coastguard Worker    def QVSTFDXIA : XForm_8<31, 709,
667*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
668*9880d681SAndroid Build Coastguard Worker                        "qvstfdxia $FRT, $dst", IIC_LdStSTFD, []>;
669*9880d681SAndroid Build Coastguard Worker
670*9880d681SAndroid Build Coastguard Worker    def QVSTFDUXI : XForm_8<31, 741,
671*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
672*9880d681SAndroid Build Coastguard Worker                        "qvstfduxi $FRT, $dst", IIC_LdStSTFD, []>;
673*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
674*9880d681SAndroid Build Coastguard Worker    def QVSTFDUXIA : XForm_8<31, 741,
675*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
676*9880d681SAndroid Build Coastguard Worker                        "qvstfduxia $FRT, $dst", IIC_LdStSTFD, []>;
677*9880d681SAndroid Build Coastguard Worker
678*9880d681SAndroid Build Coastguard Worker    def QVSTFSX : XForm_8<31, 647,
679*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
680*9880d681SAndroid Build Coastguard Worker                        "qvstfsx $FRT, $dst", IIC_LdStSTFD,
681*9880d681SAndroid Build Coastguard Worker                        [(truncstorev4f32 qfrc:$FRT, xoaddr:$dst)]>;
682*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in
683*9880d681SAndroid Build Coastguard Worker    def QVSTFSXs : XForm_8<31, 647,
684*9880d681SAndroid Build Coastguard Worker                         (outs), (ins qsrc:$FRT, memrr:$dst),
685*9880d681SAndroid Build Coastguard Worker                         "qvstfsx $FRT, $dst", IIC_LdStSTFD,
686*9880d681SAndroid Build Coastguard Worker                         [(store qsrc:$FRT, xoaddr:$dst)]>;
687*9880d681SAndroid Build Coastguard Worker
688*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
689*9880d681SAndroid Build Coastguard Worker    def QVSTFSXA : XForm_8<31, 647,
690*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
691*9880d681SAndroid Build Coastguard Worker                        "qvstfsxa $FRT, $dst", IIC_LdStSTFD, []>;
692*9880d681SAndroid Build Coastguard Worker
693*9880d681SAndroid Build Coastguard Worker    def QVSTFSUX : XForm_8<31, 679, (outs ptr_rc_nor0:$ea_res),
694*9880d681SAndroid Build Coastguard Worker                           (ins qsrc:$FRT, memrr:$dst),
695*9880d681SAndroid Build Coastguard Worker                           "qvstfsux $FRT, $dst", IIC_LdStSTFDU, []>,
696*9880d681SAndroid Build Coastguard Worker                           RegConstraint<"$dst.ptrreg = $ea_res">,
697*9880d681SAndroid Build Coastguard Worker                           NoEncode<"$ea_res">;
698*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in
699*9880d681SAndroid Build Coastguard Worker    def QVSTFSUXs: XForm_8<31, 679, (outs ptr_rc_nor0:$ea_res),
700*9880d681SAndroid Build Coastguard Worker                           (ins qfrc:$FRT, memrr:$dst),
701*9880d681SAndroid Build Coastguard Worker                           "qvstfsux $FRT, $dst", IIC_LdStSTFDU, []>,
702*9880d681SAndroid Build Coastguard Worker                           RegConstraint<"$dst.ptrreg = $ea_res">,
703*9880d681SAndroid Build Coastguard Worker                           NoEncode<"$ea_res">;
704*9880d681SAndroid Build Coastguard Worker
705*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
706*9880d681SAndroid Build Coastguard Worker    def QVSTFSUXA : XForm_8<31, 679,
707*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
708*9880d681SAndroid Build Coastguard Worker                        "qvstfsuxa $FRT, $dst", IIC_LdStSTFD, []>;
709*9880d681SAndroid Build Coastguard Worker
710*9880d681SAndroid Build Coastguard Worker    def QVSTFSXI : XForm_8<31, 645,
711*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
712*9880d681SAndroid Build Coastguard Worker                        "qvstfsxi $FRT, $dst", IIC_LdStSTFD, []>;
713*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
714*9880d681SAndroid Build Coastguard Worker    def QVSTFSXIA : XForm_8<31, 645,
715*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
716*9880d681SAndroid Build Coastguard Worker                        "qvstfsxia $FRT, $dst", IIC_LdStSTFD, []>;
717*9880d681SAndroid Build Coastguard Worker
718*9880d681SAndroid Build Coastguard Worker    def QVSTFSUXI : XForm_8<31, 677,
719*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
720*9880d681SAndroid Build Coastguard Worker                        "qvstfsuxi $FRT, $dst", IIC_LdStSTFD, []>;
721*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
722*9880d681SAndroid Build Coastguard Worker    def QVSTFSUXIA : XForm_8<31, 677,
723*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
724*9880d681SAndroid Build Coastguard Worker                        "qvstfsuxia $FRT, $dst", IIC_LdStSTFD, []>;
725*9880d681SAndroid Build Coastguard Worker
726*9880d681SAndroid Build Coastguard Worker    def QVSTFCDX : XForm_8<31, 199,
727*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
728*9880d681SAndroid Build Coastguard Worker                        "qvstfcdx $FRT, $dst", IIC_LdStSTFD, []>;
729*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
730*9880d681SAndroid Build Coastguard Worker    def QVSTFCDXA : XForm_8<31, 199,
731*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
732*9880d681SAndroid Build Coastguard Worker                        "qvstfcdxa $FRT, $dst", IIC_LdStSTFD, []>;
733*9880d681SAndroid Build Coastguard Worker
734*9880d681SAndroid Build Coastguard Worker    def QVSTFCSX : XForm_8<31, 135,
735*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
736*9880d681SAndroid Build Coastguard Worker                        "qvstfcsx $FRT, $dst", IIC_LdStSTFD, []>;
737*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in
738*9880d681SAndroid Build Coastguard Worker    def QVSTFCSXs : XForm_8<31, 135,
739*9880d681SAndroid Build Coastguard Worker                         (outs), (ins qsrc:$FRT, memrr:$dst),
740*9880d681SAndroid Build Coastguard Worker                         "qvstfcsx $FRT, $dst", IIC_LdStSTFD, []>;
741*9880d681SAndroid Build Coastguard Worker
742*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
743*9880d681SAndroid Build Coastguard Worker    def QVSTFCSXA : XForm_8<31, 135,
744*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
745*9880d681SAndroid Build Coastguard Worker                        "qvstfcsxa $FRT, $dst", IIC_LdStSTFD, []>;
746*9880d681SAndroid Build Coastguard Worker
747*9880d681SAndroid Build Coastguard Worker    def QVSTFCDUX : XForm_8<31, 231,
748*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
749*9880d681SAndroid Build Coastguard Worker                        "qvstfcdux $FRT, $dst", IIC_LdStSTFD, []>;
750*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
751*9880d681SAndroid Build Coastguard Worker    def QVSTFCDUXA : XForm_8<31, 231,
752*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
753*9880d681SAndroid Build Coastguard Worker                        "qvstfcduxa $FRT, $dst", IIC_LdStSTFD, []>;
754*9880d681SAndroid Build Coastguard Worker
755*9880d681SAndroid Build Coastguard Worker    def QVSTFCSUX : XForm_8<31, 167,
756*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
757*9880d681SAndroid Build Coastguard Worker                        "qvstfcsux $FRT, $dst", IIC_LdStSTFD, []>;
758*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
759*9880d681SAndroid Build Coastguard Worker    def QVSTFCSUXA : XForm_8<31, 167,
760*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
761*9880d681SAndroid Build Coastguard Worker                        "qvstfcsuxa $FRT, $dst", IIC_LdStSTFD, []>;
762*9880d681SAndroid Build Coastguard Worker
763*9880d681SAndroid Build Coastguard Worker    def QVSTFCDXI : XForm_8<31, 197,
764*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
765*9880d681SAndroid Build Coastguard Worker                        "qvstfcdxi $FRT, $dst", IIC_LdStSTFD, []>;
766*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
767*9880d681SAndroid Build Coastguard Worker    def QVSTFCDXIA : XForm_8<31, 197,
768*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
769*9880d681SAndroid Build Coastguard Worker                        "qvstfcdxia $FRT, $dst", IIC_LdStSTFD, []>;
770*9880d681SAndroid Build Coastguard Worker
771*9880d681SAndroid Build Coastguard Worker    def QVSTFCSXI : XForm_8<31, 133,
772*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
773*9880d681SAndroid Build Coastguard Worker                        "qvstfcsxi $FRT, $dst", IIC_LdStSTFD, []>;
774*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
775*9880d681SAndroid Build Coastguard Worker    def QVSTFCSXIA : XForm_8<31, 133,
776*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
777*9880d681SAndroid Build Coastguard Worker                        "qvstfcsxia $FRT, $dst", IIC_LdStSTFD, []>;
778*9880d681SAndroid Build Coastguard Worker
779*9880d681SAndroid Build Coastguard Worker    def QVSTFCDUXI : XForm_8<31, 229,
780*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
781*9880d681SAndroid Build Coastguard Worker                        "qvstfcduxi $FRT, $dst", IIC_LdStSTFD, []>;
782*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
783*9880d681SAndroid Build Coastguard Worker    def QVSTFCDUXIA : XForm_8<31, 229,
784*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
785*9880d681SAndroid Build Coastguard Worker                        "qvstfcduxia $FRT, $dst", IIC_LdStSTFD, []>;
786*9880d681SAndroid Build Coastguard Worker
787*9880d681SAndroid Build Coastguard Worker    def QVSTFCSUXI : XForm_8<31, 165,
788*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
789*9880d681SAndroid Build Coastguard Worker                        "qvstfcsuxi $FRT, $dst", IIC_LdStSTFD, []>;
790*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
791*9880d681SAndroid Build Coastguard Worker    def QVSTFCSUXIA : XForm_8<31, 165,
792*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
793*9880d681SAndroid Build Coastguard Worker                        "qvstfcsuxia $FRT, $dst", IIC_LdStSTFD, []>;
794*9880d681SAndroid Build Coastguard Worker
795*9880d681SAndroid Build Coastguard Worker    def QVSTFIWX : XForm_8<31, 967,
796*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
797*9880d681SAndroid Build Coastguard Worker                        "qvstfiwx $FRT, $dst", IIC_LdStSTFD, []>;
798*9880d681SAndroid Build Coastguard Worker    let RC = 1 in
799*9880d681SAndroid Build Coastguard Worker    def QVSTFIWXA : XForm_8<31, 967,
800*9880d681SAndroid Build Coastguard Worker                        (outs), (ins qfrc:$FRT, memrr:$dst),
801*9880d681SAndroid Build Coastguard Worker                        "qvstfiwxa $FRT, $dst", IIC_LdStSTFD, []>;
802*9880d681SAndroid Build Coastguard Worker  }
803*9880d681SAndroid Build Coastguard Worker}
804*9880d681SAndroid Build Coastguard Worker
805*9880d681SAndroid Build Coastguard Worker} // neverHasSideEffects
806*9880d681SAndroid Build Coastguard Worker}
807*9880d681SAndroid Build Coastguard Worker
808*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfclr $FRT",
809*9880d681SAndroid Build Coastguard Worker                (QVFLOGICALb qbrc:$FRT, qbrc:$FRT, qbrc:$FRT, 0)>;
810*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfand $FRT, $FRA, $FRB",
811*9880d681SAndroid Build Coastguard Worker                (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 1)>;
812*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfandc $FRT, $FRA, $FRB",
813*9880d681SAndroid Build Coastguard Worker                (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 4)>;
814*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfctfb $FRT, $FRA",
815*9880d681SAndroid Build Coastguard Worker                (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRA, 5)>;
816*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfxor $FRT, $FRA, $FRB",
817*9880d681SAndroid Build Coastguard Worker                (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 6)>;
818*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfor $FRT, $FRA, $FRB",
819*9880d681SAndroid Build Coastguard Worker                (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 7)>;
820*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfnor $FRT, $FRA, $FRB",
821*9880d681SAndroid Build Coastguard Worker                (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 8)>;
822*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfequ $FRT, $FRA, $FRB",
823*9880d681SAndroid Build Coastguard Worker                (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 9)>;
824*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfnot $FRT, $FRA",
825*9880d681SAndroid Build Coastguard Worker                (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRA, 10)>;
826*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvforc $FRT, $FRA, $FRB",
827*9880d681SAndroid Build Coastguard Worker                (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 13)>;
828*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfnand $FRT, $FRA, $FRB",
829*9880d681SAndroid Build Coastguard Worker                (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 14)>;
830*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"qvfset $FRT",
831*9880d681SAndroid Build Coastguard Worker                (QVFLOGICALb qbrc:$FRT, qbrc:$FRT, qbrc:$FRT, 15)>;
832*9880d681SAndroid Build Coastguard Worker
833*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
834*9880d681SAndroid Build Coastguard Worker// Additional QPX Patterns
835*9880d681SAndroid Build Coastguard Worker//
836*9880d681SAndroid Build Coastguard Worker
837*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (scalar_to_vector f64:$A)),
838*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v4f64 (IMPLICIT_DEF)), $A, sub_64)>;
839*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (scalar_to_vector f32:$A)),
840*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), $A, sub_64)>;
841*9880d681SAndroid Build Coastguard Worker
842*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v4f64:$S, 0)),
843*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG $S, sub_64)>;
844*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (extractelt v4f32:$S, 0)),
845*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG $S, sub_64)>;
846*9880d681SAndroid Build Coastguard Worker
847*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v4f64:$S, 1)),
848*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (QVESPLATI $S, 1), sub_64)>;
849*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v4f64:$S, 2)),
850*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (QVESPLATI $S, 2), sub_64)>;
851*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v4f64:$S, 3)),
852*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (QVESPLATI $S, 3), sub_64)>;
853*9880d681SAndroid Build Coastguard Worker
854*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (extractelt v4f32:$S, 1)),
855*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (QVESPLATIs $S, 1), sub_64)>;
856*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (extractelt v4f32:$S, 2)),
857*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (QVESPLATIs $S, 2), sub_64)>;
858*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (extractelt v4f32:$S, 3)),
859*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (QVESPLATIs $S, 3), sub_64)>;
860*9880d681SAndroid Build Coastguard Worker
861*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extractelt v4f64:$S, i64:$F)),
862*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (QVFPERM $S, $S,
863*9880d681SAndroid Build Coastguard Worker                                   (QVLPCLSXint (RLDICR $F, 2,
864*9880d681SAndroid Build Coastguard Worker                                                        /* 63-2 = */ 61))),
865*9880d681SAndroid Build Coastguard Worker                          sub_64)>;
866*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (extractelt v4f32:$S, i64:$F)),
867*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (QVFPERMs $S, $S,
868*9880d681SAndroid Build Coastguard Worker                                    (QVLPCLSXint (RLDICR $F, 2,
869*9880d681SAndroid Build Coastguard Worker                                                         /* 63-2 = */ 61))),
870*9880d681SAndroid Build Coastguard Worker                          sub_64)>;
871*9880d681SAndroid Build Coastguard Worker
872*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfperm v4f64:$A, v4f64:$B, v4f64:$C),
873*9880d681SAndroid Build Coastguard Worker          (QVFPERM $A, $B, $C)>;
874*9880d681SAndroid Build Coastguard Worker
875*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfcpsgn v4f64:$A, v4f64:$B),
876*9880d681SAndroid Build Coastguard Worker          (QVFCPSGN $A, $B)>;
877*9880d681SAndroid Build Coastguard Worker
878*9880d681SAndroid Build Coastguard Worker// FCOPYSIGN's operand types need not agree.
879*9880d681SAndroid Build Coastguard Workerdef : Pat<(fcopysign v4f64:$frB, v4f32:$frA),
880*9880d681SAndroid Build Coastguard Worker          (QVFCPSGN (COPY_TO_REGCLASS $frA, QFRC), $frB)>;
881*9880d681SAndroid Build Coastguard Workerdef : Pat<(fcopysign QSRC:$frB, QFRC:$frA),
882*9880d681SAndroid Build Coastguard Worker          (QVFCPSGNs (COPY_TO_REGCLASS $frA, QSRC), $frB)>;
883*9880d681SAndroid Build Coastguard Worker
884*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfneg v4f64:$A), (QVFNEG $A)>;
885*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfabs v4f64:$A), (QVFABS $A)>;
886*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfnabs v4f64:$A), (QVFNABS $A)>;
887*9880d681SAndroid Build Coastguard Worker
888*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfriz v4f64:$A), (QVFRIZ $A)>;
889*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfrin v4f64:$A), (QVFRIN $A)>;
890*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfrip v4f64:$A), (QVFRIP $A)>;
891*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfrim v4f64:$A), (QVFRIM $A)>;
892*9880d681SAndroid Build Coastguard Worker
893*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfre v4f64:$A), (QVFRE $A)>;
894*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfrsqrte v4f64:$A), (QVFRSQRTE $A)>;
895*9880d681SAndroid Build Coastguard Worker
896*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfadd v4f64:$A, v4f64:$B),
897*9880d681SAndroid Build Coastguard Worker          (QVFADD $A, $B)>;
898*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfsub v4f64:$A, v4f64:$B),
899*9880d681SAndroid Build Coastguard Worker          (QVFSUB $A, $B)>;
900*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfmul v4f64:$A, v4f64:$B),
901*9880d681SAndroid Build Coastguard Worker          (QVFMUL $A, $B)>;
902*9880d681SAndroid Build Coastguard Worker
903*9880d681SAndroid Build Coastguard Worker// Additional QVFNMSUB patterns: -a*c + b == -(a*c - b)
904*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma (fneg v4f64:$A), v4f64:$C, v4f64:$B),
905*9880d681SAndroid Build Coastguard Worker          (QVFNMSUB $A, $B, $C)>;
906*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma v4f64:$A, (fneg v4f64:$C), v4f64:$B),
907*9880d681SAndroid Build Coastguard Worker          (QVFNMSUB $A, $B, $C)>;
908*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B),
909*9880d681SAndroid Build Coastguard Worker          (QVFNMSUBSs $A, $B, $C)>;
910*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B),
911*9880d681SAndroid Build Coastguard Worker          (QVFNMSUBSs $A, $B, $C)>;
912*9880d681SAndroid Build Coastguard Worker
913*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfmadd v4f64:$A, v4f64:$B, v4f64:$C),
914*9880d681SAndroid Build Coastguard Worker          (QVFMADD $A, $B, $C)>;
915*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfnmadd v4f64:$A, v4f64:$B, v4f64:$C),
916*9880d681SAndroid Build Coastguard Worker          (QVFNMADD $A, $B, $C)>;
917*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfmsub v4f64:$A, v4f64:$B, v4f64:$C),
918*9880d681SAndroid Build Coastguard Worker          (QVFMSUB $A, $B, $C)>;
919*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvfnmsub v4f64:$A, v4f64:$B, v4f64:$C),
920*9880d681SAndroid Build Coastguard Worker          (QVFNMSUB $A, $B, $C)>;
921*9880d681SAndroid Build Coastguard Worker
922*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfd xoaddr:$src),
923*9880d681SAndroid Build Coastguard Worker          (QVLFDX xoaddr:$src)>;
924*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfda xoaddr:$src),
925*9880d681SAndroid Build Coastguard Worker          (QVLFDXA xoaddr:$src)>;
926*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfs xoaddr:$src),
927*9880d681SAndroid Build Coastguard Worker          (QVLFSX xoaddr:$src)>;
928*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfsa xoaddr:$src),
929*9880d681SAndroid Build Coastguard Worker          (QVLFSXA xoaddr:$src)>;
930*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfcda xoaddr:$src),
931*9880d681SAndroid Build Coastguard Worker          (QVLFCDXA xoaddr:$src)>;
932*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfcd xoaddr:$src),
933*9880d681SAndroid Build Coastguard Worker          (QVLFCDX xoaddr:$src)>;
934*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfcsa xoaddr:$src),
935*9880d681SAndroid Build Coastguard Worker          (QVLFCSXA xoaddr:$src)>;
936*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfcs xoaddr:$src),
937*9880d681SAndroid Build Coastguard Worker          (QVLFCSX xoaddr:$src)>;
938*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfda xoaddr:$src),
939*9880d681SAndroid Build Coastguard Worker          (QVLFDXA xoaddr:$src)>;
940*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfiwaa xoaddr:$src),
941*9880d681SAndroid Build Coastguard Worker          (QVLFIWAXA xoaddr:$src)>;
942*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfiwa xoaddr:$src),
943*9880d681SAndroid Build Coastguard Worker          (QVLFIWAX xoaddr:$src)>;
944*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfiwza xoaddr:$src),
945*9880d681SAndroid Build Coastguard Worker          (QVLFIWZXA xoaddr:$src)>;
946*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfiwz xoaddr:$src),
947*9880d681SAndroid Build Coastguard Worker          (QVLFIWZX xoaddr:$src)>;
948*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlfsa xoaddr:$src),
949*9880d681SAndroid Build Coastguard Worker          (QVLFSXA xoaddr:$src)>;
950*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlpcld xoaddr:$src),
951*9880d681SAndroid Build Coastguard Worker          (QVLPCLDX xoaddr:$src)>;
952*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlpcls xoaddr:$src),
953*9880d681SAndroid Build Coastguard Worker          (QVLPCLSX xoaddr:$src)>;
954*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlpcrd xoaddr:$src),
955*9880d681SAndroid Build Coastguard Worker          (QVLPCRDX xoaddr:$src)>;
956*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvlpcrs xoaddr:$src),
957*9880d681SAndroid Build Coastguard Worker          (QVLPCRSX xoaddr:$src)>;
958*9880d681SAndroid Build Coastguard Worker
959*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfd v4f64:$T, xoaddr:$dst),
960*9880d681SAndroid Build Coastguard Worker          (QVSTFDX $T, xoaddr:$dst)>;
961*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfs v4f64:$T, xoaddr:$dst),
962*9880d681SAndroid Build Coastguard Worker          (QVSTFSX $T, xoaddr:$dst)>;
963*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfcda v4f64:$T, xoaddr:$dst),
964*9880d681SAndroid Build Coastguard Worker          (QVSTFCDXA $T, xoaddr:$dst)>;
965*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfcd v4f64:$T, xoaddr:$dst),
966*9880d681SAndroid Build Coastguard Worker          (QVSTFCDX $T, xoaddr:$dst)>;
967*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfcsa v4f64:$T, xoaddr:$dst),
968*9880d681SAndroid Build Coastguard Worker          (QVSTFCSXA $T, xoaddr:$dst)>;
969*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfcs v4f64:$T, xoaddr:$dst),
970*9880d681SAndroid Build Coastguard Worker          (QVSTFCSX $T, xoaddr:$dst)>;
971*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfda v4f64:$T, xoaddr:$dst),
972*9880d681SAndroid Build Coastguard Worker          (QVSTFDXA $T, xoaddr:$dst)>;
973*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfiwa v4f64:$T, xoaddr:$dst),
974*9880d681SAndroid Build Coastguard Worker          (QVSTFIWXA $T, xoaddr:$dst)>;
975*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfiw v4f64:$T, xoaddr:$dst),
976*9880d681SAndroid Build Coastguard Worker          (QVSTFIWX $T, xoaddr:$dst)>;
977*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvstfsa v4f64:$T, xoaddr:$dst),
978*9880d681SAndroid Build Coastguard Worker          (QVSTFSXA $T, xoaddr:$dst)>;
979*9880d681SAndroid Build Coastguard Worker
980*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store v4f64:$rS, iPTR:$ptrreg, iPTR:$ptroff),
981*9880d681SAndroid Build Coastguard Worker          (QVSTFDUX $rS, $ptrreg, $ptroff)>;
982*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store v4f32:$rS, iPTR:$ptrreg, iPTR:$ptroff),
983*9880d681SAndroid Build Coastguard Worker          (QVSTFSUX $rS, $ptrreg, $ptroff)>;
984*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_truncstv4f32 v4f64:$rS, iPTR:$ptrreg, iPTR:$ptroff),
985*9880d681SAndroid Build Coastguard Worker          (QVSTFSUXs $rS, $ptrreg, $ptroff)>;
986*9880d681SAndroid Build Coastguard Worker
987*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvflogical  v4f64:$A, v4f64:$B, (i32 imm:$idx)),
988*9880d681SAndroid Build Coastguard Worker          (QVFLOGICAL $A, $B, imm:$idx)>;
989*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_qpx_qvgpci (u12:$idx)),
990*9880d681SAndroid Build Coastguard Worker          (QVGPCI imm:$idx)>;
991*9880d681SAndroid Build Coastguard Worker
992*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETOGE),
993*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPLTb $FRA, $FRB),
994*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANb $FRA, $FRB), (i32 8))>;
995*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETOLE),
996*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPGTb $FRA, $FRB),
997*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANb $FRA, $FRB), (i32 8))>;
998*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETONE),
999*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPEQb $FRA, $FRB),
1000*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANb $FRA, $FRB), (i32 8))>;
1001*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETO),
1002*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFTSTNANb $FRA, $FRB),
1003*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANb $FRA, $FRB), (i32 10))>;
1004*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETUEQ),
1005*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPEQb $FRA, $FRB),
1006*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANb $FRA, $FRB), (i32 7))>;
1007*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETUGT),
1008*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPGTb $FRA, $FRB),
1009*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANb $FRA, $FRB), (i32 7))>;
1010*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETUGE),
1011*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFTSTNANb $FRA, $FRB),
1012*9880d681SAndroid Build Coastguard Worker                       (QVFCMPLTb $FRA, $FRB), (i32 13))>;
1013*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETULT),
1014*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPLTb $FRA, $FRB),
1015*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANb $FRA, $FRB), (i32 7))>;
1016*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETULE),
1017*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFTSTNANb $FRA, $FRB),
1018*9880d681SAndroid Build Coastguard Worker                       (QVFCMPGTb $FRA, $FRB), (i32 13))>;
1019*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETUNE),
1020*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFTSTNANb $FRA, $FRB),
1021*9880d681SAndroid Build Coastguard Worker                       (QVFCMPEQb $FRA, $FRB), (i32 13))>;
1022*9880d681SAndroid Build Coastguard Worker
1023*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETEQ),
1024*9880d681SAndroid Build Coastguard Worker          (QVFCMPEQb $FRA, $FRB)>;
1025*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETGT),
1026*9880d681SAndroid Build Coastguard Worker          (QVFCMPGTb $FRA, $FRB)>;
1027*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETGE),
1028*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPLTb $FRA, $FRB),
1029*9880d681SAndroid Build Coastguard Worker                       (QVFCMPLTb $FRA, $FRB), (i32 10))>;
1030*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETLT),
1031*9880d681SAndroid Build Coastguard Worker          (QVFCMPLTb $FRA, $FRB)>;
1032*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETLE),
1033*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPGTb $FRA, $FRB),
1034*9880d681SAndroid Build Coastguard Worker                       (QVFCMPGTb $FRA, $FRB), (i32 10))>;
1035*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETNE),
1036*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPEQb $FRA, $FRB),
1037*9880d681SAndroid Build Coastguard Worker                       (QVFCMPEQb $FRA, $FRB), (i32 10))>;
1038*9880d681SAndroid Build Coastguard Worker
1039*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETOGE),
1040*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPLTbs $FRA, $FRB),
1041*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANbs $FRA, $FRB), (i32 8))>;
1042*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETOLE),
1043*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPGTbs $FRA, $FRB),
1044*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANbs $FRA, $FRB), (i32 8))>;
1045*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETONE),
1046*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPEQbs $FRA, $FRB),
1047*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANbs $FRA, $FRB), (i32 8))>;
1048*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETO),
1049*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFTSTNANbs $FRA, $FRB),
1050*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANbs $FRA, $FRB), (i32 10))>;
1051*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETUEQ),
1052*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPEQbs $FRA, $FRB),
1053*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANbs $FRA, $FRB), (i32 7))>;
1054*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETUGT),
1055*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPGTbs $FRA, $FRB),
1056*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANbs $FRA, $FRB), (i32 7))>;
1057*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETUGE),
1058*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFTSTNANbs $FRA, $FRB),
1059*9880d681SAndroid Build Coastguard Worker                       (QVFCMPLTbs $FRA, $FRB), (i32 13))>;
1060*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETULT),
1061*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPLTbs $FRA, $FRB),
1062*9880d681SAndroid Build Coastguard Worker                       (QVFTSTNANbs $FRA, $FRB), (i32 7))>;
1063*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETULE),
1064*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFTSTNANbs $FRA, $FRB),
1065*9880d681SAndroid Build Coastguard Worker                       (QVFCMPGTbs $FRA, $FRB), (i32 13))>;
1066*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETUNE),
1067*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFTSTNANbs $FRA, $FRB),
1068*9880d681SAndroid Build Coastguard Worker                       (QVFCMPEQbs $FRA, $FRB), (i32 13))>;
1069*9880d681SAndroid Build Coastguard Worker
1070*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETEQ),
1071*9880d681SAndroid Build Coastguard Worker          (QVFCMPEQbs $FRA, $FRB)>;
1072*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETGT),
1073*9880d681SAndroid Build Coastguard Worker          (QVFCMPGTbs $FRA, $FRB)>;
1074*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETGE),
1075*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPLTbs $FRA, $FRB),
1076*9880d681SAndroid Build Coastguard Worker                       (QVFCMPLTbs $FRA, $FRB), (i32 10))>;
1077*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETLT),
1078*9880d681SAndroid Build Coastguard Worker          (QVFCMPLTbs $FRA, $FRB)>;
1079*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETLE),
1080*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPGTbs $FRA, $FRB),
1081*9880d681SAndroid Build Coastguard Worker                       (QVFCMPGTbs $FRA, $FRB), (i32 10))>;
1082*9880d681SAndroid Build Coastguard Workerdef : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETNE),
1083*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb (QVFCMPEQbs $FRA, $FRB),
1084*9880d681SAndroid Build Coastguard Worker                       (QVFCMPEQbs $FRA, $FRB), (i32 10))>;
1085*9880d681SAndroid Build Coastguard Worker
1086*9880d681SAndroid Build Coastguard Workerdef : Pat<(and v4i1:$FRA, (not v4i1:$FRB)),
1087*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb $FRA, $FRB, (i32 4))>;
1088*9880d681SAndroid Build Coastguard Workerdef : Pat<(not (or v4i1:$FRA, v4i1:$FRB)),
1089*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb $FRA, $FRB, (i32 8))>;
1090*9880d681SAndroid Build Coastguard Workerdef : Pat<(not (xor v4i1:$FRA, v4i1:$FRB)),
1091*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb $FRA, $FRB, (i32 9))>;
1092*9880d681SAndroid Build Coastguard Workerdef : Pat<(or v4i1:$FRA, (not v4i1:$FRB)),
1093*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb $FRA, $FRB, (i32 13))>;
1094*9880d681SAndroid Build Coastguard Workerdef : Pat<(not (and v4i1:$FRA, v4i1:$FRB)),
1095*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb $FRA, $FRB, (i32 14))>;
1096*9880d681SAndroid Build Coastguard Worker
1097*9880d681SAndroid Build Coastguard Workerdef : Pat<(and v4i1:$FRA, v4i1:$FRB),
1098*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb $FRA, $FRB, (i32 1))>;
1099*9880d681SAndroid Build Coastguard Workerdef : Pat<(or v4i1:$FRA, v4i1:$FRB),
1100*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb $FRA, $FRB, (i32 7))>;
1101*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor v4i1:$FRA, v4i1:$FRB),
1102*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb $FRA, $FRB, (i32 6))>;
1103*9880d681SAndroid Build Coastguard Workerdef : Pat<(not v4i1:$FRA),
1104*9880d681SAndroid Build Coastguard Worker          (QVFLOGICALb $FRA, $FRA, (i32 10))>;
1105*9880d681SAndroid Build Coastguard Worker
1106*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (fextend v4f32:$src)),
1107*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $src, QFRC)>;
1108*9880d681SAndroid Build Coastguard Worker
1109*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (fround_exact v4f64:$src)),
1110*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $src, QSRC)>;
1111*9880d681SAndroid Build Coastguard Worker
1112*9880d681SAndroid Build Coastguard Worker// Extract the underlying floating-point values from the
1113*9880d681SAndroid Build Coastguard Worker// QPX (-1.0, 1.0) boolean representation.
1114*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (PPCqbflt v4i1:$src)),
1115*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $src, QFRC)>;
1116*9880d681SAndroid Build Coastguard Worker
1117*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETLT)),
1118*9880d681SAndroid Build Coastguard Worker          (SELECT_QFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1119*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETULT)),
1120*9880d681SAndroid Build Coastguard Worker          (SELECT_QFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1121*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETLE)),
1122*9880d681SAndroid Build Coastguard Worker          (SELECT_QFRC (CRORC  $lhs, $rhs), $tval, $fval)>;
1123*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETULE)),
1124*9880d681SAndroid Build Coastguard Worker          (SELECT_QFRC (CRORC  $rhs, $lhs), $tval, $fval)>;
1125*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETEQ)),
1126*9880d681SAndroid Build Coastguard Worker          (SELECT_QFRC (CREQV $lhs, $rhs), $tval, $fval)>;
1127*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETGE)),
1128*9880d681SAndroid Build Coastguard Worker          (SELECT_QFRC (CRORC  $rhs, $lhs), $tval, $fval)>;
1129*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETUGE)),
1130*9880d681SAndroid Build Coastguard Worker          (SELECT_QFRC (CRORC  $lhs, $rhs), $tval, $fval)>;
1131*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETGT)),
1132*9880d681SAndroid Build Coastguard Worker          (SELECT_QFRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1133*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETUGT)),
1134*9880d681SAndroid Build Coastguard Worker          (SELECT_QFRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1135*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETNE)),
1136*9880d681SAndroid Build Coastguard Worker          (SELECT_QFRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1137*9880d681SAndroid Build Coastguard Worker
1138*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETLT)),
1139*9880d681SAndroid Build Coastguard Worker          (SELECT_QSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1140*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETULT)),
1141*9880d681SAndroid Build Coastguard Worker          (SELECT_QSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1142*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETLE)),
1143*9880d681SAndroid Build Coastguard Worker          (SELECT_QSRC (CRORC  $lhs, $rhs), $tval, $fval)>;
1144*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETULE)),
1145*9880d681SAndroid Build Coastguard Worker          (SELECT_QSRC (CRORC  $rhs, $lhs), $tval, $fval)>;
1146*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETEQ)),
1147*9880d681SAndroid Build Coastguard Worker          (SELECT_QSRC (CREQV $lhs, $rhs), $tval, $fval)>;
1148*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETGE)),
1149*9880d681SAndroid Build Coastguard Worker          (SELECT_QSRC (CRORC  $rhs, $lhs), $tval, $fval)>;
1150*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETUGE)),
1151*9880d681SAndroid Build Coastguard Worker          (SELECT_QSRC (CRORC  $lhs, $rhs), $tval, $fval)>;
1152*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETGT)),
1153*9880d681SAndroid Build Coastguard Worker          (SELECT_QSRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1154*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETUGT)),
1155*9880d681SAndroid Build Coastguard Worker          (SELECT_QSRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1156*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETNE)),
1157*9880d681SAndroid Build Coastguard Worker          (SELECT_QSRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1158*9880d681SAndroid Build Coastguard Worker
1159*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETLT)),
1160*9880d681SAndroid Build Coastguard Worker          (SELECT_QBRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1161*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETULT)),
1162*9880d681SAndroid Build Coastguard Worker          (SELECT_QBRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1163*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETLE)),
1164*9880d681SAndroid Build Coastguard Worker          (SELECT_QBRC (CRORC  $lhs, $rhs), $tval, $fval)>;
1165*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETULE)),
1166*9880d681SAndroid Build Coastguard Worker          (SELECT_QBRC (CRORC  $rhs, $lhs), $tval, $fval)>;
1167*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETEQ)),
1168*9880d681SAndroid Build Coastguard Worker          (SELECT_QBRC (CREQV $lhs, $rhs), $tval, $fval)>;
1169*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETGE)),
1170*9880d681SAndroid Build Coastguard Worker          (SELECT_QBRC (CRORC  $rhs, $lhs), $tval, $fval)>;
1171*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETUGE)),
1172*9880d681SAndroid Build Coastguard Worker          (SELECT_QBRC (CRORC  $lhs, $rhs), $tval, $fval)>;
1173*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETGT)),
1174*9880d681SAndroid Build Coastguard Worker          (SELECT_QBRC (CRANDC $rhs, $lhs), $tval, $fval)>;
1175*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETUGT)),
1176*9880d681SAndroid Build Coastguard Worker          (SELECT_QBRC (CRANDC $lhs, $rhs), $tval, $fval)>;
1177*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETNE)),
1178*9880d681SAndroid Build Coastguard Worker          (SELECT_QBRC (CRXOR $lhs, $rhs), $tval, $fval)>;
1179*9880d681SAndroid Build Coastguard Worker
1180*9880d681SAndroid Build Coastguard Worker} // end HasQPX
1181*9880d681SAndroid Build Coastguard Worker
1182*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasQPX, NoNaNsFPMath] in {
1183*9880d681SAndroid Build Coastguard Workerdef : Pat<(fminnum v4f64:$FRA, v4f64:$FRB),
1184*9880d681SAndroid Build Coastguard Worker          (QVFSELb (QVFCMPLTb $FRA, $FRB), $FRB, $FRA)>;
1185*9880d681SAndroid Build Coastguard Workerdef : Pat<(fmaxnum v4f64:$FRA, v4f64:$FRB),
1186*9880d681SAndroid Build Coastguard Worker          (QVFSELb (QVFCMPGTb $FRA, $FRB), $FRB, $FRA)>;
1187*9880d681SAndroid Build Coastguard Worker
1188*9880d681SAndroid Build Coastguard Workerdef : Pat<(fminnum v4f32:$FRA, v4f32:$FRB),
1189*9880d681SAndroid Build Coastguard Worker          (QVFSELbs (QVFCMPLTbs $FRA, $FRB), $FRB, $FRA)>;
1190*9880d681SAndroid Build Coastguard Workerdef : Pat<(fmaxnum v4f32:$FRA, v4f32:$FRB),
1191*9880d681SAndroid Build Coastguard Worker          (QVFSELbs (QVFCMPGTbs $FRA, $FRB), $FRB, $FRA)>;
1192*9880d681SAndroid Build Coastguard Worker}
1193*9880d681SAndroid Build Coastguard Worker
1194*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasQPX, NaNsFPMath] in {
1195*9880d681SAndroid Build Coastguard Worker// When either of these operands is NaN, we should return the other operand.
1196*9880d681SAndroid Build Coastguard Worker// QVFCMPLT/QVFCMPGT return false is either operand is NaN, which means we need
1197*9880d681SAndroid Build Coastguard Worker// to explicitly or with a NaN test on the second operand.
1198*9880d681SAndroid Build Coastguard Workerdef : Pat<(fminnum v4f64:$FRA, v4f64:$FRB),
1199*9880d681SAndroid Build Coastguard Worker          (QVFSELb (QVFLOGICALb (QVFCMPLTb $FRA, $FRB),
1200*9880d681SAndroid Build Coastguard Worker                                (QVFTSTNANb $FRB, $FRB), (i32 7)),
1201*9880d681SAndroid Build Coastguard Worker                   $FRB, $FRA)>;
1202*9880d681SAndroid Build Coastguard Workerdef : Pat<(fmaxnum v4f64:$FRA, v4f64:$FRB),
1203*9880d681SAndroid Build Coastguard Worker          (QVFSELb (QVFLOGICALb (QVFCMPGTb $FRA, $FRB),
1204*9880d681SAndroid Build Coastguard Worker                                (QVFTSTNANb $FRB, $FRB), (i32 7)),
1205*9880d681SAndroid Build Coastguard Worker                   $FRB, $FRA)>;
1206*9880d681SAndroid Build Coastguard Worker
1207*9880d681SAndroid Build Coastguard Workerdef : Pat<(fminnum v4f32:$FRA, v4f32:$FRB),
1208*9880d681SAndroid Build Coastguard Worker          (QVFSELbs (QVFLOGICALb (QVFCMPLTbs $FRA, $FRB),
1209*9880d681SAndroid Build Coastguard Worker                                 (QVFTSTNANbs $FRB, $FRB), (i32 7)),
1210*9880d681SAndroid Build Coastguard Worker                   $FRB, $FRA)>;
1211*9880d681SAndroid Build Coastguard Workerdef : Pat<(fmaxnum v4f32:$FRA, v4f32:$FRB),
1212*9880d681SAndroid Build Coastguard Worker          (QVFSELbs (QVFLOGICALb (QVFCMPGTbs $FRA, $FRB),
1213*9880d681SAndroid Build Coastguard Worker                                 (QVFTSTNANbs $FRB, $FRB), (i32 7)),
1214*9880d681SAndroid Build Coastguard Worker                   $FRB, $FRA)>;
1215*9880d681SAndroid Build Coastguard Worker}
1216*9880d681SAndroid Build Coastguard Worker
1217