@@ -103,6 +103,19 @@ define <4 x i32> @v_dupQ32(i32 %A) nounwind {
103103 ret <4 x i32 > %tmp4
104104}
105105
106+ define <4 x i16 > @v_dup16_const (i16 %y , ptr %p ) {
107+ ; CHECK-LABEL: v_dup16_const:
108+ ; CHECK: // %bb.0:
109+ ; CHECK-NEXT: movi.4h v0, #10
110+ ; CHECK-NEXT: mov w8, #10 // =0xa
111+ ; CHECK-NEXT: strh w8, [x1]
112+ ; CHECK-NEXT: ret
113+ %i = insertelement <4 x i16 > undef , i16 10 , i32 0
114+ %lo = shufflevector <4 x i16 > %i , <4 x i16 > undef , <4 x i32 > zeroinitializer
115+ store i16 10 , ptr %p
116+ ret <4 x i16 > %lo
117+ }
118+
106119define <4 x float > @v_dupQfloat (float %A ) nounwind {
107120; CHECK-LABEL: v_dupQfloat:
108121; CHECK: // %bb.0:
@@ -420,9 +433,9 @@ define <4 x i16> @test_perfectshuffle_dupext_v4i16(<4 x i16> %a, <4 x i16> %b) n
420433; CHECK-GI: // %bb.0:
421434; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
422435; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1
423- ; CHECK-GI-NEXT: adrp x8, .LCPI33_0
436+ ; CHECK-GI-NEXT: adrp x8, .LCPI34_0
424437; CHECK-GI-NEXT: mov.d v0[1], v1[0]
425- ; CHECK-GI-NEXT: ldr d1, [x8, :lo12:.LCPI33_0 ]
438+ ; CHECK-GI-NEXT: ldr d1, [x8, :lo12:.LCPI34_0 ]
426439; CHECK-GI-NEXT: tbl.16b v0, { v0 }, v1
427440; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
428441; CHECK-GI-NEXT: ret
@@ -443,9 +456,9 @@ define <4 x half> @test_perfectshuffle_dupext_v4f16(<4 x half> %a, <4 x half> %b
443456; CHECK-GI: // %bb.0:
444457; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
445458; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1
446- ; CHECK-GI-NEXT: adrp x8, .LCPI34_0
459+ ; CHECK-GI-NEXT: adrp x8, .LCPI35_0
447460; CHECK-GI-NEXT: mov.d v0[1], v1[0]
448- ; CHECK-GI-NEXT: ldr d1, [x8, :lo12:.LCPI34_0 ]
461+ ; CHECK-GI-NEXT: ldr d1, [x8, :lo12:.LCPI35_0 ]
449462; CHECK-GI-NEXT: tbl.16b v0, { v0 }, v1
450463; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
451464; CHECK-GI-NEXT: ret
@@ -462,9 +475,9 @@ define <4 x i32> @test_perfectshuffle_dupext_v4i32(<4 x i32> %a, <4 x i32> %b) n
462475;
463476; CHECK-GI-LABEL: test_perfectshuffle_dupext_v4i32:
464477; CHECK-GI: // %bb.0:
465- ; CHECK-GI-NEXT: adrp x8, .LCPI35_0
478+ ; CHECK-GI-NEXT: adrp x8, .LCPI36_0
466479; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
467- ; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI35_0 ]
480+ ; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI36_0 ]
468481; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
469482; CHECK-GI-NEXT: tbl.16b v0, { v0, v1 }, v2
470483; CHECK-GI-NEXT: ret
@@ -481,9 +494,9 @@ define <4 x float> @test_perfectshuffle_dupext_v4f32(<4 x float> %a, <4 x float>
481494;
482495; CHECK-GI-LABEL: test_perfectshuffle_dupext_v4f32:
483496; CHECK-GI: // %bb.0:
484- ; CHECK-GI-NEXT: adrp x8, .LCPI36_0
497+ ; CHECK-GI-NEXT: adrp x8, .LCPI37_0
485498; CHECK-GI-NEXT: // kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
486- ; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI36_0 ]
499+ ; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI37_0 ]
487500; CHECK-GI-NEXT: // kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
488501; CHECK-GI-NEXT: tbl.16b v0, { v0, v1 }, v2
489502; CHECK-GI-NEXT: ret
@@ -503,12 +516,12 @@ define void @disguised_dup(<4 x float> %x, ptr %p1, ptr %p2) {
503516;
504517; CHECK-GI-LABEL: disguised_dup:
505518; CHECK-GI: // %bb.0:
506- ; CHECK-GI-NEXT: adrp x8, .LCPI37_1
519+ ; CHECK-GI-NEXT: adrp x8, .LCPI38_1
507520; CHECK-GI-NEXT: // kill: def $q0 killed $q0 def $q0_q1
508- ; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI37_1 ]
509- ; CHECK-GI-NEXT: adrp x8, .LCPI37_0
521+ ; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI38_1 ]
522+ ; CHECK-GI-NEXT: adrp x8, .LCPI38_0
510523; CHECK-GI-NEXT: tbl.16b v0, { v0, v1 }, v2
511- ; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI37_0 ]
524+ ; CHECK-GI-NEXT: ldr q2, [x8, :lo12:.LCPI38_0 ]
512525; CHECK-GI-NEXT: tbl.16b v2, { v0, v1 }, v2
513526; CHECK-GI-NEXT: str q0, [x0]
514527; CHECK-GI-NEXT: str q2, [x1]
@@ -531,8 +544,8 @@ define <2 x i32> @dup_const2(<2 x i32> %A) nounwind {
531544;
532545; CHECK-GI-LABEL: dup_const2:
533546; CHECK-GI: // %bb.0:
534- ; CHECK-GI-NEXT: adrp x8, .LCPI38_0
535- ; CHECK-GI-NEXT: ldr d1, [x8, :lo12:.LCPI38_0 ]
547+ ; CHECK-GI-NEXT: adrp x8, .LCPI39_0
548+ ; CHECK-GI-NEXT: ldr d1, [x8, :lo12:.LCPI39_0 ]
536549; CHECK-GI-NEXT: add.2s v0, v0, v1
537550; CHECK-GI-NEXT: ret
538551 %tmp2 = add <2 x i32 > %A , <i32 8421378 , i32 8421378 >
@@ -550,8 +563,8 @@ define <2 x i32> @dup_const4_ext(<4 x i32> %A) nounwind {
550563;
551564; CHECK-GI-LABEL: dup_const4_ext:
552565; CHECK-GI: // %bb.0:
553- ; CHECK-GI-NEXT: adrp x8, .LCPI39_0
554- ; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI39_0 ]
566+ ; CHECK-GI-NEXT: adrp x8, .LCPI40_0
567+ ; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI40_0 ]
555568; CHECK-GI-NEXT: add.4s v0, v0, v1
556569; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
557570; CHECK-GI-NEXT: ret
@@ -575,12 +588,12 @@ define <4 x i32> @dup_const24(<2 x i32> %A, <2 x i32> %B, <4 x i32> %C) nounwind
575588;
576589; CHECK-GI-LABEL: dup_const24:
577590; CHECK-GI: // %bb.0:
578- ; CHECK-GI-NEXT: adrp x8, .LCPI40_1
591+ ; CHECK-GI-NEXT: adrp x8, .LCPI41_1
579592; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1
580- ; CHECK-GI-NEXT: ldr d3, [x8, :lo12:.LCPI40_1 ]
581- ; CHECK-GI-NEXT: adrp x8, .LCPI40_0
593+ ; CHECK-GI-NEXT: ldr d3, [x8, :lo12:.LCPI41_1 ]
594+ ; CHECK-GI-NEXT: adrp x8, .LCPI41_0
582595; CHECK-GI-NEXT: add.2s v0, v0, v3
583- ; CHECK-GI-NEXT: ldr q3, [x8, :lo12:.LCPI40_0 ]
596+ ; CHECK-GI-NEXT: ldr q3, [x8, :lo12:.LCPI41_0 ]
584597; CHECK-GI-NEXT: mov.d v0[1], v1[0]
585598; CHECK-GI-NEXT: add.4s v1, v2, v3
586599; CHECK-GI-NEXT: eor.16b v0, v1, v0
@@ -687,3 +700,17 @@ define <8 x i16> @bitcast_v2f64_v8i16(<2 x i64> %a) {
687700 ret <8 x i16 > %r
688701}
689702
703+ define <4 x i16 > @dup_i16_v4i16_constant () {
704+ ; CHECK-SD-LABEL: dup_i16_v4i16_constant:
705+ ; CHECK-SD: // %bb.0:
706+ ; CHECK-SD-NEXT: mov w8, #9211 // =0x23fb
707+ ; CHECK-SD-NEXT: dup.4h v0, w8
708+ ; CHECK-SD-NEXT: ret
709+ ;
710+ ; CHECK-GI-LABEL: dup_i16_v4i16_constant:
711+ ; CHECK-GI: // %bb.0:
712+ ; CHECK-GI-NEXT: adrp x8, .LCPI50_0
713+ ; CHECK-GI-NEXT: ldr d0, [x8, :lo12:.LCPI50_0]
714+ ; CHECK-GI-NEXT: ret
715+ ret <4 x i16 > <i16 9211 , i16 9211 , i16 9211 , i16 9211 >
716+ }
0 commit comments