@@ -273,13 +273,13 @@ defm : LoadPat<vec.vt, loadpat, inst>;
273
273
multiclass SIMDLoadZero<Vec vec, bits<32> simdop> {
274
274
defvar name = "v128.load"#vec.lane_bits#"_zero";
275
275
let mayLoad = 1, UseNamedOperandTable = 1 in {
276
- defm LOAD_ZERO_#vec#_A32 :
276
+ defm LOAD_ZERO_#vec.lane_bits #_A32 :
277
277
SIMD_I<(outs V128:$dst),
278
278
(ins P2Align:$p2align, offset32_op:$off, I32:$addr),
279
279
(outs), (ins P2Align:$p2align, offset32_op:$off), [],
280
280
name#"\t$dst, ${off}(${addr})$p2align",
281
281
name#"\t$off$p2align", simdop>;
282
- defm LOAD_ZERO_#vec#_A64 :
282
+ defm LOAD_ZERO_#vec.lane_bits #_A64 :
283
283
SIMD_I<(outs V128:$dst),
284
284
(ins P2Align:$p2align, offset64_op:$off, I64:$addr),
285
285
(outs), (ins P2Align:$p2align, offset64_op:$off), [],
@@ -293,32 +293,32 @@ defm "" : SIMDLoadZero<I64x2, 0x5d>;
293
293
294
294
// Use load_zero to load scalars into vectors as well where possible.
295
295
// TODO: i16, and i8 scalars
296
- foreach vec = [I32x4, I64x2] in {
297
- defvar inst = "LOAD_ZERO_"#vec;
296
+ foreach vec = [I32x4, I64x2, F32x4, F64x2 ] in {
297
+ defvar inst = "LOAD_ZERO_"#vec.lane_bits ;
298
298
defvar pat = PatFrag<(ops node:$addr), (scalar_to_vector (vec.lane_vt (load $addr)))>;
299
299
defm : LoadPat<vec.vt, pat, inst>;
300
300
}
301
301
302
302
// TODO: f32x4 and f64x2 as well
303
303
foreach vec = [I32x4, I64x2] in {
304
- defvar inst = "LOAD_ZERO_"#vec;
304
+ defvar inst = "LOAD_ZERO_"#vec.lane_bits ;
305
305
defvar pat = PatFrag<(ops node:$ptr),
306
306
(vector_insert (vec.splat (vec.lane_vt 0)), (vec.lane_vt (load $ptr)), 0)>;
307
307
defm : LoadPat<vec.vt, pat, inst>;
308
308
}
309
309
310
310
// Load lane
311
- multiclass SIMDLoadLane<Vec vec , bits<32> simdop> {
312
- defvar name = "v128.load"#vec. lane_bits#"_lane";
311
+ multiclass SIMDLoadLane<bits<32> lane_bits , bits<32> simdop> {
312
+ defvar name = "v128.load"#lane_bits#"_lane";
313
313
let mayLoad = 1, UseNamedOperandTable = 1 in {
314
- defm LOAD_LANE_#vec #_A32 :
314
+ defm LOAD_LANE_#lane_bits #_A32 :
315
315
SIMD_I<(outs V128:$dst),
316
316
(ins P2Align:$p2align, offset32_op:$off, vec_i8imm_op:$idx,
317
317
I32:$addr, V128:$vec),
318
318
(outs), (ins P2Align:$p2align, offset32_op:$off, vec_i8imm_op:$idx),
319
319
[], name#"\t$dst, ${off}(${addr})$p2align, $vec, $idx",
320
320
name#"\t$off$p2align, $idx", simdop>;
321
- defm LOAD_LANE_#vec #_A64 :
321
+ defm LOAD_LANE_#lane_bits #_A64 :
322
322
SIMD_I<(outs V128:$dst),
323
323
(ins P2Align:$p2align, offset64_op:$off, vec_i8imm_op:$idx,
324
324
I64:$addr, V128:$vec),
@@ -328,15 +328,15 @@ multiclass SIMDLoadLane<Vec vec, bits<32> simdop> {
328
328
} // mayLoad = 1, UseNamedOperandTable = 1
329
329
}
330
330
331
- defm "" : SIMDLoadLane<I8x16 , 0x54>;
332
- defm "" : SIMDLoadLane<I16x8 , 0x55>;
333
- defm "" : SIMDLoadLane<I32x4 , 0x56>;
334
- defm "" : SIMDLoadLane<I64x2 , 0x57>;
331
+ defm "" : SIMDLoadLane<8 , 0x54>;
332
+ defm "" : SIMDLoadLane<16 , 0x55>;
333
+ defm "" : SIMDLoadLane<32 , 0x56>;
334
+ defm "" : SIMDLoadLane<64 , 0x57>;
335
335
336
336
// Select loads with no constant offset.
337
337
multiclass LoadLanePatNoOffset<Vec vec, SDPatternOperator kind> {
338
- defvar load_lane_a32 = !cast<NI>("LOAD_LANE_"#vec#"_A32");
339
- defvar load_lane_a64 = !cast<NI>("LOAD_LANE_"#vec#"_A64");
338
+ defvar load_lane_a32 = !cast<NI>("LOAD_LANE_"#vec.lane_bits #"_A32");
339
+ defvar load_lane_a64 = !cast<NI>("LOAD_LANE_"#vec.lane_bits #"_A64");
340
340
def : Pat<(vec.vt (kind (i32 I32:$addr),
341
341
(vec.vt V128:$vec), (i32 vec.lane_idx:$idx))),
342
342
(load_lane_a32 0, 0, imm:$idx, $addr, $vec)>,
@@ -354,17 +354,22 @@ def load16_lane :
354
354
PatFrag<(ops node:$ptr, node:$vec, node:$idx),
355
355
(vector_insert $vec, (i32 (extloadi16 $ptr)), $idx)>;
356
356
def load32_lane :
357
- PatFrag<(ops node:$ptr, node:$vec, node:$idx),
358
- (vector_insert $vec, (i32 (load $ptr)), $idx)>;
357
+ PatFrags<(ops node:$ptr, node:$vec, node:$idx), [
358
+ (vector_insert $vec, (i32 (load $ptr)), $idx),
359
+ (vector_insert $vec, (f32 (load $ptr)), $idx)
360
+ ]>;
359
361
def load64_lane :
360
- PatFrag<(ops node:$ptr, node:$vec, node:$idx),
361
- (vector_insert $vec, (i64 (load $ptr)), $idx)>;
362
- // TODO: floating point lanes as well
362
+ PatFrags<(ops node:$ptr, node:$vec, node:$idx), [
363
+ (vector_insert $vec, (i64 (load $ptr)), $idx),
364
+ (vector_insert $vec, (f64 (load $ptr)), $idx)
365
+ ]>;
363
366
364
367
defm : LoadLanePatNoOffset<I8x16, load8_lane>;
365
368
defm : LoadLanePatNoOffset<I16x8, load16_lane>;
366
369
defm : LoadLanePatNoOffset<I32x4, load32_lane>;
367
370
defm : LoadLanePatNoOffset<I64x2, load64_lane>;
371
+ defm : LoadLanePatNoOffset<F32x4, load32_lane>;
372
+ defm : LoadLanePatNoOffset<F64x2, load64_lane>;
368
373
369
374
// TODO: Also support the other load patterns for load_lane once the instructions
370
375
// are merged to the proposal.
@@ -1463,10 +1468,10 @@ def extloadv2f32 : PatFrag<(ops node:$ptr), (extload node:$ptr)> {
1463
1468
// Adapted from the body of LoadPatNoOffset
1464
1469
// TODO: other addressing patterns
1465
1470
def : Pat<(v2f64 (extloadv2f32 (i32 I32:$addr))),
1466
- (promote_low_F64x2 (LOAD_ZERO_I64x2_A32 0, 0, I32:$addr))>,
1471
+ (promote_low_F64x2 (LOAD_ZERO_64_A32 0, 0, I32:$addr))>,
1467
1472
Requires<[HasAddr32]>;
1468
1473
def : Pat<(v2f64 (extloadv2f32 (i64 I64:$addr))),
1469
- (promote_low_F64x2 (LOAD_ZERO_I64x2_A64 0, 0, I64:$addr))>,
1474
+ (promote_low_F64x2 (LOAD_ZERO_64_A64 0, 0, I64:$addr))>,
1470
1475
Requires<[HasAddr64]>;
1471
1476
1472
1477
//===----------------------------------------------------------------------===//
0 commit comments