1318 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse3 | FileCheck %s --check-prefixes=SSE,SSE34; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSSE35; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE416; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX17; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX28; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512VL9 10define <2 x i64> @shuffle_v2i64_00(<2 x i64> %a, <2 x i64> %b) {11; SSE-LABEL: shuffle_v2i64_00:12; SSE: # %bb.0:13; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]14; SSE-NEXT: retq15;16; AVX1-LABEL: shuffle_v2i64_00:17; AVX1: # %bb.0:18; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,1,0,1]19; AVX1-NEXT: retq20;21; AVX2-LABEL: shuffle_v2i64_00:22; AVX2: # %bb.0:23; AVX2-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]24; AVX2-NEXT: retq25;26; AVX512VL-LABEL: shuffle_v2i64_00:27; AVX512VL: # %bb.0:28; AVX512VL-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]29; AVX512VL-NEXT: retq30 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 0>31 ret <2 x i64> %shuffle32}33define <2 x i64> @shuffle_v2i64_10(<2 x i64> %a, <2 x i64> %b) {34; SSE-LABEL: shuffle_v2i64_10:35; SSE: # %bb.0:36; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]37; SSE-NEXT: retq38;39; AVX-LABEL: shuffle_v2i64_10:40; AVX: # %bb.0:41; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[2,3,0,1]42; AVX-NEXT: retq43 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 0>44 ret <2 x i64> %shuffle45}46define <2 x i64> @shuffle_v2i64_11(<2 x i64> %a, <2 x i64> %b) {47; SSE-LABEL: shuffle_v2i64_11:48; SSE: # %bb.0:49; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]50; SSE-NEXT: retq51;52; AVX-LABEL: shuffle_v2i64_11:53; AVX: # %bb.0:54; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[2,3,2,3]55; AVX-NEXT: retq56 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 1>57 ret <2 x i64> %shuffle58}59define <2 x i64> @shuffle_v2i64_22(<2 x i64> %a, <2 x i64> %b) {60; SSE-LABEL: shuffle_v2i64_22:61; SSE: # %bb.0:62; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,1,0,1]63; SSE-NEXT: retq64;65; AVX1-LABEL: shuffle_v2i64_22:66; AVX1: # %bb.0:67; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm1[0,1,0,1]68; AVX1-NEXT: retq69;70; AVX2-LABEL: shuffle_v2i64_22:71; AVX2: # %bb.0:72; AVX2-NEXT: vmovddup {{.*#+}} xmm0 = xmm1[0,0]73; AVX2-NEXT: retq74;75; AVX512VL-LABEL: shuffle_v2i64_22:76; AVX512VL: # %bb.0:77; AVX512VL-NEXT: vmovddup {{.*#+}} xmm0 = xmm1[0,0]78; AVX512VL-NEXT: retq79 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 2>80 ret <2 x i64> %shuffle81}82define <2 x i64> @shuffle_v2i64_32(<2 x i64> %a, <2 x i64> %b) {83; SSE-LABEL: shuffle_v2i64_32:84; SSE: # %bb.0:85; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]86; SSE-NEXT: retq87;88; AVX-LABEL: shuffle_v2i64_32:89; AVX: # %bb.0:90; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm1[2,3,0,1]91; AVX-NEXT: retq92 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 2>93 ret <2 x i64> %shuffle94}95define <2 x i64> @shuffle_v2i64_33(<2 x i64> %a, <2 x i64> %b) {96; SSE-LABEL: shuffle_v2i64_33:97; SSE: # %bb.0:98; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]99; SSE-NEXT: retq100;101; AVX-LABEL: shuffle_v2i64_33:102; AVX: # %bb.0:103; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm1[2,3,2,3]104; AVX-NEXT: retq105 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 3>106 ret <2 x i64> %shuffle107}108 109define <2 x double> @shuffle_v2f64_00(<2 x double> %a, <2 x double> %b) {110; SSE2-LABEL: shuffle_v2f64_00:111; SSE2: # %bb.0:112; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0]113; SSE2-NEXT: retq114;115; SSE3-LABEL: shuffle_v2f64_00:116; SSE3: # %bb.0:117; SSE3-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0]118; SSE3-NEXT: retq119;120; SSSE3-LABEL: shuffle_v2f64_00:121; SSSE3: # %bb.0:122; SSSE3-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0]123; SSSE3-NEXT: retq124;125; SSE41-LABEL: shuffle_v2f64_00:126; SSE41: # %bb.0:127; SSE41-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0]128; SSE41-NEXT: retq129;130; AVX-LABEL: shuffle_v2f64_00:131; AVX: # %bb.0:132; AVX-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]133; AVX-NEXT: retq134 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 0>135 ret <2 x double> %shuffle136}137define <2 x double> @shuffle_v2f64_10(<2 x double> %a, <2 x double> %b) {138; SSE-LABEL: shuffle_v2f64_10:139; SSE: # %bb.0:140; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,3,0,1]141; SSE-NEXT: retq142;143; AVX-LABEL: shuffle_v2f64_10:144; AVX: # %bb.0:145; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]146; AVX-NEXT: retq147 148 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 0>149 ret <2 x double> %shuffle150}151define <2 x double> @shuffle_v2f64_11(<2 x double> %a, <2 x double> %b) {152; SSE-LABEL: shuffle_v2f64_11:153; SSE: # %bb.0:154; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]155; SSE-NEXT: retq156;157; AVX-LABEL: shuffle_v2f64_11:158; AVX: # %bb.0:159; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,1]160; AVX-NEXT: retq161 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 1>162 ret <2 x double> %shuffle163}164define <2 x double> @shuffle_v2f64_22(<2 x double> %a, <2 x double> %b) {165; SSE2-LABEL: shuffle_v2f64_22:166; SSE2: # %bb.0:167; SSE2-NEXT: movaps %xmm1, %xmm0168; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]169; SSE2-NEXT: retq170;171; SSE3-LABEL: shuffle_v2f64_22:172; SSE3: # %bb.0:173; SSE3-NEXT: movddup {{.*#+}} xmm0 = xmm1[0,0]174; SSE3-NEXT: retq175;176; SSSE3-LABEL: shuffle_v2f64_22:177; SSSE3: # %bb.0:178; SSSE3-NEXT: movddup {{.*#+}} xmm0 = xmm1[0,0]179; SSSE3-NEXT: retq180;181; SSE41-LABEL: shuffle_v2f64_22:182; SSE41: # %bb.0:183; SSE41-NEXT: movddup {{.*#+}} xmm0 = xmm1[0,0]184; SSE41-NEXT: retq185;186; AVX-LABEL: shuffle_v2f64_22:187; AVX: # %bb.0:188; AVX-NEXT: vmovddup {{.*#+}} xmm0 = xmm1[0,0]189; AVX-NEXT: retq190 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 2>191 ret <2 x double> %shuffle192}193define <2 x double> @shuffle_v2f64_32(<2 x double> %a, <2 x double> %b) {194; SSE-LABEL: shuffle_v2f64_32:195; SSE: # %bb.0:196; SSE-NEXT: movaps %xmm1, %xmm0197; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,3],xmm1[0,1]198; SSE-NEXT: retq199;200; AVX-LABEL: shuffle_v2f64_32:201; AVX: # %bb.0:202; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm1[1,0]203; AVX-NEXT: retq204 205 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 3, i32 2>206 ret <2 x double> %shuffle207}208define <2 x double> @shuffle_v2f64_33(<2 x double> %a, <2 x double> %b) {209; SSE-LABEL: shuffle_v2f64_33:210; SSE: # %bb.0:211; SSE-NEXT: movaps %xmm1, %xmm0212; SSE-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]213; SSE-NEXT: retq214;215; AVX-LABEL: shuffle_v2f64_33:216; AVX: # %bb.0:217; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm1[1,1]218; AVX-NEXT: retq219 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 3, i32 3>220 ret <2 x double> %shuffle221}222define <2 x double> @shuffle_v2f64_03(<2 x double> %a, <2 x double> %b) {223; SSE2-LABEL: shuffle_v2f64_03:224; SSE2: # %bb.0:225; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]226; SSE2-NEXT: retq227;228; SSE3-LABEL: shuffle_v2f64_03:229; SSE3: # %bb.0:230; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]231; SSE3-NEXT: retq232;233; SSSE3-LABEL: shuffle_v2f64_03:234; SSSE3: # %bb.0:235; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]236; SSSE3-NEXT: retq237;238; SSE41-LABEL: shuffle_v2f64_03:239; SSE41: # %bb.0:240; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]241; SSE41-NEXT: retq242;243; AVX-LABEL: shuffle_v2f64_03:244; AVX: # %bb.0:245; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1]246; AVX-NEXT: retq247 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 3>248 ret <2 x double> %shuffle249}250define <2 x double> @shuffle_v2f64_21(<2 x double> %a, <2 x double> %b) {251; SSE-LABEL: shuffle_v2f64_21:252; SSE: # %bb.0:253; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]254; SSE-NEXT: retq255;256; AVX-LABEL: shuffle_v2f64_21:257; AVX: # %bb.0:258; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]259; AVX-NEXT: retq260 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 1>261 ret <2 x double> %shuffle262}263define <2 x double> @shuffle_v2f64_u2(<2 x double> %a, <2 x double> %b) {264; SSE2-LABEL: shuffle_v2f64_u2:265; SSE2: # %bb.0:266; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]267; SSE2-NEXT: retq268;269; SSE3-LABEL: shuffle_v2f64_u2:270; SSE3: # %bb.0:271; SSE3-NEXT: movddup {{.*#+}} xmm0 = xmm1[0,0]272; SSE3-NEXT: retq273;274; SSSE3-LABEL: shuffle_v2f64_u2:275; SSSE3: # %bb.0:276; SSSE3-NEXT: movddup {{.*#+}} xmm0 = xmm1[0,0]277; SSSE3-NEXT: retq278;279; SSE41-LABEL: shuffle_v2f64_u2:280; SSE41: # %bb.0:281; SSE41-NEXT: movddup {{.*#+}} xmm0 = xmm1[0,0]282; SSE41-NEXT: retq283;284; AVX-LABEL: shuffle_v2f64_u2:285; AVX: # %bb.0:286; AVX-NEXT: vmovddup {{.*#+}} xmm0 = xmm1[0,0]287; AVX-NEXT: retq288 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 poison, i32 2>289 ret <2 x double> %shuffle290}291define <2 x double> @shuffle_v2f64_3u(<2 x double> %a, <2 x double> %b) {292; SSE-LABEL: shuffle_v2f64_3u:293; SSE: # %bb.0:294; SSE-NEXT: movaps %xmm1, %xmm0295; SSE-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]296; SSE-NEXT: retq297;298; AVX-LABEL: shuffle_v2f64_3u:299; AVX: # %bb.0:300; AVX-NEXT: vshufpd {{.*#+}} xmm0 = xmm1[1,0]301; AVX-NEXT: retq302 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 3, i32 poison>303 ret <2 x double> %shuffle304}305 306define <2 x i64> @shuffle_v2i64_02(<2 x i64> %a, <2 x i64> %b) {307; SSE-LABEL: shuffle_v2i64_02:308; SSE: # %bb.0:309; SSE-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]310; SSE-NEXT: retq311;312; AVX-LABEL: shuffle_v2i64_02:313; AVX: # %bb.0:314; AVX-NEXT: vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]315; AVX-NEXT: retq316 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>317 ret <2 x i64> %shuffle318}319define <2 x i64> @shuffle_v2i64_02_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {320; SSE-LABEL: shuffle_v2i64_02_copy:321; SSE: # %bb.0:322; SSE-NEXT: movaps %xmm1, %xmm0323; SSE-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm2[0]324; SSE-NEXT: retq325;326; AVX-LABEL: shuffle_v2i64_02_copy:327; AVX: # %bb.0:328; AVX-NEXT: vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm2[0]329; AVX-NEXT: retq330 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2>331 ret <2 x i64> %shuffle332}333define <2 x i64> @shuffle_v2i64_03(<2 x i64> %a, <2 x i64> %b) {334; SSE2-LABEL: shuffle_v2i64_03:335; SSE2: # %bb.0:336; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]337; SSE2-NEXT: retq338;339; SSE3-LABEL: shuffle_v2i64_03:340; SSE3: # %bb.0:341; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]342; SSE3-NEXT: retq343;344; SSSE3-LABEL: shuffle_v2i64_03:345; SSSE3: # %bb.0:346; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]347; SSSE3-NEXT: retq348;349; SSE41-LABEL: shuffle_v2i64_03:350; SSE41: # %bb.0:351; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]352; SSE41-NEXT: retq353;354; AVX-LABEL: shuffle_v2i64_03:355; AVX: # %bb.0:356; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]357; AVX-NEXT: retq358 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>359 ret <2 x i64> %shuffle360}361define <2 x i64> @shuffle_v2i64_03_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {362; SSE2-LABEL: shuffle_v2i64_03_copy:363; SSE2: # %bb.0:364; SSE2-NEXT: movaps %xmm1, %xmm0365; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]366; SSE2-NEXT: retq367;368; SSE3-LABEL: shuffle_v2i64_03_copy:369; SSE3: # %bb.0:370; SSE3-NEXT: movaps %xmm1, %xmm0371; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]372; SSE3-NEXT: retq373;374; SSSE3-LABEL: shuffle_v2i64_03_copy:375; SSSE3: # %bb.0:376; SSSE3-NEXT: movaps %xmm1, %xmm0377; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]378; SSSE3-NEXT: retq379;380; SSE41-LABEL: shuffle_v2i64_03_copy:381; SSE41: # %bb.0:382; SSE41-NEXT: movaps %xmm1, %xmm0383; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3]384; SSE41-NEXT: retq385;386; AVX-LABEL: shuffle_v2i64_03_copy:387; AVX: # %bb.0:388; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0,1],xmm2[2,3]389; AVX-NEXT: retq390 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3>391 ret <2 x i64> %shuffle392}393define <2 x i64> @shuffle_v2i64_12(<2 x i64> %a, <2 x i64> %b) {394; SSE2-LABEL: shuffle_v2i64_12:395; SSE2: # %bb.0:396; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,3],xmm1[0,1]397; SSE2-NEXT: retq398;399; SSE3-LABEL: shuffle_v2i64_12:400; SSE3: # %bb.0:401; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,3],xmm1[0,1]402; SSE3-NEXT: retq403;404; SSSE3-LABEL: shuffle_v2i64_12:405; SSSE3: # %bb.0:406; SSSE3-NEXT: palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]407; SSSE3-NEXT: movdqa %xmm1, %xmm0408; SSSE3-NEXT: retq409;410; SSE41-LABEL: shuffle_v2i64_12:411; SSE41: # %bb.0:412; SSE41-NEXT: palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]413; SSE41-NEXT: movdqa %xmm1, %xmm0414; SSE41-NEXT: retq415;416; AVX-LABEL: shuffle_v2i64_12:417; AVX: # %bb.0:418; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]419; AVX-NEXT: retq420 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>421 ret <2 x i64> %shuffle422}423define <2 x i64> @shuffle_v2i64_12_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {424; SSE2-LABEL: shuffle_v2i64_12_copy:425; SSE2: # %bb.0:426; SSE2-NEXT: movaps %xmm1, %xmm0427; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,3],xmm2[0,1]428; SSE2-NEXT: retq429;430; SSE3-LABEL: shuffle_v2i64_12_copy:431; SSE3: # %bb.0:432; SSE3-NEXT: movaps %xmm1, %xmm0433; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,3],xmm2[0,1]434; SSE3-NEXT: retq435;436; SSSE3-LABEL: shuffle_v2i64_12_copy:437; SSSE3: # %bb.0:438; SSSE3-NEXT: movdqa %xmm2, %xmm0439; SSSE3-NEXT: palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]440; SSSE3-NEXT: retq441;442; SSE41-LABEL: shuffle_v2i64_12_copy:443; SSE41: # %bb.0:444; SSE41-NEXT: movdqa %xmm2, %xmm0445; SSE41-NEXT: palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]446; SSE41-NEXT: retq447;448; AVX-LABEL: shuffle_v2i64_12_copy:449; AVX: # %bb.0:450; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7]451; AVX-NEXT: retq452 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2>453 ret <2 x i64> %shuffle454}455define <2 x i64> @shuffle_v2i64_13(<2 x i64> %a, <2 x i64> %b) {456; SSE-LABEL: shuffle_v2i64_13:457; SSE: # %bb.0:458; SSE-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]459; SSE-NEXT: retq460;461; AVX-LABEL: shuffle_v2i64_13:462; AVX: # %bb.0:463; AVX-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]464; AVX-NEXT: retq465 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>466 ret <2 x i64> %shuffle467}468define <2 x i64> @shuffle_v2i64_13_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {469; SSE-LABEL: shuffle_v2i64_13_copy:470; SSE: # %bb.0:471; SSE-NEXT: movaps %xmm1, %xmm0472; SSE-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm2[1]473; SSE-NEXT: retq474;475; AVX-LABEL: shuffle_v2i64_13_copy:476; AVX: # %bb.0:477; AVX-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm2[1]478; AVX-NEXT: retq479 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3>480 ret <2 x i64> %shuffle481}482define <2 x i64> @shuffle_v2i64_20(<2 x i64> %a, <2 x i64> %b) {483; SSE-LABEL: shuffle_v2i64_20:484; SSE: # %bb.0:485; SSE-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]486; SSE-NEXT: movaps %xmm1, %xmm0487; SSE-NEXT: retq488;489; AVX-LABEL: shuffle_v2i64_20:490; AVX: # %bb.0:491; AVX-NEXT: vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]492; AVX-NEXT: retq493 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>494 ret <2 x i64> %shuffle495}496define <2 x i64> @shuffle_v2i64_20_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {497; SSE-LABEL: shuffle_v2i64_20_copy:498; SSE: # %bb.0:499; SSE-NEXT: movaps %xmm2, %xmm0500; SSE-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]501; SSE-NEXT: retq502;503; AVX-LABEL: shuffle_v2i64_20_copy:504; AVX: # %bb.0:505; AVX-NEXT: vmovlhps {{.*#+}} xmm0 = xmm2[0],xmm1[0]506; AVX-NEXT: retq507 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0>508 ret <2 x i64> %shuffle509}510define <2 x i64> @shuffle_v2i64_21(<2 x i64> %a, <2 x i64> %b) {511; SSE-LABEL: shuffle_v2i64_21:512; SSE: # %bb.0:513; SSE-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]514; SSE-NEXT: retq515;516; AVX-LABEL: shuffle_v2i64_21:517; AVX: # %bb.0:518; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]519; AVX-NEXT: retq520 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1>521 ret <2 x i64> %shuffle522}523define <2 x i64> @shuffle_v2i64_21_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {524; SSE2-LABEL: shuffle_v2i64_21_copy:525; SSE2: # %bb.0:526; SSE2-NEXT: movapd %xmm1, %xmm0527; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]528; SSE2-NEXT: retq529;530; SSE3-LABEL: shuffle_v2i64_21_copy:531; SSE3: # %bb.0:532; SSE3-NEXT: movapd %xmm1, %xmm0533; SSE3-NEXT: movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]534; SSE3-NEXT: retq535;536; SSSE3-LABEL: shuffle_v2i64_21_copy:537; SSSE3: # %bb.0:538; SSSE3-NEXT: movapd %xmm1, %xmm0539; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]540; SSSE3-NEXT: retq541;542; SSE41-LABEL: shuffle_v2i64_21_copy:543; SSE41: # %bb.0:544; SSE41-NEXT: movaps %xmm1, %xmm0545; SSE41-NEXT: movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]546; SSE41-NEXT: retq547;548; AVX-LABEL: shuffle_v2i64_21_copy:549; AVX: # %bb.0:550; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0,1],xmm1[2,3]551; AVX-NEXT: retq552 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1>553 ret <2 x i64> %shuffle554}555define <2 x i64> @shuffle_v2i64_30(<2 x i64> %a, <2 x i64> %b) {556; SSE2-LABEL: shuffle_v2i64_30:557; SSE2: # %bb.0:558; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,3],xmm0[0,1]559; SSE2-NEXT: movaps %xmm1, %xmm0560; SSE2-NEXT: retq561;562; SSE3-LABEL: shuffle_v2i64_30:563; SSE3: # %bb.0:564; SSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,3],xmm0[0,1]565; SSE3-NEXT: movaps %xmm1, %xmm0566; SSE3-NEXT: retq567;568; SSSE3-LABEL: shuffle_v2i64_30:569; SSSE3: # %bb.0:570; SSSE3-NEXT: palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]571; SSSE3-NEXT: retq572;573; SSE41-LABEL: shuffle_v2i64_30:574; SSE41: # %bb.0:575; SSE41-NEXT: palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]576; SSE41-NEXT: retq577;578; AVX-LABEL: shuffle_v2i64_30:579; AVX: # %bb.0:580; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]581; AVX-NEXT: retq582 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0>583 ret <2 x i64> %shuffle584}585define <2 x i64> @shuffle_v2i64_30_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {586; SSE2-LABEL: shuffle_v2i64_30_copy:587; SSE2: # %bb.0:588; SSE2-NEXT: movaps %xmm2, %xmm0589; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,3],xmm1[0,1]590; SSE2-NEXT: retq591;592; SSE3-LABEL: shuffle_v2i64_30_copy:593; SSE3: # %bb.0:594; SSE3-NEXT: movaps %xmm2, %xmm0595; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,3],xmm1[0,1]596; SSE3-NEXT: retq597;598; SSSE3-LABEL: shuffle_v2i64_30_copy:599; SSSE3: # %bb.0:600; SSSE3-NEXT: movdqa %xmm1, %xmm0601; SSSE3-NEXT: palignr {{.*#+}} xmm0 = xmm2[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]602; SSSE3-NEXT: retq603;604; SSE41-LABEL: shuffle_v2i64_30_copy:605; SSE41: # %bb.0:606; SSE41-NEXT: movdqa %xmm1, %xmm0607; SSE41-NEXT: palignr {{.*#+}} xmm0 = xmm2[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]608; SSE41-NEXT: retq609;610; AVX-LABEL: shuffle_v2i64_30_copy:611; AVX: # %bb.0:612; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]613; AVX-NEXT: retq614 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0>615 ret <2 x i64> %shuffle616}617define <2 x i64> @shuffle_v2i64_31(<2 x i64> %a, <2 x i64> %b) {618; SSE-LABEL: shuffle_v2i64_31:619; SSE: # %bb.0:620; SSE-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]621; SSE-NEXT: movaps %xmm1, %xmm0622; SSE-NEXT: retq623;624; AVX-LABEL: shuffle_v2i64_31:625; AVX: # %bb.0:626; AVX-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1]627; AVX-NEXT: retq628 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>629 ret <2 x i64> %shuffle630}631define <2 x i64> @shuffle_v2i64_31_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) {632; SSE-LABEL: shuffle_v2i64_31_copy:633; SSE: # %bb.0:634; SSE-NEXT: movaps %xmm2, %xmm0635; SSE-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]636; SSE-NEXT: retq637;638; AVX-LABEL: shuffle_v2i64_31_copy:639; AVX: # %bb.0:640; AVX-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm2[1],xmm1[1]641; AVX-NEXT: retq642 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>643 ret <2 x i64> %shuffle644}645 646define <2 x i64> @shuffle_v2i64_0z(<2 x i64> %a) {647; SSE-LABEL: shuffle_v2i64_0z:648; SSE: # %bb.0:649; SSE-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero650; SSE-NEXT: retq651;652; AVX-LABEL: shuffle_v2i64_0z:653; AVX: # %bb.0:654; AVX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero655; AVX-NEXT: retq656 %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>657 ret <2 x i64> %shuffle658}659 660define <2 x i64> @shuffle_v2i64_1z(<2 x i64> %a) {661; SSE-LABEL: shuffle_v2i64_1z:662; SSE: # %bb.0:663; SSE-NEXT: psrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero664; SSE-NEXT: retq665;666; AVX-LABEL: shuffle_v2i64_1z:667; AVX: # %bb.0:668; AVX-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero669; AVX-NEXT: retq670 %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 1, i32 3>671 ret <2 x i64> %shuffle672}673 674define <2 x i64> @shuffle_v2i64_z0(<2 x i64> %a) {675; SSE-LABEL: shuffle_v2i64_z0:676; SSE: # %bb.0:677; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]678; SSE-NEXT: retq679;680; AVX-LABEL: shuffle_v2i64_z0:681; AVX: # %bb.0:682; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]683; AVX-NEXT: retq684 %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 2, i32 0>685 ret <2 x i64> %shuffle686}687 688define <2 x i64> @shuffle_v2i64_z1(<2 x i64> %a) {689; SSE2-LABEL: shuffle_v2i64_z1:690; SSE2: # %bb.0:691; SSE2-NEXT: xorps %xmm1, %xmm1692; SSE2-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]693; SSE2-NEXT: movaps %xmm1, %xmm0694; SSE2-NEXT: retq695;696; SSE3-LABEL: shuffle_v2i64_z1:697; SSE3: # %bb.0:698; SSE3-NEXT: xorps %xmm1, %xmm1699; SSE3-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]700; SSE3-NEXT: movaps %xmm1, %xmm0701; SSE3-NEXT: retq702;703; SSSE3-LABEL: shuffle_v2i64_z1:704; SSSE3: # %bb.0:705; SSSE3-NEXT: xorps %xmm1, %xmm1706; SSSE3-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]707; SSSE3-NEXT: movaps %xmm1, %xmm0708; SSSE3-NEXT: retq709;710; SSE41-LABEL: shuffle_v2i64_z1:711; SSE41: # %bb.0:712; SSE41-NEXT: xorps %xmm1, %xmm1713; SSE41-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]714; SSE41-NEXT: retq715;716; AVX-LABEL: shuffle_v2i64_z1:717; AVX: # %bb.0:718; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1719; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]720; AVX-NEXT: retq721 %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 2, i32 1>722 ret <2 x i64> %shuffle723}724 725define <2 x double> @shuffle_v2f64_0z(<2 x double> %a) {726; SSE-LABEL: shuffle_v2f64_0z:727; SSE: # %bb.0:728; SSE-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero729; SSE-NEXT: retq730;731; AVX-LABEL: shuffle_v2f64_0z:732; AVX: # %bb.0:733; AVX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero734; AVX-NEXT: retq735 %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>736 ret <2 x double> %shuffle737}738 739define <2 x double> @shuffle_v2f64_1z(<2 x double> %a) {740; SSE-LABEL: shuffle_v2f64_1z:741; SSE: # %bb.0:742; SSE-NEXT: xorps %xmm1, %xmm1743; SSE-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]744; SSE-NEXT: retq745;746; AVX-LABEL: shuffle_v2f64_1z:747; AVX: # %bb.0:748; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1749; AVX-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]750; AVX-NEXT: retq751 %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 1, i32 3>752 ret <2 x double> %shuffle753}754 755define <2 x double> @shuffle_v2f64_z0(<2 x double> %a) {756; SSE-LABEL: shuffle_v2f64_z0:757; SSE: # %bb.0:758; SSE-NEXT: xorps %xmm1, %xmm1759; SSE-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]760; SSE-NEXT: movaps %xmm1, %xmm0761; SSE-NEXT: retq762;763; AVX-LABEL: shuffle_v2f64_z0:764; AVX: # %bb.0:765; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1766; AVX-NEXT: vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]767; AVX-NEXT: retq768 %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 0>769 ret <2 x double> %shuffle770}771 772define <2 x double> @shuffle_v2f64_z1(<2 x double> %a) {773; SSE2-LABEL: shuffle_v2f64_z1:774; SSE2: # %bb.0:775; SSE2-NEXT: xorpd %xmm1, %xmm1776; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]777; SSE2-NEXT: retq778;779; SSE3-LABEL: shuffle_v2f64_z1:780; SSE3: # %bb.0:781; SSE3-NEXT: xorpd %xmm1, %xmm1782; SSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]783; SSE3-NEXT: retq784;785; SSSE3-LABEL: shuffle_v2f64_z1:786; SSSE3: # %bb.0:787; SSSE3-NEXT: xorpd %xmm1, %xmm1788; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]789; SSSE3-NEXT: retq790;791; SSE41-LABEL: shuffle_v2f64_z1:792; SSE41: # %bb.0:793; SSE41-NEXT: xorps %xmm1, %xmm1794; SSE41-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]795; SSE41-NEXT: retq796;797; AVX-LABEL: shuffle_v2f64_z1:798; AVX: # %bb.0:799; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1800; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]801; AVX-NEXT: retq802 %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 1>803 ret <2 x double> %shuffle804}805 806define <2 x double> @shuffle_v2f64_bitcast_1z(<2 x double> %a) {807; SSE-LABEL: shuffle_v2f64_bitcast_1z:808; SSE: # %bb.0:809; SSE-NEXT: xorps %xmm1, %xmm1810; SSE-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]811; SSE-NEXT: retq812;813; AVX-LABEL: shuffle_v2f64_bitcast_1z:814; AVX: # %bb.0:815; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1816; AVX-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]817; AVX-NEXT: retq818 %shuffle64 = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 1>819 %bitcast32 = bitcast <2 x double> %shuffle64 to <4 x float>820 %shuffle32 = shufflevector <4 x float> %bitcast32, <4 x float> poison, <4 x i32> <i32 2, i32 3, i32 0, i32 1>821 %bitcast64 = bitcast <4 x float> %shuffle32 to <2 x double>822 ret <2 x double> %bitcast64823}824 825define <2 x i64> @shuffle_v2i64_bitcast_z123(<2 x i64> %x) {826; SSE2-LABEL: shuffle_v2i64_bitcast_z123:827; SSE2: # %bb.0:828; SSE2-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0829; SSE2-NEXT: retq830;831; SSE3-LABEL: shuffle_v2i64_bitcast_z123:832; SSE3: # %bb.0:833; SSE3-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0834; SSE3-NEXT: retq835;836; SSSE3-LABEL: shuffle_v2i64_bitcast_z123:837; SSSE3: # %bb.0:838; SSSE3-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0839; SSSE3-NEXT: retq840;841; SSE41-LABEL: shuffle_v2i64_bitcast_z123:842; SSE41: # %bb.0:843; SSE41-NEXT: xorps %xmm1, %xmm1844; SSE41-NEXT: movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]845; SSE41-NEXT: retq846;847; AVX-LABEL: shuffle_v2i64_bitcast_z123:848; AVX: # %bb.0:849; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1850; AVX-NEXT: vmovss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]851; AVX-NEXT: retq852 %bitcast32 = bitcast <2 x i64> %x to <4 x float>853 %shuffle32 = shufflevector <4 x float> %bitcast32, <4 x float> <float 1.000000e+00, float poison, float poison, float poison>, <4 x i32> <i32 4, i32 1, i32 2, i32 3>854 %bitcast64 = bitcast <4 x float> %shuffle32 to <2 x i64>855 %and = and <2 x i64> %bitcast64, <i64 -4294967296, i64 -1>856 ret <2 x i64> %and857}858 859define <2 x i64> @insert_reg_and_zero_v2i64(i64 %a) {860; SSE-LABEL: insert_reg_and_zero_v2i64:861; SSE: # %bb.0:862; SSE-NEXT: movq %rdi, %xmm0863; SSE-NEXT: retq864;865; AVX-LABEL: insert_reg_and_zero_v2i64:866; AVX: # %bb.0:867; AVX-NEXT: vmovq %rdi, %xmm0868; AVX-NEXT: retq869 %v = insertelement <2 x i64> poison, i64 %a, i32 0870 %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>871 ret <2 x i64> %shuffle872}873 874define <2 x i64> @insert_mem_and_zero_v2i64(ptr %ptr) {875; SSE-LABEL: insert_mem_and_zero_v2i64:876; SSE: # %bb.0:877; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero878; SSE-NEXT: retq879;880; AVX-LABEL: insert_mem_and_zero_v2i64:881; AVX: # %bb.0:882; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero883; AVX-NEXT: retq884 %a = load i64, ptr %ptr885 %v = insertelement <2 x i64> poison, i64 %a, i32 0886 %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3>887 ret <2 x i64> %shuffle888}889 890define <2 x double> @insert_reg_and_zero_v2f64(double %a) {891; SSE-LABEL: insert_reg_and_zero_v2f64:892; SSE: # %bb.0:893; SSE-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero894; SSE-NEXT: retq895;896; AVX-LABEL: insert_reg_and_zero_v2f64:897; AVX: # %bb.0:898; AVX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero899; AVX-NEXT: retq900 %v = insertelement <2 x double> poison, double %a, i32 0901 %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>902 ret <2 x double> %shuffle903}904 905define <2 x double> @insert_mem_and_zero_v2f64(ptr %ptr) {906; SSE-LABEL: insert_mem_and_zero_v2f64:907; SSE: # %bb.0:908; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero909; SSE-NEXT: retq910;911; AVX-LABEL: insert_mem_and_zero_v2f64:912; AVX: # %bb.0:913; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero914; AVX-NEXT: retq915 %a = load double, ptr %ptr916 %v = insertelement <2 x double> poison, double %a, i32 0917 %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3>918 ret <2 x double> %shuffle919}920 921define <2 x i64> @insert_reg_lo_v2i64(i64 %a, <2 x i64> %b) {922; SSE2-LABEL: insert_reg_lo_v2i64:923; SSE2: # %bb.0:924; SSE2-NEXT: movq %rdi, %xmm1925; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]926; SSE2-NEXT: retq927;928; SSE3-LABEL: insert_reg_lo_v2i64:929; SSE3: # %bb.0:930; SSE3-NEXT: movq %rdi, %xmm1931; SSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]932; SSE3-NEXT: retq933;934; SSSE3-LABEL: insert_reg_lo_v2i64:935; SSSE3: # %bb.0:936; SSSE3-NEXT: movq %rdi, %xmm1937; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]938; SSSE3-NEXT: retq939;940; SSE41-LABEL: insert_reg_lo_v2i64:941; SSE41: # %bb.0:942; SSE41-NEXT: pinsrq $0, %rdi, %xmm0943; SSE41-NEXT: retq944;945; AVX-LABEL: insert_reg_lo_v2i64:946; AVX: # %bb.0:947; AVX-NEXT: vpinsrq $0, %rdi, %xmm0, %xmm0948; AVX-NEXT: retq949 %v = insertelement <2 x i64> poison, i64 %a, i32 0950 %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 0, i32 3>951 ret <2 x i64> %shuffle952}953 954define <2 x i64> @insert_mem_lo_v2i64(ptr %ptr, <2 x i64> %b) {955; SSE2-LABEL: insert_mem_lo_v2i64:956; SSE2: # %bb.0:957; SSE2-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]958; SSE2-NEXT: retq959;960; SSE3-LABEL: insert_mem_lo_v2i64:961; SSE3: # %bb.0:962; SSE3-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]963; SSE3-NEXT: retq964;965; SSSE3-LABEL: insert_mem_lo_v2i64:966; SSSE3: # %bb.0:967; SSSE3-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]968; SSSE3-NEXT: retq969;970; SSE41-LABEL: insert_mem_lo_v2i64:971; SSE41: # %bb.0:972; SSE41-NEXT: pinsrq $0, (%rdi), %xmm0973; SSE41-NEXT: retq974;975; AVX-LABEL: insert_mem_lo_v2i64:976; AVX: # %bb.0:977; AVX-NEXT: vpinsrq $0, (%rdi), %xmm0, %xmm0978; AVX-NEXT: retq979 %a = load i64, ptr %ptr980 %v = insertelement <2 x i64> poison, i64 %a, i32 0981 %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 0, i32 3>982 ret <2 x i64> %shuffle983}984 985define <2 x i64> @insert_reg_hi_v2i64(i64 %a, <2 x i64> %b) {986; SSE2-LABEL: insert_reg_hi_v2i64:987; SSE2: # %bb.0:988; SSE2-NEXT: movq %rdi, %xmm1989; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]990; SSE2-NEXT: retq991;992; SSE3-LABEL: insert_reg_hi_v2i64:993; SSE3: # %bb.0:994; SSE3-NEXT: movq %rdi, %xmm1995; SSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]996; SSE3-NEXT: retq997;998; SSSE3-LABEL: insert_reg_hi_v2i64:999; SSSE3: # %bb.0:1000; SSSE3-NEXT: movq %rdi, %xmm11001; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1002; SSSE3-NEXT: retq1003;1004; SSE41-LABEL: insert_reg_hi_v2i64:1005; SSE41: # %bb.0:1006; SSE41-NEXT: pinsrq $1, %rdi, %xmm01007; SSE41-NEXT: retq1008;1009; AVX-LABEL: insert_reg_hi_v2i64:1010; AVX: # %bb.0:1011; AVX-NEXT: vpinsrq $1, %rdi, %xmm0, %xmm01012; AVX-NEXT: retq1013 %v = insertelement <2 x i64> poison, i64 %a, i32 01014 %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 2, i32 0>1015 ret <2 x i64> %shuffle1016}1017 1018define <2 x i64> @insert_mem_hi_v2i64(ptr %ptr, <2 x i64> %b) {1019; SSE2-LABEL: insert_mem_hi_v2i64:1020; SSE2: # %bb.0:1021; SSE2-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero1022; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]1023; SSE2-NEXT: retq1024;1025; SSE3-LABEL: insert_mem_hi_v2i64:1026; SSE3: # %bb.0:1027; SSE3-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero1028; SSE3-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]1029; SSE3-NEXT: retq1030;1031; SSSE3-LABEL: insert_mem_hi_v2i64:1032; SSSE3: # %bb.0:1033; SSSE3-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero1034; SSSE3-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]1035; SSSE3-NEXT: retq1036;1037; SSE41-LABEL: insert_mem_hi_v2i64:1038; SSE41: # %bb.0:1039; SSE41-NEXT: pinsrq $1, (%rdi), %xmm01040; SSE41-NEXT: retq1041;1042; AVX-LABEL: insert_mem_hi_v2i64:1043; AVX: # %bb.0:1044; AVX-NEXT: vpinsrq $1, (%rdi), %xmm0, %xmm01045; AVX-NEXT: retq1046 %a = load i64, ptr %ptr1047 %v = insertelement <2 x i64> poison, i64 %a, i32 01048 %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 2, i32 0>1049 ret <2 x i64> %shuffle1050}1051 1052define <2 x double> @insert_reg_lo_v2f64(double %a, <2 x double> %b) {1053; SSE2-LABEL: insert_reg_lo_v2f64:1054; SSE2: # %bb.0:1055; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]1056; SSE2-NEXT: retq1057;1058; SSE3-LABEL: insert_reg_lo_v2f64:1059; SSE3: # %bb.0:1060; SSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]1061; SSE3-NEXT: retq1062;1063; SSSE3-LABEL: insert_reg_lo_v2f64:1064; SSSE3: # %bb.0:1065; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]1066; SSSE3-NEXT: retq1067;1068; SSE41-LABEL: insert_reg_lo_v2f64:1069; SSE41: # %bb.0:1070; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]1071; SSE41-NEXT: retq1072;1073; AVX-LABEL: insert_reg_lo_v2f64:1074; AVX: # %bb.0:1075; AVX-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1]1076; AVX-NEXT: retq1077 %v = insertelement <2 x double> poison, double %a, i32 01078 %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 0, i32 3>1079 ret <2 x double> %shuffle1080}1081 1082define <2 x double> @insert_mem_lo_v2f64(ptr %ptr, <2 x double> %b) {1083; SSE-LABEL: insert_mem_lo_v2f64:1084; SSE: # %bb.0:1085; SSE-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1086; SSE-NEXT: retq1087;1088; AVX-LABEL: insert_mem_lo_v2f64:1089; AVX: # %bb.0:1090; AVX-NEXT: vmovlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1091; AVX-NEXT: retq1092 %a = load double, ptr %ptr1093 %v = insertelement <2 x double> poison, double %a, i32 01094 %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 0, i32 3>1095 ret <2 x double> %shuffle1096}1097 1098define <2 x double> @insert_reg_hi_v2f64(double %a, <2 x double> %b) {1099; SSE-LABEL: insert_reg_hi_v2f64:1100; SSE: # %bb.0:1101; SSE-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]1102; SSE-NEXT: movaps %xmm1, %xmm01103; SSE-NEXT: retq1104;1105; AVX-LABEL: insert_reg_hi_v2f64:1106; AVX: # %bb.0:1107; AVX-NEXT: vmovlhps {{.*#+}} xmm0 = xmm1[0],xmm0[0]1108; AVX-NEXT: retq1109 %v = insertelement <2 x double> poison, double %a, i32 01110 %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 2, i32 0>1111 ret <2 x double> %shuffle1112}1113 1114define <2 x double> @insert_mem_hi_v2f64(ptr %ptr, <2 x double> %b) {1115; SSE-LABEL: insert_mem_hi_v2f64:1116; SSE: # %bb.0:1117; SSE-NEXT: movhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]1118; SSE-NEXT: retq1119;1120; AVX-LABEL: insert_mem_hi_v2f64:1121; AVX: # %bb.0:1122; AVX-NEXT: vmovhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]1123; AVX-NEXT: retq1124 %a = load double, ptr %ptr1125 %v = insertelement <2 x double> poison, double %a, i32 01126 %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 2, i32 0>1127 ret <2 x double> %shuffle1128}1129 1130define <2 x double> @insert_dup_reg_v2f64(double %a) {1131; SSE2-LABEL: insert_dup_reg_v2f64:1132; SSE2: # %bb.0:1133; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0]1134; SSE2-NEXT: retq1135;1136; SSE3-LABEL: insert_dup_reg_v2f64:1137; SSE3: # %bb.0:1138; SSE3-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0]1139; SSE3-NEXT: retq1140;1141; SSSE3-LABEL: insert_dup_reg_v2f64:1142; SSSE3: # %bb.0:1143; SSSE3-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0]1144; SSSE3-NEXT: retq1145;1146; SSE41-LABEL: insert_dup_reg_v2f64:1147; SSE41: # %bb.0:1148; SSE41-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0]1149; SSE41-NEXT: retq1150;1151; AVX-LABEL: insert_dup_reg_v2f64:1152; AVX: # %bb.0:1153; AVX-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]1154; AVX-NEXT: retq1155 %v = insertelement <2 x double> poison, double %a, i32 01156 %shuffle = shufflevector <2 x double> %v, <2 x double> poison, <2 x i32> <i32 0, i32 0>1157 ret <2 x double> %shuffle1158}1159 1160define <2 x double> @insert_dup_mem_v2f64(ptr %ptr) {1161; SSE2-LABEL: insert_dup_mem_v2f64:1162; SSE2: # %bb.0:1163; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero1164; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0]1165; SSE2-NEXT: retq1166;1167; SSE3-LABEL: insert_dup_mem_v2f64:1168; SSE3: # %bb.0:1169; SSE3-NEXT: movddup {{.*#+}} xmm0 = mem[0,0]1170; SSE3-NEXT: retq1171;1172; SSSE3-LABEL: insert_dup_mem_v2f64:1173; SSSE3: # %bb.0:1174; SSSE3-NEXT: movddup {{.*#+}} xmm0 = mem[0,0]1175; SSSE3-NEXT: retq1176;1177; SSE41-LABEL: insert_dup_mem_v2f64:1178; SSE41: # %bb.0:1179; SSE41-NEXT: movddup {{.*#+}} xmm0 = mem[0,0]1180; SSE41-NEXT: retq1181;1182; AVX-LABEL: insert_dup_mem_v2f64:1183; AVX: # %bb.0:1184; AVX-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]1185; AVX-NEXT: retq1186 %a = load double, ptr %ptr1187 %v = insertelement <2 x double> poison, double %a, i32 01188 %shuffle = shufflevector <2 x double> %v, <2 x double> poison, <2 x i32> <i32 0, i32 0>1189 ret <2 x double> %shuffle1190}1191 1192define <2 x double> @insert_dup_mem128_v2f64(ptr %ptr) nounwind {1193; SSE2-LABEL: insert_dup_mem128_v2f64:1194; SSE2: # %bb.0:1195; SSE2-NEXT: movaps (%rdi), %xmm01196; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0]1197; SSE2-NEXT: retq1198;1199; SSE3-LABEL: insert_dup_mem128_v2f64:1200; SSE3: # %bb.0:1201; SSE3-NEXT: movddup {{.*#+}} xmm0 = mem[0,0]1202; SSE3-NEXT: retq1203;1204; SSSE3-LABEL: insert_dup_mem128_v2f64:1205; SSSE3: # %bb.0:1206; SSSE3-NEXT: movddup {{.*#+}} xmm0 = mem[0,0]1207; SSSE3-NEXT: retq1208;1209; SSE41-LABEL: insert_dup_mem128_v2f64:1210; SSE41: # %bb.0:1211; SSE41-NEXT: movddup {{.*#+}} xmm0 = mem[0,0]1212; SSE41-NEXT: retq1213;1214; AVX-LABEL: insert_dup_mem128_v2f64:1215; AVX: # %bb.0:1216; AVX-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]1217; AVX-NEXT: retq1218 %v = load <2 x double>, ptr %ptr1219 %shuffle = shufflevector <2 x double> %v, <2 x double> poison, <2 x i32> <i32 0, i32 0>1220 ret <2 x double> %shuffle1221}1222 1223 1224define <2 x i64> @insert_dup_mem_v2i64(ptr %ptr) {1225; SSE-LABEL: insert_dup_mem_v2i64:1226; SSE: # %bb.0:1227; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero1228; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]1229; SSE-NEXT: retq1230;1231; AVX-LABEL: insert_dup_mem_v2i64:1232; AVX: # %bb.0:1233; AVX-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]1234; AVX-NEXT: retq1235 %tmp = load i64, ptr %ptr, align 11236 %tmp1 = insertelement <2 x i64> poison, i64 %tmp, i32 01237 %tmp2 = shufflevector <2 x i64> %tmp1, <2 x i64> poison, <2 x i32> zeroinitializer1238 ret <2 x i64> %tmp21239}1240 1241define <2 x double> @shuffle_mem_v2f64_10(ptr %ptr) {1242; SSE-LABEL: shuffle_mem_v2f64_10:1243; SSE: # %bb.0:1244; SSE-NEXT: movaps (%rdi), %xmm01245; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,3,0,1]1246; SSE-NEXT: retq1247;1248; AVX-LABEL: shuffle_mem_v2f64_10:1249; AVX: # %bb.0:1250; AVX-NEXT: vpermilpd {{.*#+}} xmm0 = mem[1,0]1251; AVX-NEXT: retq1252 1253 %a = load <2 x double>, ptr %ptr1254 %shuffle = shufflevector <2 x double> %a, <2 x double> poison, <2 x i32> <i32 1, i32 0>1255 ret <2 x double> %shuffle1256}1257 1258define <2 x double> @shuffle_mem_v2f64_31(<2 x double> %a, ptr %b) {1259; SSE-LABEL: shuffle_mem_v2f64_31:1260; SSE: # %bb.0:1261; SSE-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1262; SSE-NEXT: retq1263;1264; AVX-LABEL: shuffle_mem_v2f64_31:1265; AVX: # %bb.0:1266; AVX-NEXT: vmovlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1267; AVX-NEXT: retq1268 %c = load <2 x double>, ptr %b1269 %f = shufflevector <2 x double> %a, <2 x double> %c, <2 x i32> <i32 3, i32 1>1270 ret <2 x double> %f1271}1272 1273define <2 x double> @shuffle_mem_v2f64_02(<2 x double> %a, ptr %pb) {1274; SSE-LABEL: shuffle_mem_v2f64_02:1275; SSE: # %bb.0:1276; SSE-NEXT: movhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]1277; SSE-NEXT: retq1278;1279; AVX-LABEL: shuffle_mem_v2f64_02:1280; AVX: # %bb.0:1281; AVX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],mem[0]1282; AVX-NEXT: retq1283 %b = load <2 x double>, ptr %pb, align 11284 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 2>1285 ret <2 x double> %shuffle1286}1287 1288define <2 x double> @shuffle_mem_v2f64_21(<2 x double> %a, ptr %pb) {1289; SSE2-LABEL: shuffle_mem_v2f64_21:1290; SSE2: # %bb.0:1291; SSE2-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1292; SSE2-NEXT: retq1293;1294; SSE3-LABEL: shuffle_mem_v2f64_21:1295; SSE3: # %bb.0:1296; SSE3-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1297; SSE3-NEXT: retq1298;1299; SSSE3-LABEL: shuffle_mem_v2f64_21:1300; SSSE3: # %bb.0:1301; SSSE3-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1302; SSSE3-NEXT: retq1303;1304; SSE41-LABEL: shuffle_mem_v2f64_21:1305; SSE41: # %bb.0:1306; SSE41-NEXT: movups (%rdi), %xmm11307; SSE41-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]1308; SSE41-NEXT: retq1309;1310; AVX-LABEL: shuffle_mem_v2f64_21:1311; AVX: # %bb.0:1312; AVX-NEXT: vblendps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1313; AVX-NEXT: retq1314 %b = load <2 x double>, ptr %pb, align 11315 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 1>1316 ret <2 x double> %shuffle1317}1318