brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.4 KiB · 0f737f5 Raw
198 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse2   | FileCheck %s --check-prefix=SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1 | FileCheck %s --check-prefix=SSE44; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx    | FileCheck %s --check-prefix=AVX5 6define <4 x i32> @ins_elt_0(i32 %x, <4 x i32> %v1, <4 x i32> %v2) {7; SSE2-LABEL: ins_elt_0:8; SSE2:       # %bb.0:9; SSE2-NEXT:    movaps %xmm1, %xmm010; SSE2-NEXT:    movd %edi, %xmm111; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]12; SSE2-NEXT:    retq13;14; SSE4-LABEL: ins_elt_0:15; SSE4:       # %bb.0:16; SSE4-NEXT:    movdqa %xmm1, %xmm017; SSE4-NEXT:    pinsrd $0, %edi, %xmm018; SSE4-NEXT:    retq19;20; AVX-LABEL: ins_elt_0:21; AVX:       # %bb.0:22; AVX-NEXT:    vpinsrd $0, %edi, %xmm1, %xmm023; AVX-NEXT:    retq24  %ins = insertelement <4 x i32> %v1, i32 %x, i32 025  %shuf = shufflevector <4 x i32> %ins, <4 x i32> %v2, <4 x i32> <i32 0, i32 5, i32 6, i32 7>26  ret <4 x i32> %shuf27}28 29define <4 x i32> @ins_elt_1(i32 %x, <4 x i32> %v1, <4 x i32> %v2) {30; SSE2-LABEL: ins_elt_1:31; SSE2:       # %bb.0:32; SSE2-NEXT:    movd %edi, %xmm033; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]34; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]35; SSE2-NEXT:    retq36;37; SSE4-LABEL: ins_elt_1:38; SSE4:       # %bb.0:39; SSE4-NEXT:    movdqa %xmm1, %xmm040; SSE4-NEXT:    pinsrd $1, %edi, %xmm041; SSE4-NEXT:    retq42;43; AVX-LABEL: ins_elt_1:44; AVX:       # %bb.0:45; AVX-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm046; AVX-NEXT:    retq47  %ins = insertelement <4 x i32> %v1, i32 %x, i32 148  %shuf = shufflevector <4 x i32> %ins, <4 x i32> %v2, <4 x i32> <i32 4, i32 1, i32 6, i32 7>49  ret <4 x i32> %shuf50}51 52; Verify that the transform still works when the insert element is the 2nd operand to the shuffle.53 54define <4 x i32> @ins_elt_2_commute(i32 %x, <4 x i32> %v1, <4 x i32> %v2) {55; SSE2-LABEL: ins_elt_2_commute:56; SSE2:       # %bb.0:57; SSE2-NEXT:    movaps %xmm1, %xmm058; SSE2-NEXT:    movd %edi, %xmm159; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]60; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]61; SSE2-NEXT:    retq62;63; SSE4-LABEL: ins_elt_2_commute:64; SSE4:       # %bb.0:65; SSE4-NEXT:    movdqa %xmm1, %xmm066; SSE4-NEXT:    pinsrd $2, %edi, %xmm067; SSE4-NEXT:    retq68;69; AVX-LABEL: ins_elt_2_commute:70; AVX:       # %bb.0:71; AVX-NEXT:    vpinsrd $2, %edi, %xmm1, %xmm072; AVX-NEXT:    retq73  %ins = insertelement <4 x i32> %v1, i32 %x, i32 274  %shuf = shufflevector <4 x i32> %v2, <4 x i32> %ins, <4 x i32> <i32 0, i32 1, i32 6, i32 3>75  ret <4 x i32> %shuf76}77 78define <4 x i32> @ins_elt_3_commute(i32 %x, <4 x i32> %v1, <4 x i32> %v2) {79; SSE2-LABEL: ins_elt_3_commute:80; SSE2:       # %bb.0:81; SSE2-NEXT:    movaps %xmm1, %xmm082; SSE2-NEXT:    movd %edi, %xmm183; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,3]84; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]85; SSE2-NEXT:    retq86;87; SSE4-LABEL: ins_elt_3_commute:88; SSE4:       # %bb.0:89; SSE4-NEXT:    movdqa %xmm1, %xmm090; SSE4-NEXT:    pinsrd $3, %edi, %xmm091; SSE4-NEXT:    retq92;93; AVX-LABEL: ins_elt_3_commute:94; AVX:       # %bb.0:95; AVX-NEXT:    vpinsrd $3, %edi, %xmm1, %xmm096; AVX-NEXT:    retq97  %ins = insertelement <4 x i32> %v1, i32 %x, i32 398  %shuf = shufflevector <4 x i32> %v2, <4 x i32> %ins, <4 x i32> <i32 0, i32 1, i32 2, i32 7>99  ret <4 x i32> %shuf100}101 102; In the next 4 tests, the shuffle moves the inserted scalar to a different position in the output vector.103 104define <4 x i32> @ins_elt_0_to_2(i32 %x, <4 x i32> %v1, <4 x i32> %v2) {105; SSE2-LABEL: ins_elt_0_to_2:106; SSE2:       # %bb.0:107; SSE2-NEXT:    movaps %xmm1, %xmm0108; SSE2-NEXT:    movd %edi, %xmm1109; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]110; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]111; SSE2-NEXT:    retq112;113; SSE4-LABEL: ins_elt_0_to_2:114; SSE4:       # %bb.0:115; SSE4-NEXT:    movdqa %xmm1, %xmm0116; SSE4-NEXT:    pinsrd $2, %edi, %xmm0117; SSE4-NEXT:    retq118;119; AVX-LABEL: ins_elt_0_to_2:120; AVX:       # %bb.0:121; AVX-NEXT:    vpinsrd $2, %edi, %xmm1, %xmm0122; AVX-NEXT:    retq123  %ins = insertelement <4 x i32> %v1, i32 %x, i32 0124  %shuf = shufflevector <4 x i32> %ins, <4 x i32> %v2, <4 x i32> <i32 4, i32 5, i32 0, i32 7>125  ret <4 x i32> %shuf126}127 128define <4 x i32> @ins_elt_1_to_0(i32 %x, <4 x i32> %v1, <4 x i32> %v2) {129; SSE2-LABEL: ins_elt_1_to_0:130; SSE2:       # %bb.0:131; SSE2-NEXT:    movaps %xmm1, %xmm0132; SSE2-NEXT:    movd %edi, %xmm1133; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]134; SSE2-NEXT:    retq135;136; SSE4-LABEL: ins_elt_1_to_0:137; SSE4:       # %bb.0:138; SSE4-NEXT:    movdqa %xmm1, %xmm0139; SSE4-NEXT:    pinsrd $0, %edi, %xmm0140; SSE4-NEXT:    retq141;142; AVX-LABEL: ins_elt_1_to_0:143; AVX:       # %bb.0:144; AVX-NEXT:    vpinsrd $0, %edi, %xmm1, %xmm0145; AVX-NEXT:    retq146  %ins = insertelement <4 x i32> %v1, i32 %x, i32 1147  %shuf = shufflevector <4 x i32> %ins, <4 x i32> %v2, <4 x i32> <i32 1, i32 5, i32 6, i32 7>148  ret <4 x i32> %shuf149}150 151define <4 x i32> @ins_elt_2_to_3(i32 %x, <4 x i32> %v1, <4 x i32> %v2) {152; SSE2-LABEL: ins_elt_2_to_3:153; SSE2:       # %bb.0:154; SSE2-NEXT:    movaps %xmm1, %xmm0155; SSE2-NEXT:    movd %edi, %xmm1156; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,3]157; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]158; SSE2-NEXT:    retq159;160; SSE4-LABEL: ins_elt_2_to_3:161; SSE4:       # %bb.0:162; SSE4-NEXT:    movdqa %xmm1, %xmm0163; SSE4-NEXT:    pinsrd $3, %edi, %xmm0164; SSE4-NEXT:    retq165;166; AVX-LABEL: ins_elt_2_to_3:167; AVX:       # %bb.0:168; AVX-NEXT:    vpinsrd $3, %edi, %xmm1, %xmm0169; AVX-NEXT:    retq170  %ins = insertelement <4 x i32> %v1, i32 %x, i32 2171  %shuf = shufflevector <4 x i32> %v2, <4 x i32> %ins, <4 x i32> <i32 0, i32 1, i32 2, i32 6>172  ret <4 x i32> %shuf173}174 175define <4 x i32> @ins_elt_3_to_1(i32 %x, <4 x i32> %v1, <4 x i32> %v2) {176; SSE2-LABEL: ins_elt_3_to_1:177; SSE2:       # %bb.0:178; SSE2-NEXT:    movd %edi, %xmm0179; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]180; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]181; SSE2-NEXT:    retq182;183; SSE4-LABEL: ins_elt_3_to_1:184; SSE4:       # %bb.0:185; SSE4-NEXT:    movdqa %xmm1, %xmm0186; SSE4-NEXT:    pinsrd $1, %edi, %xmm0187; SSE4-NEXT:    retq188;189; AVX-LABEL: ins_elt_3_to_1:190; AVX:       # %bb.0:191; AVX-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm0192; AVX-NEXT:    retq193  %ins = insertelement <4 x i32> %v1, i32 %x, i32 3194  %shuf = shufflevector <4 x i32> %v2, <4 x i32> %ins, <4 x i32> <i32 0, i32 7, i32 2, i32 3>195  ret <4 x i32> %shuf196}197 198