@@ -442,3 +442,21 @@ define <4 x float> @test_perfectshuffle_dupext_v4f32(<4 x float> %a, <4 x float>
442442 %r = shufflevector <4 x float > %a , <4 x float > %b , <4 x i32 > <i32 0 , i32 0 , i32 4 , i32 5 >
443443 ret <4 x float > %r
444444}
445+
446+ define void @disguised_dup (<4 x float > %x , <4 x float >* %p1 , <4 x float >* %p2 ) {
447+ ; CHECK-LABEL: disguised_dup:
448+ ; CHECK: // %bb.0:
449+ ; CHECK-NEXT: dup.4s v1, v0[0]
450+ ; CHECK-NEXT: ext.16b v0, v0, v0, #12
451+ ; CHECK-NEXT: ext.16b v0, v0, v1, #8
452+ ; CHECK-NEXT: zip2.4s v1, v0, v0
453+ ; CHECK-NEXT: ext.16b v1, v0, v1, #12
454+ ; CHECK-NEXT: str q0, [x0]
455+ ; CHECK-NEXT: str q1, [x1]
456+ ; CHECK-NEXT: ret
457+ %shuf = shufflevector <4 x float > %x , <4 x float > undef , <4 x i32 > <i32 1 , i32 2 , i32 0 , i32 0 >
458+ %dup = shufflevector <4 x float > %shuf , <4 x float > undef , <4 x i32 > <i32 3 , i32 2 , i32 2 , i32 3 >
459+ store <4 x float > %shuf , <4 x float >* %p1 , align 8
460+ store <4 x float > %dup , <4 x float >* %p2 , align 8
461+ ret void
462+ }
0 commit comments