438 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE3; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX14; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX25 6define <16 x i8> @load8_ins_elt0_v16i8(ptr %p) nounwind {7; SSE-LABEL: load8_ins_elt0_v16i8:8; SSE: # %bb.0:9; SSE-NEXT: movzbl (%rdi), %eax10; SSE-NEXT: movd %eax, %xmm011; SSE-NEXT: retq12;13; AVX1-LABEL: load8_ins_elt0_v16i8:14; AVX1: # %bb.0:15; AVX1-NEXT: movzbl (%rdi), %eax16; AVX1-NEXT: vmovd %eax, %xmm017; AVX1-NEXT: retq18;19; AVX2-LABEL: load8_ins_elt0_v16i8:20; AVX2: # %bb.0:21; AVX2-NEXT: vpbroadcastb (%rdi), %xmm022; AVX2-NEXT: retq23 %x = load i8, ptr %p24 %ins = insertelement <16 x i8> undef, i8 %x, i32 025 ret <16 x i8> %ins26}27 28define <8 x i16> @load16_ins_elt0_v8i16(ptr %p) nounwind {29; SSE-LABEL: load16_ins_elt0_v8i16:30; SSE: # %bb.0:31; SSE-NEXT: movzwl (%rdi), %eax32; SSE-NEXT: movd %eax, %xmm033; SSE-NEXT: retq34;35; AVX1-LABEL: load16_ins_elt0_v8i16:36; AVX1: # %bb.0:37; AVX1-NEXT: movzwl (%rdi), %eax38; AVX1-NEXT: vmovd %eax, %xmm039; AVX1-NEXT: retq40;41; AVX2-LABEL: load16_ins_elt0_v8i16:42; AVX2: # %bb.0:43; AVX2-NEXT: vpbroadcastw (%rdi), %xmm044; AVX2-NEXT: retq45 %x = load i16, ptr %p46 %ins = insertelement <8 x i16> undef, i16 %x, i32 047 ret <8 x i16> %ins48}49 50define <4 x i32> @load32_ins_elt0_v4i32(ptr %p) nounwind {51; SSE-LABEL: load32_ins_elt0_v4i32:52; SSE: # %bb.0:53; SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero54; SSE-NEXT: retq55;56; AVX-LABEL: load32_ins_elt0_v4i32:57; AVX: # %bb.0:58; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero59; AVX-NEXT: retq60 %x = load i32, ptr %p61 %ins = insertelement <4 x i32> undef, i32 %x, i32 062 ret <4 x i32> %ins63}64 65define <2 x i64> @load64_ins_elt0_v2i64(ptr %p) nounwind {66; SSE-LABEL: load64_ins_elt0_v2i64:67; SSE: # %bb.0:68; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero69; SSE-NEXT: retq70;71; AVX-LABEL: load64_ins_elt0_v2i64:72; AVX: # %bb.0:73; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero74; AVX-NEXT: retq75 %x = load i64, ptr %p76 %ins = insertelement <2 x i64> undef, i64 %x, i32 077 ret <2 x i64> %ins78}79 80define <4 x float> @load32_ins_elt0_v4f32(ptr %p) nounwind {81; SSE-LABEL: load32_ins_elt0_v4f32:82; SSE: # %bb.0:83; SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero84; SSE-NEXT: retq85;86; AVX-LABEL: load32_ins_elt0_v4f32:87; AVX: # %bb.0:88; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero89; AVX-NEXT: retq90 %x = load float, ptr %p91 %ins = insertelement <4 x float> undef, float %x, i32 092 ret <4 x float> %ins93}94 95define <2 x double> @load64_ins_elt0_v2f64(ptr %p) nounwind {96; SSE-LABEL: load64_ins_elt0_v2f64:97; SSE: # %bb.0:98; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero99; SSE-NEXT: retq100;101; AVX-LABEL: load64_ins_elt0_v2f64:102; AVX: # %bb.0:103; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero104; AVX-NEXT: retq105 %x = load double, ptr %p106 %ins = insertelement <2 x double> undef, double %x, i32 0107 ret <2 x double> %ins108}109 110define <16 x i8> @load8_ins_eltc_v16i8(ptr %p) nounwind {111; SSE-LABEL: load8_ins_eltc_v16i8:112; SSE: # %bb.0:113; SSE-NEXT: movzbl (%rdi), %eax114; SSE-NEXT: movd %eax, %xmm0115; SSE-NEXT: pslld $24, %xmm0116; SSE-NEXT: retq117;118; AVX1-LABEL: load8_ins_eltc_v16i8:119; AVX1: # %bb.0:120; AVX1-NEXT: movzbl (%rdi), %eax121; AVX1-NEXT: vmovd %eax, %xmm0122; AVX1-NEXT: vpslld $24, %xmm0, %xmm0123; AVX1-NEXT: retq124;125; AVX2-LABEL: load8_ins_eltc_v16i8:126; AVX2: # %bb.0:127; AVX2-NEXT: vpbroadcastb (%rdi), %xmm0128; AVX2-NEXT: retq129 %x = load i8, ptr %p130 %ins = insertelement <16 x i8> undef, i8 %x, i32 3131 ret <16 x i8> %ins132}133 134define <8 x i16> @load16_ins_eltc_v8i16(ptr %p) nounwind {135; SSE-LABEL: load16_ins_eltc_v8i16:136; SSE: # %bb.0:137; SSE-NEXT: movzwl (%rdi), %eax138; SSE-NEXT: movd %eax, %xmm0139; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]140; SSE-NEXT: retq141;142; AVX1-LABEL: load16_ins_eltc_v8i16:143; AVX1: # %bb.0:144; AVX1-NEXT: movzwl (%rdi), %eax145; AVX1-NEXT: vmovd %eax, %xmm0146; AVX1-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]147; AVX1-NEXT: retq148;149; AVX2-LABEL: load16_ins_eltc_v8i16:150; AVX2: # %bb.0:151; AVX2-NEXT: vpbroadcastw (%rdi), %xmm0152; AVX2-NEXT: retq153 %x = load i16, ptr %p154 %ins = insertelement <8 x i16> undef, i16 %x, i32 5155 ret <8 x i16> %ins156}157 158define <4 x i32> @load32_ins_eltc_v4i32(ptr %p) nounwind {159; SSE-LABEL: load32_ins_eltc_v4i32:160; SSE: # %bb.0:161; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero162; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]163; SSE-NEXT: retq164;165; AVX-LABEL: load32_ins_eltc_v4i32:166; AVX: # %bb.0:167; AVX-NEXT: vbroadcastss (%rdi), %xmm0168; AVX-NEXT: retq169 %x = load i32, ptr %p170 %ins = insertelement <4 x i32> undef, i32 %x, i32 2171 ret <4 x i32> %ins172}173 174define <2 x i64> @load64_ins_eltc_v2i64(ptr %p) nounwind {175; SSE-LABEL: load64_ins_eltc_v2i64:176; SSE: # %bb.0:177; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero178; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]179; SSE-NEXT: retq180;181; AVX-LABEL: load64_ins_eltc_v2i64:182; AVX: # %bb.0:183; AVX-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]184; AVX-NEXT: retq185 %x = load i64, ptr %p186 %ins = insertelement <2 x i64> undef, i64 %x, i32 1187 ret <2 x i64> %ins188}189 190define <4 x float> @load32_ins_eltc_v4f32(ptr %p) nounwind {191; SSE-LABEL: load32_ins_eltc_v4f32:192; SSE: # %bb.0:193; SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero194; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0,0,0]195; SSE-NEXT: retq196;197; AVX-LABEL: load32_ins_eltc_v4f32:198; AVX: # %bb.0:199; AVX-NEXT: vbroadcastss (%rdi), %xmm0200; AVX-NEXT: retq201 %x = load float, ptr %p202 %ins = insertelement <4 x float> undef, float %x, i32 3203 ret <4 x float> %ins204}205 206define <2 x double> @load64_ins_eltc_v2f64(ptr %p) nounwind {207; SSE-LABEL: load64_ins_eltc_v2f64:208; SSE: # %bb.0:209; SSE-NEXT: movddup {{.*#+}} xmm0 = mem[0,0]210; SSE-NEXT: retq211;212; AVX-LABEL: load64_ins_eltc_v2f64:213; AVX: # %bb.0:214; AVX-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]215; AVX-NEXT: retq216 %x = load double, ptr %p217 %ins = insertelement <2 x double> undef, double %x, i32 1218 ret <2 x double> %ins219}220 221define <32 x i8> @load8_ins_elt0_v32i8(ptr %p) nounwind {222; SSE-LABEL: load8_ins_elt0_v32i8:223; SSE: # %bb.0:224; SSE-NEXT: movzbl (%rdi), %eax225; SSE-NEXT: movd %eax, %xmm0226; SSE-NEXT: retq227;228; AVX1-LABEL: load8_ins_elt0_v32i8:229; AVX1: # %bb.0:230; AVX1-NEXT: movzbl (%rdi), %eax231; AVX1-NEXT: vmovd %eax, %xmm0232; AVX1-NEXT: retq233;234; AVX2-LABEL: load8_ins_elt0_v32i8:235; AVX2: # %bb.0:236; AVX2-NEXT: vpbroadcastb (%rdi), %ymm0237; AVX2-NEXT: retq238 %x = load i8, ptr %p239 %ins = insertelement <32 x i8> undef, i8 %x, i32 0240 ret <32 x i8> %ins241}242 243define <16 x i16> @load16_ins_elt0_v16i16(ptr %p) nounwind {244; SSE-LABEL: load16_ins_elt0_v16i16:245; SSE: # %bb.0:246; SSE-NEXT: movzwl (%rdi), %eax247; SSE-NEXT: movd %eax, %xmm0248; SSE-NEXT: retq249;250; AVX1-LABEL: load16_ins_elt0_v16i16:251; AVX1: # %bb.0:252; AVX1-NEXT: movzwl (%rdi), %eax253; AVX1-NEXT: vmovd %eax, %xmm0254; AVX1-NEXT: retq255;256; AVX2-LABEL: load16_ins_elt0_v16i16:257; AVX2: # %bb.0:258; AVX2-NEXT: vpbroadcastw (%rdi), %ymm0259; AVX2-NEXT: retq260 %x = load i16, ptr %p261 %ins = insertelement <16 x i16> undef, i16 %x, i32 0262 ret <16 x i16> %ins263}264 265define <8 x i32> @load32_ins_elt0_v8i32(ptr %p) nounwind {266; SSE-LABEL: load32_ins_elt0_v8i32:267; SSE: # %bb.0:268; SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero269; SSE-NEXT: retq270;271; AVX-LABEL: load32_ins_elt0_v8i32:272; AVX: # %bb.0:273; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero274; AVX-NEXT: retq275 %x = load i32, ptr %p276 %ins = insertelement <8 x i32> undef, i32 %x, i32 0277 ret <8 x i32> %ins278}279 280define <4 x i64> @load64_ins_elt0_v4i64(ptr %p) nounwind {281; SSE-LABEL: load64_ins_elt0_v4i64:282; SSE: # %bb.0:283; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero284; SSE-NEXT: retq285;286; AVX-LABEL: load64_ins_elt0_v4i64:287; AVX: # %bb.0:288; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero289; AVX-NEXT: retq290 %x = load i64, ptr %p291 %ins = insertelement <4 x i64> undef, i64 %x, i32 0292 ret <4 x i64> %ins293}294 295define <8 x float> @load32_ins_elt0_v8f32(ptr %p) nounwind {296; SSE-LABEL: load32_ins_elt0_v8f32:297; SSE: # %bb.0:298; SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero299; SSE-NEXT: retq300;301; AVX-LABEL: load32_ins_elt0_v8f32:302; AVX: # %bb.0:303; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero304; AVX-NEXT: retq305 %x = load float, ptr %p306 %ins = insertelement <8 x float> undef, float %x, i32 0307 ret <8 x float> %ins308}309 310define <4 x double> @load64_ins_elt0_v4f64(ptr %p) nounwind {311; SSE-LABEL: load64_ins_elt0_v4f64:312; SSE: # %bb.0:313; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero314; SSE-NEXT: retq315;316; AVX-LABEL: load64_ins_elt0_v4f64:317; AVX: # %bb.0:318; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero319; AVX-NEXT: retq320 %x = load double, ptr %p321 %ins = insertelement <4 x double> undef, double %x, i32 0322 ret <4 x double> %ins323}324 325define <32 x i8> @load8_ins_eltc_v32i8(ptr %p) nounwind {326; SSE-LABEL: load8_ins_eltc_v32i8:327; SSE: # %bb.0:328; SSE-NEXT: movzbl (%rdi), %eax329; SSE-NEXT: movd %eax, %xmm1330; SSE-NEXT: psllq $40, %xmm1331; SSE-NEXT: retq332;333; AVX1-LABEL: load8_ins_eltc_v32i8:334; AVX1: # %bb.0:335; AVX1-NEXT: movzbl (%rdi), %eax336; AVX1-NEXT: vmovd %eax, %xmm0337; AVX1-NEXT: vpsllq $40, %xmm0, %xmm0338; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0339; AVX1-NEXT: retq340;341; AVX2-LABEL: load8_ins_eltc_v32i8:342; AVX2: # %bb.0:343; AVX2-NEXT: vpbroadcastb (%rdi), %ymm0344; AVX2-NEXT: retq345 %x = load i8, ptr %p346 %ins = insertelement <32 x i8> undef, i8 %x, i32 21347 ret <32 x i8> %ins348}349 350define <16 x i16> @load16_ins_eltc_v16i16(ptr %p) nounwind {351; SSE-LABEL: load16_ins_eltc_v16i16:352; SSE: # %bb.0:353; SSE-NEXT: movzwl (%rdi), %eax354; SSE-NEXT: movd %eax, %xmm1355; SSE-NEXT: psllq $48, %xmm1356; SSE-NEXT: retq357;358; AVX1-LABEL: load16_ins_eltc_v16i16:359; AVX1: # %bb.0:360; AVX1-NEXT: movzwl (%rdi), %eax361; AVX1-NEXT: vmovd %eax, %xmm0362; AVX1-NEXT: vpsllq $48, %xmm0, %xmm0363; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0364; AVX1-NEXT: retq365;366; AVX2-LABEL: load16_ins_eltc_v16i16:367; AVX2: # %bb.0:368; AVX2-NEXT: vpbroadcastw (%rdi), %ymm0369; AVX2-NEXT: retq370 %x = load i16, ptr %p371 %ins = insertelement <16 x i16> undef, i16 %x, i32 11372 ret <16 x i16> %ins373}374 375define <8 x i32> @load32_ins_eltc_v8i32(ptr %p) nounwind {376; SSE-LABEL: load32_ins_eltc_v8i32:377; SSE: # %bb.0:378; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero379; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]380; SSE-NEXT: retq381;382; AVX-LABEL: load32_ins_eltc_v8i32:383; AVX: # %bb.0:384; AVX-NEXT: vbroadcastss (%rdi), %ymm0385; AVX-NEXT: retq386 %x = load i32, ptr %p387 %ins = insertelement <8 x i32> undef, i32 %x, i32 7388 ret <8 x i32> %ins389}390 391define <4 x i64> @load64_ins_eltc_v4i64(ptr %p) nounwind {392; SSE-LABEL: load64_ins_eltc_v4i64:393; SSE: # %bb.0:394; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero395; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]396; SSE-NEXT: retq397;398; AVX-LABEL: load64_ins_eltc_v4i64:399; AVX: # %bb.0:400; AVX-NEXT: vbroadcastsd (%rdi), %ymm0401; AVX-NEXT: retq402 %x = load i64, ptr %p403 %ins = insertelement <4 x i64> undef, i64 %x, i32 3404 ret <4 x i64> %ins405}406 407define <8 x float> @load32_ins_eltc_v8f32(ptr %p) nounwind {408; SSE-LABEL: load32_ins_eltc_v8f32:409; SSE: # %bb.0:410; SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero411; SSE-NEXT: movsldup {{.*#+}} xmm1 = xmm0[0,0,2,2]412; SSE-NEXT: retq413;414; AVX-LABEL: load32_ins_eltc_v8f32:415; AVX: # %bb.0:416; AVX-NEXT: vbroadcastss (%rdi), %ymm0417; AVX-NEXT: retq418 %x = load float, ptr %p419 %ins = insertelement <8 x float> undef, float %x, i32 5420 ret <8 x float> %ins421}422 423define <4 x double> @load64_ins_eltc_v4f64(ptr %p) nounwind {424; SSE-LABEL: load64_ins_eltc_v4f64:425; SSE: # %bb.0:426; SSE-NEXT: movddup {{.*#+}} xmm1 = mem[0,0]427; SSE-NEXT: retq428;429; AVX-LABEL: load64_ins_eltc_v4f64:430; AVX: # %bb.0:431; AVX-NEXT: vbroadcastsd (%rdi), %ymm0432; AVX-NEXT: retq433 %x = load double, ptr %p434 %ins = insertelement <4 x double> undef, double %x, i32 3435 ret <4 x double> %ins436}437 438