1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -march=x86 -mcpu=core2 -mattr=+ssse3 | FileCheck %s 3; RUN: llc < %s -march=x86 -mcpu=yonah | FileCheck --check-prefix=CHECK-YONAH %s 4 5define <4 x i32> @test1(<4 x i32> %A, <4 x i32> %B) nounwind { 6; CHECK-LABEL: test1: 7; CHECK: # BB#0: 8; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0] 9; CHECK-NEXT: retl 10; 11; CHECK-YONAH-LABEL: test1: 12; CHECK-YONAH: # BB#0: 13; CHECK-YONAH-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0] 14; CHECK-YONAH-NEXT: retl 15 %C = shufflevector <4 x i32> %A, <4 x i32> undef, <4 x i32> < i32 1, i32 2, i32 3, i32 0 > 16 ret <4 x i32> %C 17} 18 19define <4 x i32> @test2(<4 x i32> %A, <4 x i32> %B) nounwind { 20; CHECK-LABEL: test2: 21; CHECK: # BB#0: 22; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3] 23; CHECK-NEXT: movdqa %xmm1, %xmm0 24; CHECK-NEXT: retl 25; 26; CHECK-YONAH-LABEL: test2: 27; CHECK-YONAH: # BB#0: 28; CHECK-YONAH-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0] 29; CHECK-YONAH-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0] 30; CHECK-YONAH-NEXT: retl 31 %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 3, i32 4 > 32 ret <4 x i32> %C 33} 34 35define <4 x i32> @test3(<4 x i32> %A, <4 x i32> %B) nounwind { 36; CHECK-LABEL: test3: 37; CHECK: # BB#0: 38; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3] 39; CHECK-NEXT: movdqa %xmm1, %xmm0 40; CHECK-NEXT: retl 41; 42; CHECK-YONAH-LABEL: test3: 43; CHECK-YONAH: # BB#0: 44; CHECK-YONAH-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0] 45; CHECK-YONAH-NEXT: retl 46 %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 undef, i32 4 > 47 ret <4 x i32> %C 48} 49 50define <4 x i32> @test4(<4 x i32> %A, <4 x i32> %B) nounwind { 51; CHECK-LABEL: test4: 52; CHECK: # BB#0: 53; CHECK-NEXT: palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7] 54; CHECK-NEXT: retl 55; 56; CHECK-YONAH-LABEL: test4: 57; CHECK-YONAH: # BB#0: 58; CHECK-YONAH-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0] 59; CHECK-YONAH-NEXT: movapd %xmm1, %xmm0 60; CHECK-YONAH-NEXT: retl 61 %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 > 62 ret <4 x i32> %C 63} 64 65define <4 x float> @test5(<4 x float> %A, <4 x float> %B) nounwind { 66; CHECK-LABEL: test5: 67; CHECK: # BB#0: 68; CHECK-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0] 69; CHECK-NEXT: movapd %xmm1, %xmm0 70; CHECK-NEXT: retl 71; 72; CHECK-YONAH-LABEL: test5: 73; CHECK-YONAH: # BB#0: 74; CHECK-YONAH-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0] 75; CHECK-YONAH-NEXT: movapd %xmm1, %xmm0 76; CHECK-YONAH-NEXT: retl 77 %C = shufflevector <4 x float> %A, <4 x float> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 > 78 ret <4 x float> %C 79} 80 81define <8 x i16> @test6(<8 x i16> %A, <8 x i16> %B) nounwind { 82; CHECK-LABEL: test6: 83; CHECK: # BB#0: 84; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5] 85; CHECK-NEXT: movdqa %xmm1, %xmm0 86; CHECK-NEXT: retl 87; 88; CHECK-YONAH-LABEL: test6: 89; CHECK-YONAH: # BB#0: 90; CHECK-YONAH-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero 91; CHECK-YONAH-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5] 92; CHECK-YONAH-NEXT: por %xmm1, %xmm0 93; CHECK-YONAH-NEXT: retl 94 %C = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> < i32 3, i32 4, i32 undef, i32 6, i32 7, i32 8, i32 9, i32 10 > 95 ret <8 x i16> %C 96} 97 98define <8 x i16> @test7(<8 x i16> %A, <8 x i16> %B) nounwind { 99; CHECK-LABEL: test7: 100; CHECK: # BB#0: 101; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9] 102; CHECK-NEXT: movdqa %xmm1, %xmm0 103; CHECK-NEXT: retl 104; 105; CHECK-YONAH-LABEL: test7: 106; CHECK-YONAH: # BB#0: 107; CHECK-YONAH-NEXT: psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 108; CHECK-YONAH-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5,6,7,8,9] 109; CHECK-YONAH-NEXT: por %xmm1, %xmm0 110; CHECK-YONAH-NEXT: retl 111 %C = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> < i32 undef, i32 6, i32 undef, i32 8, i32 9, i32 10, i32 11, i32 12 > 112 ret <8 x i16> %C 113} 114 115define <16 x i8> @test8(<16 x i8> %A, <16 x i8> %B) nounwind { 116; CHECK-LABEL: test8: 117; CHECK: # BB#0: 118; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4] 119; CHECK-NEXT: movdqa %xmm1, %xmm0 120; CHECK-NEXT: retl 121; 122; CHECK-YONAH-LABEL: test8: 123; CHECK-YONAH: # BB#0: 124; CHECK-YONAH-NEXT: psrldq {{.*#+}} xmm0 = xmm0[5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero 125; CHECK-YONAH-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4] 126; CHECK-YONAH-NEXT: por %xmm1, %xmm0 127; CHECK-YONAH-NEXT: retl 128 %C = shufflevector <16 x i8> %A, <16 x i8> %B, <16 x i32> < i32 5, i32 6, i32 7, i32 undef, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20 > 129 ret <16 x i8> %C 130} 131 132; Check that we don't do unary (circular on single operand) palignr incorrectly. 133; (It is possible, but before this testcase was committed, it was being done 134; incorrectly. In particular, one of the operands of the palignr node 135; was an UNDEF.) 136define <8 x i16> @test9(<8 x i16> %A, <8 x i16> %B) nounwind { 137; CHECK-LABEL: test9: 138; CHECK: # BB#0: 139; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1] 140; CHECK-NEXT: movdqa %xmm1, %xmm0 141; CHECK-NEXT: retl 142; 143; CHECK-YONAH-LABEL: test9: 144; CHECK-YONAH: # BB#0: 145; CHECK-YONAH-NEXT: movdqa %xmm1, %xmm0 146; CHECK-YONAH-NEXT: psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 147; CHECK-YONAH-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1] 148; CHECK-YONAH-NEXT: por %xmm0, %xmm1 149; CHECK-YONAH-NEXT: movdqa %xmm1, %xmm0 150; CHECK-YONAH-NEXT: retl 151 %C = shufflevector <8 x i16> %B, <8 x i16> %A, <8 x i32> < i32 undef, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0 > 152 ret <8 x i16> %C 153} 154 155