1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE3 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=knl -mattr=+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512VL 9 10target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 11target triple = "x86_64-unknown-unknown" 12 13define <2 x i64> @shuffle_v2i64_00(<2 x i64> %a, <2 x i64> %b) { 14; SSE-LABEL: shuffle_v2i64_00: 15; SSE: # BB#0: 16; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 17; SSE-NEXT: retq 18; 19; AVX1-LABEL: shuffle_v2i64_00: 20; AVX1: # BB#0: 21; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 22; AVX1-NEXT: retq 23; 24; AVX2-LABEL: shuffle_v2i64_00: 25; AVX2: # BB#0: 26; AVX2-NEXT: vpbroadcastq %xmm0, %xmm0 27; AVX2-NEXT: retq 28; 29; AVX512VL-LABEL: shuffle_v2i64_00: 30; AVX512VL: # BB#0: 31; AVX512VL-NEXT: vpbroadcastq %xmm0, %xmm0 32; AVX512VL-NEXT: retq 33 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 0> 34 ret <2 x i64> %shuffle 35} 36define <2 x i64> @shuffle_v2i64_10(<2 x i64> %a, <2 x i64> %b) { 37; SSE-LABEL: shuffle_v2i64_10: 38; SSE: # BB#0: 39; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 40; SSE-NEXT: retq 41; 42; AVX-LABEL: shuffle_v2i64_10: 43; AVX: # BB#0: 44; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 45; AVX-NEXT: retq 46 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 0> 47 ret <2 x i64> %shuffle 48} 49define <2 x i64> @shuffle_v2i64_11(<2 x i64> %a, <2 x i64> %b) { 50; SSE-LABEL: shuffle_v2i64_11: 51; SSE: # BB#0: 52; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 53; SSE-NEXT: retq 54; 55; AVX-LABEL: shuffle_v2i64_11: 56; AVX: # BB#0: 57; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 58; AVX-NEXT: retq 59 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 1> 60 ret <2 x i64> %shuffle 61} 62define <2 x i64> @shuffle_v2i64_22(<2 x i64> %a, <2 x i64> %b) { 63; SSE-LABEL: shuffle_v2i64_22: 64; SSE: # BB#0: 65; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,1,0,1] 66; SSE-NEXT: retq 67; 68; AVX1-LABEL: shuffle_v2i64_22: 69; AVX1: # BB#0: 70; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm1[0,1,0,1] 71; AVX1-NEXT: retq 72; 73; AVX2-LABEL: shuffle_v2i64_22: 74; AVX2: # BB#0: 75; AVX2-NEXT: vpbroadcastq %xmm1, %xmm0 76; AVX2-NEXT: retq 77; 78; AVX512VL-LABEL: shuffle_v2i64_22: 79; AVX512VL: # BB#0: 80; AVX512VL-NEXT: vpbroadcastq %xmm1, %xmm0 81; AVX512VL-NEXT: retq 82 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 2> 83 ret <2 x i64> %shuffle 84} 85define <2 x i64> @shuffle_v2i64_32(<2 x i64> %a, <2 x i64> %b) { 86; SSE-LABEL: shuffle_v2i64_32: 87; SSE: # BB#0: 88; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 89; SSE-NEXT: retq 90; 91; AVX-LABEL: shuffle_v2i64_32: 92; AVX: # BB#0: 93; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] 94; AVX-NEXT: retq 95 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 2> 96 ret <2 x i64> %shuffle 97} 98define <2 x i64> @shuffle_v2i64_33(<2 x i64> %a, <2 x i64> %b) { 99; SSE-LABEL: shuffle_v2i64_33: 100; SSE: # BB#0: 101; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3] 102; SSE-NEXT: retq 103; 104; AVX-LABEL: shuffle_v2i64_33: 105; AVX: # BB#0: 106; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm1[2,3,2,3] 107; AVX-NEXT: retq 108 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 3> 109 ret <2 x i64> %shuffle 110} 111 112define <2 x double> @shuffle_v2f64_00(<2 x double> %a, <2 x double> %b) { 113; SSE2-LABEL: shuffle_v2f64_00: 114; SSE2: # BB#0: 115; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0] 116; SSE2-NEXT: retq 117; 118; SSE3-LABEL: shuffle_v2f64_00: 119; SSE3: # BB#0: 120; SSE3-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 121; SSE3-NEXT: retq 122; 123; SSSE3-LABEL: shuffle_v2f64_00: 124; SSSE3: # BB#0: 125; SSSE3-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 126; SSSE3-NEXT: retq 127; 128; SSE41-LABEL: shuffle_v2f64_00: 129; SSE41: # BB#0: 130; SSE41-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 131; SSE41-NEXT: retq 132; 133; AVX-LABEL: shuffle_v2f64_00: 134; AVX: # BB#0: 135; AVX-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0] 136; AVX-NEXT: retq 137 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 0> 138 ret <2 x double> %shuffle 139} 140define <2 x double> @shuffle_v2f64_10(<2 x double> %a, <2 x double> %b) { 141; SSE-LABEL: shuffle_v2f64_10: 142; SSE: # BB#0: 143; SSE-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1,0] 144; SSE-NEXT: retq 145; 146; AVX-LABEL: shuffle_v2f64_10: 147; AVX: # BB#0: 148; AVX-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 149; AVX-NEXT: retq 150 151 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 0> 152 ret <2 x double> %shuffle 153} 154define <2 x double> @shuffle_v2f64_11(<2 x double> %a, <2 x double> %b) { 155; SSE-LABEL: shuffle_v2f64_11: 156; SSE: # BB#0: 157; SSE-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1,1] 158; SSE-NEXT: retq 159; 160; AVX-LABEL: shuffle_v2f64_11: 161; AVX: # BB#0: 162; AVX-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,1] 163; AVX-NEXT: retq 164 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 1> 165 ret <2 x double> %shuffle 166} 167define <2 x double> @shuffle_v2f64_22(<2 x double> %a, <2 x double> %b) { 168; SSE2-LABEL: shuffle_v2f64_22: 169; SSE2: # BB#0: 170; SSE2-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0,0] 171; SSE2-NEXT: movaps %xmm1, %xmm0 172; SSE2-NEXT: retq 173; 174; SSE3-LABEL: shuffle_v2f64_22: 175; SSE3: # BB#0: 176; SSE3-NEXT: movddup {{.*#+}} xmm0 = xmm1[0,0] 177; SSE3-NEXT: retq 178; 179; SSSE3-LABEL: shuffle_v2f64_22: 180; SSSE3: # BB#0: 181; SSSE3-NEXT: movddup {{.*#+}} xmm0 = xmm1[0,0] 182; SSSE3-NEXT: retq 183; 184; SSE41-LABEL: shuffle_v2f64_22: 185; SSE41: # BB#0: 186; SSE41-NEXT: movddup {{.*#+}} xmm0 = xmm1[0,0] 187; SSE41-NEXT: retq 188; 189; AVX-LABEL: shuffle_v2f64_22: 190; AVX: # BB#0: 191; AVX-NEXT: vmovddup {{.*#+}} xmm0 = xmm1[0,0] 192; AVX-NEXT: retq 193 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 2> 194 ret <2 x double> %shuffle 195} 196define <2 x double> @shuffle_v2f64_32(<2 x double> %a, <2 x double> %b) { 197; SSE-LABEL: shuffle_v2f64_32: 198; SSE: # BB#0: 199; SSE-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1,0] 200; SSE-NEXT: movapd %xmm1, %xmm0 201; SSE-NEXT: retq 202; 203; AVX-LABEL: shuffle_v2f64_32: 204; AVX: # BB#0: 205; AVX-NEXT: vpermilpd {{.*#+}} xmm0 = xmm1[1,0] 206; AVX-NEXT: retq 207 208 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 3, i32 2> 209 ret <2 x double> %shuffle 210} 211define <2 x double> @shuffle_v2f64_33(<2 x double> %a, <2 x double> %b) { 212; SSE-LABEL: shuffle_v2f64_33: 213; SSE: # BB#0: 214; SSE-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1] 215; SSE-NEXT: movaps %xmm1, %xmm0 216; SSE-NEXT: retq 217; 218; AVX-LABEL: shuffle_v2f64_33: 219; AVX: # BB#0: 220; AVX-NEXT: vpermilpd {{.*#+}} xmm0 = xmm1[1,1] 221; AVX-NEXT: retq 222 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 3, i32 3> 223 ret <2 x double> %shuffle 224} 225define <2 x double> @shuffle_v2f64_03(<2 x double> %a, <2 x double> %b) { 226; SSE2-LABEL: shuffle_v2f64_03: 227; SSE2: # BB#0: 228; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 229; SSE2-NEXT: movapd %xmm1, %xmm0 230; SSE2-NEXT: retq 231; 232; SSE3-LABEL: shuffle_v2f64_03: 233; SSE3: # BB#0: 234; SSE3-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 235; SSE3-NEXT: movapd %xmm1, %xmm0 236; SSE3-NEXT: retq 237; 238; SSSE3-LABEL: shuffle_v2f64_03: 239; SSSE3: # BB#0: 240; SSSE3-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 241; SSSE3-NEXT: movapd %xmm1, %xmm0 242; SSSE3-NEXT: retq 243; 244; SSE41-LABEL: shuffle_v2f64_03: 245; SSE41: # BB#0: 246; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 247; SSE41-NEXT: retq 248; 249; AVX1-LABEL: shuffle_v2f64_03: 250; AVX1: # BB#0: 251; AVX1-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 252; AVX1-NEXT: retq 253; 254; AVX2-LABEL: shuffle_v2f64_03: 255; AVX2: # BB#0: 256; AVX2-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 257; AVX2-NEXT: retq 258; 259; AVX512VL-LABEL: shuffle_v2f64_03: 260; AVX512VL: # BB#0: 261; AVX512VL-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 262; AVX512VL-NEXT: retq 263 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 0, i32 3> 264 ret <2 x double> %shuffle 265} 266define <2 x double> @shuffle_v2f64_21(<2 x double> %a, <2 x double> %b) { 267; SSE2-LABEL: shuffle_v2f64_21: 268; SSE2: # BB#0: 269; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 270; SSE2-NEXT: retq 271; 272; SSE3-LABEL: shuffle_v2f64_21: 273; SSE3: # BB#0: 274; SSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 275; SSE3-NEXT: retq 276; 277; SSSE3-LABEL: shuffle_v2f64_21: 278; SSSE3: # BB#0: 279; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 280; SSSE3-NEXT: retq 281; 282; SSE41-LABEL: shuffle_v2f64_21: 283; SSE41: # BB#0: 284; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 285; SSE41-NEXT: retq 286; 287; AVX1-LABEL: shuffle_v2f64_21: 288; AVX1: # BB#0: 289; AVX1-NEXT: vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 290; AVX1-NEXT: retq 291; 292; AVX2-LABEL: shuffle_v2f64_21: 293; AVX2: # BB#0: 294; AVX2-NEXT: vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 295; AVX2-NEXT: retq 296; 297; AVX512VL-LABEL: shuffle_v2f64_21: 298; AVX512VL: # BB#0: 299; AVX512VL-NEXT: vmovsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 300; AVX512VL-NEXT: retq 301 %shuffle = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 2, i32 1> 302 ret <2 x double> %shuffle 303} 304 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: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 310; SSE-NEXT: retq 311; 312; AVX-LABEL: shuffle_v2i64_02: 313; AVX: # BB#0: 314; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 315; AVX-NEXT: retq 316 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2> 317 ret <2 x i64> %shuffle 318} 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: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 323; SSE-NEXT: movdqa %xmm1, %xmm0 324; SSE-NEXT: retq 325; 326; AVX-LABEL: shuffle_v2i64_02_copy: 327; AVX: # BB#0: 328; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm2[0] 329; AVX-NEXT: retq 330 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 2> 331 ret <2 x i64> %shuffle 332} 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: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 337; SSE2-NEXT: movapd %xmm1, %xmm0 338; SSE2-NEXT: retq 339; 340; SSE3-LABEL: shuffle_v2i64_03: 341; SSE3: # BB#0: 342; SSE3-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 343; SSE3-NEXT: movapd %xmm1, %xmm0 344; SSE3-NEXT: retq 345; 346; SSSE3-LABEL: shuffle_v2i64_03: 347; SSSE3: # BB#0: 348; SSSE3-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 349; SSSE3-NEXT: movapd %xmm1, %xmm0 350; SSSE3-NEXT: retq 351; 352; SSE41-LABEL: shuffle_v2i64_03: 353; SSE41: # BB#0: 354; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 355; SSE41-NEXT: retq 356; 357; AVX1-LABEL: shuffle_v2i64_03: 358; AVX1: # BB#0: 359; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 360; AVX1-NEXT: retq 361; 362; AVX2-LABEL: shuffle_v2i64_03: 363; AVX2: # BB#0: 364; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3] 365; AVX2-NEXT: retq 366; 367; AVX512VL-LABEL: shuffle_v2i64_03: 368; AVX512VL: # BB#0: 369; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3] 370; AVX512VL-NEXT: retq 371 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3> 372 ret <2 x i64> %shuffle 373} 374define <2 x i64> @shuffle_v2i64_03_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) { 375; SSE2-LABEL: shuffle_v2i64_03_copy: 376; SSE2: # BB#0: 377; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1] 378; SSE2-NEXT: movapd %xmm2, %xmm0 379; SSE2-NEXT: retq 380; 381; SSE3-LABEL: shuffle_v2i64_03_copy: 382; SSE3: # BB#0: 383; SSE3-NEXT: movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1] 384; SSE3-NEXT: movapd %xmm2, %xmm0 385; SSE3-NEXT: retq 386; 387; SSSE3-LABEL: shuffle_v2i64_03_copy: 388; SSSE3: # BB#0: 389; SSSE3-NEXT: movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1] 390; SSSE3-NEXT: movapd %xmm2, %xmm0 391; SSSE3-NEXT: retq 392; 393; SSE41-LABEL: shuffle_v2i64_03_copy: 394; SSE41: # BB#0: 395; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7] 396; SSE41-NEXT: movdqa %xmm1, %xmm0 397; SSE41-NEXT: retq 398; 399; AVX1-LABEL: shuffle_v2i64_03_copy: 400; AVX1: # BB#0: 401; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm2[4,5,6,7] 402; AVX1-NEXT: retq 403; 404; AVX2-LABEL: shuffle_v2i64_03_copy: 405; AVX2: # BB#0: 406; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm2[2,3] 407; AVX2-NEXT: retq 408; 409; AVX512VL-LABEL: shuffle_v2i64_03_copy: 410; AVX512VL: # BB#0: 411; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm2[2,3] 412; AVX512VL-NEXT: retq 413 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 0, i32 3> 414 ret <2 x i64> %shuffle 415} 416define <2 x i64> @shuffle_v2i64_12(<2 x i64> %a, <2 x i64> %b) { 417; SSE2-LABEL: shuffle_v2i64_12: 418; SSE2: # BB#0: 419; SSE2-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0] 420; SSE2-NEXT: retq 421; 422; SSE3-LABEL: shuffle_v2i64_12: 423; SSE3: # BB#0: 424; SSE3-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0] 425; SSE3-NEXT: retq 426; 427; SSSE3-LABEL: shuffle_v2i64_12: 428; SSSE3: # BB#0: 429; SSSE3-NEXT: palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7] 430; SSSE3-NEXT: movdqa %xmm1, %xmm0 431; SSSE3-NEXT: retq 432; 433; SSE41-LABEL: shuffle_v2i64_12: 434; SSE41: # BB#0: 435; SSE41-NEXT: palignr {{.*#+}} xmm1 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7] 436; SSE41-NEXT: movdqa %xmm1, %xmm0 437; SSE41-NEXT: retq 438; 439; AVX-LABEL: shuffle_v2i64_12: 440; AVX: # BB#0: 441; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7] 442; AVX-NEXT: retq 443 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2> 444 ret <2 x i64> %shuffle 445} 446define <2 x i64> @shuffle_v2i64_12_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) { 447; SSE2-LABEL: shuffle_v2i64_12_copy: 448; SSE2: # BB#0: 449; SSE2-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm2[0] 450; SSE2-NEXT: movapd %xmm1, %xmm0 451; SSE2-NEXT: retq 452; 453; SSE3-LABEL: shuffle_v2i64_12_copy: 454; SSE3: # BB#0: 455; SSE3-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm2[0] 456; SSE3-NEXT: movapd %xmm1, %xmm0 457; SSE3-NEXT: retq 458; 459; SSSE3-LABEL: shuffle_v2i64_12_copy: 460; SSSE3: # BB#0: 461; SSSE3-NEXT: palignr {{.*#+}} xmm2 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7] 462; SSSE3-NEXT: movdqa %xmm2, %xmm0 463; SSSE3-NEXT: retq 464; 465; SSE41-LABEL: shuffle_v2i64_12_copy: 466; SSE41: # BB#0: 467; SSE41-NEXT: palignr {{.*#+}} xmm2 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7] 468; SSE41-NEXT: movdqa %xmm2, %xmm0 469; SSE41-NEXT: retq 470; 471; AVX-LABEL: shuffle_v2i64_12_copy: 472; AVX: # BB#0: 473; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm2[0,1,2,3,4,5,6,7] 474; AVX-NEXT: retq 475 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2> 476 ret <2 x i64> %shuffle 477} 478define <2 x i64> @shuffle_v2i64_13(<2 x i64> %a, <2 x i64> %b) { 479; SSE-LABEL: shuffle_v2i64_13: 480; SSE: # BB#0: 481; SSE-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] 482; SSE-NEXT: retq 483; 484; AVX-LABEL: shuffle_v2i64_13: 485; AVX: # BB#0: 486; AVX-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] 487; AVX-NEXT: retq 488 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3> 489 ret <2 x i64> %shuffle 490} 491define <2 x i64> @shuffle_v2i64_13_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) { 492; SSE-LABEL: shuffle_v2i64_13_copy: 493; SSE: # BB#0: 494; SSE-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm2[1] 495; SSE-NEXT: movdqa %xmm1, %xmm0 496; SSE-NEXT: retq 497; 498; AVX-LABEL: shuffle_v2i64_13_copy: 499; AVX: # BB#0: 500; AVX-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm2[1] 501; AVX-NEXT: retq 502 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 3> 503 ret <2 x i64> %shuffle 504} 505define <2 x i64> @shuffle_v2i64_20(<2 x i64> %a, <2 x i64> %b) { 506; SSE-LABEL: shuffle_v2i64_20: 507; SSE: # BB#0: 508; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 509; SSE-NEXT: movdqa %xmm1, %xmm0 510; SSE-NEXT: retq 511; 512; AVX-LABEL: shuffle_v2i64_20: 513; AVX: # BB#0: 514; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 515; AVX-NEXT: retq 516 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0> 517 ret <2 x i64> %shuffle 518} 519define <2 x i64> @shuffle_v2i64_20_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) { 520; SSE-LABEL: shuffle_v2i64_20_copy: 521; SSE: # BB#0: 522; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 523; SSE-NEXT: movdqa %xmm2, %xmm0 524; SSE-NEXT: retq 525; 526; AVX-LABEL: shuffle_v2i64_20_copy: 527; AVX: # BB#0: 528; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm1[0] 529; AVX-NEXT: retq 530 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 0> 531 ret <2 x i64> %shuffle 532} 533define <2 x i64> @shuffle_v2i64_21(<2 x i64> %a, <2 x i64> %b) { 534; SSE2-LABEL: shuffle_v2i64_21: 535; SSE2: # BB#0: 536; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 537; SSE2-NEXT: retq 538; 539; SSE3-LABEL: shuffle_v2i64_21: 540; SSE3: # BB#0: 541; SSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 542; SSE3-NEXT: retq 543; 544; SSSE3-LABEL: shuffle_v2i64_21: 545; SSSE3: # BB#0: 546; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 547; SSSE3-NEXT: retq 548; 549; SSE41-LABEL: shuffle_v2i64_21: 550; SSE41: # BB#0: 551; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 552; SSE41-NEXT: retq 553; 554; AVX1-LABEL: shuffle_v2i64_21: 555; AVX1: # BB#0: 556; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 557; AVX1-NEXT: retq 558; 559; AVX2-LABEL: shuffle_v2i64_21: 560; AVX2: # BB#0: 561; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3] 562; AVX2-NEXT: retq 563; 564; AVX512VL-LABEL: shuffle_v2i64_21: 565; AVX512VL: # BB#0: 566; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3] 567; AVX512VL-NEXT: retq 568 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1> 569 ret <2 x i64> %shuffle 570} 571define <2 x i64> @shuffle_v2i64_21_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) { 572; SSE2-LABEL: shuffle_v2i64_21_copy: 573; SSE2: # BB#0: 574; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1] 575; SSE2-NEXT: movapd %xmm1, %xmm0 576; SSE2-NEXT: retq 577; 578; SSE3-LABEL: shuffle_v2i64_21_copy: 579; SSE3: # BB#0: 580; SSE3-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1] 581; SSE3-NEXT: movapd %xmm1, %xmm0 582; SSE3-NEXT: retq 583; 584; SSSE3-LABEL: shuffle_v2i64_21_copy: 585; SSSE3: # BB#0: 586; SSSE3-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1] 587; SSSE3-NEXT: movapd %xmm1, %xmm0 588; SSSE3-NEXT: retq 589; 590; SSE41-LABEL: shuffle_v2i64_21_copy: 591; SSE41: # BB#0: 592; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7] 593; SSE41-NEXT: movdqa %xmm1, %xmm0 594; SSE41-NEXT: retq 595; 596; AVX1-LABEL: shuffle_v2i64_21_copy: 597; AVX1: # BB#0: 598; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm1[4,5,6,7] 599; AVX1-NEXT: retq 600; 601; AVX2-LABEL: shuffle_v2i64_21_copy: 602; AVX2: # BB#0: 603; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm2[0,1],xmm1[2,3] 604; AVX2-NEXT: retq 605; 606; AVX512VL-LABEL: shuffle_v2i64_21_copy: 607; AVX512VL: # BB#0: 608; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm2[0,1],xmm1[2,3] 609; AVX512VL-NEXT: retq 610 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 2, i32 1> 611 ret <2 x i64> %shuffle 612} 613define <2 x i64> @shuffle_v2i64_30(<2 x i64> %a, <2 x i64> %b) { 614; SSE2-LABEL: shuffle_v2i64_30: 615; SSE2: # BB#0: 616; SSE2-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0] 617; SSE2-NEXT: movapd %xmm1, %xmm0 618; SSE2-NEXT: retq 619; 620; SSE3-LABEL: shuffle_v2i64_30: 621; SSE3: # BB#0: 622; SSE3-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0] 623; SSE3-NEXT: movapd %xmm1, %xmm0 624; SSE3-NEXT: retq 625; 626; SSSE3-LABEL: shuffle_v2i64_30: 627; SSSE3: # BB#0: 628; SSSE3-NEXT: palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7] 629; SSSE3-NEXT: retq 630; 631; SSE41-LABEL: shuffle_v2i64_30: 632; SSE41: # BB#0: 633; SSE41-NEXT: palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7] 634; SSE41-NEXT: retq 635; 636; AVX-LABEL: shuffle_v2i64_30: 637; AVX: # BB#0: 638; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7] 639; AVX-NEXT: retq 640 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0> 641 ret <2 x i64> %shuffle 642} 643define <2 x i64> @shuffle_v2i64_30_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) { 644; SSE2-LABEL: shuffle_v2i64_30_copy: 645; SSE2: # BB#0: 646; SSE2-NEXT: shufpd {{.*#+}} xmm2 = xmm2[1],xmm1[0] 647; SSE2-NEXT: movapd %xmm2, %xmm0 648; SSE2-NEXT: retq 649; 650; SSE3-LABEL: shuffle_v2i64_30_copy: 651; SSE3: # BB#0: 652; SSE3-NEXT: shufpd {{.*#+}} xmm2 = xmm2[1],xmm1[0] 653; SSE3-NEXT: movapd %xmm2, %xmm0 654; SSE3-NEXT: retq 655; 656; SSSE3-LABEL: shuffle_v2i64_30_copy: 657; SSSE3: # BB#0: 658; SSSE3-NEXT: palignr {{.*#+}} xmm1 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7] 659; SSSE3-NEXT: movdqa %xmm1, %xmm0 660; SSSE3-NEXT: retq 661; 662; SSE41-LABEL: shuffle_v2i64_30_copy: 663; SSE41: # BB#0: 664; SSE41-NEXT: palignr {{.*#+}} xmm1 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7] 665; SSE41-NEXT: movdqa %xmm1, %xmm0 666; SSE41-NEXT: retq 667; 668; AVX-LABEL: shuffle_v2i64_30_copy: 669; AVX: # BB#0: 670; AVX-NEXT: vpalignr {{.*#+}} xmm0 = xmm2[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7] 671; AVX-NEXT: retq 672 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 0> 673 ret <2 x i64> %shuffle 674} 675define <2 x i64> @shuffle_v2i64_31(<2 x i64> %a, <2 x i64> %b) { 676; SSE-LABEL: shuffle_v2i64_31: 677; SSE: # BB#0: 678; SSE-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm0[1] 679; SSE-NEXT: movdqa %xmm1, %xmm0 680; SSE-NEXT: retq 681; 682; AVX-LABEL: shuffle_v2i64_31: 683; AVX: # BB#0: 684; AVX-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1] 685; AVX-NEXT: retq 686 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1> 687 ret <2 x i64> %shuffle 688} 689define <2 x i64> @shuffle_v2i64_31_copy(<2 x i64> %nonce, <2 x i64> %a, <2 x i64> %b) { 690; SSE-LABEL: shuffle_v2i64_31_copy: 691; SSE: # BB#0: 692; SSE-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm1[1] 693; SSE-NEXT: movdqa %xmm2, %xmm0 694; SSE-NEXT: retq 695; 696; AVX-LABEL: shuffle_v2i64_31_copy: 697; AVX: # BB#0: 698; AVX-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm2[1],xmm1[1] 699; AVX-NEXT: retq 700 %shuffle = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1> 701 ret <2 x i64> %shuffle 702} 703 704define <2 x i64> @shuffle_v2i64_0z(<2 x i64> %a) { 705; SSE-LABEL: shuffle_v2i64_0z: 706; SSE: # BB#0: 707; SSE-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero 708; SSE-NEXT: retq 709; 710; AVX-LABEL: shuffle_v2i64_0z: 711; AVX: # BB#0: 712; AVX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 713; AVX-NEXT: retq 714 %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3> 715 ret <2 x i64> %shuffle 716} 717 718define <2 x i64> @shuffle_v2i64_1z(<2 x i64> %a) { 719; SSE-LABEL: shuffle_v2i64_1z: 720; SSE: # BB#0: 721; SSE-NEXT: psrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero 722; SSE-NEXT: retq 723; 724; AVX-LABEL: shuffle_v2i64_1z: 725; AVX: # BB#0: 726; AVX-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero 727; AVX-NEXT: retq 728 %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 1, i32 3> 729 ret <2 x i64> %shuffle 730} 731 732define <2 x i64> @shuffle_v2i64_z0(<2 x i64> %a) { 733; SSE-LABEL: shuffle_v2i64_z0: 734; SSE: # BB#0: 735; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7] 736; SSE-NEXT: retq 737; 738; AVX-LABEL: shuffle_v2i64_z0: 739; AVX: # BB#0: 740; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7] 741; AVX-NEXT: retq 742 %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 2, i32 0> 743 ret <2 x i64> %shuffle 744} 745 746define <2 x i64> @shuffle_v2i64_z1(<2 x i64> %a) { 747; SSE2-LABEL: shuffle_v2i64_z1: 748; SSE2: # BB#0: 749; SSE2-NEXT: xorpd %xmm1, %xmm1 750; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 751; SSE2-NEXT: retq 752; 753; SSE3-LABEL: shuffle_v2i64_z1: 754; SSE3: # BB#0: 755; SSE3-NEXT: xorpd %xmm1, %xmm1 756; SSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 757; SSE3-NEXT: retq 758; 759; SSSE3-LABEL: shuffle_v2i64_z1: 760; SSSE3: # BB#0: 761; SSSE3-NEXT: xorpd %xmm1, %xmm1 762; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 763; SSSE3-NEXT: retq 764; 765; SSE41-LABEL: shuffle_v2i64_z1: 766; SSE41: # BB#0: 767; SSE41-NEXT: pxor %xmm1, %xmm1 768; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 769; SSE41-NEXT: retq 770; 771; AVX1-LABEL: shuffle_v2i64_z1: 772; AVX1: # BB#0: 773; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 774; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 775; AVX1-NEXT: retq 776; 777; AVX2-LABEL: shuffle_v2i64_z1: 778; AVX2: # BB#0: 779; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 780; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3] 781; AVX2-NEXT: retq 782; 783; AVX512VL-LABEL: shuffle_v2i64_z1: 784; AVX512VL: # BB#0: 785; AVX512VL-NEXT: vpxord %xmm1, %xmm1, %xmm1 786; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3] 787; AVX512VL-NEXT: retq 788 %shuffle = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32> <i32 2, i32 1> 789 ret <2 x i64> %shuffle 790} 791 792define <2 x double> @shuffle_v2f64_0z(<2 x double> %a) { 793; SSE-LABEL: shuffle_v2f64_0z: 794; SSE: # BB#0: 795; SSE-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero 796; SSE-NEXT: retq 797; 798; AVX-LABEL: shuffle_v2f64_0z: 799; AVX: # BB#0: 800; AVX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 801; AVX-NEXT: retq 802 %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3> 803 ret <2 x double> %shuffle 804} 805 806define <2 x double> @shuffle_v2f64_1z(<2 x double> %a) { 807; SSE-LABEL: shuffle_v2f64_1z: 808; SSE: # BB#0: 809; SSE-NEXT: xorpd %xmm1, %xmm1 810; SSE-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1] 811; SSE-NEXT: retq 812; 813; AVX1-LABEL: shuffle_v2f64_1z: 814; AVX1: # BB#0: 815; AVX1-NEXT: vxorpd %xmm1, %xmm1, %xmm1 816; AVX1-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1] 817; AVX1-NEXT: retq 818; 819; AVX2-LABEL: shuffle_v2f64_1z: 820; AVX2: # BB#0: 821; AVX2-NEXT: vxorpd %xmm1, %xmm1, %xmm1 822; AVX2-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1] 823; AVX2-NEXT: retq 824; 825; AVX512VL-LABEL: shuffle_v2f64_1z: 826; AVX512VL: # BB#0: 827; AVX512VL-NEXT: vpxord %xmm1, %xmm1, %xmm1 828; AVX512VL-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1] 829; AVX512VL-NEXT: retq 830 %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 1, i32 3> 831 ret <2 x double> %shuffle 832} 833 834define <2 x double> @shuffle_v2f64_z0(<2 x double> %a) { 835; SSE-LABEL: shuffle_v2f64_z0: 836; SSE: # BB#0: 837; SSE-NEXT: xorpd %xmm1, %xmm1 838; SSE-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0] 839; SSE-NEXT: movapd %xmm1, %xmm0 840; SSE-NEXT: retq 841; 842; AVX1-LABEL: shuffle_v2f64_z0: 843; AVX1: # BB#0: 844; AVX1-NEXT: vxorpd %xmm1, %xmm1, %xmm1 845; AVX1-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0] 846; AVX1-NEXT: retq 847; 848; AVX2-LABEL: shuffle_v2f64_z0: 849; AVX2: # BB#0: 850; AVX2-NEXT: vxorpd %xmm1, %xmm1, %xmm1 851; AVX2-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0] 852; AVX2-NEXT: retq 853; 854; AVX512VL-LABEL: shuffle_v2f64_z0: 855; AVX512VL: # BB#0: 856; AVX512VL-NEXT: vpxord %xmm1, %xmm1, %xmm1 857; AVX512VL-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0] 858; AVX512VL-NEXT: retq 859 %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 0> 860 ret <2 x double> %shuffle 861} 862 863define <2 x double> @shuffle_v2f64_z1(<2 x double> %a) { 864; SSE2-LABEL: shuffle_v2f64_z1: 865; SSE2: # BB#0: 866; SSE2-NEXT: xorpd %xmm1, %xmm1 867; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 868; SSE2-NEXT: retq 869; 870; SSE3-LABEL: shuffle_v2f64_z1: 871; SSE3: # BB#0: 872; SSE3-NEXT: xorpd %xmm1, %xmm1 873; SSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 874; SSE3-NEXT: retq 875; 876; SSSE3-LABEL: shuffle_v2f64_z1: 877; SSSE3: # BB#0: 878; SSSE3-NEXT: xorpd %xmm1, %xmm1 879; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 880; SSSE3-NEXT: retq 881; 882; SSE41-LABEL: shuffle_v2f64_z1: 883; SSE41: # BB#0: 884; SSE41-NEXT: xorpd %xmm1, %xmm1 885; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 886; SSE41-NEXT: retq 887; 888; AVX1-LABEL: shuffle_v2f64_z1: 889; AVX1: # BB#0: 890; AVX1-NEXT: vxorpd %xmm1, %xmm1, %xmm1 891; AVX1-NEXT: vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 892; AVX1-NEXT: retq 893; 894; AVX2-LABEL: shuffle_v2f64_z1: 895; AVX2: # BB#0: 896; AVX2-NEXT: vxorpd %xmm1, %xmm1, %xmm1 897; AVX2-NEXT: vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 898; AVX2-NEXT: retq 899; 900; AVX512VL-LABEL: shuffle_v2f64_z1: 901; AVX512VL: # BB#0: 902; AVX512VL-NEXT: vpxord %xmm1, %xmm1, %xmm1 903; AVX512VL-NEXT: vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 904; AVX512VL-NEXT: retq 905 %shuffle = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 1> 906 ret <2 x double> %shuffle 907} 908 909define <2 x double> @shuffle_v2f64_bitcast_1z(<2 x double> %a) { 910; SSE-LABEL: shuffle_v2f64_bitcast_1z: 911; SSE: # BB#0: 912; SSE-NEXT: xorpd %xmm1, %xmm1 913; SSE-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0] 914; SSE-NEXT: retq 915; 916; AVX1-LABEL: shuffle_v2f64_bitcast_1z: 917; AVX1: # BB#0: 918; AVX1-NEXT: vxorpd %xmm1, %xmm1, %xmm1 919; AVX1-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0] 920; AVX1-NEXT: retq 921; 922; AVX2-LABEL: shuffle_v2f64_bitcast_1z: 923; AVX2: # BB#0: 924; AVX2-NEXT: vxorpd %xmm1, %xmm1, %xmm1 925; AVX2-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0] 926; AVX2-NEXT: retq 927; 928; AVX512VL-LABEL: shuffle_v2f64_bitcast_1z: 929; AVX512VL: # BB#0: 930; AVX512VL-NEXT: vpxord %xmm1, %xmm1, %xmm1 931; AVX512VL-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0] 932; AVX512VL-NEXT: retq 933 %shuffle64 = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <2 x i32> <i32 2, i32 1> 934 %bitcast32 = bitcast <2 x double> %shuffle64 to <4 x float> 935 %shuffle32 = shufflevector <4 x float> %bitcast32, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 0, i32 1> 936 %bitcast64 = bitcast <4 x float> %shuffle32 to <2 x double> 937 ret <2 x double> %bitcast64 938} 939 940define <2 x i64> @shuffle_v2i64_bitcast_z123(<2 x i64> %x) { 941; SSE2-LABEL: shuffle_v2i64_bitcast_z123: 942; SSE2: # BB#0: 943; SSE2-NEXT: andps {{.*}}(%rip), %xmm0 944; SSE2-NEXT: retq 945; 946; SSE3-LABEL: shuffle_v2i64_bitcast_z123: 947; SSE3: # BB#0: 948; SSE3-NEXT: andps {{.*}}(%rip), %xmm0 949; SSE3-NEXT: retq 950; 951; SSSE3-LABEL: shuffle_v2i64_bitcast_z123: 952; SSSE3: # BB#0: 953; SSSE3-NEXT: andps {{.*}}(%rip), %xmm0 954; SSSE3-NEXT: retq 955; 956; SSE41-LABEL: shuffle_v2i64_bitcast_z123: 957; SSE41: # BB#0: 958; SSE41-NEXT: pxor %xmm1, %xmm1 959; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7] 960; SSE41-NEXT: retq 961; 962; AVX1-LABEL: shuffle_v2i64_bitcast_z123: 963; AVX1: # BB#0: 964; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 965; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7] 966; AVX1-NEXT: retq 967; 968; AVX2-LABEL: shuffle_v2i64_bitcast_z123: 969; AVX2: # BB#0: 970; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 971; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] 972; AVX2-NEXT: retq 973; 974; AVX512VL-LABEL: shuffle_v2i64_bitcast_z123: 975; AVX512VL: # BB#0: 976; AVX512VL-NEXT: vpxord %xmm1, %xmm1, %xmm1 977; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] 978; AVX512VL-NEXT: retq 979 %bitcast32 = bitcast <2 x i64> %x to <4 x float> 980 %shuffle32 = shufflevector <4 x float> %bitcast32, <4 x float> <float 1.000000e+00, float undef, float undef, float undef>, <4 x i32> <i32 4, i32 1, i32 2, i32 3> 981 %bitcast64 = bitcast <4 x float> %shuffle32 to <2 x i64> 982 %and = and <2 x i64> %bitcast64, <i64 -4294967296, i64 -1> 983 ret <2 x i64> %and 984} 985 986define <2 x i64> @insert_reg_and_zero_v2i64(i64 %a) { 987; SSE-LABEL: insert_reg_and_zero_v2i64: 988; SSE: # BB#0: 989; SSE-NEXT: movd %rdi, %xmm0 990; SSE-NEXT: retq 991; 992; AVX-LABEL: insert_reg_and_zero_v2i64: 993; AVX: # BB#0: 994; AVX-NEXT: vmovq %rdi, %xmm0 995; AVX-NEXT: retq 996 %v = insertelement <2 x i64> undef, i64 %a, i32 0 997 %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3> 998 ret <2 x i64> %shuffle 999} 1000 1001define <2 x i64> @insert_mem_and_zero_v2i64(i64* %ptr) { 1002; SSE-LABEL: insert_mem_and_zero_v2i64: 1003; SSE: # BB#0: 1004; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 1005; SSE-NEXT: retq 1006; 1007; AVX-LABEL: insert_mem_and_zero_v2i64: 1008; AVX: # BB#0: 1009; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 1010; AVX-NEXT: retq 1011 %a = load i64, i64* %ptr 1012 %v = insertelement <2 x i64> undef, i64 %a, i32 0 1013 %shuffle = shufflevector <2 x i64> %v, <2 x i64> zeroinitializer, <2 x i32> <i32 0, i32 3> 1014 ret <2 x i64> %shuffle 1015} 1016 1017define <2 x double> @insert_reg_and_zero_v2f64(double %a) { 1018; SSE-LABEL: insert_reg_and_zero_v2f64: 1019; SSE: # BB#0: 1020; SSE-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero 1021; SSE-NEXT: retq 1022; 1023; AVX-LABEL: insert_reg_and_zero_v2f64: 1024; AVX: # BB#0: 1025; AVX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 1026; AVX-NEXT: retq 1027 %v = insertelement <2 x double> undef, double %a, i32 0 1028 %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3> 1029 ret <2 x double> %shuffle 1030} 1031 1032define <2 x double> @insert_mem_and_zero_v2f64(double* %ptr) { 1033; SSE-LABEL: insert_mem_and_zero_v2f64: 1034; SSE: # BB#0: 1035; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1036; SSE-NEXT: retq 1037; 1038; AVX-LABEL: insert_mem_and_zero_v2f64: 1039; AVX: # BB#0: 1040; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 1041; AVX-NEXT: retq 1042 %a = load double, double* %ptr 1043 %v = insertelement <2 x double> undef, double %a, i32 0 1044 %shuffle = shufflevector <2 x double> %v, <2 x double> zeroinitializer, <2 x i32> <i32 0, i32 3> 1045 ret <2 x double> %shuffle 1046} 1047 1048define <2 x i64> @insert_reg_lo_v2i64(i64 %a, <2 x i64> %b) { 1049; SSE2-LABEL: insert_reg_lo_v2i64: 1050; SSE2: # BB#0: 1051; SSE2-NEXT: movd %rdi, %xmm1 1052; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 1053; SSE2-NEXT: retq 1054; 1055; SSE3-LABEL: insert_reg_lo_v2i64: 1056; SSE3: # BB#0: 1057; SSE3-NEXT: movd %rdi, %xmm1 1058; SSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 1059; SSE3-NEXT: retq 1060; 1061; SSSE3-LABEL: insert_reg_lo_v2i64: 1062; SSSE3: # BB#0: 1063; SSSE3-NEXT: movd %rdi, %xmm1 1064; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 1065; SSSE3-NEXT: retq 1066; 1067; SSE41-LABEL: insert_reg_lo_v2i64: 1068; SSE41: # BB#0: 1069; SSE41-NEXT: movd %rdi, %xmm1 1070; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 1071; SSE41-NEXT: retq 1072; 1073; AVX1-LABEL: insert_reg_lo_v2i64: 1074; AVX1: # BB#0: 1075; AVX1-NEXT: vmovq %rdi, %xmm1 1076; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 1077; AVX1-NEXT: retq 1078; 1079; AVX2-LABEL: insert_reg_lo_v2i64: 1080; AVX2: # BB#0: 1081; AVX2-NEXT: vmovq %rdi, %xmm1 1082; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3] 1083; AVX2-NEXT: retq 1084; 1085; AVX512VL-LABEL: insert_reg_lo_v2i64: 1086; AVX512VL: # BB#0: 1087; AVX512VL-NEXT: vmovq %rdi, %xmm1 1088; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3] 1089; AVX512VL-NEXT: retq 1090 %v = insertelement <2 x i64> undef, i64 %a, i32 0 1091 %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 0, i32 3> 1092 ret <2 x i64> %shuffle 1093} 1094 1095define <2 x i64> @insert_mem_lo_v2i64(i64* %ptr, <2 x i64> %b) { 1096; SSE2-LABEL: insert_mem_lo_v2i64: 1097; SSE2: # BB#0: 1098; SSE2-NEXT: movlpd {{.*#+}} xmm0 = mem[0],xmm0[1] 1099; SSE2-NEXT: retq 1100; 1101; SSE3-LABEL: insert_mem_lo_v2i64: 1102; SSE3: # BB#0: 1103; SSE3-NEXT: movlpd {{.*#+}} xmm0 = mem[0],xmm0[1] 1104; SSE3-NEXT: retq 1105; 1106; SSSE3-LABEL: insert_mem_lo_v2i64: 1107; SSSE3: # BB#0: 1108; SSSE3-NEXT: movlpd {{.*#+}} xmm0 = mem[0],xmm0[1] 1109; SSSE3-NEXT: retq 1110; 1111; SSE41-LABEL: insert_mem_lo_v2i64: 1112; SSE41: # BB#0: 1113; SSE41-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1114; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 1115; SSE41-NEXT: retq 1116; 1117; AVX1-LABEL: insert_mem_lo_v2i64: 1118; AVX1: # BB#0: 1119; AVX1-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1120; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 1121; AVX1-NEXT: retq 1122; 1123; AVX2-LABEL: insert_mem_lo_v2i64: 1124; AVX2: # BB#0: 1125; AVX2-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1126; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3] 1127; AVX2-NEXT: retq 1128; 1129; AVX512VL-LABEL: insert_mem_lo_v2i64: 1130; AVX512VL: # BB#0: 1131; AVX512VL-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1132; AVX512VL-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3] 1133; AVX512VL-NEXT: retq 1134 %a = load i64, i64* %ptr 1135 %v = insertelement <2 x i64> undef, i64 %a, i32 0 1136 %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 0, i32 3> 1137 ret <2 x i64> %shuffle 1138} 1139 1140define <2 x i64> @insert_reg_hi_v2i64(i64 %a, <2 x i64> %b) { 1141; SSE-LABEL: insert_reg_hi_v2i64: 1142; SSE: # BB#0: 1143; SSE-NEXT: movd %rdi, %xmm1 1144; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1145; SSE-NEXT: retq 1146; 1147; AVX-LABEL: insert_reg_hi_v2i64: 1148; AVX: # BB#0: 1149; AVX-NEXT: vmovq %rdi, %xmm1 1150; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1151; AVX-NEXT: retq 1152 %v = insertelement <2 x i64> undef, i64 %a, i32 0 1153 %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 2, i32 0> 1154 ret <2 x i64> %shuffle 1155} 1156 1157define <2 x i64> @insert_mem_hi_v2i64(i64* %ptr, <2 x i64> %b) { 1158; SSE-LABEL: insert_mem_hi_v2i64: 1159; SSE: # BB#0: 1160; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 1161; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1162; SSE-NEXT: retq 1163; 1164; AVX-LABEL: insert_mem_hi_v2i64: 1165; AVX: # BB#0: 1166; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 1167; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1168; AVX-NEXT: retq 1169 %a = load i64, i64* %ptr 1170 %v = insertelement <2 x i64> undef, i64 %a, i32 0 1171 %shuffle = shufflevector <2 x i64> %v, <2 x i64> %b, <2 x i32> <i32 2, i32 0> 1172 ret <2 x i64> %shuffle 1173} 1174 1175define <2 x double> @insert_reg_lo_v2f64(double %a, <2 x double> %b) { 1176; SSE2-LABEL: insert_reg_lo_v2f64: 1177; SSE2: # BB#0: 1178; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 1179; SSE2-NEXT: movapd %xmm1, %xmm0 1180; SSE2-NEXT: retq 1181; 1182; SSE3-LABEL: insert_reg_lo_v2f64: 1183; SSE3: # BB#0: 1184; SSE3-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 1185; SSE3-NEXT: movapd %xmm1, %xmm0 1186; SSE3-NEXT: retq 1187; 1188; SSSE3-LABEL: insert_reg_lo_v2f64: 1189; SSSE3: # BB#0: 1190; SSSE3-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 1191; SSSE3-NEXT: movapd %xmm1, %xmm0 1192; SSSE3-NEXT: retq 1193; 1194; SSE41-LABEL: insert_reg_lo_v2f64: 1195; SSE41: # BB#0: 1196; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 1197; SSE41-NEXT: retq 1198; 1199; AVX1-LABEL: insert_reg_lo_v2f64: 1200; AVX1: # BB#0: 1201; AVX1-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 1202; AVX1-NEXT: retq 1203; 1204; AVX2-LABEL: insert_reg_lo_v2f64: 1205; AVX2: # BB#0: 1206; AVX2-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 1207; AVX2-NEXT: retq 1208; 1209; AVX512VL-LABEL: insert_reg_lo_v2f64: 1210; AVX512VL: # BB#0: 1211; AVX512VL-NEXT: vmovsd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 1212; AVX512VL-NEXT: retq 1213 %v = insertelement <2 x double> undef, double %a, i32 0 1214 %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 0, i32 3> 1215 ret <2 x double> %shuffle 1216} 1217 1218define <2 x double> @insert_mem_lo_v2f64(double* %ptr, <2 x double> %b) { 1219; SSE-LABEL: insert_mem_lo_v2f64: 1220; SSE: # BB#0: 1221; SSE-NEXT: movlpd {{.*#+}} xmm0 = mem[0],xmm0[1] 1222; SSE-NEXT: retq 1223; 1224; AVX-LABEL: insert_mem_lo_v2f64: 1225; AVX: # BB#0: 1226; AVX-NEXT: vmovlpd {{.*#+}} xmm0 = mem[0],xmm0[1] 1227; AVX-NEXT: retq 1228 %a = load double, double* %ptr 1229 %v = insertelement <2 x double> undef, double %a, i32 0 1230 %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 0, i32 3> 1231 ret <2 x double> %shuffle 1232} 1233 1234define <2 x double> @insert_reg_hi_v2f64(double %a, <2 x double> %b) { 1235; SSE-LABEL: insert_reg_hi_v2f64: 1236; SSE: # BB#0: 1237; SSE-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0] 1238; SSE-NEXT: movapd %xmm1, %xmm0 1239; SSE-NEXT: retq 1240; 1241; AVX-LABEL: insert_reg_hi_v2f64: 1242; AVX: # BB#0: 1243; AVX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1244; AVX-NEXT: retq 1245 %v = insertelement <2 x double> undef, double %a, i32 0 1246 %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 2, i32 0> 1247 ret <2 x double> %shuffle 1248} 1249 1250define <2 x double> @insert_mem_hi_v2f64(double* %ptr, <2 x double> %b) { 1251; SSE-LABEL: insert_mem_hi_v2f64: 1252; SSE: # BB#0: 1253; SSE-NEXT: movhpd {{.*#+}} xmm0 = xmm0[0],mem[0] 1254; SSE-NEXT: retq 1255; 1256; AVX-LABEL: insert_mem_hi_v2f64: 1257; AVX: # BB#0: 1258; AVX-NEXT: vmovhpd {{.*#+}} xmm0 = xmm0[0],mem[0] 1259; AVX-NEXT: retq 1260 %a = load double, double* %ptr 1261 %v = insertelement <2 x double> undef, double %a, i32 0 1262 %shuffle = shufflevector <2 x double> %v, <2 x double> %b, <2 x i32> <i32 2, i32 0> 1263 ret <2 x double> %shuffle 1264} 1265 1266define <2 x double> @insert_dup_reg_v2f64(double %a) { 1267; SSE2-LABEL: insert_dup_reg_v2f64: 1268; SSE2: # BB#0: 1269; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0] 1270; SSE2-NEXT: retq 1271; 1272; SSE3-LABEL: insert_dup_reg_v2f64: 1273; SSE3: # BB#0: 1274; SSE3-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 1275; SSE3-NEXT: retq 1276; 1277; SSSE3-LABEL: insert_dup_reg_v2f64: 1278; SSSE3: # BB#0: 1279; SSSE3-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 1280; SSSE3-NEXT: retq 1281; 1282; SSE41-LABEL: insert_dup_reg_v2f64: 1283; SSE41: # BB#0: 1284; SSE41-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 1285; SSE41-NEXT: retq 1286; 1287; AVX-LABEL: insert_dup_reg_v2f64: 1288; AVX: # BB#0: 1289; AVX-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0] 1290; AVX-NEXT: retq 1291 %v = insertelement <2 x double> undef, double %a, i32 0 1292 %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0> 1293 ret <2 x double> %shuffle 1294} 1295 1296define <2 x double> @insert_dup_mem_v2f64(double* %ptr) { 1297; SSE2-LABEL: insert_dup_mem_v2f64: 1298; SSE2: # BB#0: 1299; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1300; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0] 1301; SSE2-NEXT: retq 1302; 1303; SSE3-LABEL: insert_dup_mem_v2f64: 1304; SSE3: # BB#0: 1305; SSE3-NEXT: movddup {{.*#+}} xmm0 = mem[0,0] 1306; SSE3-NEXT: retq 1307; 1308; SSSE3-LABEL: insert_dup_mem_v2f64: 1309; SSSE3: # BB#0: 1310; SSSE3-NEXT: movddup {{.*#+}} xmm0 = mem[0,0] 1311; SSSE3-NEXT: retq 1312; 1313; SSE41-LABEL: insert_dup_mem_v2f64: 1314; SSE41: # BB#0: 1315; SSE41-NEXT: movddup {{.*#+}} xmm0 = mem[0,0] 1316; SSE41-NEXT: retq 1317; 1318; AVX-LABEL: insert_dup_mem_v2f64: 1319; AVX: # BB#0: 1320; AVX-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0] 1321; AVX-NEXT: retq 1322 %a = load double, double* %ptr 1323 %v = insertelement <2 x double> undef, double %a, i32 0 1324 %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0> 1325 ret <2 x double> %shuffle 1326} 1327 1328define <2 x double> @insert_dup_mem128_v2f64(<2 x double>* %ptr) nounwind { 1329; SSE2-LABEL: insert_dup_mem128_v2f64: 1330; SSE2: # BB#0: 1331; SSE2-NEXT: movaps (%rdi), %xmm0 1332; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0] 1333; SSE2-NEXT: retq 1334; 1335; SSE3-LABEL: insert_dup_mem128_v2f64: 1336; SSE3: # BB#0: 1337; SSE3-NEXT: movddup {{.*#+}} xmm0 = mem[0,0] 1338; SSE3-NEXT: retq 1339; 1340; SSSE3-LABEL: insert_dup_mem128_v2f64: 1341; SSSE3: # BB#0: 1342; SSSE3-NEXT: movddup {{.*#+}} xmm0 = mem[0,0] 1343; SSSE3-NEXT: retq 1344; 1345; SSE41-LABEL: insert_dup_mem128_v2f64: 1346; SSE41: # BB#0: 1347; SSE41-NEXT: movddup {{.*#+}} xmm0 = mem[0,0] 1348; SSE41-NEXT: retq 1349; 1350; AVX-LABEL: insert_dup_mem128_v2f64: 1351; AVX: # BB#0: 1352; AVX-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0] 1353; AVX-NEXT: retq 1354 %v = load <2 x double>, <2 x double>* %ptr 1355 %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0> 1356 ret <2 x double> %shuffle 1357} 1358 1359 1360define <2 x i64> @insert_dup_mem_v2i64(i64* %ptr) { 1361; SSE-LABEL: insert_dup_mem_v2i64: 1362; SSE: # BB#0: 1363; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 1364; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 1365; SSE-NEXT: retq 1366; 1367; AVX1-LABEL: insert_dup_mem_v2i64: 1368; AVX1: # BB#0: 1369; AVX1-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 1370; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 1371; AVX1-NEXT: retq 1372; 1373; AVX2-LABEL: insert_dup_mem_v2i64: 1374; AVX2: # BB#0: 1375; AVX2-NEXT: vpbroadcastq (%rdi), %xmm0 1376; AVX2-NEXT: retq 1377; 1378; AVX512VL-LABEL: insert_dup_mem_v2i64: 1379; AVX512VL: # BB#0: 1380; AVX512VL-NEXT: vpbroadcastq (%rdi), %xmm0 1381; AVX512VL-NEXT: retq 1382 %tmp = load i64, i64* %ptr, align 1 1383 %tmp1 = insertelement <2 x i64> undef, i64 %tmp, i32 0 1384 %tmp2 = shufflevector <2 x i64> %tmp1, <2 x i64> undef, <2 x i32> zeroinitializer 1385 ret <2 x i64> %tmp2 1386} 1387 1388define <2 x double> @shuffle_mem_v2f64_10(<2 x double>* %ptr) { 1389; SSE-LABEL: shuffle_mem_v2f64_10: 1390; SSE: # BB#0: 1391; SSE-NEXT: movapd (%rdi), %xmm0 1392; SSE-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1,0] 1393; SSE-NEXT: retq 1394; 1395; AVX-LABEL: shuffle_mem_v2f64_10: 1396; AVX: # BB#0: 1397; AVX-NEXT: vpermilpd {{.*#+}} xmm0 = mem[1,0] 1398; AVX-NEXT: retq 1399 1400 %a = load <2 x double>, <2 x double>* %ptr 1401 %shuffle = shufflevector <2 x double> %a, <2 x double> undef, <2 x i32> <i32 1, i32 0> 1402 ret <2 x double> %shuffle 1403} 1404