@@ -273,13 +273,13 @@ defm : LoadPat<vec.vt, loadpat, inst>;
273273multiclass SIMDLoadZero<Vec vec, bits<32> simdop> {
274274 defvar name = "v128.load"#vec.lane_bits#"_zero";
275275 let mayLoad = 1, UseNamedOperandTable = 1 in {
276- defm LOAD_ZERO_#vec#_A32 :
276+ defm LOAD_ZERO_#vec.lane_bits #_A32 :
277277 SIMD_I<(outs V128:$dst),
278278 (ins P2Align:$p2align, offset32_op:$off, I32:$addr),
279279 (outs), (ins P2Align:$p2align, offset32_op:$off), [],
280280 name#"\t$dst, ${off}(${addr})$p2align",
281281 name#"\t$off$p2align", simdop>;
282- defm LOAD_ZERO_#vec#_A64 :
282+ defm LOAD_ZERO_#vec.lane_bits #_A64 :
283283 SIMD_I<(outs V128:$dst),
284284 (ins P2Align:$p2align, offset64_op:$off, I64:$addr),
285285 (outs), (ins P2Align:$p2align, offset64_op:$off), [],
@@ -293,32 +293,32 @@ defm "" : SIMDLoadZero<I64x2, 0x5d>;
293293
294294// Use load_zero to load scalars into vectors as well where possible.
295295// 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 ;
298298 defvar pat = PatFrag<(ops node:$addr), (scalar_to_vector (vec.lane_vt (load $addr)))>;
299299 defm : LoadPat<vec.vt, pat, inst>;
300300}
301301
302302// TODO: f32x4 and f64x2 as well
303303foreach vec = [I32x4, I64x2] in {
304- defvar inst = "LOAD_ZERO_"#vec;
304+ defvar inst = "LOAD_ZERO_"#vec.lane_bits ;
305305 defvar pat = PatFrag<(ops node:$ptr),
306306 (vector_insert (vec.splat (vec.lane_vt 0)), (vec.lane_vt (load $ptr)), 0)>;
307307 defm : LoadPat<vec.vt, pat, inst>;
308308}
309309
310310// 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";
313313 let mayLoad = 1, UseNamedOperandTable = 1 in {
314- defm LOAD_LANE_#vec #_A32 :
314+ defm LOAD_LANE_#lane_bits #_A32 :
315315 SIMD_I<(outs V128:$dst),
316316 (ins P2Align:$p2align, offset32_op:$off, vec_i8imm_op:$idx,
317317 I32:$addr, V128:$vec),
318318 (outs), (ins P2Align:$p2align, offset32_op:$off, vec_i8imm_op:$idx),
319319 [], name#"\t$dst, ${off}(${addr})$p2align, $vec, $idx",
320320 name#"\t$off$p2align, $idx", simdop>;
321- defm LOAD_LANE_#vec #_A64 :
321+ defm LOAD_LANE_#lane_bits #_A64 :
322322 SIMD_I<(outs V128:$dst),
323323 (ins P2Align:$p2align, offset64_op:$off, vec_i8imm_op:$idx,
324324 I64:$addr, V128:$vec),
@@ -328,15 +328,15 @@ multiclass SIMDLoadLane<Vec vec, bits<32> simdop> {
328328 } // mayLoad = 1, UseNamedOperandTable = 1
329329}
330330
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>;
335335
336336// Select loads with no constant offset.
337337multiclass 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");
340340 def : Pat<(vec.vt (kind (i32 I32:$addr),
341341 (vec.vt V128:$vec), (i32 vec.lane_idx:$idx))),
342342 (load_lane_a32 0, 0, imm:$idx, $addr, $vec)>,
@@ -354,17 +354,22 @@ def load16_lane :
354354 PatFrag<(ops node:$ptr, node:$vec, node:$idx),
355355 (vector_insert $vec, (i32 (extloadi16 $ptr)), $idx)>;
356356def 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+ ]>;
359361def 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+ ]>;
363366
364367defm : LoadLanePatNoOffset<I8x16, load8_lane>;
365368defm : LoadLanePatNoOffset<I16x8, load16_lane>;
366369defm : LoadLanePatNoOffset<I32x4, load32_lane>;
367370defm : LoadLanePatNoOffset<I64x2, load64_lane>;
371+ defm : LoadLanePatNoOffset<F32x4, load32_lane>;
372+ defm : LoadLanePatNoOffset<F64x2, load64_lane>;
368373
369374// TODO: Also support the other load patterns for load_lane once the instructions
370375// are merged to the proposal.
@@ -1463,10 +1468,10 @@ def extloadv2f32 : PatFrag<(ops node:$ptr), (extload node:$ptr)> {
14631468// Adapted from the body of LoadPatNoOffset
14641469// TODO: other addressing patterns
14651470def : 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))>,
14671472 Requires<[HasAddr32]>;
14681473def : 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))>,
14701475 Requires<[HasAddr64]>;
14711476
14721477//===----------------------------------------------------------------------===//
0 commit comments