@@ -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