1; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2 2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3 3; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41 4; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 5; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 6; 7; Just one 32-bit run to make sure we do reasonable things there. 8; RUN: llc < %s -mtriple=i686-apple-darwin -mcpu=i686 -mattr=+sse4.1 | FileCheck %s --check-prefix=X32-SSE41 9 10define <8 x i32> @sext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp { 11; SSE2-LABEL: sext_8i16_to_8i32: 12; SSE2: ## BB#0: 13; SSE2-NEXT: movdqa %xmm0, %xmm1 14; SSE2-NEXT: ## kill: XMM0<def> XMM1<kill> 15; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 16; SSE2-NEXT: pslld $16, %xmm0 17; SSE2-NEXT: psrad $16, %xmm0 18; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 19; SSE2-NEXT: pslld $16, %xmm1 20; SSE2-NEXT: psrad $16, %xmm1 21; SSE2-NEXT: retq 22; 23; SSSE3-LABEL: sext_8i16_to_8i32: 24; SSSE3: ## BB#0: 25; SSSE3-NEXT: movdqa %xmm0, %xmm1 26; SSSE3-NEXT: ## kill: XMM0<def> XMM1<kill> 27; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 28; SSSE3-NEXT: pslld $16, %xmm0 29; SSSE3-NEXT: psrad $16, %xmm0 30; SSSE3-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 31; SSSE3-NEXT: pslld $16, %xmm1 32; SSSE3-NEXT: psrad $16, %xmm1 33; SSSE3-NEXT: retq 34; 35; SSE41-LABEL: sext_8i16_to_8i32: 36; SSE41: ## BB#0: 37; SSE41-NEXT: movdqa %xmm0, %xmm1 38; SSE41-NEXT: pmovzxwd %xmm1, %xmm0 39; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 40; SSE41-NEXT: pslld $16, %xmm1 41; SSE41-NEXT: psrad $16, %xmm1 42; SSE41-NEXT: pslld $16, %xmm0 43; SSE41-NEXT: psrad $16, %xmm0 44; SSE41-NEXT: retq 45; 46; AVX1-LABEL: sext_8i16_to_8i32: 47; AVX1: ## BB#0: 48; AVX1-NEXT: vpmovsxwd %xmm0, %xmm1 49; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1] 50; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0 51; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 52; AVX1-NEXT: retq 53; 54; AVX2-LABEL: sext_8i16_to_8i32: 55; AVX2: ## BB#0: 56; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0 57; AVX2-NEXT: retq 58; 59; X32-SSE41-LABEL: sext_8i16_to_8i32: 60; X32-SSE41: ## BB#0: 61; X32-SSE41-NEXT: movdqa %xmm0, %xmm1 62; X32-SSE41-NEXT: pmovzxwd %xmm1, %xmm0 63; X32-SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 64; X32-SSE41-NEXT: pslld $16, %xmm1 65; X32-SSE41-NEXT: psrad $16, %xmm1 66; X32-SSE41-NEXT: pslld $16, %xmm0 67; X32-SSE41-NEXT: psrad $16, %xmm0 68; X32-SSE41-NEXT: retl 69 70 %B = sext <8 x i16> %A to <8 x i32> 71 ret <8 x i32>%B 72} 73 74define <4 x i64> @sext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp { 75; SSE2-LABEL: sext_4i32_to_4i64: 76; SSE2: ## BB#0: 77; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0] 78; SSE2-NEXT: movd %xmm1, %rax 79; SSE2-NEXT: cltq 80; SSE2-NEXT: movd %rax, %xmm2 81; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1] 82; SSE2-NEXT: movd %xmm1, %rax 83; SSE2-NEXT: cltq 84; SSE2-NEXT: movd %rax, %xmm1 85; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 86; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0] 87; SSE2-NEXT: movd %xmm0, %rax 88; SSE2-NEXT: cltq 89; SSE2-NEXT: movd %rax, %xmm1 90; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] 91; SSE2-NEXT: movd %xmm0, %rax 92; SSE2-NEXT: cltq 93; SSE2-NEXT: movd %rax, %xmm0 94; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 95; SSE2-NEXT: movdqa %xmm2, %xmm0 96; SSE2-NEXT: retq 97; 98; SSSE3-LABEL: sext_4i32_to_4i64: 99; SSSE3: ## BB#0: 100; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0] 101; SSSE3-NEXT: movd %xmm1, %rax 102; SSSE3-NEXT: cltq 103; SSSE3-NEXT: movd %rax, %xmm2 104; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1] 105; SSSE3-NEXT: movd %xmm1, %rax 106; SSSE3-NEXT: cltq 107; SSSE3-NEXT: movd %rax, %xmm1 108; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 109; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0] 110; SSSE3-NEXT: movd %xmm0, %rax 111; SSSE3-NEXT: cltq 112; SSSE3-NEXT: movd %rax, %xmm1 113; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] 114; SSSE3-NEXT: movd %xmm0, %rax 115; SSSE3-NEXT: cltq 116; SSSE3-NEXT: movd %rax, %xmm0 117; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 118; SSSE3-NEXT: movdqa %xmm2, %xmm0 119; SSSE3-NEXT: retq 120; 121; SSE41-LABEL: sext_4i32_to_4i64: 122; SSE41: ## BB#0: 123; SSE41-NEXT: pmovzxdq %xmm0, %xmm1 124; SSE41-NEXT: pextrq $1, %xmm1, %rax 125; SSE41-NEXT: cltq 126; SSE41-NEXT: movd %rax, %xmm3 127; SSE41-NEXT: movd %xmm1, %rax 128; SSE41-NEXT: cltq 129; SSE41-NEXT: movd %rax, %xmm2 130; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] 131; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0] 132; SSE41-NEXT: pextrq $1, %xmm0, %rax 133; SSE41-NEXT: cltq 134; SSE41-NEXT: movd %rax, %xmm3 135; SSE41-NEXT: movd %xmm0, %rax 136; SSE41-NEXT: cltq 137; SSE41-NEXT: movd %rax, %xmm1 138; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 139; SSE41-NEXT: movdqa %xmm2, %xmm0 140; SSE41-NEXT: retq 141; 142; AVX1-LABEL: sext_4i32_to_4i64: 143; AVX1: ## BB#0: 144; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1 145; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1] 146; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0 147; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 148; AVX1-NEXT: retq 149; 150; AVX2-LABEL: sext_4i32_to_4i64: 151; AVX2: ## BB#0: 152; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0 153; AVX2-NEXT: retq 154; 155; X32-SSE41-LABEL: sext_4i32_to_4i64: 156; X32-SSE41: ## BB#0: 157; X32-SSE41-NEXT: pmovzxdq %xmm0, %xmm2 158; X32-SSE41-NEXT: movd %xmm2, %eax 159; X32-SSE41-NEXT: sarl $31, %eax 160; X32-SSE41-NEXT: pextrd $2, %xmm2, %ecx 161; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm2 162; X32-SSE41-NEXT: sarl $31, %ecx 163; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm2 164; X32-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,0,3,0] 165; X32-SSE41-NEXT: movd %xmm1, %eax 166; X32-SSE41-NEXT: sarl $31, %eax 167; X32-SSE41-NEXT: pextrd $2, %xmm1, %ecx 168; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1 169; X32-SSE41-NEXT: sarl $31, %ecx 170; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm1 171; X32-SSE41-NEXT: movdqa %xmm2, %xmm0 172; X32-SSE41-NEXT: retl 173 174 %B = sext <4 x i32> %A to <4 x i64> 175 ret <4 x i64>%B 176} 177 178define <4 x i32> @load_sext_test1(<4 x i16> *%ptr) { 179; SSE2-LABEL: load_sext_test1: 180; SSE2: ## BB#0: 181; SSE2-NEXT: movq (%rdi), %xmm0 182; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 183; SSE2-NEXT: psrad $16, %xmm0 184; SSE2-NEXT: retq 185; 186; SSSE3-LABEL: load_sext_test1: 187; SSSE3: ## BB#0: 188; SSSE3-NEXT: movq (%rdi), %xmm0 189; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 190; SSSE3-NEXT: psrad $16, %xmm0 191; SSSE3-NEXT: retq 192; 193; SSE41-LABEL: load_sext_test1: 194; SSE41: ## BB#0: 195; SSE41-NEXT: pmovsxwd (%rdi), %xmm0 196; SSE41-NEXT: retq 197; 198; AVX-LABEL: load_sext_test1: 199; AVX: ## BB#0: 200; AVX-NEXT: vpmovsxwd (%rdi), %xmm0 201; AVX-NEXT: retq 202; 203; X32-SSE41-LABEL: load_sext_test1: 204; X32-SSE41: ## BB#0: 205; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 206; X32-SSE41-NEXT: pmovsxwd (%eax), %xmm0 207; X32-SSE41-NEXT: retl 208 209 %X = load <4 x i16>* %ptr 210 %Y = sext <4 x i16> %X to <4 x i32> 211 ret <4 x i32>%Y 212} 213 214define <4 x i32> @load_sext_test2(<4 x i8> *%ptr) { 215; SSE2-LABEL: load_sext_test2: 216; SSE2: ## BB#0: 217; SSE2-NEXT: movl (%rdi), %eax 218; SSE2-NEXT: movl %eax, %ecx 219; SSE2-NEXT: shll $8, %ecx 220; SSE2-NEXT: movd %eax, %xmm0 221; SSE2-NEXT: pextrw $1, %xmm0, %edx 222; SSE2-NEXT: pinsrw $1, %ecx, %xmm0 223; SSE2-NEXT: pinsrw $3, %eax, %xmm0 224; SSE2-NEXT: movl %edx, %eax 225; SSE2-NEXT: shll $8, %eax 226; SSE2-NEXT: pinsrw $5, %eax, %xmm0 227; SSE2-NEXT: pinsrw $7, %edx, %xmm0 228; SSE2-NEXT: psrad $24, %xmm0 229; SSE2-NEXT: retq 230; 231; SSSE3-LABEL: load_sext_test2: 232; SSSE3: ## BB#0: 233; SSSE3-NEXT: movd (%rdi), %xmm0 234; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = zero,zero,zero,xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3] 235; SSSE3-NEXT: psrad $24, %xmm0 236; SSSE3-NEXT: retq 237; 238; SSE41-LABEL: load_sext_test2: 239; SSE41: ## BB#0: 240; SSE41-NEXT: pmovsxbd (%rdi), %xmm0 241; SSE41-NEXT: retq 242; 243; AVX-LABEL: load_sext_test2: 244; AVX: ## BB#0: 245; AVX-NEXT: vpmovsxbd (%rdi), %xmm0 246; AVX-NEXT: retq 247; 248; X32-SSE41-LABEL: load_sext_test2: 249; X32-SSE41: ## BB#0: 250; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 251; X32-SSE41-NEXT: pmovsxbd (%eax), %xmm0 252; X32-SSE41-NEXT: retl 253 %X = load <4 x i8>* %ptr 254 %Y = sext <4 x i8> %X to <4 x i32> 255 ret <4 x i32>%Y 256} 257 258define <2 x i64> @load_sext_test3(<2 x i8> *%ptr) { 259; SSE2-LABEL: load_sext_test3: 260; SSE2: ## BB#0: 261; SSE2-NEXT: movsbq 1(%rdi), %rax 262; SSE2-NEXT: movd %rax, %xmm1 263; SSE2-NEXT: movsbq (%rdi), %rax 264; SSE2-NEXT: movd %rax, %xmm0 265; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 266; SSE2-NEXT: retq 267; 268; SSSE3-LABEL: load_sext_test3: 269; SSSE3: ## BB#0: 270; SSSE3-NEXT: movsbq 1(%rdi), %rax 271; SSSE3-NEXT: movd %rax, %xmm1 272; SSSE3-NEXT: movsbq (%rdi), %rax 273; SSSE3-NEXT: movd %rax, %xmm0 274; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 275; SSSE3-NEXT: retq 276; 277; SSE41-LABEL: load_sext_test3: 278; SSE41: ## BB#0: 279; SSE41-NEXT: pmovsxbq (%rdi), %xmm0 280; SSE41-NEXT: retq 281; 282; AVX-LABEL: load_sext_test3: 283; AVX: ## BB#0: 284; AVX-NEXT: vpmovsxbq (%rdi), %xmm0 285; AVX-NEXT: retq 286; 287; X32-SSE41-LABEL: load_sext_test3: 288; X32-SSE41: ## BB#0: 289; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 290; X32-SSE41-NEXT: pmovsxbq (%eax), %xmm0 291; X32-SSE41-NEXT: retl 292 %X = load <2 x i8>* %ptr 293 %Y = sext <2 x i8> %X to <2 x i64> 294 ret <2 x i64>%Y 295} 296 297define <2 x i64> @load_sext_test4(<2 x i16> *%ptr) { 298; SSE2-LABEL: load_sext_test4: 299; SSE2: ## BB#0: 300; SSE2-NEXT: movswq 2(%rdi), %rax 301; SSE2-NEXT: movd %rax, %xmm1 302; SSE2-NEXT: movswq (%rdi), %rax 303; SSE2-NEXT: movd %rax, %xmm0 304; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 305; SSE2-NEXT: retq 306; 307; SSSE3-LABEL: load_sext_test4: 308; SSSE3: ## BB#0: 309; SSSE3-NEXT: movswq 2(%rdi), %rax 310; SSSE3-NEXT: movd %rax, %xmm1 311; SSSE3-NEXT: movswq (%rdi), %rax 312; SSSE3-NEXT: movd %rax, %xmm0 313; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 314; SSSE3-NEXT: retq 315; 316; SSE41-LABEL: load_sext_test4: 317; SSE41: ## BB#0: 318; SSE41-NEXT: pmovsxwq (%rdi), %xmm0 319; SSE41-NEXT: retq 320; 321; AVX-LABEL: load_sext_test4: 322; AVX: ## BB#0: 323; AVX-NEXT: vpmovsxwq (%rdi), %xmm0 324; AVX-NEXT: retq 325; 326; X32-SSE41-LABEL: load_sext_test4: 327; X32-SSE41: ## BB#0: 328; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 329; X32-SSE41-NEXT: pmovsxwq (%eax), %xmm0 330; X32-SSE41-NEXT: retl 331 %X = load <2 x i16>* %ptr 332 %Y = sext <2 x i16> %X to <2 x i64> 333 ret <2 x i64>%Y 334} 335 336define <2 x i64> @load_sext_test5(<2 x i32> *%ptr) { 337; SSE2-LABEL: load_sext_test5: 338; SSE2: ## BB#0: 339; SSE2-NEXT: movslq 4(%rdi), %rax 340; SSE2-NEXT: movd %rax, %xmm1 341; SSE2-NEXT: movslq (%rdi), %rax 342; SSE2-NEXT: movd %rax, %xmm0 343; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 344; SSE2-NEXT: retq 345; 346; SSSE3-LABEL: load_sext_test5: 347; SSSE3: ## BB#0: 348; SSSE3-NEXT: movslq 4(%rdi), %rax 349; SSSE3-NEXT: movd %rax, %xmm1 350; SSSE3-NEXT: movslq (%rdi), %rax 351; SSSE3-NEXT: movd %rax, %xmm0 352; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 353; SSSE3-NEXT: retq 354; 355; SSE41-LABEL: load_sext_test5: 356; SSE41: ## BB#0: 357; SSE41-NEXT: pmovsxdq (%rdi), %xmm0 358; SSE41-NEXT: retq 359; 360; AVX-LABEL: load_sext_test5: 361; AVX: ## BB#0: 362; AVX-NEXT: vpmovsxdq (%rdi), %xmm0 363; AVX-NEXT: retq 364; 365; X32-SSE41-LABEL: load_sext_test5: 366; X32-SSE41: ## BB#0: 367; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 368; X32-SSE41-NEXT: pmovsxdq (%eax), %xmm0 369; X32-SSE41-NEXT: retl 370 %X = load <2 x i32>* %ptr 371 %Y = sext <2 x i32> %X to <2 x i64> 372 ret <2 x i64>%Y 373} 374 375define <8 x i16> @load_sext_test6(<8 x i8> *%ptr) { 376; SSE2-LABEL: load_sext_test6: 377; SSE2: ## BB#0: 378; SSE2-NEXT: movq (%rdi), %xmm0 379; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 380; SSE2-NEXT: psraw $8, %xmm0 381; SSE2-NEXT: retq 382; 383; SSSE3-LABEL: load_sext_test6: 384; SSSE3: ## BB#0: 385; SSSE3-NEXT: movq (%rdi), %xmm0 386; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 387; SSSE3-NEXT: psraw $8, %xmm0 388; SSSE3-NEXT: retq 389; 390; SSE41-LABEL: load_sext_test6: 391; SSE41: ## BB#0: 392; SSE41-NEXT: pmovsxbw (%rdi), %xmm0 393; SSE41-NEXT: retq 394; 395; AVX-LABEL: load_sext_test6: 396; AVX: ## BB#0: 397; AVX-NEXT: vpmovsxbw (%rdi), %xmm0 398; AVX-NEXT: retq 399; 400; X32-SSE41-LABEL: load_sext_test6: 401; X32-SSE41: ## BB#0: 402; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 403; X32-SSE41-NEXT: pmovsxbw (%eax), %xmm0 404; X32-SSE41-NEXT: retl 405 %X = load <8 x i8>* %ptr 406 %Y = sext <8 x i8> %X to <8 x i16> 407 ret <8 x i16>%Y 408} 409 410define <4 x i64> @sext_4i1_to_4i64(<4 x i1> %mask) { 411; SSE2-LABEL: sext_4i1_to_4i64: 412; SSE2: ## BB#0: 413; SSE2-NEXT: pslld $31, %xmm0 414; SSE2-NEXT: psrad $31, %xmm0 415; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0] 416; SSE2-NEXT: movd %xmm1, %rax 417; SSE2-NEXT: cltq 418; SSE2-NEXT: movd %rax, %xmm2 419; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1] 420; SSE2-NEXT: movd %xmm1, %rax 421; SSE2-NEXT: cltq 422; SSE2-NEXT: movd %rax, %xmm1 423; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 424; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0] 425; SSE2-NEXT: movd %xmm0, %rax 426; SSE2-NEXT: cltq 427; SSE2-NEXT: movd %rax, %xmm1 428; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] 429; SSE2-NEXT: movd %xmm0, %rax 430; SSE2-NEXT: cltq 431; SSE2-NEXT: movd %rax, %xmm0 432; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 433; SSE2-NEXT: movdqa %xmm2, %xmm0 434; SSE2-NEXT: retq 435; 436; SSSE3-LABEL: sext_4i1_to_4i64: 437; SSSE3: ## BB#0: 438; SSSE3-NEXT: pslld $31, %xmm0 439; SSSE3-NEXT: psrad $31, %xmm0 440; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0] 441; SSSE3-NEXT: movd %xmm1, %rax 442; SSSE3-NEXT: cltq 443; SSSE3-NEXT: movd %rax, %xmm2 444; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1] 445; SSSE3-NEXT: movd %xmm1, %rax 446; SSSE3-NEXT: cltq 447; SSSE3-NEXT: movd %rax, %xmm1 448; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 449; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0] 450; SSSE3-NEXT: movd %xmm0, %rax 451; SSSE3-NEXT: cltq 452; SSSE3-NEXT: movd %rax, %xmm1 453; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] 454; SSSE3-NEXT: movd %xmm0, %rax 455; SSSE3-NEXT: cltq 456; SSSE3-NEXT: movd %rax, %xmm0 457; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 458; SSSE3-NEXT: movdqa %xmm2, %xmm0 459; SSSE3-NEXT: retq 460; 461; SSE41-LABEL: sext_4i1_to_4i64: 462; SSE41: ## BB#0: 463; SSE41-NEXT: pslld $31, %xmm0 464; SSE41-NEXT: psrad $31, %xmm0 465; SSE41-NEXT: pmovzxdq %xmm0, %xmm1 466; SSE41-NEXT: pextrq $1, %xmm1, %rax 467; SSE41-NEXT: cltq 468; SSE41-NEXT: movd %rax, %xmm3 469; SSE41-NEXT: movd %xmm1, %rax 470; SSE41-NEXT: cltq 471; SSE41-NEXT: movd %rax, %xmm2 472; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] 473; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0] 474; SSE41-NEXT: pextrq $1, %xmm0, %rax 475; SSE41-NEXT: cltq 476; SSE41-NEXT: movd %rax, %xmm3 477; SSE41-NEXT: movd %xmm0, %rax 478; SSE41-NEXT: cltq 479; SSE41-NEXT: movd %rax, %xmm1 480; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 481; SSE41-NEXT: movdqa %xmm2, %xmm0 482; SSE41-NEXT: retq 483; 484; AVX1-LABEL: sext_4i1_to_4i64: 485; AVX1: ## BB#0: 486; AVX1-NEXT: vpslld $31, %xmm0, %xmm0 487; AVX1-NEXT: vpsrad $31, %xmm0, %xmm0 488; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1 489; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1] 490; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0 491; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 492; AVX1-NEXT: retq 493; 494; AVX2-LABEL: sext_4i1_to_4i64: 495; AVX2: ## BB#0: 496; AVX2-NEXT: vpslld $31, %xmm0, %xmm0 497; AVX2-NEXT: vpsrad $31, %xmm0, %xmm0 498; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0 499; AVX2-NEXT: retq 500; 501; X32-SSE41-LABEL: sext_4i1_to_4i64: 502; X32-SSE41: ## BB#0: 503; X32-SSE41-NEXT: pslld $31, %xmm0 504; X32-SSE41-NEXT: psrad $31, %xmm0 505; X32-SSE41-NEXT: pmovzxdq %xmm0, %xmm2 506; X32-SSE41-NEXT: movd %xmm2, %eax 507; X32-SSE41-NEXT: sarl $31, %eax 508; X32-SSE41-NEXT: pextrd $2, %xmm2, %ecx 509; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm2 510; X32-SSE41-NEXT: sarl $31, %ecx 511; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm2 512; X32-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,0,3,0] 513; X32-SSE41-NEXT: movd %xmm1, %eax 514; X32-SSE41-NEXT: sarl $31, %eax 515; X32-SSE41-NEXT: pextrd $2, %xmm1, %ecx 516; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1 517; X32-SSE41-NEXT: sarl $31, %ecx 518; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm1 519; X32-SSE41-NEXT: movdqa %xmm2, %xmm0 520; X32-SSE41-NEXT: retl 521 %extmask = sext <4 x i1> %mask to <4 x i64> 522 ret <4 x i64> %extmask 523} 524 525define <16 x i16> @sext_16i8_to_16i16(<16 x i8> *%ptr) { 526; SSE2-LABEL: sext_16i8_to_16i16: 527; SSE2: ## BB#0: 528; SSE2-NEXT: movdqa (%rdi), %xmm1 529; SSE2-NEXT: movdqa %xmm1, %xmm0 530; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 531; SSE2-NEXT: psllw $8, %xmm0 532; SSE2-NEXT: psraw $8, %xmm0 533; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 534; SSE2-NEXT: psllw $8, %xmm1 535; SSE2-NEXT: psraw $8, %xmm1 536; SSE2-NEXT: retq 537; 538; SSSE3-LABEL: sext_16i8_to_16i16: 539; SSSE3: ## BB#0: 540; SSSE3-NEXT: movdqa (%rdi), %xmm1 541; SSSE3-NEXT: movdqa %xmm1, %xmm0 542; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 543; SSSE3-NEXT: psllw $8, %xmm0 544; SSSE3-NEXT: psraw $8, %xmm0 545; SSSE3-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 546; SSSE3-NEXT: psllw $8, %xmm1 547; SSSE3-NEXT: psraw $8, %xmm1 548; SSSE3-NEXT: retq 549; 550; SSE41-LABEL: sext_16i8_to_16i16: 551; SSE41: ## BB#0: 552; SSE41-NEXT: movdqa (%rdi), %xmm1 553; SSE41-NEXT: pmovzxbw %xmm1, %xmm0 554; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 555; SSE41-NEXT: psllw $8, %xmm1 556; SSE41-NEXT: psraw $8, %xmm1 557; SSE41-NEXT: psllw $8, %xmm0 558; SSE41-NEXT: psraw $8, %xmm0 559; SSE41-NEXT: retq 560; 561; AVX1-LABEL: sext_16i8_to_16i16: 562; AVX1: ## BB#0: 563; AVX1-NEXT: vmovdqa (%rdi), %xmm0 564; AVX1-NEXT: vpmovsxbw %xmm0, %xmm1 565; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1] 566; AVX1-NEXT: vpmovsxbw %xmm0, %xmm0 567; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 568; AVX1-NEXT: retq 569; 570; AVX2-LABEL: sext_16i8_to_16i16: 571; AVX2: ## BB#0: 572; AVX2-NEXT: vmovdqa (%rdi), %xmm0 573; AVX2-NEXT: vpmovsxbw %xmm0, %ymm0 574; AVX2-NEXT: retq 575; 576; X32-SSE41-LABEL: sext_16i8_to_16i16: 577; X32-SSE41: ## BB#0: 578; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 579; X32-SSE41-NEXT: movdqa (%eax), %xmm1 580; X32-SSE41-NEXT: pmovzxbw %xmm1, %xmm0 581; X32-SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15] 582; X32-SSE41-NEXT: psllw $8, %xmm1 583; X32-SSE41-NEXT: psraw $8, %xmm1 584; X32-SSE41-NEXT: psllw $8, %xmm0 585; X32-SSE41-NEXT: psraw $8, %xmm0 586; X32-SSE41-NEXT: retl 587 %X = load <16 x i8>* %ptr 588 %Y = sext <16 x i8> %X to <16 x i16> 589 ret <16 x i16> %Y 590} 591 592define <4 x i64> @sext_4i8_to_4i64(<4 x i8> %mask) { 593; SSE2-LABEL: sext_4i8_to_4i64: 594; SSE2: ## BB#0: 595; SSE2-NEXT: pslld $24, %xmm0 596; SSE2-NEXT: psrad $24, %xmm0 597; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0] 598; SSE2-NEXT: movd %xmm1, %rax 599; SSE2-NEXT: cltq 600; SSE2-NEXT: movd %rax, %xmm2 601; SSE2-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1] 602; SSE2-NEXT: movd %xmm1, %rax 603; SSE2-NEXT: cltq 604; SSE2-NEXT: movd %rax, %xmm1 605; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 606; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0] 607; SSE2-NEXT: movd %xmm0, %rax 608; SSE2-NEXT: cltq 609; SSE2-NEXT: movd %rax, %xmm1 610; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] 611; SSE2-NEXT: movd %xmm0, %rax 612; SSE2-NEXT: cltq 613; SSE2-NEXT: movd %rax, %xmm0 614; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 615; SSE2-NEXT: movdqa %xmm2, %xmm0 616; SSE2-NEXT: retq 617; 618; SSSE3-LABEL: sext_4i8_to_4i64: 619; SSSE3: ## BB#0: 620; SSSE3-NEXT: pslld $24, %xmm0 621; SSSE3-NEXT: psrad $24, %xmm0 622; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,1,0] 623; SSSE3-NEXT: movd %xmm1, %rax 624; SSSE3-NEXT: cltq 625; SSSE3-NEXT: movd %rax, %xmm2 626; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1,1] 627; SSSE3-NEXT: movd %xmm1, %rax 628; SSSE3-NEXT: cltq 629; SSSE3-NEXT: movd %rax, %xmm1 630; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 631; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0] 632; SSSE3-NEXT: movd %xmm0, %rax 633; SSSE3-NEXT: cltq 634; SSSE3-NEXT: movd %rax, %xmm1 635; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1,1] 636; SSSE3-NEXT: movd %xmm0, %rax 637; SSSE3-NEXT: cltq 638; SSSE3-NEXT: movd %rax, %xmm0 639; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 640; SSSE3-NEXT: movdqa %xmm2, %xmm0 641; SSSE3-NEXT: retq 642; 643; SSE41-LABEL: sext_4i8_to_4i64: 644; SSE41: ## BB#0: 645; SSE41-NEXT: pslld $24, %xmm0 646; SSE41-NEXT: psrad $24, %xmm0 647; SSE41-NEXT: pmovzxdq %xmm0, %xmm1 648; SSE41-NEXT: pextrq $1, %xmm1, %rax 649; SSE41-NEXT: cltq 650; SSE41-NEXT: movd %rax, %xmm3 651; SSE41-NEXT: movd %xmm1, %rax 652; SSE41-NEXT: cltq 653; SSE41-NEXT: movd %rax, %xmm2 654; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] 655; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,3,0] 656; SSE41-NEXT: pextrq $1, %xmm0, %rax 657; SSE41-NEXT: cltq 658; SSE41-NEXT: movd %rax, %xmm3 659; SSE41-NEXT: movd %xmm0, %rax 660; SSE41-NEXT: cltq 661; SSE41-NEXT: movd %rax, %xmm1 662; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 663; SSE41-NEXT: movdqa %xmm2, %xmm0 664; SSE41-NEXT: retq 665; 666; AVX1-LABEL: sext_4i8_to_4i64: 667; AVX1: ## BB#0: 668; AVX1-NEXT: vpslld $24, %xmm0, %xmm0 669; AVX1-NEXT: vpsrad $24, %xmm0, %xmm0 670; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1 671; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1] 672; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0 673; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 674; AVX1-NEXT: retq 675; 676; AVX2-LABEL: sext_4i8_to_4i64: 677; AVX2: ## BB#0: 678; AVX2-NEXT: vpslld $24, %xmm0, %xmm0 679; AVX2-NEXT: vpsrad $24, %xmm0, %xmm0 680; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0 681; AVX2-NEXT: retq 682; 683; X32-SSE41-LABEL: sext_4i8_to_4i64: 684; X32-SSE41: ## BB#0: 685; X32-SSE41-NEXT: pslld $24, %xmm0 686; X32-SSE41-NEXT: psrad $24, %xmm0 687; X32-SSE41-NEXT: pmovzxdq %xmm0, %xmm2 688; X32-SSE41-NEXT: movd %xmm2, %eax 689; X32-SSE41-NEXT: sarl $31, %eax 690; X32-SSE41-NEXT: pextrd $2, %xmm2, %ecx 691; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm2 692; X32-SSE41-NEXT: sarl $31, %ecx 693; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm2 694; X32-SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,0,3,0] 695; X32-SSE41-NEXT: movd %xmm1, %eax 696; X32-SSE41-NEXT: sarl $31, %eax 697; X32-SSE41-NEXT: pextrd $2, %xmm1, %ecx 698; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1 699; X32-SSE41-NEXT: sarl $31, %ecx 700; X32-SSE41-NEXT: pinsrd $3, %ecx, %xmm1 701; X32-SSE41-NEXT: movdqa %xmm2, %xmm0 702; X32-SSE41-NEXT: retl 703 %extmask = sext <4 x i8> %mask to <4 x i64> 704 ret <4 x i64> %extmask 705} 706 707define <4 x i64> @load_sext_4i8_to_4i64(<4 x i8> *%ptr) { 708; SSE2-LABEL: load_sext_4i8_to_4i64: 709; SSE2: ## BB#0: 710; SSE2-NEXT: movl (%rdi), %eax 711; SSE2-NEXT: movd %eax, %xmm1 712; SSE2-NEXT: pextrw $1, %xmm1, %ecx 713; SSE2-NEXT: pinsrw $0, %eax, %xmm1 714; SSE2-NEXT: movzbl %ah, %eax 715; SSE2-NEXT: pinsrw $2, %eax, %xmm1 716; SSE2-NEXT: pinsrw $4, %ecx, %xmm1 717; SSE2-NEXT: shrl $8, %ecx 718; SSE2-NEXT: pinsrw $6, %ecx, %xmm1 719; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0] 720; SSE2-NEXT: movd %xmm2, %rax 721; SSE2-NEXT: movsbq %al, %rax 722; SSE2-NEXT: movd %rax, %xmm0 723; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1] 724; SSE2-NEXT: movd %xmm2, %rax 725; SSE2-NEXT: movsbq %al, %rax 726; SSE2-NEXT: movd %rax, %xmm2 727; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 728; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0] 729; SSE2-NEXT: movd %xmm2, %rax 730; SSE2-NEXT: movsbq %al, %rax 731; SSE2-NEXT: movd %rax, %xmm1 732; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1] 733; SSE2-NEXT: movd %xmm2, %rax 734; SSE2-NEXT: movsbq %al, %rax 735; SSE2-NEXT: movd %rax, %xmm2 736; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 737; SSE2-NEXT: retq 738; 739; SSSE3-LABEL: load_sext_4i8_to_4i64: 740; SSSE3: ## BB#0: 741; SSSE3-NEXT: movd (%rdi), %xmm1 742; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero 743; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0] 744; SSSE3-NEXT: movd %xmm2, %rax 745; SSSE3-NEXT: movsbq %al, %rax 746; SSSE3-NEXT: movd %rax, %xmm0 747; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1] 748; SSSE3-NEXT: movd %xmm2, %rax 749; SSSE3-NEXT: movsbq %al, %rax 750; SSSE3-NEXT: movd %rax, %xmm2 751; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 752; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0] 753; SSSE3-NEXT: movd %xmm2, %rax 754; SSSE3-NEXT: movsbq %al, %rax 755; SSSE3-NEXT: movd %rax, %xmm1 756; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1] 757; SSSE3-NEXT: movd %xmm2, %rax 758; SSSE3-NEXT: movsbq %al, %rax 759; SSSE3-NEXT: movd %rax, %xmm2 760; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 761; SSSE3-NEXT: retq 762; 763; SSE41-LABEL: load_sext_4i8_to_4i64: 764; SSE41: ## BB#0: 765; SSE41-NEXT: movd (%rdi), %xmm0 766; SSE41-NEXT: pmovzxbd %xmm0, %xmm1 767; SSE41-NEXT: pmovzxbq %xmm0, %xmm0 768; SSE41-NEXT: pextrq $1, %xmm0, %rax 769; SSE41-NEXT: movsbq %al, %rax 770; SSE41-NEXT: movd %rax, %xmm2 771; SSE41-NEXT: movd %xmm0, %rax 772; SSE41-NEXT: movsbq %al, %rax 773; SSE41-NEXT: movd %rax, %xmm0 774; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 775; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,0,3,0] 776; SSE41-NEXT: pextrq $1, %xmm1, %rax 777; SSE41-NEXT: movsbq %al, %rax 778; SSE41-NEXT: movd %rax, %xmm2 779; SSE41-NEXT: movd %xmm1, %rax 780; SSE41-NEXT: movsbq %al, %rax 781; SSE41-NEXT: movd %rax, %xmm1 782; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 783; SSE41-NEXT: retq 784; 785; AVX1-LABEL: load_sext_4i8_to_4i64: 786; AVX1: ## BB#0: 787; AVX1-NEXT: vpmovsxbd (%rdi), %xmm0 788; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1 789; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1] 790; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0 791; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 792; AVX1-NEXT: retq 793; 794; AVX2-LABEL: load_sext_4i8_to_4i64: 795; AVX2: ## BB#0: 796; AVX2-NEXT: vpmovsxbq (%rdi), %ymm0 797; AVX2-NEXT: retq 798; 799; X32-SSE41-LABEL: load_sext_4i8_to_4i64: 800; X32-SSE41: ## BB#0: 801; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 802; X32-SSE41-NEXT: movd (%eax), %xmm0 803; X32-SSE41-NEXT: pmovzxbd %xmm0, %xmm1 804; X32-SSE41-NEXT: pmovzxbq %xmm0, %xmm2 805; X32-SSE41-NEXT: movd %xmm2, %eax 806; X32-SSE41-NEXT: movsbl %al, %eax 807; X32-SSE41-NEXT: movd %eax, %xmm0 808; X32-SSE41-NEXT: sarl $31, %eax 809; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm0 810; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax 811; X32-SSE41-NEXT: movsbl %al, %eax 812; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm0 813; X32-SSE41-NEXT: sarl $31, %eax 814; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm0 815; X32-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0] 816; X32-SSE41-NEXT: movd %xmm2, %eax 817; X32-SSE41-NEXT: movsbl %al, %eax 818; X32-SSE41-NEXT: movd %eax, %xmm1 819; X32-SSE41-NEXT: sarl $31, %eax 820; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1 821; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax 822; X32-SSE41-NEXT: movsbl %al, %eax 823; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm1 824; X32-SSE41-NEXT: sarl $31, %eax 825; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm1 826; X32-SSE41-NEXT: retl 827 %X = load <4 x i8>* %ptr 828 %Y = sext <4 x i8> %X to <4 x i64> 829 ret <4 x i64>%Y 830} 831 832define <4 x i64> @load_sext_4i16_to_4i64(<4 x i16> *%ptr) { 833; SSE2-LABEL: load_sext_4i16_to_4i64: 834; SSE2: ## BB#0: 835; SSE2-NEXT: movq (%rdi), %xmm1 836; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] 837; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0] 838; SSE2-NEXT: movd %xmm2, %rax 839; SSE2-NEXT: movswq %ax, %rax 840; SSE2-NEXT: movd %rax, %xmm0 841; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1] 842; SSE2-NEXT: movd %xmm2, %rax 843; SSE2-NEXT: movswq %ax, %rax 844; SSE2-NEXT: movd %rax, %xmm2 845; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 846; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0] 847; SSE2-NEXT: movd %xmm2, %rax 848; SSE2-NEXT: movswq %ax, %rax 849; SSE2-NEXT: movd %rax, %xmm1 850; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1] 851; SSE2-NEXT: movd %xmm2, %rax 852; SSE2-NEXT: movswq %ax, %rax 853; SSE2-NEXT: movd %rax, %xmm2 854; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 855; SSE2-NEXT: retq 856; 857; SSSE3-LABEL: load_sext_4i16_to_4i64: 858; SSSE3: ## BB#0: 859; SSSE3-NEXT: movq (%rdi), %xmm1 860; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] 861; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,1,0] 862; SSSE3-NEXT: movd %xmm2, %rax 863; SSSE3-NEXT: movswq %ax, %rax 864; SSSE3-NEXT: movd %rax, %xmm0 865; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1] 866; SSSE3-NEXT: movd %xmm2, %rax 867; SSSE3-NEXT: movswq %ax, %rax 868; SSSE3-NEXT: movd %rax, %xmm2 869; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 870; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0] 871; SSSE3-NEXT: movd %xmm2, %rax 872; SSSE3-NEXT: movswq %ax, %rax 873; SSSE3-NEXT: movd %rax, %xmm1 874; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1,1] 875; SSSE3-NEXT: movd %xmm2, %rax 876; SSSE3-NEXT: movswq %ax, %rax 877; SSSE3-NEXT: movd %rax, %xmm2 878; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 879; SSSE3-NEXT: retq 880; 881; SSE41-LABEL: load_sext_4i16_to_4i64: 882; SSE41: ## BB#0: 883; SSE41-NEXT: movq (%rdi), %xmm0 884; SSE41-NEXT: pmovzxwd %xmm0, %xmm1 885; SSE41-NEXT: pmovzxwq %xmm0, %xmm0 886; SSE41-NEXT: pextrq $1, %xmm0, %rax 887; SSE41-NEXT: movswq %ax, %rax 888; SSE41-NEXT: movd %rax, %xmm2 889; SSE41-NEXT: movd %xmm0, %rax 890; SSE41-NEXT: movswq %ax, %rax 891; SSE41-NEXT: movd %rax, %xmm0 892; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 893; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,0,3,0] 894; SSE41-NEXT: pextrq $1, %xmm1, %rax 895; SSE41-NEXT: movswq %ax, %rax 896; SSE41-NEXT: movd %rax, %xmm2 897; SSE41-NEXT: movd %xmm1, %rax 898; SSE41-NEXT: movswq %ax, %rax 899; SSE41-NEXT: movd %rax, %xmm1 900; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 901; SSE41-NEXT: retq 902; 903; AVX1-LABEL: load_sext_4i16_to_4i64: 904; AVX1: ## BB#0: 905; AVX1-NEXT: vpmovsxwd (%rdi), %xmm0 906; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1 907; AVX1-NEXT: vmovhlps {{.*#+}} xmm0 = xmm0[1,1] 908; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0 909; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 910; AVX1-NEXT: retq 911; 912; AVX2-LABEL: load_sext_4i16_to_4i64: 913; AVX2: ## BB#0: 914; AVX2-NEXT: vpmovsxwq (%rdi), %ymm0 915; AVX2-NEXT: retq 916; 917; X32-SSE41-LABEL: load_sext_4i16_to_4i64: 918; X32-SSE41: ## BB#0: 919; X32-SSE41-NEXT: movl {{[0-9]+}}(%esp), %eax 920; X32-SSE41-NEXT: movsd (%eax), %xmm0 921; X32-SSE41-NEXT: pmovzxwd %xmm0, %xmm1 922; X32-SSE41-NEXT: pmovzxwq %xmm0, %xmm2 923; X32-SSE41-NEXT: movd %xmm2, %eax 924; X32-SSE41-NEXT: cwtl 925; X32-SSE41-NEXT: movd %eax, %xmm0 926; X32-SSE41-NEXT: sarl $31, %eax 927; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm0 928; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax 929; X32-SSE41-NEXT: cwtl 930; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm0 931; X32-SSE41-NEXT: sarl $31, %eax 932; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm0 933; X32-SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,0,3,0] 934; X32-SSE41-NEXT: movd %xmm2, %eax 935; X32-SSE41-NEXT: cwtl 936; X32-SSE41-NEXT: movd %eax, %xmm1 937; X32-SSE41-NEXT: sarl $31, %eax 938; X32-SSE41-NEXT: pinsrd $1, %eax, %xmm1 939; X32-SSE41-NEXT: pextrd $2, %xmm2, %eax 940; X32-SSE41-NEXT: cwtl 941; X32-SSE41-NEXT: pinsrd $2, %eax, %xmm1 942; X32-SSE41-NEXT: sarl $31, %eax 943; X32-SSE41-NEXT: pinsrd $3, %eax, %xmm1 944; X32-SSE41-NEXT: retl 945 %X = load <4 x i16>* %ptr 946 %Y = sext <4 x i16> %X to <4 x i64> 947 ret <4 x i64>%Y 948} 949