@@ -1341,6 +1341,21 @@ def DWToSPExtractConv {
1341
1341
dag BVS = (v4f32 (build_vector El0SS1, El1SS1, El0SS2, El1SS2));
1342
1342
}
1343
1343
1344
+ def WToDPExtractConv {
1345
+ dag El0S = (f64 (PPCfcfid (PPCmtvsra (extractelt v4i32:$A, 0))));
1346
+ dag El1S = (f64 (PPCfcfid (PPCmtvsra (extractelt v4i32:$A, 1))));
1347
+ dag El2S = (f64 (PPCfcfid (PPCmtvsra (extractelt v4i32:$A, 2))));
1348
+ dag El3S = (f64 (PPCfcfid (PPCmtvsra (extractelt v4i32:$A, 3))));
1349
+ dag El0U = (f64 (PPCfcfidu (PPCmtvsrz (extractelt v4i32:$A, 0))));
1350
+ dag El1U = (f64 (PPCfcfidu (PPCmtvsrz (extractelt v4i32:$A, 1))));
1351
+ dag El2U = (f64 (PPCfcfidu (PPCmtvsrz (extractelt v4i32:$A, 2))));
1352
+ dag El3U = (f64 (PPCfcfidu (PPCmtvsrz (extractelt v4i32:$A, 3))));
1353
+ dag BV02S = (v2f64 (build_vector El0S, El2S));
1354
+ dag BV13S = (v2f64 (build_vector El1S, El3S));
1355
+ dag BV02U = (v2f64 (build_vector El0U, El2U));
1356
+ dag BV13U = (v2f64 (build_vector El1U, El3U));
1357
+ }
1358
+
1344
1359
// The following VSX instructions were introduced in Power ISA 2.07
1345
1360
/* FIXME: if the operands are v2i64, these patterns will not match.
1346
1361
we should define new patterns or otherwise match the same patterns
@@ -4171,6 +4186,41 @@ let AddedComplexity = 400 in {
4171
4186
def : Pat<(v4i32 (build_vector ExtDbl.A0U, ExtDbl.A1U,
4172
4187
ExtDbl.B0U, ExtDbl.B1U)),
4173
4188
(v4i32 (VMRGEW MrgWords.CVA0B0U, MrgWords.CVA1B1U))>;
4189
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))),
4190
+ (f64 (fpextend (extractelt v4f32:$A, 1))))),
4191
+ (v2f64 (XVCVSPDP (XXMRGHW $A, $A)))>;
4192
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))),
4193
+ (f64 (fpextend (extractelt v4f32:$A, 0))))),
4194
+ (v2f64 (XXPERMDI (XVCVSPDP (XXMRGHW $A, $A)),
4195
+ (XVCVSPDP (XXMRGHW $A, $A)), 2))>;
4196
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))),
4197
+ (f64 (fpextend (extractelt v4f32:$A, 2))))),
4198
+ (v2f64 (XVCVSPDP $A))>;
4199
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))),
4200
+ (f64 (fpextend (extractelt v4f32:$A, 3))))),
4201
+ (v2f64 (XVCVSPDP (XXSLDWI $A, $A, 3)))>;
4202
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 2))),
4203
+ (f64 (fpextend (extractelt v4f32:$A, 3))))),
4204
+ (v2f64 (XVCVSPDP (XXMRGLW $A, $A)))>;
4205
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 3))),
4206
+ (f64 (fpextend (extractelt v4f32:$A, 2))))),
4207
+ (v2f64 (XXPERMDI (XVCVSPDP (XXMRGLW $A, $A)),
4208
+ (XVCVSPDP (XXMRGLW $A, $A)), 2))>;
4209
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))),
4210
+ (f64 (fpextend (extractelt v4f32:$B, 0))))),
4211
+ (v2f64 (XVCVSPDP (XXPERMDI $A, $B, 0)))>;
4212
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 3))),
4213
+ (f64 (fpextend (extractelt v4f32:$B, 3))))),
4214
+ (v2f64 (XVCVSPDP (XXSLDWI (XXPERMDI $A, $B, 3),
4215
+ (XXPERMDI $A, $B, 3), 1)))>;
4216
+ def : Pat<WToDPExtractConv.BV02S,
4217
+ (v2f64 (XVCVSXWDP $A))>;
4218
+ def : Pat<WToDPExtractConv.BV13S,
4219
+ (v2f64 (XVCVSXWDP (XXSLDWI $A, $A, 3)))>;
4220
+ def : Pat<WToDPExtractConv.BV02U,
4221
+ (v2f64 (XVCVUXWDP $A))>;
4222
+ def : Pat<WToDPExtractConv.BV13U,
4223
+ (v2f64 (XVCVUXWDP (XXSLDWI $A, $A, 3)))>;
4174
4224
}
4175
4225
4176
4226
let Predicates = [IsLittleEndian, HasP8Vector] in {
@@ -4249,6 +4299,41 @@ let AddedComplexity = 400 in {
4249
4299
def : Pat<(v4i32 (build_vector ExtDbl.A0U, ExtDbl.A1U,
4250
4300
ExtDbl.B0U, ExtDbl.B1U)),
4251
4301
(v4i32 (VMRGEW MrgWords.CVB1A1U, MrgWords.CVB0A0U))>;
4302
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))),
4303
+ (f64 (fpextend (extractelt v4f32:$A, 1))))),
4304
+ (v2f64 (XVCVSPDP (XXMRGLW $A, $A)))>;
4305
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))),
4306
+ (f64 (fpextend (extractelt v4f32:$A, 0))))),
4307
+ (v2f64 (XXPERMDI (XVCVSPDP (XXMRGLW $A, $A)),
4308
+ (XVCVSPDP (XXMRGLW $A, $A)), 2))>;
4309
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))),
4310
+ (f64 (fpextend (extractelt v4f32:$A, 2))))),
4311
+ (v2f64 (XVCVSPDP (XXSLDWI $A, $A, 1)))>;
4312
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))),
4313
+ (f64 (fpextend (extractelt v4f32:$A, 3))))),
4314
+ (v2f64 (XVCVSPDP $A))>;
4315
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 2))),
4316
+ (f64 (fpextend (extractelt v4f32:$A, 3))))),
4317
+ (v2f64 (XVCVSPDP (XXMRGHW $A, $A)))>;
4318
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 3))),
4319
+ (f64 (fpextend (extractelt v4f32:$A, 2))))),
4320
+ (v2f64 (XXPERMDI (XVCVSPDP (XXMRGHW $A, $A)),
4321
+ (XVCVSPDP (XXMRGHW $A, $A)), 2))>;
4322
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))),
4323
+ (f64 (fpextend (extractelt v4f32:$B, 0))))),
4324
+ (v2f64 (XVCVSPDP (XXSLDWI (XXPERMDI $B, $A, 3),
4325
+ (XXPERMDI $B, $A, 3), 1)))>;
4326
+ def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 3))),
4327
+ (f64 (fpextend (extractelt v4f32:$B, 3))))),
4328
+ (v2f64 (XVCVSPDP (XXPERMDI $B, $A, 0)))>;
4329
+ def : Pat<WToDPExtractConv.BV02S,
4330
+ (v2f64 (XVCVSXWDP (XXSLDWI $A, $A, 1)))>;
4331
+ def : Pat<WToDPExtractConv.BV13S,
4332
+ (v2f64 (XVCVSXWDP $A))>;
4333
+ def : Pat<WToDPExtractConv.BV02U,
4334
+ (v2f64 (XVCVUXWDP (XXSLDWI $A, $A, 1)))>;
4335
+ def : Pat<WToDPExtractConv.BV13U,
4336
+ (v2f64 (XVCVUXWDP $A))>;
4252
4337
}
4253
4338
4254
4339
let Predicates = [HasDirectMove] in {
0 commit comments