5646 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE414; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,VEX,AVX15; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,VEX,AVX26; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F7; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VL8; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefixes=AVX,AVX512,AVX512DQ9; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VLDQ10;11; 32-bit tests to make sure we're not doing anything stupid.12; RUN: llc < %s -disable-peephole -mtriple=i686-unknown-unknown13; RUN: llc < %s -disable-peephole -mtriple=i686-unknown-unknown -mattr=+sse14; RUN: llc < %s -disable-peephole -mtriple=i686-unknown-unknown -mattr=+sse215; RUN: llc < %s -disable-peephole -mtriple=i686-unknown-unknown -mattr=+sse4.116 17;18; Signed Integer to Double19;20 21define <2 x float> @sitofp_2i32_to_2f32(<2 x i32> %a) {22; SSE-LABEL: sitofp_2i32_to_2f32:23; SSE: # %bb.0:24; SSE-NEXT: cvtdq2ps %xmm0, %xmm025; SSE-NEXT: retq26;27; AVX-LABEL: sitofp_2i32_to_2f32:28; AVX: # %bb.0:29; AVX-NEXT: vcvtdq2ps %xmm0, %xmm030; AVX-NEXT: retq31 %cvt = sitofp <2 x i32> %a to <2 x float>32 ret <2 x float> %cvt33}34 35define <2 x float> @uitofp_2i32_to_2f32(<2 x i32> %a) {36; SSE2-LABEL: uitofp_2i32_to_2f32:37; SSE2: # %bb.0:38; SSE2-NEXT: xorpd %xmm1, %xmm139; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]40; SSE2-NEXT: movapd {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]41; SSE2-NEXT: orpd %xmm1, %xmm042; SSE2-NEXT: subpd %xmm1, %xmm043; SSE2-NEXT: cvtpd2ps %xmm0, %xmm044; SSE2-NEXT: retq45;46; SSE41-LABEL: uitofp_2i32_to_2f32:47; SSE41: # %bb.0:48; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero49; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]50; SSE41-NEXT: por %xmm1, %xmm051; SSE41-NEXT: subpd %xmm1, %xmm052; SSE41-NEXT: cvtpd2ps %xmm0, %xmm053; SSE41-NEXT: retq54;55; AVX1-LABEL: uitofp_2i32_to_2f32:56; AVX1: # %bb.0:57; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero58; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]59; AVX1-NEXT: # xmm1 = mem[0,0]60; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm061; AVX1-NEXT: vsubpd %xmm1, %xmm0, %xmm062; AVX1-NEXT: vcvtpd2ps %xmm0, %xmm063; AVX1-NEXT: retq64;65; AVX2-LABEL: uitofp_2i32_to_2f32:66; AVX2: # %bb.0:67; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero68; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]69; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm070; AVX2-NEXT: vsubpd %xmm1, %xmm0, %xmm071; AVX2-NEXT: vcvtpd2ps %xmm0, %xmm072; AVX2-NEXT: retq73;74; AVX512F-LABEL: uitofp_2i32_to_2f32:75; AVX512F: # %bb.0:76; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm077; AVX512F-NEXT: vcvtudq2ps %zmm0, %zmm078; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm079; AVX512F-NEXT: vzeroupper80; AVX512F-NEXT: retq81;82; AVX512VL-LABEL: uitofp_2i32_to_2f32:83; AVX512VL: # %bb.0:84; AVX512VL-NEXT: vcvtudq2ps %xmm0, %xmm085; AVX512VL-NEXT: retq86;87; AVX512DQ-LABEL: uitofp_2i32_to_2f32:88; AVX512DQ: # %bb.0:89; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm090; AVX512DQ-NEXT: vcvtudq2ps %zmm0, %zmm091; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm092; AVX512DQ-NEXT: vzeroupper93; AVX512DQ-NEXT: retq94;95; AVX512VLDQ-LABEL: uitofp_2i32_to_2f32:96; AVX512VLDQ: # %bb.0:97; AVX512VLDQ-NEXT: vcvtudq2ps %xmm0, %xmm098; AVX512VLDQ-NEXT: retq99 %cvt = uitofp <2 x i32> %a to <2 x float>100 ret <2 x float> %cvt101}102 103define <2 x double> @sitofp_2i64_to_2f64(<2 x i64> %a) {104; SSE2-LABEL: sitofp_2i64_to_2f64:105; SSE2: # %bb.0:106; SSE2-NEXT: movq %xmm0, %rax107; SSE2-NEXT: cvtsi2sd %rax, %xmm1108; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]109; SSE2-NEXT: movq %xmm0, %rax110; SSE2-NEXT: xorps %xmm0, %xmm0111; SSE2-NEXT: cvtsi2sd %rax, %xmm0112; SSE2-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]113; SSE2-NEXT: movapd %xmm1, %xmm0114; SSE2-NEXT: retq115;116; SSE41-LABEL: sitofp_2i64_to_2f64:117; SSE41: # %bb.0:118; SSE41-NEXT: pextrq $1, %xmm0, %rax119; SSE41-NEXT: cvtsi2sd %rax, %xmm1120; SSE41-NEXT: movq %xmm0, %rax121; SSE41-NEXT: xorps %xmm0, %xmm0122; SSE41-NEXT: cvtsi2sd %rax, %xmm0123; SSE41-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]124; SSE41-NEXT: retq125;126; VEX-LABEL: sitofp_2i64_to_2f64:127; VEX: # %bb.0:128; VEX-NEXT: vpextrq $1, %xmm0, %rax129; VEX-NEXT: vcvtsi2sd %rax, %xmm15, %xmm1130; VEX-NEXT: vmovq %xmm0, %rax131; VEX-NEXT: vcvtsi2sd %rax, %xmm15, %xmm0132; VEX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]133; VEX-NEXT: retq134;135; AVX512F-LABEL: sitofp_2i64_to_2f64:136; AVX512F: # %bb.0:137; AVX512F-NEXT: vpextrq $1, %xmm0, %rax138; AVX512F-NEXT: vcvtsi2sd %rax, %xmm15, %xmm1139; AVX512F-NEXT: vmovq %xmm0, %rax140; AVX512F-NEXT: vcvtsi2sd %rax, %xmm15, %xmm0141; AVX512F-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]142; AVX512F-NEXT: retq143;144; AVX512VL-LABEL: sitofp_2i64_to_2f64:145; AVX512VL: # %bb.0:146; AVX512VL-NEXT: vpextrq $1, %xmm0, %rax147; AVX512VL-NEXT: vcvtsi2sd %rax, %xmm15, %xmm1148; AVX512VL-NEXT: vmovq %xmm0, %rax149; AVX512VL-NEXT: vcvtsi2sd %rax, %xmm15, %xmm0150; AVX512VL-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]151; AVX512VL-NEXT: retq152;153; AVX512DQ-LABEL: sitofp_2i64_to_2f64:154; AVX512DQ: # %bb.0:155; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0156; AVX512DQ-NEXT: vcvtqq2pd %zmm0, %zmm0157; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0158; AVX512DQ-NEXT: vzeroupper159; AVX512DQ-NEXT: retq160;161; AVX512VLDQ-LABEL: sitofp_2i64_to_2f64:162; AVX512VLDQ: # %bb.0:163; AVX512VLDQ-NEXT: vcvtqq2pd %xmm0, %xmm0164; AVX512VLDQ-NEXT: retq165 %cvt = sitofp <2 x i64> %a to <2 x double>166 ret <2 x double> %cvt167}168 169define <2 x double> @sitofp_2i32_to_2f64(<4 x i32> %a) {170; SSE-LABEL: sitofp_2i32_to_2f64:171; SSE: # %bb.0:172; SSE-NEXT: cvtdq2pd %xmm0, %xmm0173; SSE-NEXT: retq174;175; AVX-LABEL: sitofp_2i32_to_2f64:176; AVX: # %bb.0:177; AVX-NEXT: vcvtdq2pd %xmm0, %xmm0178; AVX-NEXT: retq179 %shuf = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 0, i32 1>180 %cvt = sitofp <2 x i32> %shuf to <2 x double>181 ret <2 x double> %cvt182}183 184define <2 x double> @sitofp_4i32_to_2f64(<4 x i32> %a) {185; SSE-LABEL: sitofp_4i32_to_2f64:186; SSE: # %bb.0:187; SSE-NEXT: cvtdq2pd %xmm0, %xmm0188; SSE-NEXT: retq189;190; AVX-LABEL: sitofp_4i32_to_2f64:191; AVX: # %bb.0:192; AVX-NEXT: vcvtdq2pd %xmm0, %xmm0193; AVX-NEXT: retq194 %cvt = sitofp <4 x i32> %a to <4 x double>195 %shuf = shufflevector <4 x double> %cvt, <4 x double> undef, <2 x i32> <i32 0, i32 1>196 ret <2 x double> %shuf197}198 199define <2 x double> @sitofp_2i16_to_2f64(<8 x i16> %a) {200; SSE2-LABEL: sitofp_2i16_to_2f64:201; SSE2: # %bb.0:202; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]203; SSE2-NEXT: psrad $16, %xmm0204; SSE2-NEXT: cvtdq2pd %xmm0, %xmm0205; SSE2-NEXT: retq206;207; SSE41-LABEL: sitofp_2i16_to_2f64:208; SSE41: # %bb.0:209; SSE41-NEXT: pmovsxwd %xmm0, %xmm0210; SSE41-NEXT: cvtdq2pd %xmm0, %xmm0211; SSE41-NEXT: retq212;213; AVX-LABEL: sitofp_2i16_to_2f64:214; AVX: # %bb.0:215; AVX-NEXT: vpmovsxwd %xmm0, %xmm0216; AVX-NEXT: vcvtdq2pd %xmm0, %xmm0217; AVX-NEXT: retq218 %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <2 x i32> <i32 0, i32 1>219 %cvt = sitofp <2 x i16> %shuf to <2 x double>220 ret <2 x double> %cvt221}222 223define <2 x double> @sitofp_8i16_to_2f64(<8 x i16> %a) {224; SSE2-LABEL: sitofp_8i16_to_2f64:225; SSE2: # %bb.0:226; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]227; SSE2-NEXT: psrad $16, %xmm0228; SSE2-NEXT: cvtdq2pd %xmm0, %xmm0229; SSE2-NEXT: retq230;231; SSE41-LABEL: sitofp_8i16_to_2f64:232; SSE41: # %bb.0:233; SSE41-NEXT: pmovsxwd %xmm0, %xmm0234; SSE41-NEXT: cvtdq2pd %xmm0, %xmm0235; SSE41-NEXT: retq236;237; VEX-LABEL: sitofp_8i16_to_2f64:238; VEX: # %bb.0:239; VEX-NEXT: vpmovsxwd %xmm0, %xmm0240; VEX-NEXT: vcvtdq2pd %xmm0, %xmm0241; VEX-NEXT: retq242;243; AVX512-LABEL: sitofp_8i16_to_2f64:244; AVX512: # %bb.0:245; AVX512-NEXT: vpmovsxwd %xmm0, %ymm0246; AVX512-NEXT: vcvtdq2pd %ymm0, %zmm0247; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0248; AVX512-NEXT: vzeroupper249; AVX512-NEXT: retq250 %cvt = sitofp <8 x i16> %a to <8 x double>251 %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <2 x i32> <i32 0, i32 1>252 ret <2 x double> %shuf253}254 255define <2 x double> @sitofp_2i8_to_2f64(<16 x i8> %a) {256; SSE2-LABEL: sitofp_2i8_to_2f64:257; SSE2: # %bb.0:258; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]259; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]260; SSE2-NEXT: psrad $24, %xmm0261; SSE2-NEXT: cvtdq2pd %xmm0, %xmm0262; SSE2-NEXT: retq263;264; SSE41-LABEL: sitofp_2i8_to_2f64:265; SSE41: # %bb.0:266; SSE41-NEXT: pmovsxbd %xmm0, %xmm0267; SSE41-NEXT: cvtdq2pd %xmm0, %xmm0268; SSE41-NEXT: retq269;270; AVX-LABEL: sitofp_2i8_to_2f64:271; AVX: # %bb.0:272; AVX-NEXT: vpmovsxbd %xmm0, %xmm0273; AVX-NEXT: vcvtdq2pd %xmm0, %xmm0274; AVX-NEXT: retq275 %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <2 x i32> <i32 0, i32 1>276 %cvt = sitofp <2 x i8> %shuf to <2 x double>277 ret <2 x double> %cvt278}279 280define <2 x double> @sitofp_16i8_to_2f64(<16 x i8> %a) {281; SSE2-LABEL: sitofp_16i8_to_2f64:282; SSE2: # %bb.0:283; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]284; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]285; SSE2-NEXT: psrad $24, %xmm0286; SSE2-NEXT: cvtdq2pd %xmm0, %xmm0287; SSE2-NEXT: retq288;289; SSE41-LABEL: sitofp_16i8_to_2f64:290; SSE41: # %bb.0:291; SSE41-NEXT: pmovsxbd %xmm0, %xmm0292; SSE41-NEXT: cvtdq2pd %xmm0, %xmm0293; SSE41-NEXT: retq294;295; VEX-LABEL: sitofp_16i8_to_2f64:296; VEX: # %bb.0:297; VEX-NEXT: vpmovsxbd %xmm0, %xmm0298; VEX-NEXT: vcvtdq2pd %xmm0, %xmm0299; VEX-NEXT: retq300;301; AVX512-LABEL: sitofp_16i8_to_2f64:302; AVX512: # %bb.0:303; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0304; AVX512-NEXT: vcvtdq2pd %ymm0, %zmm0305; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0306; AVX512-NEXT: vzeroupper307; AVX512-NEXT: retq308 %cvt = sitofp <16 x i8> %a to <16 x double>309 %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <2 x i32> <i32 0, i32 1>310 ret <2 x double> %shuf311}312 313define <4 x double> @sitofp_4i64_to_4f64(<4 x i64> %a) {314; SSE2-LABEL: sitofp_4i64_to_4f64:315; SSE2: # %bb.0:316; SSE2-NEXT: movq %xmm0, %rax317; SSE2-NEXT: cvtsi2sd %rax, %xmm2318; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]319; SSE2-NEXT: movq %xmm0, %rax320; SSE2-NEXT: xorps %xmm0, %xmm0321; SSE2-NEXT: cvtsi2sd %rax, %xmm0322; SSE2-NEXT: unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm0[0]323; SSE2-NEXT: movq %xmm1, %rax324; SSE2-NEXT: cvtsi2sd %rax, %xmm3325; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]326; SSE2-NEXT: movq %xmm0, %rax327; SSE2-NEXT: xorps %xmm0, %xmm0328; SSE2-NEXT: cvtsi2sd %rax, %xmm0329; SSE2-NEXT: unpcklpd {{.*#+}} xmm3 = xmm3[0],xmm0[0]330; SSE2-NEXT: movapd %xmm2, %xmm0331; SSE2-NEXT: movapd %xmm3, %xmm1332; SSE2-NEXT: retq333;334; SSE41-LABEL: sitofp_4i64_to_4f64:335; SSE41: # %bb.0:336; SSE41-NEXT: pextrq $1, %xmm0, %rax337; SSE41-NEXT: cvtsi2sd %rax, %xmm2338; SSE41-NEXT: movq %xmm0, %rax339; SSE41-NEXT: xorps %xmm0, %xmm0340; SSE41-NEXT: cvtsi2sd %rax, %xmm0341; SSE41-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]342; SSE41-NEXT: pextrq $1, %xmm1, %rax343; SSE41-NEXT: xorps %xmm2, %xmm2344; SSE41-NEXT: cvtsi2sd %rax, %xmm2345; SSE41-NEXT: movq %xmm1, %rax346; SSE41-NEXT: xorps %xmm1, %xmm1347; SSE41-NEXT: cvtsi2sd %rax, %xmm1348; SSE41-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]349; SSE41-NEXT: retq350;351; AVX1-LABEL: sitofp_4i64_to_4f64:352; AVX1: # %bb.0:353; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1354; AVX1-NEXT: vpextrq $1, %xmm1, %rax355; AVX1-NEXT: vcvtsi2sd %rax, %xmm15, %xmm2356; AVX1-NEXT: vmovq %xmm1, %rax357; AVX1-NEXT: vcvtsi2sd %rax, %xmm15, %xmm1358; AVX1-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]359; AVX1-NEXT: vpextrq $1, %xmm0, %rax360; AVX1-NEXT: vcvtsi2sd %rax, %xmm15, %xmm2361; AVX1-NEXT: vmovq %xmm0, %rax362; AVX1-NEXT: vcvtsi2sd %rax, %xmm15, %xmm0363; AVX1-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]364; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0365; AVX1-NEXT: retq366;367; AVX2-LABEL: sitofp_4i64_to_4f64:368; AVX2: # %bb.0:369; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1370; AVX2-NEXT: vpextrq $1, %xmm1, %rax371; AVX2-NEXT: vcvtsi2sd %rax, %xmm15, %xmm2372; AVX2-NEXT: vmovq %xmm1, %rax373; AVX2-NEXT: vcvtsi2sd %rax, %xmm15, %xmm1374; AVX2-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]375; AVX2-NEXT: vpextrq $1, %xmm0, %rax376; AVX2-NEXT: vcvtsi2sd %rax, %xmm15, %xmm2377; AVX2-NEXT: vmovq %xmm0, %rax378; AVX2-NEXT: vcvtsi2sd %rax, %xmm15, %xmm0379; AVX2-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]380; AVX2-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0381; AVX2-NEXT: retq382;383; AVX512F-LABEL: sitofp_4i64_to_4f64:384; AVX512F: # %bb.0:385; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1386; AVX512F-NEXT: vpextrq $1, %xmm1, %rax387; AVX512F-NEXT: vcvtsi2sd %rax, %xmm15, %xmm2388; AVX512F-NEXT: vmovq %xmm1, %rax389; AVX512F-NEXT: vcvtsi2sd %rax, %xmm15, %xmm1390; AVX512F-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]391; AVX512F-NEXT: vpextrq $1, %xmm0, %rax392; AVX512F-NEXT: vcvtsi2sd %rax, %xmm15, %xmm2393; AVX512F-NEXT: vmovq %xmm0, %rax394; AVX512F-NEXT: vcvtsi2sd %rax, %xmm15, %xmm0395; AVX512F-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]396; AVX512F-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0397; AVX512F-NEXT: retq398;399; AVX512VL-LABEL: sitofp_4i64_to_4f64:400; AVX512VL: # %bb.0:401; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1402; AVX512VL-NEXT: vpextrq $1, %xmm1, %rax403; AVX512VL-NEXT: vcvtsi2sd %rax, %xmm15, %xmm2404; AVX512VL-NEXT: vmovq %xmm1, %rax405; AVX512VL-NEXT: vcvtsi2sd %rax, %xmm15, %xmm1406; AVX512VL-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]407; AVX512VL-NEXT: vpextrq $1, %xmm0, %rax408; AVX512VL-NEXT: vcvtsi2sd %rax, %xmm15, %xmm2409; AVX512VL-NEXT: vmovq %xmm0, %rax410; AVX512VL-NEXT: vcvtsi2sd %rax, %xmm15, %xmm0411; AVX512VL-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0]412; AVX512VL-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0413; AVX512VL-NEXT: retq414;415; AVX512DQ-LABEL: sitofp_4i64_to_4f64:416; AVX512DQ: # %bb.0:417; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0418; AVX512DQ-NEXT: vcvtqq2pd %zmm0, %zmm0419; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0420; AVX512DQ-NEXT: retq421;422; AVX512VLDQ-LABEL: sitofp_4i64_to_4f64:423; AVX512VLDQ: # %bb.0:424; AVX512VLDQ-NEXT: vcvtqq2pd %ymm0, %ymm0425; AVX512VLDQ-NEXT: retq426 %cvt = sitofp <4 x i64> %a to <4 x double>427 ret <4 x double> %cvt428}429 430define <4 x double> @sitofp_4i32_to_4f64(<4 x i32> %a) {431; SSE-LABEL: sitofp_4i32_to_4f64:432; SSE: # %bb.0:433; SSE-NEXT: cvtdq2pd %xmm0, %xmm2434; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]435; SSE-NEXT: cvtdq2pd %xmm0, %xmm1436; SSE-NEXT: movaps %xmm2, %xmm0437; SSE-NEXT: retq438;439; AVX-LABEL: sitofp_4i32_to_4f64:440; AVX: # %bb.0:441; AVX-NEXT: vcvtdq2pd %xmm0, %ymm0442; AVX-NEXT: retq443 %cvt = sitofp <4 x i32> %a to <4 x double>444 ret <4 x double> %cvt445}446 447define <4 x double> @sitofp_4i16_to_4f64(<8 x i16> %a) {448; SSE2-LABEL: sitofp_4i16_to_4f64:449; SSE2: # %bb.0:450; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]451; SSE2-NEXT: psrad $16, %xmm1452; SSE2-NEXT: cvtdq2pd %xmm1, %xmm0453; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]454; SSE2-NEXT: cvtdq2pd %xmm1, %xmm1455; SSE2-NEXT: retq456;457; SSE41-LABEL: sitofp_4i16_to_4f64:458; SSE41: # %bb.0:459; SSE41-NEXT: pmovsxwd %xmm0, %xmm1460; SSE41-NEXT: cvtdq2pd %xmm1, %xmm0461; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]462; SSE41-NEXT: cvtdq2pd %xmm1, %xmm1463; SSE41-NEXT: retq464;465; AVX-LABEL: sitofp_4i16_to_4f64:466; AVX: # %bb.0:467; AVX-NEXT: vpmovsxwd %xmm0, %xmm0468; AVX-NEXT: vcvtdq2pd %xmm0, %ymm0469; AVX-NEXT: retq470 %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>471 %cvt = sitofp <4 x i16> %shuf to <4 x double>472 ret <4 x double> %cvt473}474 475define <4 x double> @sitofp_8i16_to_4f64(<8 x i16> %a) {476; SSE2-LABEL: sitofp_8i16_to_4f64:477; SSE2: # %bb.0:478; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]479; SSE2-NEXT: psrad $16, %xmm1480; SSE2-NEXT: cvtdq2pd %xmm1, %xmm0481; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]482; SSE2-NEXT: cvtdq2pd %xmm1, %xmm1483; SSE2-NEXT: retq484;485; SSE41-LABEL: sitofp_8i16_to_4f64:486; SSE41: # %bb.0:487; SSE41-NEXT: pmovsxwd %xmm0, %xmm1488; SSE41-NEXT: cvtdq2pd %xmm1, %xmm0489; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]490; SSE41-NEXT: cvtdq2pd %xmm1, %xmm1491; SSE41-NEXT: retq492;493; VEX-LABEL: sitofp_8i16_to_4f64:494; VEX: # %bb.0:495; VEX-NEXT: vpmovsxwd %xmm0, %xmm0496; VEX-NEXT: vcvtdq2pd %xmm0, %ymm0497; VEX-NEXT: retq498;499; AVX512-LABEL: sitofp_8i16_to_4f64:500; AVX512: # %bb.0:501; AVX512-NEXT: vpmovsxwd %xmm0, %ymm0502; AVX512-NEXT: vcvtdq2pd %ymm0, %zmm0503; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0504; AVX512-NEXT: retq505 %cvt = sitofp <8 x i16> %a to <8 x double>506 %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>507 ret <4 x double> %shuf508}509 510define <4 x double> @sitofp_4i8_to_4f64(<16 x i8> %a) {511; SSE2-LABEL: sitofp_4i8_to_4f64:512; SSE2: # %bb.0:513; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]514; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]515; SSE2-NEXT: psrad $24, %xmm1516; SSE2-NEXT: cvtdq2pd %xmm1, %xmm0517; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]518; SSE2-NEXT: cvtdq2pd %xmm1, %xmm1519; SSE2-NEXT: retq520;521; SSE41-LABEL: sitofp_4i8_to_4f64:522; SSE41: # %bb.0:523; SSE41-NEXT: pmovsxbd %xmm0, %xmm1524; SSE41-NEXT: cvtdq2pd %xmm1, %xmm0525; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]526; SSE41-NEXT: cvtdq2pd %xmm1, %xmm1527; SSE41-NEXT: retq528;529; AVX-LABEL: sitofp_4i8_to_4f64:530; AVX: # %bb.0:531; AVX-NEXT: vpmovsxbd %xmm0, %xmm0532; AVX-NEXT: vcvtdq2pd %xmm0, %ymm0533; AVX-NEXT: retq534 %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>535 %cvt = sitofp <4 x i8> %shuf to <4 x double>536 ret <4 x double> %cvt537}538 539define <4 x double> @sitofp_16i8_to_4f64(<16 x i8> %a) {540; SSE2-LABEL: sitofp_16i8_to_4f64:541; SSE2: # %bb.0:542; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]543; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]544; SSE2-NEXT: psrad $24, %xmm1545; SSE2-NEXT: cvtdq2pd %xmm1, %xmm0546; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]547; SSE2-NEXT: cvtdq2pd %xmm1, %xmm1548; SSE2-NEXT: retq549;550; SSE41-LABEL: sitofp_16i8_to_4f64:551; SSE41: # %bb.0:552; SSE41-NEXT: pmovsxbd %xmm0, %xmm1553; SSE41-NEXT: cvtdq2pd %xmm1, %xmm0554; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]555; SSE41-NEXT: cvtdq2pd %xmm1, %xmm1556; SSE41-NEXT: retq557;558; VEX-LABEL: sitofp_16i8_to_4f64:559; VEX: # %bb.0:560; VEX-NEXT: vpmovsxbd %xmm0, %xmm0561; VEX-NEXT: vcvtdq2pd %xmm0, %ymm0562; VEX-NEXT: retq563;564; AVX512-LABEL: sitofp_16i8_to_4f64:565; AVX512: # %bb.0:566; AVX512-NEXT: vpmovsxbd %xmm0, %zmm0567; AVX512-NEXT: vcvtdq2pd %ymm0, %zmm0568; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0569; AVX512-NEXT: retq570 %cvt = sitofp <16 x i8> %a to <16 x double>571 %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>572 ret <4 x double> %shuf573}574 575;576; Unsigned Integer to Double577;578 579define <2 x double> @uitofp_2i64_to_2f64(<2 x i64> %a) {580; SSE2-LABEL: uitofp_2i64_to_2f64:581; SSE2: # %bb.0:582; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [4294967295,4294967295]583; SSE2-NEXT: pand %xmm0, %xmm1584; SSE2-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1585; SSE2-NEXT: psrlq $32, %xmm0586; SSE2-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0587; SSE2-NEXT: subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0588; SSE2-NEXT: addpd %xmm1, %xmm0589; SSE2-NEXT: retq590;591; SSE41-LABEL: uitofp_2i64_to_2f64:592; SSE41: # %bb.0:593; SSE41-NEXT: pxor %xmm1, %xmm1594; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]595; SSE41-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1596; SSE41-NEXT: psrlq $32, %xmm0597; SSE41-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0598; SSE41-NEXT: subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0599; SSE41-NEXT: addpd %xmm1, %xmm0600; SSE41-NEXT: retq601;602; AVX1-LABEL: uitofp_2i64_to_2f64:603; AVX1: # %bb.0:604; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1605; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]606; AVX1-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1607; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm0608; AVX1-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0609; AVX1-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0610; AVX1-NEXT: vaddpd %xmm0, %xmm1, %xmm0611; AVX1-NEXT: retq612;613; AVX2-LABEL: uitofp_2i64_to_2f64:614; AVX2: # %bb.0:615; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1616; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]617; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1618; AVX2-NEXT: vpsrlq $32, %xmm0, %xmm0619; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0620; AVX2-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0621; AVX2-NEXT: vaddpd %xmm0, %xmm1, %xmm0622; AVX2-NEXT: retq623;624; AVX512F-LABEL: uitofp_2i64_to_2f64:625; AVX512F: # %bb.0:626; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1627; AVX512F-NEXT: vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]628; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1629; AVX512F-NEXT: vpsrlq $32, %xmm0, %xmm0630; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0631; AVX512F-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0632; AVX512F-NEXT: vaddpd %xmm0, %xmm1, %xmm0633; AVX512F-NEXT: retq634;635; AVX512VL-LABEL: uitofp_2i64_to_2f64:636; AVX512VL: # %bb.0:637; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1638; AVX512VL-NEXT: vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]639; AVX512VL-NEXT: vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %xmm1640; AVX512VL-NEXT: vpsrlq $32, %xmm0, %xmm0641; AVX512VL-NEXT: vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0642; AVX512VL-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0643; AVX512VL-NEXT: vaddpd %xmm0, %xmm1, %xmm0644; AVX512VL-NEXT: retq645;646; AVX512DQ-LABEL: uitofp_2i64_to_2f64:647; AVX512DQ: # %bb.0:648; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0649; AVX512DQ-NEXT: vcvtuqq2pd %zmm0, %zmm0650; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0651; AVX512DQ-NEXT: vzeroupper652; AVX512DQ-NEXT: retq653;654; AVX512VLDQ-LABEL: uitofp_2i64_to_2f64:655; AVX512VLDQ: # %bb.0:656; AVX512VLDQ-NEXT: vcvtuqq2pd %xmm0, %xmm0657; AVX512VLDQ-NEXT: retq658 %cvt = uitofp <2 x i64> %a to <2 x double>659 ret <2 x double> %cvt660}661 662define <2 x double> @uitofp_2i32_to_2f64(<4 x i32> %a) {663; SSE2-LABEL: uitofp_2i32_to_2f64:664; SSE2: # %bb.0:665; SSE2-NEXT: xorpd %xmm1, %xmm1666; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]667; SSE2-NEXT: movapd {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]668; SSE2-NEXT: orpd %xmm1, %xmm0669; SSE2-NEXT: subpd %xmm1, %xmm0670; SSE2-NEXT: retq671;672; SSE41-LABEL: uitofp_2i32_to_2f64:673; SSE41: # %bb.0:674; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero675; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]676; SSE41-NEXT: por %xmm1, %xmm0677; SSE41-NEXT: subpd %xmm1, %xmm0678; SSE41-NEXT: retq679;680; AVX1-LABEL: uitofp_2i32_to_2f64:681; AVX1: # %bb.0:682; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero683; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]684; AVX1-NEXT: # xmm1 = mem[0,0]685; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0686; AVX1-NEXT: vsubpd %xmm1, %xmm0, %xmm0687; AVX1-NEXT: retq688;689; AVX2-LABEL: uitofp_2i32_to_2f64:690; AVX2: # %bb.0:691; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero692; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]693; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0694; AVX2-NEXT: vsubpd %xmm1, %xmm0, %xmm0695; AVX2-NEXT: retq696;697; AVX512F-LABEL: uitofp_2i32_to_2f64:698; AVX512F: # %bb.0:699; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0700; AVX512F-NEXT: vcvtudq2pd %ymm0, %zmm0701; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0702; AVX512F-NEXT: vzeroupper703; AVX512F-NEXT: retq704;705; AVX512VL-LABEL: uitofp_2i32_to_2f64:706; AVX512VL: # %bb.0:707; AVX512VL-NEXT: vcvtudq2pd %xmm0, %xmm0708; AVX512VL-NEXT: retq709;710; AVX512DQ-LABEL: uitofp_2i32_to_2f64:711; AVX512DQ: # %bb.0:712; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0713; AVX512DQ-NEXT: vcvtudq2pd %ymm0, %zmm0714; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0715; AVX512DQ-NEXT: vzeroupper716; AVX512DQ-NEXT: retq717;718; AVX512VLDQ-LABEL: uitofp_2i32_to_2f64:719; AVX512VLDQ: # %bb.0:720; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %xmm0721; AVX512VLDQ-NEXT: retq722 %shuf = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 0, i32 1>723 %cvt = uitofp <2 x i32> %shuf to <2 x double>724 ret <2 x double> %cvt725}726 727define <2 x double> @uitofp_4i32_to_2f64(<4 x i32> %a) {728; SSE2-LABEL: uitofp_4i32_to_2f64:729; SSE2: # %bb.0:730; SSE2-NEXT: xorpd %xmm1, %xmm1731; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]732; SSE2-NEXT: movapd {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]733; SSE2-NEXT: orpd %xmm1, %xmm0734; SSE2-NEXT: subpd %xmm1, %xmm0735; SSE2-NEXT: retq736;737; SSE41-LABEL: uitofp_4i32_to_2f64:738; SSE41: # %bb.0:739; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero740; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]741; SSE41-NEXT: por %xmm1, %xmm0742; SSE41-NEXT: subpd %xmm1, %xmm0743; SSE41-NEXT: retq744;745; AVX1-LABEL: uitofp_4i32_to_2f64:746; AVX1: # %bb.0:747; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero748; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]749; AVX1-NEXT: # xmm1 = mem[0,0]750; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0751; AVX1-NEXT: vsubpd %xmm1, %xmm0, %xmm0752; AVX1-NEXT: retq753;754; AVX2-LABEL: uitofp_4i32_to_2f64:755; AVX2: # %bb.0:756; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]757; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero758; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0759; AVX2-NEXT: vsubpd %xmm1, %xmm0, %xmm0760; AVX2-NEXT: retq761;762; AVX512F-LABEL: uitofp_4i32_to_2f64:763; AVX512F: # %bb.0:764; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0765; AVX512F-NEXT: vcvtudq2pd %ymm0, %zmm0766; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0767; AVX512F-NEXT: vzeroupper768; AVX512F-NEXT: retq769;770; AVX512VL-LABEL: uitofp_4i32_to_2f64:771; AVX512VL: # %bb.0:772; AVX512VL-NEXT: vcvtudq2pd %xmm0, %xmm0773; AVX512VL-NEXT: retq774;775; AVX512DQ-LABEL: uitofp_4i32_to_2f64:776; AVX512DQ: # %bb.0:777; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0778; AVX512DQ-NEXT: vcvtudq2pd %ymm0, %zmm0779; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0780; AVX512DQ-NEXT: vzeroupper781; AVX512DQ-NEXT: retq782;783; AVX512VLDQ-LABEL: uitofp_4i32_to_2f64:784; AVX512VLDQ: # %bb.0:785; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %xmm0786; AVX512VLDQ-NEXT: retq787 %cvt = uitofp <4 x i32> %a to <4 x double>788 %shuf = shufflevector <4 x double> %cvt, <4 x double> undef, <2 x i32> <i32 0, i32 1>789 ret <2 x double> %shuf790}791 792define <2 x double> @uitofp_2i16_to_2f64(<8 x i16> %a) {793; SSE2-LABEL: uitofp_2i16_to_2f64:794; SSE2: # %bb.0:795; SSE2-NEXT: pxor %xmm1, %xmm1796; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]797; SSE2-NEXT: cvtdq2pd %xmm0, %xmm0798; SSE2-NEXT: retq799;800; SSE41-LABEL: uitofp_2i16_to_2f64:801; SSE41: # %bb.0:802; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero803; SSE41-NEXT: cvtdq2pd %xmm0, %xmm0804; SSE41-NEXT: retq805;806; AVX-LABEL: uitofp_2i16_to_2f64:807; AVX: # %bb.0:808; AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero809; AVX-NEXT: vcvtdq2pd %xmm0, %xmm0810; AVX-NEXT: retq811 %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <2 x i32> <i32 0, i32 1>812 %cvt = uitofp <2 x i16> %shuf to <2 x double>813 ret <2 x double> %cvt814}815 816define <2 x double> @uitofp_8i16_to_2f64(<8 x i16> %a) {817; SSE2-LABEL: uitofp_8i16_to_2f64:818; SSE2: # %bb.0:819; SSE2-NEXT: pxor %xmm1, %xmm1820; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]821; SSE2-NEXT: cvtdq2pd %xmm0, %xmm0822; SSE2-NEXT: retq823;824; SSE41-LABEL: uitofp_8i16_to_2f64:825; SSE41: # %bb.0:826; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero827; SSE41-NEXT: cvtdq2pd %xmm0, %xmm0828; SSE41-NEXT: retq829;830; VEX-LABEL: uitofp_8i16_to_2f64:831; VEX: # %bb.0:832; VEX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero833; VEX-NEXT: vcvtdq2pd %xmm0, %xmm0834; VEX-NEXT: retq835;836; AVX512-LABEL: uitofp_8i16_to_2f64:837; AVX512: # %bb.0:838; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero839; AVX512-NEXT: vcvtdq2pd %ymm0, %zmm0840; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0841; AVX512-NEXT: vzeroupper842; AVX512-NEXT: retq843 %cvt = uitofp <8 x i16> %a to <8 x double>844 %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <2 x i32> <i32 0, i32 1>845 ret <2 x double> %shuf846}847 848define <2 x double> @uitofp_2i8_to_2f64(<16 x i8> %a) {849; SSE2-LABEL: uitofp_2i8_to_2f64:850; SSE2: # %bb.0:851; SSE2-NEXT: pxor %xmm1, %xmm1852; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]853; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]854; SSE2-NEXT: cvtdq2pd %xmm0, %xmm0855; SSE2-NEXT: retq856;857; SSE41-LABEL: uitofp_2i8_to_2f64:858; SSE41: # %bb.0:859; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero860; SSE41-NEXT: cvtdq2pd %xmm0, %xmm0861; SSE41-NEXT: retq862;863; AVX-LABEL: uitofp_2i8_to_2f64:864; AVX: # %bb.0:865; AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero866; AVX-NEXT: vcvtdq2pd %xmm0, %xmm0867; AVX-NEXT: retq868 %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <2 x i32> <i32 0, i32 1>869 %cvt = uitofp <2 x i8> %shuf to <2 x double>870 ret <2 x double> %cvt871}872 873define <2 x double> @uitofp_16i8_to_2f64(<16 x i8> %a) {874; SSE2-LABEL: uitofp_16i8_to_2f64:875; SSE2: # %bb.0:876; SSE2-NEXT: pxor %xmm1, %xmm1877; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]878; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]879; SSE2-NEXT: cvtdq2pd %xmm0, %xmm0880; SSE2-NEXT: retq881;882; SSE41-LABEL: uitofp_16i8_to_2f64:883; SSE41: # %bb.0:884; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero885; SSE41-NEXT: cvtdq2pd %xmm0, %xmm0886; SSE41-NEXT: retq887;888; VEX-LABEL: uitofp_16i8_to_2f64:889; VEX: # %bb.0:890; VEX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero891; VEX-NEXT: vcvtdq2pd %xmm0, %xmm0892; VEX-NEXT: retq893;894; AVX512-LABEL: uitofp_16i8_to_2f64:895; AVX512: # %bb.0:896; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero897; AVX512-NEXT: vcvtdq2pd %ymm0, %zmm0898; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0899; AVX512-NEXT: vzeroupper900; AVX512-NEXT: retq901 %cvt = uitofp <16 x i8> %a to <16 x double>902 %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <2 x i32> <i32 0, i32 1>903 ret <2 x double> %shuf904}905 906define <4 x double> @uitofp_4i64_to_4f64(<4 x i64> %a) {907; SSE2-LABEL: uitofp_4i64_to_4f64:908; SSE2: # %bb.0:909; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [4294967295,4294967295]910; SSE2-NEXT: movdqa %xmm0, %xmm3911; SSE2-NEXT: pand %xmm2, %xmm3912; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]913; SSE2-NEXT: por %xmm4, %xmm3914; SSE2-NEXT: psrlq $32, %xmm0915; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]916; SSE2-NEXT: por %xmm5, %xmm0917; SSE2-NEXT: movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]918; SSE2-NEXT: subpd %xmm6, %xmm0919; SSE2-NEXT: addpd %xmm3, %xmm0920; SSE2-NEXT: pand %xmm1, %xmm2921; SSE2-NEXT: por %xmm4, %xmm2922; SSE2-NEXT: psrlq $32, %xmm1923; SSE2-NEXT: por %xmm5, %xmm1924; SSE2-NEXT: subpd %xmm6, %xmm1925; SSE2-NEXT: addpd %xmm2, %xmm1926; SSE2-NEXT: retq927;928; SSE41-LABEL: uitofp_4i64_to_4f64:929; SSE41: # %bb.0:930; SSE41-NEXT: pxor %xmm2, %xmm2931; SSE41-NEXT: movdqa %xmm0, %xmm3932; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]933; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]934; SSE41-NEXT: por %xmm4, %xmm3935; SSE41-NEXT: psrlq $32, %xmm0936; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]937; SSE41-NEXT: por %xmm5, %xmm0938; SSE41-NEXT: movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]939; SSE41-NEXT: subpd %xmm6, %xmm0940; SSE41-NEXT: addpd %xmm3, %xmm0941; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]942; SSE41-NEXT: por %xmm4, %xmm2943; SSE41-NEXT: psrlq $32, %xmm1944; SSE41-NEXT: por %xmm5, %xmm1945; SSE41-NEXT: subpd %xmm6, %xmm1946; SSE41-NEXT: addpd %xmm2, %xmm1947; SSE41-NEXT: retq948;949; AVX1-LABEL: uitofp_4i64_to_4f64:950; AVX1: # %bb.0:951; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1952; AVX1-NEXT: vblendps {{.*#+}} ymm2 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]953; AVX1-NEXT: vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2954; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm1[1,3],ymm0[5,7],ymm1[5,7]955; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]956; AVX1-NEXT: vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0957; AVX1-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0958; AVX1-NEXT: vaddpd %ymm0, %ymm2, %ymm0959; AVX1-NEXT: retq960;961; AVX2-LABEL: uitofp_4i64_to_4f64:962; AVX2: # %bb.0:963; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1964; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]965; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]966; AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1967; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm0968; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]969; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0970; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25]971; AVX2-NEXT: vsubpd %ymm2, %ymm0, %ymm0972; AVX2-NEXT: vaddpd %ymm0, %ymm1, %ymm0973; AVX2-NEXT: retq974;975; AVX512F-LABEL: uitofp_4i64_to_4f64:976; AVX512F: # %bb.0:977; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1978; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]979; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]980; AVX512F-NEXT: vpor %ymm2, %ymm1, %ymm1981; AVX512F-NEXT: vpsrlq $32, %ymm0, %ymm0982; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]983; AVX512F-NEXT: vpor %ymm2, %ymm0, %ymm0984; AVX512F-NEXT: vbroadcastsd {{.*#+}} ymm2 = [1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25]985; AVX512F-NEXT: vsubpd %ymm2, %ymm0, %ymm0986; AVX512F-NEXT: vaddpd %ymm0, %ymm1, %ymm0987; AVX512F-NEXT: retq988;989; AVX512VL-LABEL: uitofp_4i64_to_4f64:990; AVX512VL: # %bb.0:991; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1992; AVX512VL-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]993; AVX512VL-NEXT: vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm1, %ymm1994; AVX512VL-NEXT: vpsrlq $32, %ymm0, %ymm0995; AVX512VL-NEXT: vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0996; AVX512VL-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0997; AVX512VL-NEXT: vaddpd %ymm0, %ymm1, %ymm0998; AVX512VL-NEXT: retq999;1000; AVX512DQ-LABEL: uitofp_4i64_to_4f64:1001; AVX512DQ: # %bb.0:1002; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01003; AVX512DQ-NEXT: vcvtuqq2pd %zmm0, %zmm01004; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01005; AVX512DQ-NEXT: retq1006;1007; AVX512VLDQ-LABEL: uitofp_4i64_to_4f64:1008; AVX512VLDQ: # %bb.0:1009; AVX512VLDQ-NEXT: vcvtuqq2pd %ymm0, %ymm01010; AVX512VLDQ-NEXT: retq1011 %cvt = uitofp <4 x i64> %a to <4 x double>1012 ret <4 x double> %cvt1013}1014 1015define <4 x double> @uitofp_4i32_to_4f64(<4 x i32> %a) {1016; SSE2-LABEL: uitofp_4i32_to_4f64:1017; SSE2: # %bb.0:1018; SSE2-NEXT: movapd %xmm0, %xmm11019; SSE2-NEXT: xorpd %xmm2, %xmm21020; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]1021; SSE2-NEXT: movapd {{.*#+}} xmm3 = [4.503599627370496E+15,4.503599627370496E+15]1022; SSE2-NEXT: orpd %xmm3, %xmm01023; SSE2-NEXT: subpd %xmm3, %xmm01024; SSE2-NEXT: unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]1025; SSE2-NEXT: orpd %xmm3, %xmm11026; SSE2-NEXT: subpd %xmm3, %xmm11027; SSE2-NEXT: retq1028;1029; SSE41-LABEL: uitofp_4i32_to_4f64:1030; SSE41: # %bb.0:1031; SSE41-NEXT: movdqa %xmm0, %xmm11032; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero1033; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [4.503599627370496E+15,4.503599627370496E+15]1034; SSE41-NEXT: por %xmm2, %xmm01035; SSE41-NEXT: subpd %xmm2, %xmm01036; SSE41-NEXT: pxor %xmm3, %xmm31037; SSE41-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]1038; SSE41-NEXT: por %xmm2, %xmm11039; SSE41-NEXT: subpd %xmm2, %xmm11040; SSE41-NEXT: retq1041;1042; AVX1-LABEL: uitofp_4i32_to_4f64:1043; AVX1: # %bb.0:1044; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11045; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm1 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]1046; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero1047; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01048; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm1 = [4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15]1049; AVX1-NEXT: vorpd %ymm1, %ymm0, %ymm01050; AVX1-NEXT: vsubpd %ymm1, %ymm0, %ymm01051; AVX1-NEXT: retq1052;1053; AVX2-LABEL: uitofp_4i32_to_4f64:1054; AVX2: # %bb.0:1055; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1056; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15]1057; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01058; AVX2-NEXT: vsubpd %ymm1, %ymm0, %ymm01059; AVX2-NEXT: retq1060;1061; AVX512F-LABEL: uitofp_4i32_to_4f64:1062; AVX512F: # %bb.0:1063; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01064; AVX512F-NEXT: vcvtudq2pd %ymm0, %zmm01065; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01066; AVX512F-NEXT: retq1067;1068; AVX512VL-LABEL: uitofp_4i32_to_4f64:1069; AVX512VL: # %bb.0:1070; AVX512VL-NEXT: vcvtudq2pd %xmm0, %ymm01071; AVX512VL-NEXT: retq1072;1073; AVX512DQ-LABEL: uitofp_4i32_to_4f64:1074; AVX512DQ: # %bb.0:1075; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01076; AVX512DQ-NEXT: vcvtudq2pd %ymm0, %zmm01077; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01078; AVX512DQ-NEXT: retq1079;1080; AVX512VLDQ-LABEL: uitofp_4i32_to_4f64:1081; AVX512VLDQ: # %bb.0:1082; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %ymm01083; AVX512VLDQ-NEXT: retq1084 %cvt = uitofp <4 x i32> %a to <4 x double>1085 ret <4 x double> %cvt1086}1087 1088define <4 x double> @uitofp_4i16_to_4f64(<8 x i16> %a) {1089; SSE2-LABEL: uitofp_4i16_to_4f64:1090; SSE2: # %bb.0:1091; SSE2-NEXT: pxor %xmm1, %xmm11092; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1093; SSE2-NEXT: cvtdq2pd %xmm0, %xmm21094; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1095; SSE2-NEXT: cvtdq2pd %xmm0, %xmm11096; SSE2-NEXT: movaps %xmm2, %xmm01097; SSE2-NEXT: retq1098;1099; SSE41-LABEL: uitofp_4i16_to_4f64:1100; SSE41: # %bb.0:1101; SSE41-NEXT: pmovzxwd {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1102; SSE41-NEXT: cvtdq2pd %xmm1, %xmm01103; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1104; SSE41-NEXT: cvtdq2pd %xmm1, %xmm11105; SSE41-NEXT: retq1106;1107; AVX-LABEL: uitofp_4i16_to_4f64:1108; AVX: # %bb.0:1109; AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1110; AVX-NEXT: vcvtdq2pd %xmm0, %ymm01111; AVX-NEXT: retq1112 %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1113 %cvt = uitofp <4 x i16> %shuf to <4 x double>1114 ret <4 x double> %cvt1115}1116 1117define <4 x double> @uitofp_8i16_to_4f64(<8 x i16> %a) {1118; SSE2-LABEL: uitofp_8i16_to_4f64:1119; SSE2: # %bb.0:1120; SSE2-NEXT: pxor %xmm1, %xmm11121; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1122; SSE2-NEXT: cvtdq2pd %xmm0, %xmm21123; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1124; SSE2-NEXT: cvtdq2pd %xmm0, %xmm11125; SSE2-NEXT: movaps %xmm2, %xmm01126; SSE2-NEXT: retq1127;1128; SSE41-LABEL: uitofp_8i16_to_4f64:1129; SSE41: # %bb.0:1130; SSE41-NEXT: pmovzxwd {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1131; SSE41-NEXT: cvtdq2pd %xmm1, %xmm01132; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1133; SSE41-NEXT: cvtdq2pd %xmm1, %xmm11134; SSE41-NEXT: retq1135;1136; VEX-LABEL: uitofp_8i16_to_4f64:1137; VEX: # %bb.0:1138; VEX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1139; VEX-NEXT: vcvtdq2pd %xmm0, %ymm01140; VEX-NEXT: retq1141;1142; AVX512-LABEL: uitofp_8i16_to_4f64:1143; AVX512: # %bb.0:1144; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero1145; AVX512-NEXT: vcvtdq2pd %ymm0, %zmm01146; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01147; AVX512-NEXT: retq1148 %cvt = uitofp <8 x i16> %a to <8 x double>1149 %shuf = shufflevector <8 x double> %cvt, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1150 ret <4 x double> %shuf1151}1152 1153define <4 x double> @uitofp_4i8_to_4f64(<16 x i8> %a) {1154; SSE2-LABEL: uitofp_4i8_to_4f64:1155; SSE2: # %bb.0:1156; SSE2-NEXT: pxor %xmm1, %xmm11157; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1158; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1159; SSE2-NEXT: cvtdq2pd %xmm0, %xmm21160; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1161; SSE2-NEXT: cvtdq2pd %xmm0, %xmm11162; SSE2-NEXT: movaps %xmm2, %xmm01163; SSE2-NEXT: retq1164;1165; SSE41-LABEL: uitofp_4i8_to_4f64:1166; SSE41: # %bb.0:1167; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero1168; SSE41-NEXT: cvtdq2pd %xmm1, %xmm01169; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1170; SSE41-NEXT: cvtdq2pd %xmm1, %xmm11171; SSE41-NEXT: retq1172;1173; AVX-LABEL: uitofp_4i8_to_4f64:1174; AVX: # %bb.0:1175; AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero1176; AVX-NEXT: vcvtdq2pd %xmm0, %ymm01177; AVX-NEXT: retq1178 %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1179 %cvt = uitofp <4 x i8> %shuf to <4 x double>1180 ret <4 x double> %cvt1181}1182 1183define <4 x double> @uitofp_16i8_to_4f64(<16 x i8> %a) {1184; SSE2-LABEL: uitofp_16i8_to_4f64:1185; SSE2: # %bb.0:1186; SSE2-NEXT: pxor %xmm1, %xmm11187; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1188; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1189; SSE2-NEXT: cvtdq2pd %xmm0, %xmm21190; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1191; SSE2-NEXT: cvtdq2pd %xmm0, %xmm11192; SSE2-NEXT: movaps %xmm2, %xmm01193; SSE2-NEXT: retq1194;1195; SSE41-LABEL: uitofp_16i8_to_4f64:1196; SSE41: # %bb.0:1197; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero1198; SSE41-NEXT: cvtdq2pd %xmm1, %xmm01199; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1200; SSE41-NEXT: cvtdq2pd %xmm1, %xmm11201; SSE41-NEXT: retq1202;1203; VEX-LABEL: uitofp_16i8_to_4f64:1204; VEX: # %bb.0:1205; VEX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero1206; VEX-NEXT: vcvtdq2pd %xmm0, %ymm01207; VEX-NEXT: retq1208;1209; AVX512-LABEL: uitofp_16i8_to_4f64:1210; AVX512: # %bb.0:1211; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero1212; AVX512-NEXT: vcvtdq2pd %ymm0, %zmm01213; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01214; AVX512-NEXT: retq1215 %cvt = uitofp <16 x i8> %a to <16 x double>1216 %shuf = shufflevector <16 x double> %cvt, <16 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1217 ret <4 x double> %shuf1218}1219 1220;1221; Signed Integer to Float1222;1223 1224define <4 x float> @sitofp_2i64_to_4f32(<2 x i64> %a) {1225; SSE2-LABEL: sitofp_2i64_to_4f32:1226; SSE2: # %bb.0:1227; SSE2-NEXT: movq %xmm0, %rax1228; SSE2-NEXT: cvtsi2ss %rax, %xmm11229; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1230; SSE2-NEXT: movq %xmm0, %rax1231; SSE2-NEXT: xorps %xmm0, %xmm01232; SSE2-NEXT: cvtsi2ss %rax, %xmm01233; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1234; SSE2-NEXT: movaps %xmm1, %xmm01235; SSE2-NEXT: retq1236;1237; SSE41-LABEL: sitofp_2i64_to_4f32:1238; SSE41: # %bb.0:1239; SSE41-NEXT: pextrq $1, %xmm0, %rax1240; SSE41-NEXT: cvtsi2ss %rax, %xmm11241; SSE41-NEXT: movq %xmm0, %rax1242; SSE41-NEXT: xorps %xmm0, %xmm01243; SSE41-NEXT: cvtsi2ss %rax, %xmm01244; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]1245; SSE41-NEXT: retq1246;1247; VEX-LABEL: sitofp_2i64_to_4f32:1248; VEX: # %bb.0:1249; VEX-NEXT: vpextrq $1, %xmm0, %rax1250; VEX-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11251; VEX-NEXT: vmovq %xmm0, %rax1252; VEX-NEXT: vcvtsi2ss %rax, %xmm15, %xmm01253; VEX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero1254; VEX-NEXT: retq1255;1256; AVX512F-LABEL: sitofp_2i64_to_4f32:1257; AVX512F: # %bb.0:1258; AVX512F-NEXT: vpextrq $1, %xmm0, %rax1259; AVX512F-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11260; AVX512F-NEXT: vmovq %xmm0, %rax1261; AVX512F-NEXT: vcvtsi2ss %rax, %xmm15, %xmm01262; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero1263; AVX512F-NEXT: retq1264;1265; AVX512VL-LABEL: sitofp_2i64_to_4f32:1266; AVX512VL: # %bb.0:1267; AVX512VL-NEXT: vpextrq $1, %xmm0, %rax1268; AVX512VL-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11269; AVX512VL-NEXT: vmovq %xmm0, %rax1270; AVX512VL-NEXT: vcvtsi2ss %rax, %xmm15, %xmm01271; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero1272; AVX512VL-NEXT: retq1273;1274; AVX512DQ-LABEL: sitofp_2i64_to_4f32:1275; AVX512DQ: # %bb.0:1276; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01277; AVX512DQ-NEXT: vcvtqq2ps %zmm0, %ymm01278; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01279; AVX512DQ-NEXT: vzeroupper1280; AVX512DQ-NEXT: retq1281;1282; AVX512VLDQ-LABEL: sitofp_2i64_to_4f32:1283; AVX512VLDQ: # %bb.0:1284; AVX512VLDQ-NEXT: vcvtqq2ps %xmm0, %xmm01285; AVX512VLDQ-NEXT: retq1286 %cvt = sitofp <2 x i64> %a to <2 x float>1287 %ext = shufflevector <2 x float> %cvt, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>1288 ret <4 x float> %ext1289}1290 1291define <4 x float> @sitofp_2i64_to_4f32_zero(<2 x i64> %a) {1292; SSE2-LABEL: sitofp_2i64_to_4f32_zero:1293; SSE2: # %bb.0:1294; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1295; SSE2-NEXT: movq %xmm1, %rax1296; SSE2-NEXT: xorps %xmm1, %xmm11297; SSE2-NEXT: cvtsi2ss %rax, %xmm11298; SSE2-NEXT: movq %xmm0, %rax1299; SSE2-NEXT: xorps %xmm0, %xmm01300; SSE2-NEXT: cvtsi2ss %rax, %xmm01301; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1302; SSE2-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero1303; SSE2-NEXT: retq1304;1305; SSE41-LABEL: sitofp_2i64_to_4f32_zero:1306; SSE41: # %bb.0:1307; SSE41-NEXT: movq %xmm0, %rax1308; SSE41-NEXT: cvtsi2ss %rax, %xmm11309; SSE41-NEXT: pextrq $1, %xmm0, %rax1310; SSE41-NEXT: xorps %xmm0, %xmm01311; SSE41-NEXT: cvtsi2ss %rax, %xmm01312; SSE41-NEXT: insertps {{.*#+}} xmm1 = xmm1[0],xmm0[0],zero,zero1313; SSE41-NEXT: movaps %xmm1, %xmm01314; SSE41-NEXT: retq1315;1316; VEX-LABEL: sitofp_2i64_to_4f32_zero:1317; VEX: # %bb.0:1318; VEX-NEXT: vmovq %xmm0, %rax1319; VEX-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11320; VEX-NEXT: vpextrq $1, %xmm0, %rax1321; VEX-NEXT: vcvtsi2ss %rax, %xmm15, %xmm01322; VEX-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero1323; VEX-NEXT: retq1324;1325; AVX512F-LABEL: sitofp_2i64_to_4f32_zero:1326; AVX512F: # %bb.0:1327; AVX512F-NEXT: vmovq %xmm0, %rax1328; AVX512F-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11329; AVX512F-NEXT: vpextrq $1, %xmm0, %rax1330; AVX512F-NEXT: vcvtsi2ss %rax, %xmm15, %xmm01331; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero1332; AVX512F-NEXT: retq1333;1334; AVX512VL-LABEL: sitofp_2i64_to_4f32_zero:1335; AVX512VL: # %bb.0:1336; AVX512VL-NEXT: vmovq %xmm0, %rax1337; AVX512VL-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11338; AVX512VL-NEXT: vpextrq $1, %xmm0, %rax1339; AVX512VL-NEXT: vcvtsi2ss %rax, %xmm15, %xmm01340; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero1341; AVX512VL-NEXT: retq1342;1343; AVX512DQ-LABEL: sitofp_2i64_to_4f32_zero:1344; AVX512DQ: # %bb.0:1345; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01346; AVX512DQ-NEXT: vcvtqq2ps %zmm0, %ymm01347; AVX512DQ-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero1348; AVX512DQ-NEXT: vzeroupper1349; AVX512DQ-NEXT: retq1350;1351; AVX512VLDQ-LABEL: sitofp_2i64_to_4f32_zero:1352; AVX512VLDQ: # %bb.0:1353; AVX512VLDQ-NEXT: vcvtqq2ps %xmm0, %xmm01354; AVX512VLDQ-NEXT: retq1355 %cvt = sitofp <2 x i64> %a to <2 x float>1356 %ext = shufflevector <2 x float> %cvt, <2 x float> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1357 ret <4 x float> %ext1358}1359 1360define <4 x float> @sitofp_4i64_to_4f32_undef(<2 x i64> %a) {1361; SSE2-LABEL: sitofp_4i64_to_4f32_undef:1362; SSE2: # %bb.0:1363; SSE2-NEXT: movq %xmm0, %rax1364; SSE2-NEXT: cvtsi2ss %rax, %xmm11365; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1366; SSE2-NEXT: movq %xmm0, %rax1367; SSE2-NEXT: xorps %xmm0, %xmm01368; SSE2-NEXT: cvtsi2ss %rax, %xmm01369; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1370; SSE2-NEXT: movq {{.*#+}} xmm0 = xmm1[0],zero1371; SSE2-NEXT: retq1372;1373; SSE41-LABEL: sitofp_4i64_to_4f32_undef:1374; SSE41: # %bb.0:1375; SSE41-NEXT: pextrq $1, %xmm0, %rax1376; SSE41-NEXT: cvtsi2ss %rax, %xmm11377; SSE41-NEXT: movq %xmm0, %rax1378; SSE41-NEXT: xorps %xmm0, %xmm01379; SSE41-NEXT: cvtsi2ss %rax, %xmm01380; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero1381; SSE41-NEXT: retq1382;1383; VEX-LABEL: sitofp_4i64_to_4f32_undef:1384; VEX: # %bb.0:1385; VEX-NEXT: vpextrq $1, %xmm0, %rax1386; VEX-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11387; VEX-NEXT: vmovq %xmm0, %rax1388; VEX-NEXT: vcvtsi2ss %rax, %xmm15, %xmm01389; VEX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero1390; VEX-NEXT: retq1391;1392; AVX512F-LABEL: sitofp_4i64_to_4f32_undef:1393; AVX512F: # %bb.0:1394; AVX512F-NEXT: vpextrq $1, %xmm0, %rax1395; AVX512F-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11396; AVX512F-NEXT: vmovq %xmm0, %rax1397; AVX512F-NEXT: vcvtsi2ss %rax, %xmm15, %xmm01398; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero1399; AVX512F-NEXT: retq1400;1401; AVX512VL-LABEL: sitofp_4i64_to_4f32_undef:1402; AVX512VL: # %bb.0:1403; AVX512VL-NEXT: vpextrq $1, %xmm0, %rax1404; AVX512VL-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11405; AVX512VL-NEXT: vmovq %xmm0, %rax1406; AVX512VL-NEXT: vcvtsi2ss %rax, %xmm15, %xmm01407; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero1408; AVX512VL-NEXT: retq1409;1410; AVX512DQ-LABEL: sitofp_4i64_to_4f32_undef:1411; AVX512DQ: # %bb.0:1412; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01413; AVX512DQ-NEXT: vcvtqq2ps %zmm0, %ymm01414; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01415; AVX512DQ-NEXT: vzeroupper1416; AVX512DQ-NEXT: retq1417;1418; AVX512VLDQ-LABEL: sitofp_4i64_to_4f32_undef:1419; AVX512VLDQ: # %bb.0:1420; AVX512VLDQ-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01421; AVX512VLDQ-NEXT: vcvtqq2ps %ymm0, %xmm01422; AVX512VLDQ-NEXT: vzeroupper1423; AVX512VLDQ-NEXT: retq1424 %ext = shufflevector <2 x i64> %a, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>1425 %cvt = sitofp <4 x i64> %ext to <4 x float>1426 ret <4 x float> %cvt1427}1428 1429define <4 x float> @sitofp_4i32_to_4f32(<4 x i32> %a) {1430; SSE-LABEL: sitofp_4i32_to_4f32:1431; SSE: # %bb.0:1432; SSE-NEXT: cvtdq2ps %xmm0, %xmm01433; SSE-NEXT: retq1434;1435; AVX-LABEL: sitofp_4i32_to_4f32:1436; AVX: # %bb.0:1437; AVX-NEXT: vcvtdq2ps %xmm0, %xmm01438; AVX-NEXT: retq1439 %cvt = sitofp <4 x i32> %a to <4 x float>1440 ret <4 x float> %cvt1441}1442 1443define <4 x float> @sitofp_4i16_to_4f32(<8 x i16> %a) {1444; SSE2-LABEL: sitofp_4i16_to_4f32:1445; SSE2: # %bb.0:1446; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1447; SSE2-NEXT: psrad $16, %xmm01448; SSE2-NEXT: cvtdq2ps %xmm0, %xmm01449; SSE2-NEXT: retq1450;1451; SSE41-LABEL: sitofp_4i16_to_4f32:1452; SSE41: # %bb.0:1453; SSE41-NEXT: pmovsxwd %xmm0, %xmm01454; SSE41-NEXT: cvtdq2ps %xmm0, %xmm01455; SSE41-NEXT: retq1456;1457; AVX-LABEL: sitofp_4i16_to_4f32:1458; AVX: # %bb.0:1459; AVX-NEXT: vpmovsxwd %xmm0, %xmm01460; AVX-NEXT: vcvtdq2ps %xmm0, %xmm01461; AVX-NEXT: retq1462 %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1463 %cvt = sitofp <4 x i16> %shuf to <4 x float>1464 ret <4 x float> %cvt1465}1466 1467define <4 x float> @sitofp_8i16_to_4f32(<8 x i16> %a) {1468; SSE2-LABEL: sitofp_8i16_to_4f32:1469; SSE2: # %bb.0:1470; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1471; SSE2-NEXT: psrad $16, %xmm01472; SSE2-NEXT: cvtdq2ps %xmm0, %xmm01473; SSE2-NEXT: retq1474;1475; SSE41-LABEL: sitofp_8i16_to_4f32:1476; SSE41: # %bb.0:1477; SSE41-NEXT: pmovsxwd %xmm0, %xmm01478; SSE41-NEXT: cvtdq2ps %xmm0, %xmm01479; SSE41-NEXT: retq1480;1481; AVX-LABEL: sitofp_8i16_to_4f32:1482; AVX: # %bb.0:1483; AVX-NEXT: vpmovsxwd %xmm0, %xmm01484; AVX-NEXT: vcvtdq2ps %xmm0, %xmm01485; AVX-NEXT: retq1486 %cvt = sitofp <8 x i16> %a to <8 x float>1487 %shuf = shufflevector <8 x float> %cvt, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1488 ret <4 x float> %shuf1489}1490 1491define <4 x float> @sitofp_4i8_to_4f32(<16 x i8> %a) {1492; SSE2-LABEL: sitofp_4i8_to_4f32:1493; SSE2: # %bb.0:1494; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1495; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1496; SSE2-NEXT: psrad $24, %xmm01497; SSE2-NEXT: cvtdq2ps %xmm0, %xmm01498; SSE2-NEXT: retq1499;1500; SSE41-LABEL: sitofp_4i8_to_4f32:1501; SSE41: # %bb.0:1502; SSE41-NEXT: pmovsxbd %xmm0, %xmm01503; SSE41-NEXT: cvtdq2ps %xmm0, %xmm01504; SSE41-NEXT: retq1505;1506; AVX-LABEL: sitofp_4i8_to_4f32:1507; AVX: # %bb.0:1508; AVX-NEXT: vpmovsxbd %xmm0, %xmm01509; AVX-NEXT: vcvtdq2ps %xmm0, %xmm01510; AVX-NEXT: retq1511 %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1512 %cvt = sitofp <4 x i8> %shuf to <4 x float>1513 ret <4 x float> %cvt1514}1515 1516define <4 x float> @sitofp_16i8_to_4f32(<16 x i8> %a) {1517; SSE2-LABEL: sitofp_16i8_to_4f32:1518; SSE2: # %bb.0:1519; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1520; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1521; SSE2-NEXT: psrad $24, %xmm01522; SSE2-NEXT: cvtdq2ps %xmm0, %xmm01523; SSE2-NEXT: retq1524;1525; SSE41-LABEL: sitofp_16i8_to_4f32:1526; SSE41: # %bb.0:1527; SSE41-NEXT: pmovsxbd %xmm0, %xmm01528; SSE41-NEXT: cvtdq2ps %xmm0, %xmm01529; SSE41-NEXT: retq1530;1531; AVX-LABEL: sitofp_16i8_to_4f32:1532; AVX: # %bb.0:1533; AVX-NEXT: vpmovsxbd %xmm0, %xmm01534; AVX-NEXT: vcvtdq2ps %xmm0, %xmm01535; AVX-NEXT: retq1536 %cvt = sitofp <16 x i8> %a to <16 x float>1537 %shuf = shufflevector <16 x float> %cvt, <16 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1538 ret <4 x float> %shuf1539}1540 1541define <4 x float> @sitofp_4i64_to_4f32(<4 x i64> %a) {1542; SSE2-LABEL: sitofp_4i64_to_4f32:1543; SSE2: # %bb.0:1544; SSE2-NEXT: movq %xmm1, %rax1545; SSE2-NEXT: cvtsi2ss %rax, %xmm21546; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1547; SSE2-NEXT: movq %xmm1, %rax1548; SSE2-NEXT: xorps %xmm1, %xmm11549; SSE2-NEXT: cvtsi2ss %rax, %xmm11550; SSE2-NEXT: unpcklps {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]1551; SSE2-NEXT: movq %xmm0, %rax1552; SSE2-NEXT: xorps %xmm1, %xmm11553; SSE2-NEXT: cvtsi2ss %rax, %xmm11554; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1555; SSE2-NEXT: movq %xmm0, %rax1556; SSE2-NEXT: xorps %xmm0, %xmm01557; SSE2-NEXT: cvtsi2ss %rax, %xmm01558; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1559; SSE2-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]1560; SSE2-NEXT: movaps %xmm1, %xmm01561; SSE2-NEXT: retq1562;1563; SSE41-LABEL: sitofp_4i64_to_4f32:1564; SSE41: # %bb.0:1565; SSE41-NEXT: pextrq $1, %xmm0, %rax1566; SSE41-NEXT: cvtsi2ss %rax, %xmm21567; SSE41-NEXT: movq %xmm0, %rax1568; SSE41-NEXT: xorps %xmm0, %xmm01569; SSE41-NEXT: cvtsi2ss %rax, %xmm01570; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[2,3]1571; SSE41-NEXT: movq %xmm1, %rax1572; SSE41-NEXT: xorps %xmm2, %xmm21573; SSE41-NEXT: cvtsi2ss %rax, %xmm21574; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1],xmm2[0],xmm0[3]1575; SSE41-NEXT: pextrq $1, %xmm1, %rax1576; SSE41-NEXT: xorps %xmm1, %xmm11577; SSE41-NEXT: cvtsi2ss %rax, %xmm11578; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]1579; SSE41-NEXT: retq1580;1581; AVX1-LABEL: sitofp_4i64_to_4f32:1582; AVX1: # %bb.0:1583; AVX1-NEXT: vpextrq $1, %xmm0, %rax1584; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11585; AVX1-NEXT: vmovq %xmm0, %rax1586; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm21587; AVX1-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]1588; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01589; AVX1-NEXT: vmovq %xmm0, %rax1590; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm21591; AVX1-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]1592; AVX1-NEXT: vpextrq $1, %xmm0, %rax1593; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm01594; AVX1-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]1595; AVX1-NEXT: vzeroupper1596; AVX1-NEXT: retq1597;1598; AVX2-LABEL: sitofp_4i64_to_4f32:1599; AVX2: # %bb.0:1600; AVX2-NEXT: vpextrq $1, %xmm0, %rax1601; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11602; AVX2-NEXT: vmovq %xmm0, %rax1603; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm21604; AVX2-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]1605; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm01606; AVX2-NEXT: vmovq %xmm0, %rax1607; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm21608; AVX2-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]1609; AVX2-NEXT: vpextrq $1, %xmm0, %rax1610; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm01611; AVX2-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]1612; AVX2-NEXT: vzeroupper1613; AVX2-NEXT: retq1614;1615; AVX512F-LABEL: sitofp_4i64_to_4f32:1616; AVX512F: # %bb.0:1617; AVX512F-NEXT: vpextrq $1, %xmm0, %rax1618; AVX512F-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11619; AVX512F-NEXT: vmovq %xmm0, %rax1620; AVX512F-NEXT: vcvtsi2ss %rax, %xmm15, %xmm21621; AVX512F-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]1622; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm01623; AVX512F-NEXT: vmovq %xmm0, %rax1624; AVX512F-NEXT: vcvtsi2ss %rax, %xmm15, %xmm21625; AVX512F-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]1626; AVX512F-NEXT: vpextrq $1, %xmm0, %rax1627; AVX512F-NEXT: vcvtsi2ss %rax, %xmm15, %xmm01628; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]1629; AVX512F-NEXT: vzeroupper1630; AVX512F-NEXT: retq1631;1632; AVX512VL-LABEL: sitofp_4i64_to_4f32:1633; AVX512VL: # %bb.0:1634; AVX512VL-NEXT: vpextrq $1, %xmm0, %rax1635; AVX512VL-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11636; AVX512VL-NEXT: vmovq %xmm0, %rax1637; AVX512VL-NEXT: vcvtsi2ss %rax, %xmm15, %xmm21638; AVX512VL-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]1639; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm01640; AVX512VL-NEXT: vmovq %xmm0, %rax1641; AVX512VL-NEXT: vcvtsi2ss %rax, %xmm15, %xmm21642; AVX512VL-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]1643; AVX512VL-NEXT: vpextrq $1, %xmm0, %rax1644; AVX512VL-NEXT: vcvtsi2ss %rax, %xmm15, %xmm01645; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]1646; AVX512VL-NEXT: vzeroupper1647; AVX512VL-NEXT: retq1648;1649; AVX512DQ-LABEL: sitofp_4i64_to_4f32:1650; AVX512DQ: # %bb.0:1651; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01652; AVX512DQ-NEXT: vcvtqq2ps %zmm0, %ymm01653; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01654; AVX512DQ-NEXT: vzeroupper1655; AVX512DQ-NEXT: retq1656;1657; AVX512VLDQ-LABEL: sitofp_4i64_to_4f32:1658; AVX512VLDQ: # %bb.0:1659; AVX512VLDQ-NEXT: vcvtqq2ps %ymm0, %xmm01660; AVX512VLDQ-NEXT: vzeroupper1661; AVX512VLDQ-NEXT: retq1662 %cvt = sitofp <4 x i64> %a to <4 x float>1663 ret <4 x float> %cvt1664}1665 1666define <8 x float> @sitofp_8i32_to_8f32(<8 x i32> %a) {1667; SSE-LABEL: sitofp_8i32_to_8f32:1668; SSE: # %bb.0:1669; SSE-NEXT: cvtdq2ps %xmm0, %xmm01670; SSE-NEXT: cvtdq2ps %xmm1, %xmm11671; SSE-NEXT: retq1672;1673; AVX-LABEL: sitofp_8i32_to_8f32:1674; AVX: # %bb.0:1675; AVX-NEXT: vcvtdq2ps %ymm0, %ymm01676; AVX-NEXT: retq1677 %cvt = sitofp <8 x i32> %a to <8 x float>1678 ret <8 x float> %cvt1679}1680 1681define <8 x float> @sitofp_8i16_to_8f32(<8 x i16> %a) {1682; SSE2-LABEL: sitofp_8i16_to_8f32:1683; SSE2: # %bb.0:1684; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1685; SSE2-NEXT: psrad $16, %xmm11686; SSE2-NEXT: cvtdq2ps %xmm1, %xmm21687; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]1688; SSE2-NEXT: psrad $16, %xmm01689; SSE2-NEXT: cvtdq2ps %xmm0, %xmm11690; SSE2-NEXT: movaps %xmm2, %xmm01691; SSE2-NEXT: retq1692;1693; SSE41-LABEL: sitofp_8i16_to_8f32:1694; SSE41: # %bb.0:1695; SSE41-NEXT: pmovsxwd %xmm0, %xmm11696; SSE41-NEXT: cvtdq2ps %xmm1, %xmm21697; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1698; SSE41-NEXT: pmovsxwd %xmm0, %xmm01699; SSE41-NEXT: cvtdq2ps %xmm0, %xmm11700; SSE41-NEXT: movaps %xmm2, %xmm01701; SSE41-NEXT: retq1702;1703; AVX1-LABEL: sitofp_8i16_to_8f32:1704; AVX1: # %bb.0:1705; AVX1-NEXT: vpmovsxwd %xmm0, %xmm11706; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1707; AVX1-NEXT: vpmovsxwd %xmm0, %xmm01708; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01709; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm01710; AVX1-NEXT: retq1711;1712; AVX2-LABEL: sitofp_8i16_to_8f32:1713; AVX2: # %bb.0:1714; AVX2-NEXT: vpmovsxwd %xmm0, %ymm01715; AVX2-NEXT: vcvtdq2ps %ymm0, %ymm01716; AVX2-NEXT: retq1717;1718; AVX512-LABEL: sitofp_8i16_to_8f32:1719; AVX512: # %bb.0:1720; AVX512-NEXT: vpmovsxwd %xmm0, %ymm01721; AVX512-NEXT: vcvtdq2ps %ymm0, %ymm01722; AVX512-NEXT: retq1723 %cvt = sitofp <8 x i16> %a to <8 x float>1724 ret <8 x float> %cvt1725}1726 1727define <8 x float> @sitofp_8i8_to_8f32(<16 x i8> %a) {1728; SSE2-LABEL: sitofp_8i8_to_8f32:1729; SSE2: # %bb.0:1730; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1731; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1732; SSE2-NEXT: psrad $24, %xmm01733; SSE2-NEXT: cvtdq2ps %xmm0, %xmm01734; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]1735; SSE2-NEXT: psrad $24, %xmm11736; SSE2-NEXT: cvtdq2ps %xmm1, %xmm11737; SSE2-NEXT: retq1738;1739; SSE41-LABEL: sitofp_8i8_to_8f32:1740; SSE41: # %bb.0:1741; SSE41-NEXT: pmovsxbd %xmm0, %xmm11742; SSE41-NEXT: cvtdq2ps %xmm1, %xmm21743; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1744; SSE41-NEXT: pmovsxbd %xmm0, %xmm01745; SSE41-NEXT: cvtdq2ps %xmm0, %xmm11746; SSE41-NEXT: movaps %xmm2, %xmm01747; SSE41-NEXT: retq1748;1749; AVX1-LABEL: sitofp_8i8_to_8f32:1750; AVX1: # %bb.0:1751; AVX1-NEXT: vpmovsxbd %xmm0, %xmm11752; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1753; AVX1-NEXT: vpmovsxbd %xmm0, %xmm01754; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01755; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm01756; AVX1-NEXT: retq1757;1758; AVX2-LABEL: sitofp_8i8_to_8f32:1759; AVX2: # %bb.0:1760; AVX2-NEXT: vpmovsxbd %xmm0, %ymm01761; AVX2-NEXT: vcvtdq2ps %ymm0, %ymm01762; AVX2-NEXT: retq1763;1764; AVX512-LABEL: sitofp_8i8_to_8f32:1765; AVX512: # %bb.0:1766; AVX512-NEXT: vpmovsxbd %xmm0, %ymm01767; AVX512-NEXT: vcvtdq2ps %ymm0, %ymm01768; AVX512-NEXT: retq1769 %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1770 %cvt = sitofp <8 x i8> %shuf to <8 x float>1771 ret <8 x float> %cvt1772}1773 1774define <8 x float> @sitofp_16i8_to_8f32(<16 x i8> %a) {1775; SSE2-LABEL: sitofp_16i8_to_8f32:1776; SSE2: # %bb.0:1777; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]1778; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]1779; SSE2-NEXT: psrad $24, %xmm01780; SSE2-NEXT: cvtdq2ps %xmm0, %xmm01781; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]1782; SSE2-NEXT: psrad $24, %xmm11783; SSE2-NEXT: cvtdq2ps %xmm1, %xmm11784; SSE2-NEXT: retq1785;1786; SSE41-LABEL: sitofp_16i8_to_8f32:1787; SSE41: # %bb.0:1788; SSE41-NEXT: pmovsxbd %xmm0, %xmm11789; SSE41-NEXT: cvtdq2ps %xmm1, %xmm21790; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1791; SSE41-NEXT: pmovsxbd %xmm0, %xmm01792; SSE41-NEXT: cvtdq2ps %xmm0, %xmm11793; SSE41-NEXT: movaps %xmm2, %xmm01794; SSE41-NEXT: retq1795;1796; AVX1-LABEL: sitofp_16i8_to_8f32:1797; AVX1: # %bb.0:1798; AVX1-NEXT: vpmovsxbd %xmm0, %xmm11799; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1800; AVX1-NEXT: vpmovsxbd %xmm0, %xmm01801; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01802; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm01803; AVX1-NEXT: retq1804;1805; AVX2-LABEL: sitofp_16i8_to_8f32:1806; AVX2: # %bb.0:1807; AVX2-NEXT: vpmovsxbd %xmm0, %ymm01808; AVX2-NEXT: vcvtdq2ps %ymm0, %ymm01809; AVX2-NEXT: retq1810;1811; AVX512-LABEL: sitofp_16i8_to_8f32:1812; AVX512: # %bb.0:1813; AVX512-NEXT: vpmovsxbd %xmm0, %zmm01814; AVX512-NEXT: vcvtdq2ps %zmm0, %zmm01815; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01816; AVX512-NEXT: retq1817 %cvt = sitofp <16 x i8> %a to <16 x float>1818 %shuf = shufflevector <16 x float> %cvt, <16 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1819 ret <8 x float> %shuf1820}1821 1822;1823; Unsigned Integer to Float1824;1825 1826define <4 x float> @uitofp_2i64_to_4f32(<2 x i64> %a) {1827; SSE2-LABEL: uitofp_2i64_to_4f32:1828; SSE2: # %bb.0:1829; SSE2-NEXT: movdqa %xmm0, %xmm11830; SSE2-NEXT: movq %xmm0, %rax1831; SSE2-NEXT: testq %rax, %rax1832; SSE2-NEXT: js .LBB41_11833; SSE2-NEXT: # %bb.2:1834; SSE2-NEXT: xorps %xmm0, %xmm01835; SSE2-NEXT: cvtsi2ss %rax, %xmm01836; SSE2-NEXT: jmp .LBB41_31837; SSE2-NEXT: .LBB41_1:1838; SSE2-NEXT: movq %rax, %rcx1839; SSE2-NEXT: shrq %rcx1840; SSE2-NEXT: andl $1, %eax1841; SSE2-NEXT: orq %rcx, %rax1842; SSE2-NEXT: xorps %xmm0, %xmm01843; SSE2-NEXT: cvtsi2ss %rax, %xmm01844; SSE2-NEXT: addss %xmm0, %xmm01845; SSE2-NEXT: .LBB41_3:1846; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1847; SSE2-NEXT: movq %xmm1, %rax1848; SSE2-NEXT: testq %rax, %rax1849; SSE2-NEXT: js .LBB41_41850; SSE2-NEXT: # %bb.5:1851; SSE2-NEXT: xorps %xmm1, %xmm11852; SSE2-NEXT: cvtsi2ss %rax, %xmm11853; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1854; SSE2-NEXT: retq1855; SSE2-NEXT: .LBB41_4:1856; SSE2-NEXT: movq %rax, %rcx1857; SSE2-NEXT: shrq %rcx1858; SSE2-NEXT: andl $1, %eax1859; SSE2-NEXT: orq %rcx, %rax1860; SSE2-NEXT: xorps %xmm1, %xmm11861; SSE2-NEXT: cvtsi2ss %rax, %xmm11862; SSE2-NEXT: addss %xmm1, %xmm11863; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1864; SSE2-NEXT: retq1865;1866; SSE41-LABEL: uitofp_2i64_to_4f32:1867; SSE41: # %bb.0:1868; SSE41-NEXT: pmovsxbq {{.*#+}} xmm1 = [1,1]1869; SSE41-NEXT: pand %xmm0, %xmm11870; SSE41-NEXT: movdqa %xmm0, %xmm21871; SSE41-NEXT: psrlq $1, %xmm21872; SSE41-NEXT: por %xmm1, %xmm21873; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]1874; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm01875; SSE41-NEXT: pextrq $1, %xmm0, %rax1876; SSE41-NEXT: cvtsi2ss %rax, %xmm31877; SSE41-NEXT: movq %xmm0, %rax1878; SSE41-NEXT: xorps %xmm2, %xmm21879; SSE41-NEXT: cvtsi2ss %rax, %xmm21880; SSE41-NEXT: insertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],zero,zero1881; SSE41-NEXT: movaps %xmm2, %xmm31882; SSE41-NEXT: addps %xmm2, %xmm31883; SSE41-NEXT: movdqa %xmm1, %xmm01884; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm21885; SSE41-NEXT: movaps %xmm2, %xmm01886; SSE41-NEXT: retq1887;1888; VEX-LABEL: uitofp_2i64_to_4f32:1889; VEX: # %bb.0:1890; VEX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11891; VEX-NEXT: vpsrlq $1, %xmm0, %xmm21892; VEX-NEXT: vpor %xmm1, %xmm2, %xmm11893; VEX-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm11894; VEX-NEXT: vpextrq $1, %xmm1, %rax1895; VEX-NEXT: vcvtsi2ss %rax, %xmm15, %xmm21896; VEX-NEXT: vmovq %xmm1, %rax1897; VEX-NEXT: vcvtsi2ss %rax, %xmm15, %xmm11898; VEX-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],zero,zero1899; VEX-NEXT: vaddps %xmm1, %xmm1, %xmm21900; VEX-NEXT: vpxor %xmm3, %xmm3, %xmm31901; VEX-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm01902; VEX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]1903; VEX-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm01904; VEX-NEXT: retq1905;1906; AVX512F-LABEL: uitofp_2i64_to_4f32:1907; AVX512F: # %bb.0:1908; AVX512F-NEXT: vpextrq $1, %xmm0, %rax1909; AVX512F-NEXT: vcvtusi2ss %rax, %xmm15, %xmm11910; AVX512F-NEXT: vmovq %xmm0, %rax1911; AVX512F-NEXT: vcvtusi2ss %rax, %xmm15, %xmm01912; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero1913; AVX512F-NEXT: retq1914;1915; AVX512VL-LABEL: uitofp_2i64_to_4f32:1916; AVX512VL: # %bb.0:1917; AVX512VL-NEXT: vpextrq $1, %xmm0, %rax1918; AVX512VL-NEXT: vcvtusi2ss %rax, %xmm15, %xmm11919; AVX512VL-NEXT: vmovq %xmm0, %rax1920; AVX512VL-NEXT: vcvtusi2ss %rax, %xmm15, %xmm01921; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero1922; AVX512VL-NEXT: retq1923;1924; AVX512DQ-LABEL: uitofp_2i64_to_4f32:1925; AVX512DQ: # %bb.0:1926; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01927; AVX512DQ-NEXT: vcvtuqq2ps %zmm0, %ymm01928; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01929; AVX512DQ-NEXT: vzeroupper1930; AVX512DQ-NEXT: retq1931;1932; AVX512VLDQ-LABEL: uitofp_2i64_to_4f32:1933; AVX512VLDQ: # %bb.0:1934; AVX512VLDQ-NEXT: vcvtuqq2ps %xmm0, %xmm01935; AVX512VLDQ-NEXT: retq1936 %cvt = uitofp <2 x i64> %a to <2 x float>1937 %ext = shufflevector <2 x float> %cvt, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>1938 ret <4 x float> %ext1939}1940 1941define <4 x float> @uitofp_2i64_to_2f32(<2 x i64> %a) {1942; SSE2-LABEL: uitofp_2i64_to_2f32:1943; SSE2: # %bb.0:1944; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1945; SSE2-NEXT: movq %xmm1, %rax1946; SSE2-NEXT: testq %rax, %rax1947; SSE2-NEXT: js .LBB42_11948; SSE2-NEXT: # %bb.2:1949; SSE2-NEXT: xorps %xmm1, %xmm11950; SSE2-NEXT: cvtsi2ss %rax, %xmm11951; SSE2-NEXT: jmp .LBB42_31952; SSE2-NEXT: .LBB42_1:1953; SSE2-NEXT: movq %rax, %rcx1954; SSE2-NEXT: shrq %rcx1955; SSE2-NEXT: andl $1, %eax1956; SSE2-NEXT: orq %rcx, %rax1957; SSE2-NEXT: xorps %xmm1, %xmm11958; SSE2-NEXT: cvtsi2ss %rax, %xmm11959; SSE2-NEXT: addss %xmm1, %xmm11960; SSE2-NEXT: .LBB42_3:1961; SSE2-NEXT: movq %xmm0, %rax1962; SSE2-NEXT: testq %rax, %rax1963; SSE2-NEXT: js .LBB42_41964; SSE2-NEXT: # %bb.5:1965; SSE2-NEXT: xorps %xmm0, %xmm01966; SSE2-NEXT: cvtsi2ss %rax, %xmm01967; SSE2-NEXT: jmp .LBB42_61968; SSE2-NEXT: .LBB42_4:1969; SSE2-NEXT: movq %rax, %rcx1970; SSE2-NEXT: shrq %rcx1971; SSE2-NEXT: andl $1, %eax1972; SSE2-NEXT: orq %rcx, %rax1973; SSE2-NEXT: xorps %xmm0, %xmm01974; SSE2-NEXT: cvtsi2ss %rax, %xmm01975; SSE2-NEXT: addss %xmm0, %xmm01976; SSE2-NEXT: .LBB42_6:1977; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1978; SSE2-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero1979; SSE2-NEXT: retq1980;1981; SSE41-LABEL: uitofp_2i64_to_2f32:1982; SSE41: # %bb.0:1983; SSE41-NEXT: pmovsxbq {{.*#+}} xmm1 = [1,1]1984; SSE41-NEXT: pand %xmm0, %xmm11985; SSE41-NEXT: movdqa %xmm0, %xmm21986; SSE41-NEXT: psrlq $1, %xmm21987; SSE41-NEXT: por %xmm1, %xmm21988; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]1989; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm01990; SSE41-NEXT: pextrq $1, %xmm0, %rax1991; SSE41-NEXT: xorps %xmm2, %xmm21992; SSE41-NEXT: cvtsi2ss %rax, %xmm21993; SSE41-NEXT: movq %xmm0, %rax1994; SSE41-NEXT: cvtsi2ss %rax, %xmm31995; SSE41-NEXT: insertps {{.*#+}} xmm3 = xmm3[0],xmm2[0],zero,zero1996; SSE41-NEXT: movaps %xmm3, %xmm21997; SSE41-NEXT: addps %xmm3, %xmm21998; SSE41-NEXT: movdqa %xmm1, %xmm01999; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm32000; SSE41-NEXT: movq {{.*#+}} xmm0 = xmm3[0],zero2001; SSE41-NEXT: retq2002;2003; VEX-LABEL: uitofp_2i64_to_2f32:2004; VEX: # %bb.0:2005; VEX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12006; VEX-NEXT: vpsrlq $1, %xmm0, %xmm22007; VEX-NEXT: vpor %xmm1, %xmm2, %xmm12008; VEX-NEXT: vblendvpd %xmm0, %xmm1, %xmm0, %xmm12009; VEX-NEXT: vpextrq $1, %xmm1, %rax2010; VEX-NEXT: vcvtsi2ss %rax, %xmm15, %xmm22011; VEX-NEXT: vmovq %xmm1, %rax2012; VEX-NEXT: vcvtsi2ss %rax, %xmm15, %xmm12013; VEX-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],zero,zero2014; VEX-NEXT: vaddps %xmm1, %xmm1, %xmm22015; VEX-NEXT: vpxor %xmm3, %xmm3, %xmm32016; VEX-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm02017; VEX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]2018; VEX-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm02019; VEX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero2020; VEX-NEXT: retq2021;2022; AVX512F-LABEL: uitofp_2i64_to_2f32:2023; AVX512F: # %bb.0:2024; AVX512F-NEXT: vmovq %xmm0, %rax2025; AVX512F-NEXT: vcvtusi2ss %rax, %xmm15, %xmm12026; AVX512F-NEXT: vpextrq $1, %xmm0, %rax2027; AVX512F-NEXT: vcvtusi2ss %rax, %xmm15, %xmm02028; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero2029; AVX512F-NEXT: retq2030;2031; AVX512VL-LABEL: uitofp_2i64_to_2f32:2032; AVX512VL: # %bb.0:2033; AVX512VL-NEXT: vmovq %xmm0, %rax2034; AVX512VL-NEXT: vcvtusi2ss %rax, %xmm15, %xmm12035; AVX512VL-NEXT: vpextrq $1, %xmm0, %rax2036; AVX512VL-NEXT: vcvtusi2ss %rax, %xmm15, %xmm02037; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],zero,zero2038; AVX512VL-NEXT: retq2039;2040; AVX512DQ-LABEL: uitofp_2i64_to_2f32:2041; AVX512DQ: # %bb.0:2042; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02043; AVX512DQ-NEXT: vcvtuqq2ps %zmm0, %ymm02044; AVX512DQ-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero2045; AVX512DQ-NEXT: vzeroupper2046; AVX512DQ-NEXT: retq2047;2048; AVX512VLDQ-LABEL: uitofp_2i64_to_2f32:2049; AVX512VLDQ: # %bb.0:2050; AVX512VLDQ-NEXT: vcvtuqq2ps %xmm0, %xmm02051; AVX512VLDQ-NEXT: retq2052 %cvt = uitofp <2 x i64> %a to <2 x float>2053 %ext = shufflevector <2 x float> %cvt, <2 x float> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>2054 ret <4 x float> %ext2055}2056 2057define <4 x float> @uitofp_4i64_to_4f32_undef(<2 x i64> %a) {2058; SSE2-LABEL: uitofp_4i64_to_4f32_undef:2059; SSE2: # %bb.0:2060; SSE2-NEXT: movq %xmm0, %rax2061; SSE2-NEXT: testq %rax, %rax2062; SSE2-NEXT: js .LBB43_12063; SSE2-NEXT: # %bb.2:2064; SSE2-NEXT: cvtsi2ss %rax, %xmm12065; SSE2-NEXT: jmp .LBB43_32066; SSE2-NEXT: .LBB43_1:2067; SSE2-NEXT: movq %rax, %rcx2068; SSE2-NEXT: shrq %rcx2069; SSE2-NEXT: andl $1, %eax2070; SSE2-NEXT: orq %rcx, %rax2071; SSE2-NEXT: cvtsi2ss %rax, %xmm12072; SSE2-NEXT: addss %xmm1, %xmm12073; SSE2-NEXT: .LBB43_3:2074; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]2075; SSE2-NEXT: movq %xmm0, %rax2076; SSE2-NEXT: testq %rax, %rax2077; SSE2-NEXT: js .LBB43_42078; SSE2-NEXT: # %bb.5:2079; SSE2-NEXT: xorps %xmm0, %xmm02080; SSE2-NEXT: cvtsi2ss %rax, %xmm02081; SSE2-NEXT: jmp .LBB43_62082; SSE2-NEXT: .LBB43_4:2083; SSE2-NEXT: movq %rax, %rcx2084; SSE2-NEXT: shrq %rcx2085; SSE2-NEXT: andl $1, %eax2086; SSE2-NEXT: orq %rcx, %rax2087; SSE2-NEXT: xorps %xmm0, %xmm02088; SSE2-NEXT: cvtsi2ss %rax, %xmm02089; SSE2-NEXT: addss %xmm0, %xmm02090; SSE2-NEXT: .LBB43_6:2091; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]2092; SSE2-NEXT: movq {{.*#+}} xmm0 = xmm1[0],zero2093; SSE2-NEXT: retq2094;2095; SSE41-LABEL: uitofp_4i64_to_4f32_undef:2096; SSE41: # %bb.0:2097; SSE41-NEXT: pmovsxbq {{.*#+}} xmm1 = [1,1]2098; SSE41-NEXT: pand %xmm0, %xmm12099; SSE41-NEXT: movdqa %xmm0, %xmm22100; SSE41-NEXT: psrlq $1, %xmm22101; SSE41-NEXT: por %xmm1, %xmm22102; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]2103; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm02104; SSE41-NEXT: pextrq $1, %xmm0, %rax2105; SSE41-NEXT: cvtsi2ss %rax, %xmm32106; SSE41-NEXT: movq %xmm0, %rax2107; SSE41-NEXT: xorps %xmm2, %xmm22108; SSE41-NEXT: cvtsi2ss %rax, %xmm22109; SSE41-NEXT: insertps {{.*#+}} xmm2 = xmm2[0],xmm3[0],zero,zero2110; SSE41-NEXT: movaps %xmm2, %xmm32111; SSE41-NEXT: addps %xmm2, %xmm32112; SSE41-NEXT: movdqa %xmm1, %xmm02113; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm22114; SSE41-NEXT: movaps %xmm2, %xmm02115; SSE41-NEXT: retq2116;2117; AVX1-LABEL: uitofp_4i64_to_4f32_undef:2118; AVX1: # %bb.0:2119; AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm02120; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm12121; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm22122; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm12123; AVX1-NEXT: vmovaps %xmm0, %xmm22124; AVX1-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm12125; AVX1-NEXT: vpextrq $1, %xmm1, %rax2126; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm22127; AVX1-NEXT: vmovq %xmm1, %rax2128; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm12129; AVX1-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]2130; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm22131; AVX1-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]2132; AVX1-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]2133; AVX1-NEXT: vaddps %xmm1, %xmm1, %xmm22134; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm32135; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm02136; AVX1-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm02137; AVX1-NEXT: vzeroupper2138; AVX1-NEXT: retq2139;2140; AVX2-LABEL: uitofp_4i64_to_4f32_undef:2141; AVX2: # %bb.0:2142; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm02143; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]2144; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm12145; AVX2-NEXT: vpsrlq $1, %ymm0, %ymm22146; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm12147; AVX2-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm12148; AVX2-NEXT: vpextrq $1, %xmm1, %rax2149; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm22150; AVX2-NEXT: vmovq %xmm1, %rax2151; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm32152; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]2153; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm12154; AVX2-NEXT: vmovq %xmm1, %rax2155; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm32156; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]2157; AVX2-NEXT: vpextrq $1, %xmm1, %rax2158; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm12159; AVX2-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0,1,2],xmm1[0]2160; AVX2-NEXT: vaddps %xmm1, %xmm1, %xmm22161; AVX2-NEXT: vpackssdw %xmm0, %xmm0, %xmm02162; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm02163; AVX2-NEXT: vzeroupper2164; AVX2-NEXT: retq2165;2166; AVX512F-LABEL: uitofp_4i64_to_4f32_undef:2167; AVX512F: # %bb.0:2168; AVX512F-NEXT: vpextrq $1, %xmm0, %rax2169; AVX512F-NEXT: vcvtusi2ss %rax, %xmm15, %xmm12170; AVX512F-NEXT: vmovq %xmm0, %rax2171; AVX512F-NEXT: vcvtusi2ss %rax, %xmm15, %xmm02172; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero2173; AVX512F-NEXT: retq2174;2175; AVX512VL-LABEL: uitofp_4i64_to_4f32_undef:2176; AVX512VL: # %bb.0:2177; AVX512VL-NEXT: vpextrq $1, %xmm0, %rax2178; AVX512VL-NEXT: vcvtusi2ss %rax, %xmm15, %xmm12179; AVX512VL-NEXT: vmovq %xmm0, %rax2180; AVX512VL-NEXT: vcvtusi2ss %rax, %xmm15, %xmm02181; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero2182; AVX512VL-NEXT: retq2183;2184; AVX512DQ-LABEL: uitofp_4i64_to_4f32_undef:2185; AVX512DQ: # %bb.0:2186; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02187; AVX512DQ-NEXT: vcvtuqq2ps %zmm0, %ymm02188; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02189; AVX512DQ-NEXT: vzeroupper2190; AVX512DQ-NEXT: retq2191;2192; AVX512VLDQ-LABEL: uitofp_4i64_to_4f32_undef:2193; AVX512VLDQ: # %bb.0:2194; AVX512VLDQ-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm02195; AVX512VLDQ-NEXT: vcvtuqq2ps %ymm0, %xmm02196; AVX512VLDQ-NEXT: vzeroupper2197; AVX512VLDQ-NEXT: retq2198 %ext = shufflevector <2 x i64> %a, <2 x i64> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>2199 %cvt = uitofp <4 x i64> %ext to <4 x float>2200 ret <4 x float> %cvt2201}2202 2203define <4 x float> @uitofp_4i32_to_4f32(<4 x i32> %a) {2204; SSE2-LABEL: uitofp_4i32_to_4f32:2205; SSE2: # %bb.0:2206; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]2207; SSE2-NEXT: pand %xmm0, %xmm12208; SSE2-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12209; SSE2-NEXT: psrld $16, %xmm02210; SSE2-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02211; SSE2-NEXT: subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02212; SSE2-NEXT: addps %xmm1, %xmm02213; SSE2-NEXT: retq2214;2215; SSE41-LABEL: uitofp_4i32_to_4f32:2216; SSE41: # %bb.0:2217; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [1258291200,1258291200,1258291200,1258291200]2218; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]2219; SSE41-NEXT: psrld $16, %xmm02220; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]2221; SSE41-NEXT: subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02222; SSE41-NEXT: addps %xmm1, %xmm02223; SSE41-NEXT: retq2224;2225; AVX1-LABEL: uitofp_4i32_to_4f32:2226; AVX1: # %bb.0:2227; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]2228; AVX1-NEXT: vpsrld $16, %xmm0, %xmm02229; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]2230; AVX1-NEXT: vsubps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02231; AVX1-NEXT: vaddps %xmm0, %xmm1, %xmm02232; AVX1-NEXT: retq2233;2234; AVX2-LABEL: uitofp_4i32_to_4f32:2235; AVX2: # %bb.0:2236; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1258291200,1258291200,1258291200,1258291200]2237; AVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]2238; AVX2-NEXT: vpsrld $16, %xmm0, %xmm02239; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [1392508928,1392508928,1392508928,1392508928]2240; AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]2241; AVX2-NEXT: vbroadcastss {{.*#+}} xmm2 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]2242; AVX2-NEXT: vsubps %xmm2, %xmm0, %xmm02243; AVX2-NEXT: vaddps %xmm0, %xmm1, %xmm02244; AVX2-NEXT: retq2245;2246; AVX512F-LABEL: uitofp_4i32_to_4f32:2247; AVX512F: # %bb.0:2248; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02249; AVX512F-NEXT: vcvtudq2ps %zmm0, %zmm02250; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02251; AVX512F-NEXT: vzeroupper2252; AVX512F-NEXT: retq2253;2254; AVX512VL-LABEL: uitofp_4i32_to_4f32:2255; AVX512VL: # %bb.0:2256; AVX512VL-NEXT: vcvtudq2ps %xmm0, %xmm02257; AVX512VL-NEXT: retq2258;2259; AVX512DQ-LABEL: uitofp_4i32_to_4f32:2260; AVX512DQ: # %bb.0:2261; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02262; AVX512DQ-NEXT: vcvtudq2ps %zmm0, %zmm02263; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02264; AVX512DQ-NEXT: vzeroupper2265; AVX512DQ-NEXT: retq2266;2267; AVX512VLDQ-LABEL: uitofp_4i32_to_4f32:2268; AVX512VLDQ: # %bb.0:2269; AVX512VLDQ-NEXT: vcvtudq2ps %xmm0, %xmm02270; AVX512VLDQ-NEXT: retq2271 %cvt = uitofp <4 x i32> %a to <4 x float>2272 ret <4 x float> %cvt2273}2274 2275define <4 x float> @uitofp_4i16_to_4f32(<8 x i16> %a) {2276; SSE2-LABEL: uitofp_4i16_to_4f32:2277; SSE2: # %bb.0:2278; SSE2-NEXT: pxor %xmm1, %xmm12279; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]2280; SSE2-NEXT: cvtdq2ps %xmm0, %xmm02281; SSE2-NEXT: retq2282;2283; SSE41-LABEL: uitofp_4i16_to_4f32:2284; SSE41: # %bb.0:2285; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero2286; SSE41-NEXT: cvtdq2ps %xmm0, %xmm02287; SSE41-NEXT: retq2288;2289; AVX-LABEL: uitofp_4i16_to_4f32:2290; AVX: # %bb.0:2291; AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero2292; AVX-NEXT: vcvtdq2ps %xmm0, %xmm02293; AVX-NEXT: retq2294 %shuf = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>2295 %cvt = uitofp <4 x i16> %shuf to <4 x float>2296 ret <4 x float> %cvt2297}2298 2299define <4 x float> @uitofp_8i16_to_4f32(<8 x i16> %a) {2300; SSE2-LABEL: uitofp_8i16_to_4f32:2301; SSE2: # %bb.0:2302; SSE2-NEXT: pxor %xmm1, %xmm12303; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]2304; SSE2-NEXT: cvtdq2ps %xmm0, %xmm02305; SSE2-NEXT: retq2306;2307; SSE41-LABEL: uitofp_8i16_to_4f32:2308; SSE41: # %bb.0:2309; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero2310; SSE41-NEXT: cvtdq2ps %xmm0, %xmm02311; SSE41-NEXT: retq2312;2313; AVX-LABEL: uitofp_8i16_to_4f32:2314; AVX: # %bb.0:2315; AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero2316; AVX-NEXT: vcvtdq2ps %xmm0, %xmm02317; AVX-NEXT: retq2318 %cvt = uitofp <8 x i16> %a to <8 x float>2319 %shuf = shufflevector <8 x float> %cvt, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>2320 ret <4 x float> %shuf2321}2322 2323define <4 x float> @uitofp_4i8_to_4f32(<16 x i8> %a) {2324; SSE2-LABEL: uitofp_4i8_to_4f32:2325; SSE2: # %bb.0:2326; SSE2-NEXT: pxor %xmm1, %xmm12327; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]2328; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]2329; SSE2-NEXT: cvtdq2ps %xmm0, %xmm02330; SSE2-NEXT: retq2331;2332; SSE41-LABEL: uitofp_4i8_to_4f32:2333; SSE41: # %bb.0:2334; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero2335; SSE41-NEXT: cvtdq2ps %xmm0, %xmm02336; SSE41-NEXT: retq2337;2338; AVX-LABEL: uitofp_4i8_to_4f32:2339; AVX: # %bb.0:2340; AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero2341; AVX-NEXT: vcvtdq2ps %xmm0, %xmm02342; AVX-NEXT: retq2343 %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>2344 %cvt = uitofp <4 x i8> %shuf to <4 x float>2345 ret <4 x float> %cvt2346}2347 2348define <4 x float> @uitofp_16i8_to_4f32(<16 x i8> %a) {2349; SSE2-LABEL: uitofp_16i8_to_4f32:2350; SSE2: # %bb.0:2351; SSE2-NEXT: pxor %xmm1, %xmm12352; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]2353; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]2354; SSE2-NEXT: cvtdq2ps %xmm0, %xmm02355; SSE2-NEXT: retq2356;2357; SSE41-LABEL: uitofp_16i8_to_4f32:2358; SSE41: # %bb.0:2359; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero2360; SSE41-NEXT: cvtdq2ps %xmm0, %xmm02361; SSE41-NEXT: retq2362;2363; AVX-LABEL: uitofp_16i8_to_4f32:2364; AVX: # %bb.0:2365; AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero2366; AVX-NEXT: vcvtdq2ps %xmm0, %xmm02367; AVX-NEXT: retq2368 %cvt = uitofp <16 x i8> %a to <16 x float>2369 %shuf = shufflevector <16 x float> %cvt, <16 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>2370 ret <4 x float> %shuf2371}2372 2373define <4 x float> @uitofp_4i64_to_4f32(<4 x i64> %a) {2374; SSE2-LABEL: uitofp_4i64_to_4f32:2375; SSE2: # %bb.0:2376; SSE2-NEXT: movq %xmm1, %rax2377; SSE2-NEXT: testq %rax, %rax2378; SSE2-NEXT: js .LBB49_12379; SSE2-NEXT: # %bb.2:2380; SSE2-NEXT: cvtsi2ss %rax, %xmm22381; SSE2-NEXT: jmp .LBB49_32382; SSE2-NEXT: .LBB49_1:2383; SSE2-NEXT: movq %rax, %rcx2384; SSE2-NEXT: shrq %rcx2385; SSE2-NEXT: andl $1, %eax2386; SSE2-NEXT: orq %rcx, %rax2387; SSE2-NEXT: cvtsi2ss %rax, %xmm22388; SSE2-NEXT: addss %xmm2, %xmm22389; SSE2-NEXT: .LBB49_3:2390; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]2391; SSE2-NEXT: movq %xmm1, %rax2392; SSE2-NEXT: testq %rax, %rax2393; SSE2-NEXT: js .LBB49_42394; SSE2-NEXT: # %bb.5:2395; SSE2-NEXT: cvtsi2ss %rax, %xmm32396; SSE2-NEXT: jmp .LBB49_62397; SSE2-NEXT: .LBB49_4:2398; SSE2-NEXT: movq %rax, %rcx2399; SSE2-NEXT: shrq %rcx2400; SSE2-NEXT: andl $1, %eax2401; SSE2-NEXT: orq %rcx, %rax2402; SSE2-NEXT: cvtsi2ss %rax, %xmm32403; SSE2-NEXT: addss %xmm3, %xmm32404; SSE2-NEXT: .LBB49_6:2405; SSE2-NEXT: movq %xmm0, %rax2406; SSE2-NEXT: testq %rax, %rax2407; SSE2-NEXT: js .LBB49_72408; SSE2-NEXT: # %bb.8:2409; SSE2-NEXT: xorps %xmm1, %xmm12410; SSE2-NEXT: cvtsi2ss %rax, %xmm12411; SSE2-NEXT: jmp .LBB49_92412; SSE2-NEXT: .LBB49_7:2413; SSE2-NEXT: movq %rax, %rcx2414; SSE2-NEXT: shrq %rcx2415; SSE2-NEXT: andl $1, %eax2416; SSE2-NEXT: orq %rcx, %rax2417; SSE2-NEXT: xorps %xmm1, %xmm12418; SSE2-NEXT: cvtsi2ss %rax, %xmm12419; SSE2-NEXT: addss %xmm1, %xmm12420; SSE2-NEXT: .LBB49_9:2421; SSE2-NEXT: unpcklps {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]2422; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]2423; SSE2-NEXT: movq %xmm0, %rax2424; SSE2-NEXT: testq %rax, %rax2425; SSE2-NEXT: js .LBB49_102426; SSE2-NEXT: # %bb.11:2427; SSE2-NEXT: xorps %xmm0, %xmm02428; SSE2-NEXT: cvtsi2ss %rax, %xmm02429; SSE2-NEXT: jmp .LBB49_122430; SSE2-NEXT: .LBB49_10:2431; SSE2-NEXT: movq %rax, %rcx2432; SSE2-NEXT: shrq %rcx2433; SSE2-NEXT: andl $1, %eax2434; SSE2-NEXT: orq %rcx, %rax2435; SSE2-NEXT: xorps %xmm0, %xmm02436; SSE2-NEXT: cvtsi2ss %rax, %xmm02437; SSE2-NEXT: addss %xmm0, %xmm02438; SSE2-NEXT: .LBB49_12:2439; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]2440; SSE2-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]2441; SSE2-NEXT: movaps %xmm1, %xmm02442; SSE2-NEXT: retq2443;2444; SSE41-LABEL: uitofp_4i64_to_4f32:2445; SSE41: # %bb.0:2446; SSE41-NEXT: movdqa %xmm1, %xmm22447; SSE41-NEXT: movdqa %xmm0, %xmm12448; SSE41-NEXT: pmovsxbq {{.*#+}} xmm4 = [1,1]2449; SSE41-NEXT: pand %xmm4, %xmm02450; SSE41-NEXT: movdqa %xmm1, %xmm32451; SSE41-NEXT: psrlq $1, %xmm32452; SSE41-NEXT: por %xmm0, %xmm32453; SSE41-NEXT: movdqa %xmm1, %xmm52454; SSE41-NEXT: movdqa %xmm1, %xmm02455; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm52456; SSE41-NEXT: pextrq $1, %xmm5, %rax2457; SSE41-NEXT: xorps %xmm0, %xmm02458; SSE41-NEXT: cvtsi2ss %rax, %xmm02459; SSE41-NEXT: movq %xmm5, %rax2460; SSE41-NEXT: xorps %xmm3, %xmm32461; SSE41-NEXT: cvtsi2ss %rax, %xmm32462; SSE41-NEXT: insertps {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[2,3]2463; SSE41-NEXT: pand %xmm2, %xmm42464; SSE41-NEXT: movdqa %xmm2, %xmm52465; SSE41-NEXT: psrlq $1, %xmm52466; SSE41-NEXT: por %xmm4, %xmm52467; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm2[1,3]2468; SSE41-NEXT: movaps %xmm2, %xmm02469; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm22470; SSE41-NEXT: movq %xmm2, %rax2471; SSE41-NEXT: xorps %xmm0, %xmm02472; SSE41-NEXT: cvtsi2ss %rax, %xmm02473; SSE41-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1],xmm0[0],xmm3[3]2474; SSE41-NEXT: pextrq $1, %xmm2, %rax2475; SSE41-NEXT: xorps %xmm0, %xmm02476; SSE41-NEXT: cvtsi2ss %rax, %xmm02477; SSE41-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1,2],xmm0[0]2478; SSE41-NEXT: movaps %xmm3, %xmm22479; SSE41-NEXT: addps %xmm3, %xmm22480; SSE41-NEXT: movaps %xmm1, %xmm02481; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm32482; SSE41-NEXT: movaps %xmm3, %xmm02483; SSE41-NEXT: retq2484;2485; AVX1-LABEL: uitofp_4i64_to_4f32:2486; AVX1: # %bb.0:2487; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm12488; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22489; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm32490; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm12491; AVX1-NEXT: vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm32492; AVX1-NEXT: vorpd %ymm3, %ymm1, %ymm12493; AVX1-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm12494; AVX1-NEXT: vpextrq $1, %xmm1, %rax2495; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm32496; AVX1-NEXT: vmovq %xmm1, %rax2497; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm42498; AVX1-NEXT: vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]2499; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm12500; AVX1-NEXT: vmovq %xmm1, %rax2501; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm42502; AVX1-NEXT: vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]2503; AVX1-NEXT: vpextrq $1, %xmm1, %rax2504; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm12505; AVX1-NEXT: vinsertps {{.*#+}} xmm1 = xmm3[0,1,2],xmm1[0]2506; AVX1-NEXT: vaddps %xmm1, %xmm1, %xmm32507; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm02508; AVX1-NEXT: vblendvps %xmm0, %xmm3, %xmm1, %xmm02509; AVX1-NEXT: vzeroupper2510; AVX1-NEXT: retq2511;2512; AVX2-LABEL: uitofp_4i64_to_4f32:2513; AVX2: # %bb.0:2514; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]2515; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm12516; AVX2-NEXT: vpsrlq $1, %ymm0, %ymm22517; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm12518; AVX2-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm12519; AVX2-NEXT: vpextrq $1, %xmm1, %rax2520; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm22521; AVX2-NEXT: vmovq %xmm1, %rax2522; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm32523; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]2524; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm12525; AVX2-NEXT: vmovq %xmm1, %rax2526; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm32527; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]2528; AVX2-NEXT: vpextrq $1, %xmm1, %rax2529; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm12530; AVX2-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0,1,2],xmm1[0]2531; AVX2-NEXT: vaddps %xmm1, %xmm1, %xmm22532; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm32533; AVX2-NEXT: vpackssdw %xmm3, %xmm0, %xmm02534; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm02535; AVX2-NEXT: vzeroupper2536; AVX2-NEXT: retq2537;2538; AVX512F-LABEL: uitofp_4i64_to_4f32:2539; AVX512F: # %bb.0:2540; AVX512F-NEXT: vpextrq $1, %xmm0, %rax2541; AVX512F-NEXT: vcvtusi2ss %rax, %xmm15, %xmm12542; AVX512F-NEXT: vmovq %xmm0, %rax2543; AVX512F-NEXT: vcvtusi2ss %rax, %xmm15, %xmm22544; AVX512F-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]2545; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm02546; AVX512F-NEXT: vmovq %xmm0, %rax2547; AVX512F-NEXT: vcvtusi2ss %rax, %xmm15, %xmm22548; AVX512F-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]2549; AVX512F-NEXT: vpextrq $1, %xmm0, %rax2550; AVX512F-NEXT: vcvtusi2ss %rax, %xmm15, %xmm02551; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]2552; AVX512F-NEXT: vzeroupper2553; AVX512F-NEXT: retq2554;2555; AVX512VL-LABEL: uitofp_4i64_to_4f32:2556; AVX512VL: # %bb.0:2557; AVX512VL-NEXT: vpextrq $1, %xmm0, %rax2558; AVX512VL-NEXT: vcvtusi2ss %rax, %xmm15, %xmm12559; AVX512VL-NEXT: vmovq %xmm0, %rax2560; AVX512VL-NEXT: vcvtusi2ss %rax, %xmm15, %xmm22561; AVX512VL-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]2562; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm02563; AVX512VL-NEXT: vmovq %xmm0, %rax2564; AVX512VL-NEXT: vcvtusi2ss %rax, %xmm15, %xmm22565; AVX512VL-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]2566; AVX512VL-NEXT: vpextrq $1, %xmm0, %rax2567; AVX512VL-NEXT: vcvtusi2ss %rax, %xmm15, %xmm02568; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]2569; AVX512VL-NEXT: vzeroupper2570; AVX512VL-NEXT: retq2571;2572; AVX512DQ-LABEL: uitofp_4i64_to_4f32:2573; AVX512DQ: # %bb.0:2574; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02575; AVX512DQ-NEXT: vcvtuqq2ps %zmm0, %ymm02576; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02577; AVX512DQ-NEXT: vzeroupper2578; AVX512DQ-NEXT: retq2579;2580; AVX512VLDQ-LABEL: uitofp_4i64_to_4f32:2581; AVX512VLDQ: # %bb.0:2582; AVX512VLDQ-NEXT: vcvtuqq2ps %ymm0, %xmm02583; AVX512VLDQ-NEXT: vzeroupper2584; AVX512VLDQ-NEXT: retq2585 %cvt = uitofp <4 x i64> %a to <4 x float>2586 ret <4 x float> %cvt2587}2588 2589define <8 x float> @uitofp_8i32_to_8f32(<8 x i32> %a) {2590; SSE2-LABEL: uitofp_8i32_to_8f32:2591; SSE2: # %bb.0:2592; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]2593; SSE2-NEXT: movdqa %xmm0, %xmm32594; SSE2-NEXT: pand %xmm2, %xmm32595; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [1258291200,1258291200,1258291200,1258291200]2596; SSE2-NEXT: por %xmm4, %xmm32597; SSE2-NEXT: psrld $16, %xmm02598; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1392508928,1392508928,1392508928,1392508928]2599; SSE2-NEXT: por %xmm5, %xmm02600; SSE2-NEXT: movaps {{.*#+}} xmm6 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]2601; SSE2-NEXT: subps %xmm6, %xmm02602; SSE2-NEXT: addps %xmm3, %xmm02603; SSE2-NEXT: pand %xmm1, %xmm22604; SSE2-NEXT: por %xmm4, %xmm22605; SSE2-NEXT: psrld $16, %xmm12606; SSE2-NEXT: por %xmm5, %xmm12607; SSE2-NEXT: subps %xmm6, %xmm12608; SSE2-NEXT: addps %xmm2, %xmm12609; SSE2-NEXT: retq2610;2611; SSE41-LABEL: uitofp_8i32_to_8f32:2612; SSE41: # %bb.0:2613; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [1258291200,1258291200,1258291200,1258291200]2614; SSE41-NEXT: movdqa %xmm0, %xmm32615; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1],xmm3[2],xmm2[3],xmm3[4],xmm2[5],xmm3[6],xmm2[7]2616; SSE41-NEXT: psrld $16, %xmm02617; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [1392508928,1392508928,1392508928,1392508928]2618; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1],xmm0[2],xmm4[3],xmm0[4],xmm4[5],xmm0[6],xmm4[7]2619; SSE41-NEXT: movaps {{.*#+}} xmm5 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]2620; SSE41-NEXT: subps %xmm5, %xmm02621; SSE41-NEXT: addps %xmm3, %xmm02622; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]2623; SSE41-NEXT: psrld $16, %xmm12624; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7]2625; SSE41-NEXT: subps %xmm5, %xmm12626; SSE41-NEXT: addps %xmm2, %xmm12627; SSE41-NEXT: retq2628;2629; AVX1-LABEL: uitofp_8i32_to_8f32:2630; AVX1: # %bb.0:2631; AVX1-NEXT: vpsrld $16, %xmm0, %xmm12632; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22633; AVX1-NEXT: vpsrld $16, %xmm2, %xmm22634; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm12635; AVX1-NEXT: vcvtdq2ps %ymm1, %ymm12636; AVX1-NEXT: vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm12637; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02638; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm02639; AVX1-NEXT: vaddps %ymm0, %ymm1, %ymm02640; AVX1-NEXT: retq2641;2642; AVX2-LABEL: uitofp_8i32_to_8f32:2643; AVX2: # %bb.0:2644; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1258291200,1258291200,1258291200,1258291200,1258291200,1258291200,1258291200,1258291200]2645; AVX2-NEXT: vpblendw {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7],ymm0[8],ymm1[9],ymm0[10],ymm1[11],ymm0[12],ymm1[13],ymm0[14],ymm1[15]2646; AVX2-NEXT: vpsrld $16, %ymm0, %ymm02647; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [1392508928,1392508928,1392508928,1392508928,1392508928,1392508928,1392508928,1392508928]2648; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm2[1],ymm0[2],ymm2[3],ymm0[4],ymm2[5],ymm0[6],ymm2[7],ymm0[8],ymm2[9],ymm0[10],ymm2[11],ymm0[12],ymm2[13],ymm0[14],ymm2[15]2649; AVX2-NEXT: vbroadcastss {{.*#+}} ymm2 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]2650; AVX2-NEXT: vsubps %ymm2, %ymm0, %ymm02651; AVX2-NEXT: vaddps %ymm0, %ymm1, %ymm02652; AVX2-NEXT: retq2653;2654; AVX512F-LABEL: uitofp_8i32_to_8f32:2655; AVX512F: # %bb.0:2656; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02657; AVX512F-NEXT: vcvtudq2ps %zmm0, %zmm02658; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm02659; AVX512F-NEXT: retq2660;2661; AVX512VL-LABEL: uitofp_8i32_to_8f32:2662; AVX512VL: # %bb.0:2663; AVX512VL-NEXT: vcvtudq2ps %ymm0, %ymm02664; AVX512VL-NEXT: retq2665;2666; AVX512DQ-LABEL: uitofp_8i32_to_8f32:2667; AVX512DQ: # %bb.0:2668; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02669; AVX512DQ-NEXT: vcvtudq2ps %zmm0, %zmm02670; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm02671; AVX512DQ-NEXT: retq2672;2673; AVX512VLDQ-LABEL: uitofp_8i32_to_8f32:2674; AVX512VLDQ: # %bb.0:2675; AVX512VLDQ-NEXT: vcvtudq2ps %ymm0, %ymm02676; AVX512VLDQ-NEXT: retq2677 %cvt = uitofp <8 x i32> %a to <8 x float>2678 ret <8 x float> %cvt2679}2680 2681define <8 x float> @uitofp_8i16_to_8f32(<8 x i16> %a) {2682; SSE2-LABEL: uitofp_8i16_to_8f32:2683; SSE2: # %bb.0:2684; SSE2-NEXT: pxor %xmm1, %xmm12685; SSE2-NEXT: movdqa %xmm0, %xmm22686; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]2687; SSE2-NEXT: cvtdq2ps %xmm2, %xmm22688; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]2689; SSE2-NEXT: cvtdq2ps %xmm0, %xmm12690; SSE2-NEXT: movaps %xmm2, %xmm02691; SSE2-NEXT: retq2692;2693; SSE41-LABEL: uitofp_8i16_to_8f32:2694; SSE41: # %bb.0:2695; SSE41-NEXT: pxor %xmm1, %xmm12696; SSE41-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero2697; SSE41-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]2698; SSE41-NEXT: cvtdq2ps %xmm0, %xmm12699; SSE41-NEXT: cvtdq2ps %xmm2, %xmm02700; SSE41-NEXT: retq2701;2702; AVX1-LABEL: uitofp_8i16_to_8f32:2703; AVX1: # %bb.0:2704; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm12705; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]2706; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero2707; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm02708; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm02709; AVX1-NEXT: retq2710;2711; AVX2-LABEL: uitofp_8i16_to_8f32:2712; AVX2: # %bb.0:2713; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero2714; AVX2-NEXT: vcvtdq2ps %ymm0, %ymm02715; AVX2-NEXT: retq2716;2717; AVX512-LABEL: uitofp_8i16_to_8f32:2718; AVX512: # %bb.0:2719; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero2720; AVX512-NEXT: vcvtdq2ps %ymm0, %ymm02721; AVX512-NEXT: retq2722 %cvt = uitofp <8 x i16> %a to <8 x float>2723 ret <8 x float> %cvt2724}2725 2726define <8 x float> @uitofp_8i8_to_8f32(<16 x i8> %a) {2727; SSE2-LABEL: uitofp_8i8_to_8f32:2728; SSE2: # %bb.0:2729; SSE2-NEXT: pxor %xmm1, %xmm12730; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]2731; SSE2-NEXT: movdqa %xmm0, %xmm22732; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]2733; SSE2-NEXT: cvtdq2ps %xmm2, %xmm22734; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]2735; SSE2-NEXT: cvtdq2ps %xmm0, %xmm12736; SSE2-NEXT: movaps %xmm2, %xmm02737; SSE2-NEXT: retq2738;2739; SSE41-LABEL: uitofp_8i8_to_8f32:2740; SSE41: # %bb.0:2741; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero2742; SSE41-NEXT: cvtdq2ps %xmm1, %xmm22743; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]2744; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero2745; SSE41-NEXT: cvtdq2ps %xmm0, %xmm12746; SSE41-NEXT: movaps %xmm2, %xmm02747; SSE41-NEXT: retq2748;2749; AVX1-LABEL: uitofp_8i8_to_8f32:2750; AVX1: # %bb.0:2751; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero2752; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]2753; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero2754; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm02755; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm02756; AVX1-NEXT: retq2757;2758; AVX2-LABEL: uitofp_8i8_to_8f32:2759; AVX2: # %bb.0:2760; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero2761; AVX2-NEXT: vcvtdq2ps %ymm0, %ymm02762; AVX2-NEXT: retq2763;2764; AVX512-LABEL: uitofp_8i8_to_8f32:2765; AVX512: # %bb.0:2766; AVX512-NEXT: vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero2767; AVX512-NEXT: vcvtdq2ps %ymm0, %ymm02768; AVX512-NEXT: retq2769 %shuf = shufflevector <16 x i8> %a, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>2770 %cvt = uitofp <8 x i8> %shuf to <8 x float>2771 ret <8 x float> %cvt2772}2773 2774define <8 x float> @uitofp_16i8_to_8f32(<16 x i8> %a) {2775; SSE2-LABEL: uitofp_16i8_to_8f32:2776; SSE2: # %bb.0:2777; SSE2-NEXT: pxor %xmm1, %xmm12778; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]2779; SSE2-NEXT: movdqa %xmm0, %xmm22780; SSE2-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]2781; SSE2-NEXT: cvtdq2ps %xmm2, %xmm22782; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]2783; SSE2-NEXT: cvtdq2ps %xmm0, %xmm12784; SSE2-NEXT: movaps %xmm2, %xmm02785; SSE2-NEXT: retq2786;2787; SSE41-LABEL: uitofp_16i8_to_8f32:2788; SSE41: # %bb.0:2789; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero2790; SSE41-NEXT: cvtdq2ps %xmm1, %xmm22791; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]2792; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero2793; SSE41-NEXT: cvtdq2ps %xmm0, %xmm12794; SSE41-NEXT: movaps %xmm2, %xmm02795; SSE41-NEXT: retq2796;2797; AVX1-LABEL: uitofp_16i8_to_8f32:2798; AVX1: # %bb.0:2799; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero2800; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]2801; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero2802; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm02803; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm02804; AVX1-NEXT: retq2805;2806; AVX2-LABEL: uitofp_16i8_to_8f32:2807; AVX2: # %bb.0:2808; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero2809; AVX2-NEXT: vcvtdq2ps %ymm0, %ymm02810; AVX2-NEXT: retq2811;2812; AVX512-LABEL: uitofp_16i8_to_8f32:2813; AVX512: # %bb.0:2814; AVX512-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero2815; AVX512-NEXT: vcvtdq2ps %zmm0, %zmm02816; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm02817; AVX512-NEXT: retq2818 %cvt = uitofp <16 x i8> %a to <16 x float>2819 %shuf = shufflevector <16 x float> %cvt, <16 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>2820 ret <8 x float> %shuf2821}2822 2823;2824; Load Signed Integer to Double2825;2826 2827define <2 x double> @sitofp_load_2i64_to_2f64(ptr%a) {2828; SSE-LABEL: sitofp_load_2i64_to_2f64:2829; SSE: # %bb.0:2830; SSE-NEXT: cvtsi2sdq 8(%rdi), %xmm12831; SSE-NEXT: cvtsi2sdq (%rdi), %xmm02832; SSE-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]2833; SSE-NEXT: retq2834;2835; VEX-LABEL: sitofp_load_2i64_to_2f64:2836; VEX: # %bb.0:2837; VEX-NEXT: vcvtsi2sdq 8(%rdi), %xmm15, %xmm02838; VEX-NEXT: vcvtsi2sdq (%rdi), %xmm15, %xmm12839; VEX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]2840; VEX-NEXT: retq2841;2842; AVX512F-LABEL: sitofp_load_2i64_to_2f64:2843; AVX512F: # %bb.0:2844; AVX512F-NEXT: vcvtsi2sdq 8(%rdi), %xmm15, %xmm02845; AVX512F-NEXT: vcvtsi2sdq (%rdi), %xmm15, %xmm12846; AVX512F-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]2847; AVX512F-NEXT: retq2848;2849; AVX512VL-LABEL: sitofp_load_2i64_to_2f64:2850; AVX512VL: # %bb.0:2851; AVX512VL-NEXT: vcvtsi2sdq 8(%rdi), %xmm15, %xmm02852; AVX512VL-NEXT: vcvtsi2sdq (%rdi), %xmm15, %xmm12853; AVX512VL-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]2854; AVX512VL-NEXT: retq2855;2856; AVX512DQ-LABEL: sitofp_load_2i64_to_2f64:2857; AVX512DQ: # %bb.0:2858; AVX512DQ-NEXT: vmovaps (%rdi), %xmm02859; AVX512DQ-NEXT: vcvtqq2pd %zmm0, %zmm02860; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02861; AVX512DQ-NEXT: vzeroupper2862; AVX512DQ-NEXT: retq2863;2864; AVX512VLDQ-LABEL: sitofp_load_2i64_to_2f64:2865; AVX512VLDQ: # %bb.0:2866; AVX512VLDQ-NEXT: vcvtqq2pd (%rdi), %xmm02867; AVX512VLDQ-NEXT: retq2868 %ld = load <2 x i64>, ptr%a2869 %cvt = sitofp <2 x i64> %ld to <2 x double>2870 ret <2 x double> %cvt2871}2872 2873define <2 x double> @sitofp_load_2i32_to_2f64(ptr%a) {2874; SSE-LABEL: sitofp_load_2i32_to_2f64:2875; SSE: # %bb.0:2876; SSE-NEXT: cvtdq2pd (%rdi), %xmm02877; SSE-NEXT: retq2878;2879; AVX-LABEL: sitofp_load_2i32_to_2f64:2880; AVX: # %bb.0:2881; AVX-NEXT: vcvtdq2pd (%rdi), %xmm02882; AVX-NEXT: retq2883 %ld = load <2 x i32>, ptr%a2884 %cvt = sitofp <2 x i32> %ld to <2 x double>2885 ret <2 x double> %cvt2886}2887 2888define <2 x double> @sitofp_volatile_load_4i32_to_2f64(ptr%a) {2889; SSE-LABEL: sitofp_volatile_load_4i32_to_2f64:2890; SSE: # %bb.0:2891; SSE-NEXT: movaps (%rdi), %xmm02892; SSE-NEXT: cvtdq2pd %xmm0, %xmm02893; SSE-NEXT: retq2894;2895; AVX-LABEL: sitofp_volatile_load_4i32_to_2f64:2896; AVX: # %bb.0:2897; AVX-NEXT: vmovaps (%rdi), %xmm02898; AVX-NEXT: vcvtdq2pd %xmm0, %xmm02899; AVX-NEXT: retq2900 %ld = load volatile <4 x i32>, ptr%a2901 %b = shufflevector <4 x i32> %ld, <4 x i32> undef, <2 x i32> <i32 0, i32 1>2902 %cvt = sitofp <2 x i32> %b to <2 x double>2903 ret <2 x double> %cvt2904}2905 2906define <2 x double> @sitofp_load_4i32_to_2f64_2(ptr %x) {2907; SSE-LABEL: sitofp_load_4i32_to_2f64_2:2908; SSE: # %bb.0:2909; SSE-NEXT: cvtdq2pd (%rdi), %xmm02910; SSE-NEXT: retq2911;2912; AVX-LABEL: sitofp_load_4i32_to_2f64_2:2913; AVX: # %bb.0:2914; AVX-NEXT: vcvtdq2pd (%rdi), %xmm02915; AVX-NEXT: retq2916 %a = load <4 x i32>, ptr %x2917 %b = sitofp <4 x i32> %a to <4 x double>2918 %c = shufflevector <4 x double> %b, <4 x double> undef, <2 x i32> <i32 0, i32 1>2919 ret <2 x double> %c2920}2921 2922define <2 x double> @sitofp_volatile_load_4i32_to_2f64_2(ptr %x) {2923; SSE-LABEL: sitofp_volatile_load_4i32_to_2f64_2:2924; SSE: # %bb.0:2925; SSE-NEXT: movaps (%rdi), %xmm02926; SSE-NEXT: cvtdq2pd %xmm0, %xmm02927; SSE-NEXT: retq2928;2929; AVX-LABEL: sitofp_volatile_load_4i32_to_2f64_2:2930; AVX: # %bb.0:2931; AVX-NEXT: vmovaps (%rdi), %xmm02932; AVX-NEXT: vcvtdq2pd %xmm0, %xmm02933; AVX-NEXT: retq2934 %a = load volatile <4 x i32>, ptr %x2935 %b = sitofp <4 x i32> %a to <4 x double>2936 %c = shufflevector <4 x double> %b, <4 x double> undef, <2 x i32> <i32 0, i32 1>2937 ret <2 x double> %c2938}2939 2940define <2 x double> @sitofp_load_2i16_to_2f64(ptr%a) {2941; SSE2-LABEL: sitofp_load_2i16_to_2f64:2942; SSE2: # %bb.0:2943; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero2944; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]2945; SSE2-NEXT: psrad $16, %xmm02946; SSE2-NEXT: cvtdq2pd %xmm0, %xmm02947; SSE2-NEXT: retq2948;2949; SSE41-LABEL: sitofp_load_2i16_to_2f64:2950; SSE41: # %bb.0:2951; SSE41-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero2952; SSE41-NEXT: pmovsxwd %xmm0, %xmm02953; SSE41-NEXT: cvtdq2pd %xmm0, %xmm02954; SSE41-NEXT: retq2955;2956; AVX-LABEL: sitofp_load_2i16_to_2f64:2957; AVX: # %bb.0:2958; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero2959; AVX-NEXT: vpmovsxwd %xmm0, %xmm02960; AVX-NEXT: vcvtdq2pd %xmm0, %xmm02961; AVX-NEXT: retq2962 %ld = load <2 x i16>, ptr%a2963 %cvt = sitofp <2 x i16> %ld to <2 x double>2964 ret <2 x double> %cvt2965}2966 2967define <2 x double> @sitofp_load_2i8_to_2f64(ptr%a) {2968; SSE2-LABEL: sitofp_load_2i8_to_2f64:2969; SSE2: # %bb.0:2970; SSE2-NEXT: movzwl (%rdi), %eax2971; SSE2-NEXT: movd %eax, %xmm02972; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2973; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,1,4,5,6,7]2974; SSE2-NEXT: psrad $24, %xmm02975; SSE2-NEXT: cvtdq2pd %xmm0, %xmm02976; SSE2-NEXT: retq2977;2978; SSE41-LABEL: sitofp_load_2i8_to_2f64:2979; SSE41: # %bb.0:2980; SSE41-NEXT: movzwl (%rdi), %eax2981; SSE41-NEXT: movd %eax, %xmm02982; SSE41-NEXT: pmovsxbd %xmm0, %xmm02983; SSE41-NEXT: cvtdq2pd %xmm0, %xmm02984; SSE41-NEXT: retq2985;2986; AVX-LABEL: sitofp_load_2i8_to_2f64:2987; AVX: # %bb.0:2988; AVX-NEXT: movzwl (%rdi), %eax2989; AVX-NEXT: vmovd %eax, %xmm02990; AVX-NEXT: vpmovsxbd %xmm0, %xmm02991; AVX-NEXT: vcvtdq2pd %xmm0, %xmm02992; AVX-NEXT: retq2993 %ld = load <2 x i8>, ptr%a2994 %cvt = sitofp <2 x i8> %ld to <2 x double>2995 ret <2 x double> %cvt2996}2997 2998define <4 x double> @sitofp_load_4i64_to_4f64(ptr%a) {2999; SSE-LABEL: sitofp_load_4i64_to_4f64:3000; SSE: # %bb.0:3001; SSE-NEXT: cvtsi2sdq 8(%rdi), %xmm13002; SSE-NEXT: cvtsi2sdq (%rdi), %xmm03003; SSE-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]3004; SSE-NEXT: cvtsi2sdq 24(%rdi), %xmm23005; SSE-NEXT: xorps %xmm1, %xmm13006; SSE-NEXT: cvtsi2sdq 16(%rdi), %xmm13007; SSE-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm2[0]3008; SSE-NEXT: retq3009;3010; VEX-LABEL: sitofp_load_4i64_to_4f64:3011; VEX: # %bb.0:3012; VEX-NEXT: vcvtsi2sdq 24(%rdi), %xmm15, %xmm03013; VEX-NEXT: vcvtsi2sdq 16(%rdi), %xmm15, %xmm13014; VEX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]3015; VEX-NEXT: vcvtsi2sdq 8(%rdi), %xmm15, %xmm13016; VEX-NEXT: vcvtsi2sdq (%rdi), %xmm15, %xmm23017; VEX-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm2[0],xmm1[0]3018; VEX-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm03019; VEX-NEXT: retq3020;3021; AVX512F-LABEL: sitofp_load_4i64_to_4f64:3022; AVX512F: # %bb.0:3023; AVX512F-NEXT: vcvtsi2sdq 24(%rdi), %xmm15, %xmm03024; AVX512F-NEXT: vcvtsi2sdq 16(%rdi), %xmm15, %xmm13025; AVX512F-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]3026; AVX512F-NEXT: vcvtsi2sdq 8(%rdi), %xmm15, %xmm13027; AVX512F-NEXT: vcvtsi2sdq (%rdi), %xmm15, %xmm23028; AVX512F-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm2[0],xmm1[0]3029; AVX512F-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm03030; AVX512F-NEXT: retq3031;3032; AVX512VL-LABEL: sitofp_load_4i64_to_4f64:3033; AVX512VL: # %bb.0:3034; AVX512VL-NEXT: vcvtsi2sdq 24(%rdi), %xmm15, %xmm03035; AVX512VL-NEXT: vcvtsi2sdq 16(%rdi), %xmm15, %xmm13036; AVX512VL-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm1[0],xmm0[0]3037; AVX512VL-NEXT: vcvtsi2sdq 8(%rdi), %xmm15, %xmm13038; AVX512VL-NEXT: vcvtsi2sdq (%rdi), %xmm15, %xmm23039; AVX512VL-NEXT: vunpcklpd {{.*#+}} xmm1 = xmm2[0],xmm1[0]3040; AVX512VL-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm03041; AVX512VL-NEXT: retq3042;3043; AVX512DQ-LABEL: sitofp_load_4i64_to_4f64:3044; AVX512DQ: # %bb.0:3045; AVX512DQ-NEXT: vmovaps (%rdi), %ymm03046; AVX512DQ-NEXT: vcvtqq2pd %zmm0, %zmm03047; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm03048; AVX512DQ-NEXT: retq3049;3050; AVX512VLDQ-LABEL: sitofp_load_4i64_to_4f64:3051; AVX512VLDQ: # %bb.0:3052; AVX512VLDQ-NEXT: vcvtqq2pd (%rdi), %ymm03053; AVX512VLDQ-NEXT: retq3054 %ld = load <4 x i64>, ptr%a3055 %cvt = sitofp <4 x i64> %ld to <4 x double>3056 ret <4 x double> %cvt3057}3058 3059define <4 x double> @sitofp_load_4i32_to_4f64(ptr%a) {3060; SSE-LABEL: sitofp_load_4i32_to_4f64:3061; SSE: # %bb.0:3062; SSE-NEXT: movdqa (%rdi), %xmm13063; SSE-NEXT: cvtdq2pd %xmm1, %xmm03064; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]3065; SSE-NEXT: cvtdq2pd %xmm1, %xmm13066; SSE-NEXT: retq3067;3068; AVX-LABEL: sitofp_load_4i32_to_4f64:3069; AVX: # %bb.0:3070; AVX-NEXT: vcvtdq2pd (%rdi), %ymm03071; AVX-NEXT: retq3072 %ld = load <4 x i32>, ptr%a3073 %cvt = sitofp <4 x i32> %ld to <4 x double>3074 ret <4 x double> %cvt3075}3076 3077define <4 x double> @sitofp_load_4i16_to_4f64(ptr%a) {3078; SSE2-LABEL: sitofp_load_4i16_to_4f64:3079; SSE2: # %bb.0:3080; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero3081; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]3082; SSE2-NEXT: psrad $16, %xmm13083; SSE2-NEXT: cvtdq2pd %xmm1, %xmm03084; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]3085; SSE2-NEXT: cvtdq2pd %xmm1, %xmm13086; SSE2-NEXT: retq3087;3088; SSE41-LABEL: sitofp_load_4i16_to_4f64:3089; SSE41: # %bb.0:3090; SSE41-NEXT: pmovsxwd (%rdi), %xmm13091; SSE41-NEXT: cvtdq2pd %xmm1, %xmm03092; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]3093; SSE41-NEXT: cvtdq2pd %xmm1, %xmm13094; SSE41-NEXT: retq3095;3096; AVX-LABEL: sitofp_load_4i16_to_4f64:3097; AVX: # %bb.0:3098; AVX-NEXT: vpmovsxwd (%rdi), %xmm03099; AVX-NEXT: vcvtdq2pd %xmm0, %ymm03100; AVX-NEXT: retq3101 %ld = load <4 x i16>, ptr%a3102 %cvt = sitofp <4 x i16> %ld to <4 x double>3103 ret <4 x double> %cvt3104}3105 3106define <4 x double> @sitofp_load_4i8_to_4f64(ptr%a) {3107; SSE2-LABEL: sitofp_load_4i8_to_4f64:3108; SSE2: # %bb.0:3109; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero3110; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]3111; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]3112; SSE2-NEXT: psrad $24, %xmm13113; SSE2-NEXT: cvtdq2pd %xmm1, %xmm03114; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]3115; SSE2-NEXT: cvtdq2pd %xmm1, %xmm13116; SSE2-NEXT: retq3117;3118; SSE41-LABEL: sitofp_load_4i8_to_4f64:3119; SSE41: # %bb.0:3120; SSE41-NEXT: pmovsxbd (%rdi), %xmm13121; SSE41-NEXT: cvtdq2pd %xmm1, %xmm03122; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]3123; SSE41-NEXT: cvtdq2pd %xmm1, %xmm13124; SSE41-NEXT: retq3125;3126; AVX-LABEL: sitofp_load_4i8_to_4f64:3127; AVX: # %bb.0:3128; AVX-NEXT: vpmovsxbd (%rdi), %xmm03129; AVX-NEXT: vcvtdq2pd %xmm0, %ymm03130; AVX-NEXT: retq3131 %ld = load <4 x i8>, ptr%a3132 %cvt = sitofp <4 x i8> %ld to <4 x double>3133 ret <4 x double> %cvt3134}3135 3136;3137; Load Unsigned Integer to Double3138;3139 3140define <2 x double> @uitofp_load_2i64_to_2f64(ptr%a) {3141; SSE2-LABEL: uitofp_load_2i64_to_2f64:3142; SSE2: # %bb.0:3143; SSE2-NEXT: movdqa (%rdi), %xmm03144; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [4294967295,4294967295]3145; SSE2-NEXT: pand %xmm0, %xmm13146; SSE2-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm13147; SSE2-NEXT: psrlq $32, %xmm03148; SSE2-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03149; SSE2-NEXT: subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03150; SSE2-NEXT: addpd %xmm1, %xmm03151; SSE2-NEXT: retq3152;3153; SSE41-LABEL: uitofp_load_2i64_to_2f64:3154; SSE41: # %bb.0:3155; SSE41-NEXT: movdqa (%rdi), %xmm03156; SSE41-NEXT: pxor %xmm1, %xmm13157; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]3158; SSE41-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm13159; SSE41-NEXT: psrlq $32, %xmm03160; SSE41-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03161; SSE41-NEXT: subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm03162; SSE41-NEXT: addpd %xmm1, %xmm03163; SSE41-NEXT: retq3164;3165; AVX1-LABEL: uitofp_load_2i64_to_2f64:3166; AVX1: # %bb.0:3167; AVX1-NEXT: vmovdqa (%rdi), %xmm03168; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm13169; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]3170; AVX1-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm13171; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm03172; AVX1-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03173; AVX1-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03174; AVX1-NEXT: vaddpd %xmm0, %xmm1, %xmm03175; AVX1-NEXT: retq3176;3177; AVX2-LABEL: uitofp_load_2i64_to_2f64:3178; AVX2: # %bb.0:3179; AVX2-NEXT: vmovdqa (%rdi), %xmm03180; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm13181; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]3182; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm13183; AVX2-NEXT: vpsrlq $32, %xmm0, %xmm03184; AVX2-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03185; AVX2-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03186; AVX2-NEXT: vaddpd %xmm0, %xmm1, %xmm03187; AVX2-NEXT: retq3188;3189; AVX512F-LABEL: uitofp_load_2i64_to_2f64:3190; AVX512F: # %bb.0:3191; AVX512F-NEXT: vmovdqa (%rdi), %xmm03192; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm13193; AVX512F-NEXT: vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]3194; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm13195; AVX512F-NEXT: vpsrlq $32, %xmm0, %xmm03196; AVX512F-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03197; AVX512F-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm03198; AVX512F-NEXT: vaddpd %xmm0, %xmm1, %xmm03199; AVX512F-NEXT: retq3200;3201; AVX512VL-LABEL: uitofp_load_2i64_to_2f64:3202; AVX512VL: # %bb.0:3203; AVX512VL-NEXT: vmovdqa (%rdi), %xmm03204; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm13205; AVX512VL-NEXT: vpblendd {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]3206; AVX512VL-NEXT: vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %xmm13207; AVX512VL-NEXT: vpsrlq $32, %xmm0, %xmm03208; AVX512VL-NEXT: vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm03209; AVX512VL-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm03210; AVX512VL-NEXT: vaddpd %xmm0, %xmm1, %xmm03211; AVX512VL-NEXT: retq3212;3213; AVX512DQ-LABEL: uitofp_load_2i64_to_2f64:3214; AVX512DQ: # %bb.0:3215; AVX512DQ-NEXT: vmovaps (%rdi), %xmm03216; AVX512DQ-NEXT: vcvtuqq2pd %zmm0, %zmm03217; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm03218; AVX512DQ-NEXT: vzeroupper3219; AVX512DQ-NEXT: retq3220;3221; AVX512VLDQ-LABEL: uitofp_load_2i64_to_2f64:3222; AVX512VLDQ: # %bb.0:3223; AVX512VLDQ-NEXT: vcvtuqq2pd (%rdi), %xmm03224; AVX512VLDQ-NEXT: retq3225 %ld = load <2 x i64>, ptr%a3226 %cvt = uitofp <2 x i64> %ld to <2 x double>3227 ret <2 x double> %cvt3228}3229 3230define <2 x double> @uitofp_load_2i32_to_2f64(ptr%a) {3231; SSE2-LABEL: uitofp_load_2i32_to_2f64:3232; SSE2: # %bb.0:3233; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero3234; SSE2-NEXT: xorpd %xmm1, %xmm13235; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3236; SSE2-NEXT: movapd {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]3237; SSE2-NEXT: orpd %xmm1, %xmm03238; SSE2-NEXT: subpd %xmm1, %xmm03239; SSE2-NEXT: retq3240;3241; SSE41-LABEL: uitofp_load_2i32_to_2f64:3242; SSE41: # %bb.0:3243; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero3244; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]3245; SSE41-NEXT: por %xmm1, %xmm03246; SSE41-NEXT: subpd %xmm1, %xmm03247; SSE41-NEXT: retq3248;3249; AVX1-LABEL: uitofp_load_2i32_to_2f64:3250; AVX1: # %bb.0:3251; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero3252; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]3253; AVX1-NEXT: # xmm1 = mem[0,0]3254; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm03255; AVX1-NEXT: vsubpd %xmm1, %xmm0, %xmm03256; AVX1-NEXT: retq3257;3258; AVX2-LABEL: uitofp_load_2i32_to_2f64:3259; AVX2: # %bb.0:3260; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero3261; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]3262; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm03263; AVX2-NEXT: vsubpd %xmm1, %xmm0, %xmm03264; AVX2-NEXT: retq3265;3266; AVX512F-LABEL: uitofp_load_2i32_to_2f64:3267; AVX512F: # %bb.0:3268; AVX512F-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero3269; AVX512F-NEXT: vcvtudq2pd %ymm0, %zmm03270; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm03271; AVX512F-NEXT: vzeroupper3272; AVX512F-NEXT: retq3273;3274; AVX512VL-LABEL: uitofp_load_2i32_to_2f64:3275; AVX512VL: # %bb.0:3276; AVX512VL-NEXT: vcvtudq2pd (%rdi), %xmm03277; AVX512VL-NEXT: retq3278;3279; AVX512DQ-LABEL: uitofp_load_2i32_to_2f64:3280; AVX512DQ: # %bb.0:3281; AVX512DQ-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero3282; AVX512DQ-NEXT: vcvtudq2pd %ymm0, %zmm03283; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm03284; AVX512DQ-NEXT: vzeroupper3285; AVX512DQ-NEXT: retq3286;3287; AVX512VLDQ-LABEL: uitofp_load_2i32_to_2f64:3288; AVX512VLDQ: # %bb.0:3289; AVX512VLDQ-NEXT: vcvtudq2pd (%rdi), %xmm03290; AVX512VLDQ-NEXT: retq3291 %ld = load <2 x i32>, ptr%a3292 %cvt = uitofp <2 x i32> %ld to <2 x double>3293 ret <2 x double> %cvt3294}3295 3296define <2 x double> @uitofp_load_4i32_to_2f64_2(ptr %x) {3297; SSE2-LABEL: uitofp_load_4i32_to_2f64_2:3298; SSE2: # %bb.0:3299; SSE2-NEXT: movapd (%rdi), %xmm03300; SSE2-NEXT: xorpd %xmm1, %xmm13301; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3302; SSE2-NEXT: movapd {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]3303; SSE2-NEXT: orpd %xmm1, %xmm03304; SSE2-NEXT: subpd %xmm1, %xmm03305; SSE2-NEXT: retq3306;3307; SSE41-LABEL: uitofp_load_4i32_to_2f64_2:3308; SSE41: # %bb.0:3309; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero3310; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]3311; SSE41-NEXT: por %xmm1, %xmm03312; SSE41-NEXT: subpd %xmm1, %xmm03313; SSE41-NEXT: retq3314;3315; AVX1-LABEL: uitofp_load_4i32_to_2f64_2:3316; AVX1: # %bb.0:3317; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero3318; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]3319; AVX1-NEXT: # xmm1 = mem[0,0]3320; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm03321; AVX1-NEXT: vsubpd %xmm1, %xmm0, %xmm03322; AVX1-NEXT: retq3323;3324; AVX2-LABEL: uitofp_load_4i32_to_2f64_2:3325; AVX2: # %bb.0:3326; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero3327; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]3328; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm03329; AVX2-NEXT: vsubpd %xmm1, %xmm0, %xmm03330; AVX2-NEXT: vzeroupper3331; AVX2-NEXT: retq3332;3333; AVX512F-LABEL: uitofp_load_4i32_to_2f64_2:3334; AVX512F: # %bb.0:3335; AVX512F-NEXT: vmovaps (%rdi), %xmm03336; AVX512F-NEXT: vcvtudq2pd %ymm0, %zmm03337; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm03338; AVX512F-NEXT: vzeroupper3339; AVX512F-NEXT: retq3340;3341; AVX512VL-LABEL: uitofp_load_4i32_to_2f64_2:3342; AVX512VL: # %bb.0:3343; AVX512VL-NEXT: vcvtudq2pd (%rdi), %xmm03344; AVX512VL-NEXT: retq3345;3346; AVX512DQ-LABEL: uitofp_load_4i32_to_2f64_2:3347; AVX512DQ: # %bb.0:3348; AVX512DQ-NEXT: vmovaps (%rdi), %xmm03349; AVX512DQ-NEXT: vcvtudq2pd %ymm0, %zmm03350; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm03351; AVX512DQ-NEXT: vzeroupper3352; AVX512DQ-NEXT: retq3353;3354; AVX512VLDQ-LABEL: uitofp_load_4i32_to_2f64_2:3355; AVX512VLDQ: # %bb.0:3356; AVX512VLDQ-NEXT: vcvtudq2pd (%rdi), %xmm03357; AVX512VLDQ-NEXT: retq3358 %a = load <4 x i32>, ptr %x3359 %b = uitofp <4 x i32> %a to <4 x double>3360 %c = shufflevector <4 x double> %b, <4 x double> undef, <2 x i32> <i32 0, i32 1>3361 ret <2 x double> %c3362}3363 3364define <2 x double> @uitofp_volatile_load_4i32_to_2f64_2(ptr %x) {3365; SSE2-LABEL: uitofp_volatile_load_4i32_to_2f64_2:3366; SSE2: # %bb.0:3367; SSE2-NEXT: movapd (%rdi), %xmm03368; SSE2-NEXT: xorpd %xmm1, %xmm13369; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]3370; SSE2-NEXT: movapd {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]3371; SSE2-NEXT: orpd %xmm1, %xmm03372; SSE2-NEXT: subpd %xmm1, %xmm03373; SSE2-NEXT: retq3374;3375; SSE41-LABEL: uitofp_volatile_load_4i32_to_2f64_2:3376; SSE41: # %bb.0:3377; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero3378; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]3379; SSE41-NEXT: por %xmm1, %xmm03380; SSE41-NEXT: subpd %xmm1, %xmm03381; SSE41-NEXT: retq3382;3383; AVX1-LABEL: uitofp_volatile_load_4i32_to_2f64_2:3384; AVX1: # %bb.0:3385; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero3386; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]3387; AVX1-NEXT: # xmm1 = mem[0,0]3388; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm03389; AVX1-NEXT: vsubpd %xmm1, %xmm0, %xmm03390; AVX1-NEXT: retq3391;3392; AVX2-LABEL: uitofp_volatile_load_4i32_to_2f64_2:3393; AVX2: # %bb.0:3394; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero3395; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [4.503599627370496E+15,4.503599627370496E+15]3396; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm03397; AVX2-NEXT: vsubpd %xmm1, %xmm0, %xmm03398; AVX2-NEXT: vzeroupper3399; AVX2-NEXT: retq3400;3401; AVX512F-LABEL: uitofp_volatile_load_4i32_to_2f64_2:3402; AVX512F: # %bb.0:3403; AVX512F-NEXT: vmovaps (%rdi), %xmm03404; AVX512F-NEXT: vcvtudq2pd %ymm0, %zmm03405; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm03406; AVX512F-NEXT: vzeroupper3407; AVX512F-NEXT: retq3408;3409; AVX512VL-LABEL: uitofp_volatile_load_4i32_to_2f64_2:3410; AVX512VL: # %bb.0:3411; AVX512VL-NEXT: vmovaps (%rdi), %xmm03412; AVX512VL-NEXT: vcvtudq2pd %xmm0, %xmm03413; AVX512VL-NEXT: retq3414;3415; AVX512DQ-LABEL: uitofp_volatile_load_4i32_to_2f64_2:3416; AVX512DQ: # %bb.0:3417; AVX512DQ-NEXT: vmovaps (%rdi), %xmm03418; AVX512DQ-NEXT: vcvtudq2pd %ymm0, %zmm03419; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm03420; AVX512DQ-NEXT: vzeroupper3421; AVX512DQ-NEXT: retq3422;3423; AVX512VLDQ-LABEL: uitofp_volatile_load_4i32_to_2f64_2:3424; AVX512VLDQ: # %bb.0:3425; AVX512VLDQ-NEXT: vmovaps (%rdi), %xmm03426; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %xmm03427; AVX512VLDQ-NEXT: retq3428 %a = load volatile <4 x i32>, ptr %x3429 %b = uitofp <4 x i32> %a to <4 x double>3430 %c = shufflevector <4 x double> %b, <4 x double> undef, <2 x i32> <i32 0, i32 1>3431 ret <2 x double> %c3432}3433 3434define <2 x double> @uitofp_load_2i16_to_2f64(ptr%a) {3435; SSE2-LABEL: uitofp_load_2i16_to_2f64:3436; SSE2: # %bb.0:3437; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero3438; SSE2-NEXT: pxor %xmm1, %xmm13439; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]3440; SSE2-NEXT: cvtdq2pd %xmm0, %xmm03441; SSE2-NEXT: retq3442;3443; SSE41-LABEL: uitofp_load_2i16_to_2f64:3444; SSE41: # %bb.0:3445; SSE41-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero3446; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero3447; SSE41-NEXT: cvtdq2pd %xmm0, %xmm03448; SSE41-NEXT: retq3449;3450; AVX-LABEL: uitofp_load_2i16_to_2f64:3451; AVX: # %bb.0:3452; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero3453; AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero3454; AVX-NEXT: vcvtdq2pd %xmm0, %xmm03455; AVX-NEXT: retq3456 %ld = load <2 x i16>, ptr%a3457 %cvt = uitofp <2 x i16> %ld to <2 x double>3458 ret <2 x double> %cvt3459}3460 3461define <2 x double> @uitofp_load_2i8_to_2f64(ptr%a) {3462; SSE2-LABEL: uitofp_load_2i8_to_2f64:3463; SSE2: # %bb.0:3464; SSE2-NEXT: movzwl (%rdi), %eax3465; SSE2-NEXT: movd %eax, %xmm03466; SSE2-NEXT: pxor %xmm1, %xmm13467; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]3468; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]3469; SSE2-NEXT: cvtdq2pd %xmm0, %xmm03470; SSE2-NEXT: retq3471;3472; SSE41-LABEL: uitofp_load_2i8_to_2f64:3473; SSE41: # %bb.0:3474; SSE41-NEXT: movzwl (%rdi), %eax3475; SSE41-NEXT: movd %eax, %xmm03476; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero3477; SSE41-NEXT: cvtdq2pd %xmm0, %xmm03478; SSE41-NEXT: retq3479;3480; AVX-LABEL: uitofp_load_2i8_to_2f64:3481; AVX: # %bb.0:3482; AVX-NEXT: movzwl (%rdi), %eax3483; AVX-NEXT: vmovd %eax, %xmm03484; AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero3485; AVX-NEXT: vcvtdq2pd %xmm0, %xmm03486; AVX-NEXT: retq3487 %ld = load <2 x i8>, ptr%a3488 %cvt = uitofp <2 x i8> %ld to <2 x double>3489 ret <2 x double> %cvt3490}3491 3492define <4 x double> @uitofp_load_4i64_to_4f64(ptr%a) {3493; SSE2-LABEL: uitofp_load_4i64_to_4f64:3494; SSE2: # %bb.0:3495; SSE2-NEXT: movdqa (%rdi), %xmm03496; SSE2-NEXT: movdqa 16(%rdi), %xmm13497; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [4294967295,4294967295]3498; SSE2-NEXT: movdqa %xmm0, %xmm33499; SSE2-NEXT: pand %xmm2, %xmm33500; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]3501; SSE2-NEXT: por %xmm4, %xmm33502; SSE2-NEXT: psrlq $32, %xmm03503; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]3504; SSE2-NEXT: por %xmm5, %xmm03505; SSE2-NEXT: movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]3506; SSE2-NEXT: subpd %xmm6, %xmm03507; SSE2-NEXT: addpd %xmm3, %xmm03508; SSE2-NEXT: pand %xmm1, %xmm23509; SSE2-NEXT: por %xmm4, %xmm23510; SSE2-NEXT: psrlq $32, %xmm13511; SSE2-NEXT: por %xmm5, %xmm13512; SSE2-NEXT: subpd %xmm6, %xmm13513; SSE2-NEXT: addpd %xmm2, %xmm13514; SSE2-NEXT: retq3515;3516; SSE41-LABEL: uitofp_load_4i64_to_4f64:3517; SSE41: # %bb.0:3518; SSE41-NEXT: movdqa (%rdi), %xmm03519; SSE41-NEXT: movdqa 16(%rdi), %xmm13520; SSE41-NEXT: pxor %xmm2, %xmm23521; SSE41-NEXT: movdqa %xmm0, %xmm33522; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]3523; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]3524; SSE41-NEXT: por %xmm4, %xmm33525; SSE41-NEXT: psrlq $32, %xmm03526; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]3527; SSE41-NEXT: por %xmm5, %xmm03528; SSE41-NEXT: movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]3529; SSE41-NEXT: subpd %xmm6, %xmm03530; SSE41-NEXT: addpd %xmm3, %xmm03531; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]3532; SSE41-NEXT: por %xmm4, %xmm23533; SSE41-NEXT: psrlq $32, %xmm13534; SSE41-NEXT: por %xmm5, %xmm13535; SSE41-NEXT: subpd %xmm6, %xmm13536; SSE41-NEXT: addpd %xmm2, %xmm13537; SSE41-NEXT: retq3538;3539; AVX1-LABEL: uitofp_load_4i64_to_4f64:3540; AVX1: # %bb.0:3541; AVX1-NEXT: vmovaps (%rdi), %ymm03542; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm13543; AVX1-NEXT: vblendps {{.*#+}} ymm2 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]3544; AVX1-NEXT: vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm23545; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm1[1,3],ymm0[1,3],ymm1[5,7],ymm0[5,7]3546; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[2,0,3,1,6,4,7,5]3547; AVX1-NEXT: vorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm03548; AVX1-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm03549; AVX1-NEXT: vaddpd %ymm0, %ymm2, %ymm03550; AVX1-NEXT: retq3551;3552; AVX2-LABEL: uitofp_load_4i64_to_4f64:3553; AVX2: # %bb.0:3554; AVX2-NEXT: vmovdqa (%rdi), %ymm03555; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm13556; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]3557; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]3558; AVX2-NEXT: vpor %ymm2, %ymm1, %ymm13559; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm03560; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]3561; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm03562; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25]3563; AVX2-NEXT: vsubpd %ymm2, %ymm0, %ymm03564; AVX2-NEXT: vaddpd %ymm0, %ymm1, %ymm03565; AVX2-NEXT: retq3566;3567; AVX512F-LABEL: uitofp_load_4i64_to_4f64:3568; AVX512F: # %bb.0:3569; AVX512F-NEXT: vmovdqa (%rdi), %ymm03570; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm13571; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]3572; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4841369599423283200,4841369599423283200,4841369599423283200,4841369599423283200]3573; AVX512F-NEXT: vpor %ymm2, %ymm1, %ymm13574; AVX512F-NEXT: vpsrlq $32, %ymm0, %ymm03575; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4985484787499139072,4985484787499139072,4985484787499139072,4985484787499139072]3576; AVX512F-NEXT: vpor %ymm2, %ymm0, %ymm03577; AVX512F-NEXT: vbroadcastsd {{.*#+}} ymm2 = [1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25,1.9342813118337666E+25]3578; AVX512F-NEXT: vsubpd %ymm2, %ymm0, %ymm03579; AVX512F-NEXT: vaddpd %ymm0, %ymm1, %ymm03580; AVX512F-NEXT: retq3581;3582; AVX512VL-LABEL: uitofp_load_4i64_to_4f64:3583; AVX512VL: # %bb.0:3584; AVX512VL-NEXT: vmovdqa (%rdi), %ymm03585; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm13586; AVX512VL-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]3587; AVX512VL-NEXT: vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm1, %ymm13588; AVX512VL-NEXT: vpsrlq $32, %ymm0, %ymm03589; AVX512VL-NEXT: vporq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm03590; AVX512VL-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm03591; AVX512VL-NEXT: vaddpd %ymm0, %ymm1, %ymm03592; AVX512VL-NEXT: retq3593;3594; AVX512DQ-LABEL: uitofp_load_4i64_to_4f64:3595; AVX512DQ: # %bb.0:3596; AVX512DQ-NEXT: vmovaps (%rdi), %ymm03597; AVX512DQ-NEXT: vcvtuqq2pd %zmm0, %zmm03598; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm03599; AVX512DQ-NEXT: retq3600;3601; AVX512VLDQ-LABEL: uitofp_load_4i64_to_4f64:3602; AVX512VLDQ: # %bb.0:3603; AVX512VLDQ-NEXT: vcvtuqq2pd (%rdi), %ymm03604; AVX512VLDQ-NEXT: retq3605 %ld = load <4 x i64>, ptr%a3606 %cvt = uitofp <4 x i64> %ld to <4 x double>3607 ret <4 x double> %cvt3608}3609 3610define <4 x double> @uitofp_load_4i32_to_4f64(ptr%a) {3611; SSE2-LABEL: uitofp_load_4i32_to_4f64:3612; SSE2: # %bb.0:3613; SSE2-NEXT: movapd (%rdi), %xmm13614; SSE2-NEXT: xorpd %xmm2, %xmm23615; SSE2-NEXT: movapd %xmm1, %xmm03616; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]3617; SSE2-NEXT: movapd {{.*#+}} xmm3 = [4.503599627370496E+15,4.503599627370496E+15]3618; SSE2-NEXT: orpd %xmm3, %xmm03619; SSE2-NEXT: subpd %xmm3, %xmm03620; SSE2-NEXT: unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]3621; SSE2-NEXT: orpd %xmm3, %xmm13622; SSE2-NEXT: subpd %xmm3, %xmm13623; SSE2-NEXT: retq3624;3625; SSE41-LABEL: uitofp_load_4i32_to_4f64:3626; SSE41: # %bb.0:3627; SSE41-NEXT: movdqa (%rdi), %xmm13628; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero3629; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [4.503599627370496E+15,4.503599627370496E+15]3630; SSE41-NEXT: por %xmm2, %xmm03631; SSE41-NEXT: subpd %xmm2, %xmm03632; SSE41-NEXT: pxor %xmm3, %xmm33633; SSE41-NEXT: punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]3634; SSE41-NEXT: por %xmm2, %xmm13635; SSE41-NEXT: subpd %xmm2, %xmm13636; SSE41-NEXT: retq3637;3638; AVX1-LABEL: uitofp_load_4i32_to_4f64:3639; AVX1: # %bb.0:3640; AVX1-NEXT: vmovdqa (%rdi), %xmm03641; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm13642; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm1 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]3643; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero3644; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm03645; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm1 = [4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15]3646; AVX1-NEXT: vorpd %ymm1, %ymm0, %ymm03647; AVX1-NEXT: vsubpd %ymm1, %ymm0, %ymm03648; AVX1-NEXT: retq3649;3650; AVX2-LABEL: uitofp_load_4i32_to_4f64:3651; AVX2: # %bb.0:3652; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero3653; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15,4.503599627370496E+15]3654; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm03655; AVX2-NEXT: vsubpd %ymm1, %ymm0, %ymm03656; AVX2-NEXT: retq3657;3658; AVX512F-LABEL: uitofp_load_4i32_to_4f64:3659; AVX512F: # %bb.0:3660; AVX512F-NEXT: vmovaps (%rdi), %xmm03661; AVX512F-NEXT: vcvtudq2pd %ymm0, %zmm03662; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm03663; AVX512F-NEXT: retq3664;3665; AVX512VL-LABEL: uitofp_load_4i32_to_4f64:3666; AVX512VL: # %bb.0:3667; AVX512VL-NEXT: vcvtudq2pd (%rdi), %ymm03668; AVX512VL-NEXT: retq3669;3670; AVX512DQ-LABEL: uitofp_load_4i32_to_4f64:3671; AVX512DQ: # %bb.0:3672; AVX512DQ-NEXT: vmovaps (%rdi), %xmm03673; AVX512DQ-NEXT: vcvtudq2pd %ymm0, %zmm03674; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm03675; AVX512DQ-NEXT: retq3676;3677; AVX512VLDQ-LABEL: uitofp_load_4i32_to_4f64:3678; AVX512VLDQ: # %bb.0:3679; AVX512VLDQ-NEXT: vcvtudq2pd (%rdi), %ymm03680; AVX512VLDQ-NEXT: retq3681 %ld = load <4 x i32>, ptr%a3682 %cvt = uitofp <4 x i32> %ld to <4 x double>3683 ret <4 x double> %cvt3684}3685 3686define <4 x double> @uitofp_load_4i16_to_4f64(ptr%a) {3687; SSE2-LABEL: uitofp_load_4i16_to_4f64:3688; SSE2: # %bb.0:3689; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero3690; SSE2-NEXT: pxor %xmm0, %xmm03691; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]3692; SSE2-NEXT: cvtdq2pd %xmm1, %xmm03693; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]3694; SSE2-NEXT: cvtdq2pd %xmm1, %xmm13695; SSE2-NEXT: retq3696;3697; SSE41-LABEL: uitofp_load_4i16_to_4f64:3698; SSE41: # %bb.0:3699; SSE41-NEXT: pmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero3700; SSE41-NEXT: cvtdq2pd %xmm1, %xmm03701; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]3702; SSE41-NEXT: cvtdq2pd %xmm1, %xmm13703; SSE41-NEXT: retq3704;3705; AVX-LABEL: uitofp_load_4i16_to_4f64:3706; AVX: # %bb.0:3707; AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero3708; AVX-NEXT: vcvtdq2pd %xmm0, %ymm03709; AVX-NEXT: retq3710 %ld = load <4 x i16>, ptr%a3711 %cvt = uitofp <4 x i16> %ld to <4 x double>3712 ret <4 x double> %cvt3713}3714 3715define <4 x double> @uitofp_load_4i8_to_4f64(ptr%a) {3716; SSE2-LABEL: uitofp_load_4i8_to_4f64:3717; SSE2: # %bb.0:3718; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero3719; SSE2-NEXT: pxor %xmm0, %xmm03720; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]3721; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]3722; SSE2-NEXT: cvtdq2pd %xmm1, %xmm03723; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]3724; SSE2-NEXT: cvtdq2pd %xmm1, %xmm13725; SSE2-NEXT: retq3726;3727; SSE41-LABEL: uitofp_load_4i8_to_4f64:3728; SSE41: # %bb.0:3729; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero3730; SSE41-NEXT: cvtdq2pd %xmm1, %xmm03731; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]3732; SSE41-NEXT: cvtdq2pd %xmm1, %xmm13733; SSE41-NEXT: retq3734;3735; AVX-LABEL: uitofp_load_4i8_to_4f64:3736; AVX: # %bb.0:3737; AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero3738; AVX-NEXT: vcvtdq2pd %xmm0, %ymm03739; AVX-NEXT: retq3740 %ld = load <4 x i8>, ptr%a3741 %cvt = uitofp <4 x i8> %ld to <4 x double>3742 ret <4 x double> %cvt3743}3744 3745;3746; Load Signed Integer to Float3747;3748 3749define <4 x float> @sitofp_load_4i64_to_4f32(ptr%a) {3750; SSE2-LABEL: sitofp_load_4i64_to_4f32:3751; SSE2: # %bb.0:3752; SSE2-NEXT: cvtsi2ssq 24(%rdi), %xmm03753; SSE2-NEXT: cvtsi2ssq 16(%rdi), %xmm13754; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]3755; SSE2-NEXT: cvtsi2ssq 8(%rdi), %xmm23756; SSE2-NEXT: xorps %xmm0, %xmm03757; SSE2-NEXT: cvtsi2ssq (%rdi), %xmm03758; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]3759; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]3760; SSE2-NEXT: retq3761;3762; SSE41-LABEL: sitofp_load_4i64_to_4f32:3763; SSE41: # %bb.0:3764; SSE41-NEXT: cvtsi2ssq 8(%rdi), %xmm13765; SSE41-NEXT: cvtsi2ssq (%rdi), %xmm03766; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]3767; SSE41-NEXT: xorps %xmm1, %xmm13768; SSE41-NEXT: cvtsi2ssq 16(%rdi), %xmm13769; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]3770; SSE41-NEXT: xorps %xmm1, %xmm13771; SSE41-NEXT: cvtsi2ssq 24(%rdi), %xmm13772; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]3773; SSE41-NEXT: retq3774;3775; VEX-LABEL: sitofp_load_4i64_to_4f32:3776; VEX: # %bb.0:3777; VEX-NEXT: vcvtsi2ssq 8(%rdi), %xmm15, %xmm03778; VEX-NEXT: vcvtsi2ssq (%rdi), %xmm15, %xmm13779; VEX-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]3780; VEX-NEXT: vcvtsi2ssq 16(%rdi), %xmm15, %xmm13781; VEX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]3782; VEX-NEXT: vcvtsi2ssq 24(%rdi), %xmm15, %xmm13783; VEX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]3784; VEX-NEXT: retq3785;3786; AVX512F-LABEL: sitofp_load_4i64_to_4f32:3787; AVX512F: # %bb.0:3788; AVX512F-NEXT: vcvtsi2ssq 8(%rdi), %xmm15, %xmm03789; AVX512F-NEXT: vcvtsi2ssq (%rdi), %xmm15, %xmm13790; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]3791; AVX512F-NEXT: vcvtsi2ssq 16(%rdi), %xmm15, %xmm13792; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]3793; AVX512F-NEXT: vcvtsi2ssq 24(%rdi), %xmm15, %xmm13794; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]3795; AVX512F-NEXT: retq3796;3797; AVX512VL-LABEL: sitofp_load_4i64_to_4f32:3798; AVX512VL: # %bb.0:3799; AVX512VL-NEXT: vcvtsi2ssq 8(%rdi), %xmm15, %xmm03800; AVX512VL-NEXT: vcvtsi2ssq (%rdi), %xmm15, %xmm13801; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]3802; AVX512VL-NEXT: vcvtsi2ssq 16(%rdi), %xmm15, %xmm13803; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]3804; AVX512VL-NEXT: vcvtsi2ssq 24(%rdi), %xmm15, %xmm13805; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]3806; AVX512VL-NEXT: retq3807;3808; AVX512DQ-LABEL: sitofp_load_4i64_to_4f32:3809; AVX512DQ: # %bb.0:3810; AVX512DQ-NEXT: vmovaps (%rdi), %ymm03811; AVX512DQ-NEXT: vcvtqq2ps %zmm0, %ymm03812; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm03813; AVX512DQ-NEXT: vzeroupper3814; AVX512DQ-NEXT: retq3815;3816; AVX512VLDQ-LABEL: sitofp_load_4i64_to_4f32:3817; AVX512VLDQ: # %bb.0:3818; AVX512VLDQ-NEXT: vcvtqq2psy (%rdi), %xmm03819; AVX512VLDQ-NEXT: retq3820 %ld = load <4 x i64>, ptr%a3821 %cvt = sitofp <4 x i64> %ld to <4 x float>3822 ret <4 x float> %cvt3823}3824 3825define <4 x float> @sitofp_load_4i32_to_4f32(ptr%a) {3826; SSE-LABEL: sitofp_load_4i32_to_4f32:3827; SSE: # %bb.0:3828; SSE-NEXT: cvtdq2ps (%rdi), %xmm03829; SSE-NEXT: retq3830;3831; AVX-LABEL: sitofp_load_4i32_to_4f32:3832; AVX: # %bb.0:3833; AVX-NEXT: vcvtdq2ps (%rdi), %xmm03834; AVX-NEXT: retq3835 %ld = load <4 x i32>, ptr%a3836 %cvt = sitofp <4 x i32> %ld to <4 x float>3837 ret <4 x float> %cvt3838}3839 3840define <4 x float> @sitofp_load_4i16_to_4f32(ptr%a) {3841; SSE2-LABEL: sitofp_load_4i16_to_4f32:3842; SSE2: # %bb.0:3843; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero3844; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]3845; SSE2-NEXT: psrad $16, %xmm03846; SSE2-NEXT: cvtdq2ps %xmm0, %xmm03847; SSE2-NEXT: retq3848;3849; SSE41-LABEL: sitofp_load_4i16_to_4f32:3850; SSE41: # %bb.0:3851; SSE41-NEXT: pmovsxwd (%rdi), %xmm03852; SSE41-NEXT: cvtdq2ps %xmm0, %xmm03853; SSE41-NEXT: retq3854;3855; AVX-LABEL: sitofp_load_4i16_to_4f32:3856; AVX: # %bb.0:3857; AVX-NEXT: vpmovsxwd (%rdi), %xmm03858; AVX-NEXT: vcvtdq2ps %xmm0, %xmm03859; AVX-NEXT: retq3860 %ld = load <4 x i16>, ptr%a3861 %cvt = sitofp <4 x i16> %ld to <4 x float>3862 ret <4 x float> %cvt3863}3864 3865define <4 x float> @sitofp_load_4i8_to_4f32(ptr%a) {3866; SSE2-LABEL: sitofp_load_4i8_to_4f32:3867; SSE2: # %bb.0:3868; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero3869; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]3870; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]3871; SSE2-NEXT: psrad $24, %xmm03872; SSE2-NEXT: cvtdq2ps %xmm0, %xmm03873; SSE2-NEXT: retq3874;3875; SSE41-LABEL: sitofp_load_4i8_to_4f32:3876; SSE41: # %bb.0:3877; SSE41-NEXT: pmovsxbd (%rdi), %xmm03878; SSE41-NEXT: cvtdq2ps %xmm0, %xmm03879; SSE41-NEXT: retq3880;3881; AVX-LABEL: sitofp_load_4i8_to_4f32:3882; AVX: # %bb.0:3883; AVX-NEXT: vpmovsxbd (%rdi), %xmm03884; AVX-NEXT: vcvtdq2ps %xmm0, %xmm03885; AVX-NEXT: retq3886 %ld = load <4 x i8>, ptr%a3887 %cvt = sitofp <4 x i8> %ld to <4 x float>3888 ret <4 x float> %cvt3889}3890 3891define <8 x float> @sitofp_load_8i64_to_8f32(ptr%a) {3892; SSE2-LABEL: sitofp_load_8i64_to_8f32:3893; SSE2: # %bb.0:3894; SSE2-NEXT: cvtsi2ssq 24(%rdi), %xmm03895; SSE2-NEXT: cvtsi2ssq 16(%rdi), %xmm13896; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]3897; SSE2-NEXT: cvtsi2ssq 8(%rdi), %xmm23898; SSE2-NEXT: xorps %xmm0, %xmm03899; SSE2-NEXT: cvtsi2ssq (%rdi), %xmm03900; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]3901; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]3902; SSE2-NEXT: xorps %xmm1, %xmm13903; SSE2-NEXT: cvtsi2ssq 56(%rdi), %xmm13904; SSE2-NEXT: xorps %xmm2, %xmm23905; SSE2-NEXT: cvtsi2ssq 48(%rdi), %xmm23906; SSE2-NEXT: unpcklps {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]3907; SSE2-NEXT: cvtsi2ssq 40(%rdi), %xmm33908; SSE2-NEXT: xorps %xmm1, %xmm13909; SSE2-NEXT: cvtsi2ssq 32(%rdi), %xmm13910; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]3911; SSE2-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]3912; SSE2-NEXT: retq3913;3914; SSE41-LABEL: sitofp_load_8i64_to_8f32:3915; SSE41: # %bb.0:3916; SSE41-NEXT: cvtsi2ssq 8(%rdi), %xmm13917; SSE41-NEXT: cvtsi2ssq (%rdi), %xmm03918; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]3919; SSE41-NEXT: xorps %xmm1, %xmm13920; SSE41-NEXT: cvtsi2ssq 16(%rdi), %xmm13921; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]3922; SSE41-NEXT: xorps %xmm1, %xmm13923; SSE41-NEXT: cvtsi2ssq 24(%rdi), %xmm13924; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]3925; SSE41-NEXT: cvtsi2ssq 40(%rdi), %xmm23926; SSE41-NEXT: xorps %xmm1, %xmm13927; SSE41-NEXT: cvtsi2ssq 32(%rdi), %xmm13928; SSE41-NEXT: insertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[2,3]3929; SSE41-NEXT: xorps %xmm2, %xmm23930; SSE41-NEXT: cvtsi2ssq 48(%rdi), %xmm23931; SSE41-NEXT: insertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]3932; SSE41-NEXT: xorps %xmm2, %xmm23933; SSE41-NEXT: cvtsi2ssq 56(%rdi), %xmm23934; SSE41-NEXT: insertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]3935; SSE41-NEXT: retq3936;3937; VEX-LABEL: sitofp_load_8i64_to_8f32:3938; VEX: # %bb.0:3939; VEX-NEXT: vcvtsi2ssq 40(%rdi), %xmm15, %xmm03940; VEX-NEXT: vcvtsi2ssq 32(%rdi), %xmm15, %xmm13941; VEX-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]3942; VEX-NEXT: vcvtsi2ssq 48(%rdi), %xmm15, %xmm13943; VEX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]3944; VEX-NEXT: vcvtsi2ssq 56(%rdi), %xmm15, %xmm13945; VEX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]3946; VEX-NEXT: vcvtsi2ssq 8(%rdi), %xmm15, %xmm13947; VEX-NEXT: vcvtsi2ssq (%rdi), %xmm15, %xmm23948; VEX-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]3949; VEX-NEXT: vcvtsi2ssq 16(%rdi), %xmm15, %xmm23950; VEX-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]3951; VEX-NEXT: vcvtsi2ssq 24(%rdi), %xmm15, %xmm23952; VEX-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]3953; VEX-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm03954; VEX-NEXT: retq3955;3956; AVX512F-LABEL: sitofp_load_8i64_to_8f32:3957; AVX512F: # %bb.0:3958; AVX512F-NEXT: vcvtsi2ssq 40(%rdi), %xmm15, %xmm03959; AVX512F-NEXT: vcvtsi2ssq 32(%rdi), %xmm15, %xmm13960; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]3961; AVX512F-NEXT: vcvtsi2ssq 48(%rdi), %xmm15, %xmm13962; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]3963; AVX512F-NEXT: vcvtsi2ssq 56(%rdi), %xmm15, %xmm13964; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]3965; AVX512F-NEXT: vcvtsi2ssq 8(%rdi), %xmm15, %xmm13966; AVX512F-NEXT: vcvtsi2ssq (%rdi), %xmm15, %xmm23967; AVX512F-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]3968; AVX512F-NEXT: vcvtsi2ssq 16(%rdi), %xmm15, %xmm23969; AVX512F-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]3970; AVX512F-NEXT: vcvtsi2ssq 24(%rdi), %xmm15, %xmm23971; AVX512F-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]3972; AVX512F-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm03973; AVX512F-NEXT: retq3974;3975; AVX512VL-LABEL: sitofp_load_8i64_to_8f32:3976; AVX512VL: # %bb.0:3977; AVX512VL-NEXT: vcvtsi2ssq 40(%rdi), %xmm15, %xmm03978; AVX512VL-NEXT: vcvtsi2ssq 32(%rdi), %xmm15, %xmm13979; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]3980; AVX512VL-NEXT: vcvtsi2ssq 48(%rdi), %xmm15, %xmm13981; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]3982; AVX512VL-NEXT: vcvtsi2ssq 56(%rdi), %xmm15, %xmm13983; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]3984; AVX512VL-NEXT: vcvtsi2ssq 8(%rdi), %xmm15, %xmm13985; AVX512VL-NEXT: vcvtsi2ssq (%rdi), %xmm15, %xmm23986; AVX512VL-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]3987; AVX512VL-NEXT: vcvtsi2ssq 16(%rdi), %xmm15, %xmm23988; AVX512VL-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]3989; AVX512VL-NEXT: vcvtsi2ssq 24(%rdi), %xmm15, %xmm23990; AVX512VL-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]3991; AVX512VL-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm03992; AVX512VL-NEXT: retq3993;3994; AVX512DQ-LABEL: sitofp_load_8i64_to_8f32:3995; AVX512DQ: # %bb.0:3996; AVX512DQ-NEXT: vcvtqq2ps (%rdi), %ymm03997; AVX512DQ-NEXT: retq3998;3999; AVX512VLDQ-LABEL: sitofp_load_8i64_to_8f32:4000; AVX512VLDQ: # %bb.0:4001; AVX512VLDQ-NEXT: vcvtqq2ps (%rdi), %ymm04002; AVX512VLDQ-NEXT: retq4003 %ld = load <8 x i64>, ptr%a4004 %cvt = sitofp <8 x i64> %ld to <8 x float>4005 ret <8 x float> %cvt4006}4007 4008define <8 x float> @sitofp_load_8i32_to_8f32(ptr%a) {4009; SSE-LABEL: sitofp_load_8i32_to_8f32:4010; SSE: # %bb.0:4011; SSE-NEXT: cvtdq2ps (%rdi), %xmm04012; SSE-NEXT: cvtdq2ps 16(%rdi), %xmm14013; SSE-NEXT: retq4014;4015; AVX-LABEL: sitofp_load_8i32_to_8f32:4016; AVX: # %bb.0:4017; AVX-NEXT: vcvtdq2ps (%rdi), %ymm04018; AVX-NEXT: retq4019 %ld = load <8 x i32>, ptr%a4020 %cvt = sitofp <8 x i32> %ld to <8 x float>4021 ret <8 x float> %cvt4022}4023 4024define <8 x float> @sitofp_load_8i16_to_8f32(ptr%a) {4025; SSE2-LABEL: sitofp_load_8i16_to_8f32:4026; SSE2: # %bb.0:4027; SSE2-NEXT: movdqa (%rdi), %xmm14028; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]4029; SSE2-NEXT: psrad $16, %xmm04030; SSE2-NEXT: cvtdq2ps %xmm0, %xmm04031; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]4032; SSE2-NEXT: psrad $16, %xmm14033; SSE2-NEXT: cvtdq2ps %xmm1, %xmm14034; SSE2-NEXT: retq4035;4036; SSE41-LABEL: sitofp_load_8i16_to_8f32:4037; SSE41: # %bb.0:4038; SSE41-NEXT: pmovsxwd 8(%rdi), %xmm14039; SSE41-NEXT: pmovsxwd (%rdi), %xmm04040; SSE41-NEXT: cvtdq2ps %xmm0, %xmm04041; SSE41-NEXT: cvtdq2ps %xmm1, %xmm14042; SSE41-NEXT: retq4043;4044; AVX1-LABEL: sitofp_load_8i16_to_8f32:4045; AVX1: # %bb.0:4046; AVX1-NEXT: vpmovsxwd 8(%rdi), %xmm04047; AVX1-NEXT: vpmovsxwd (%rdi), %xmm14048; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm04049; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm04050; AVX1-NEXT: retq4051;4052; AVX2-LABEL: sitofp_load_8i16_to_8f32:4053; AVX2: # %bb.0:4054; AVX2-NEXT: vpmovsxwd (%rdi), %ymm04055; AVX2-NEXT: vcvtdq2ps %ymm0, %ymm04056; AVX2-NEXT: retq4057;4058; AVX512-LABEL: sitofp_load_8i16_to_8f32:4059; AVX512: # %bb.0:4060; AVX512-NEXT: vpmovsxwd (%rdi), %ymm04061; AVX512-NEXT: vcvtdq2ps %ymm0, %ymm04062; AVX512-NEXT: retq4063 %ld = load <8 x i16>, ptr%a4064 %cvt = sitofp <8 x i16> %ld to <8 x float>4065 ret <8 x float> %cvt4066}4067 4068define <8 x float> @sitofp_load_8i8_to_8f32(ptr%a) {4069; SSE2-LABEL: sitofp_load_8i8_to_8f32:4070; SSE2: # %bb.0:4071; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero4072; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]4073; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]4074; SSE2-NEXT: psrad $24, %xmm04075; SSE2-NEXT: cvtdq2ps %xmm0, %xmm04076; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]4077; SSE2-NEXT: psrad $24, %xmm14078; SSE2-NEXT: cvtdq2ps %xmm1, %xmm14079; SSE2-NEXT: retq4080;4081; SSE41-LABEL: sitofp_load_8i8_to_8f32:4082; SSE41: # %bb.0:4083; SSE41-NEXT: pmovsxbd 4(%rdi), %xmm14084; SSE41-NEXT: pmovsxbd (%rdi), %xmm04085; SSE41-NEXT: cvtdq2ps %xmm0, %xmm04086; SSE41-NEXT: cvtdq2ps %xmm1, %xmm14087; SSE41-NEXT: retq4088;4089; AVX1-LABEL: sitofp_load_8i8_to_8f32:4090; AVX1: # %bb.0:4091; AVX1-NEXT: vpmovsxbd 4(%rdi), %xmm04092; AVX1-NEXT: vpmovsxbd (%rdi), %xmm14093; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm04094; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm04095; AVX1-NEXT: retq4096;4097; AVX2-LABEL: sitofp_load_8i8_to_8f32:4098; AVX2: # %bb.0:4099; AVX2-NEXT: vpmovsxbd (%rdi), %ymm04100; AVX2-NEXT: vcvtdq2ps %ymm0, %ymm04101; AVX2-NEXT: retq4102;4103; AVX512-LABEL: sitofp_load_8i8_to_8f32:4104; AVX512: # %bb.0:4105; AVX512-NEXT: vpmovsxbd (%rdi), %ymm04106; AVX512-NEXT: vcvtdq2ps %ymm0, %ymm04107; AVX512-NEXT: retq4108 %ld = load <8 x i8>, ptr%a4109 %cvt = sitofp <8 x i8> %ld to <8 x float>4110 ret <8 x float> %cvt4111}4112 4113;4114; Load Unsigned Integer to Float4115;4116 4117define <4 x float> @uitofp_load_4i64_to_4f32(ptr%a) {4118; SSE2-LABEL: uitofp_load_4i64_to_4f32:4119; SSE2: # %bb.0:4120; SSE2-NEXT: movq 24(%rdi), %rax4121; SSE2-NEXT: testq %rax, %rax4122; SSE2-NEXT: js .LBB83_14123; SSE2-NEXT: # %bb.2:4124; SSE2-NEXT: cvtsi2ss %rax, %xmm04125; SSE2-NEXT: jmp .LBB83_34126; SSE2-NEXT: .LBB83_1:4127; SSE2-NEXT: movq %rax, %rcx4128; SSE2-NEXT: shrq %rcx4129; SSE2-NEXT: andl $1, %eax4130; SSE2-NEXT: orq %rcx, %rax4131; SSE2-NEXT: cvtsi2ss %rax, %xmm04132; SSE2-NEXT: addss %xmm0, %xmm04133; SSE2-NEXT: .LBB83_3:4134; SSE2-NEXT: movq 16(%rdi), %rax4135; SSE2-NEXT: testq %rax, %rax4136; SSE2-NEXT: js .LBB83_44137; SSE2-NEXT: # %bb.5:4138; SSE2-NEXT: cvtsi2ss %rax, %xmm14139; SSE2-NEXT: jmp .LBB83_64140; SSE2-NEXT: .LBB83_4:4141; SSE2-NEXT: movq %rax, %rcx4142; SSE2-NEXT: shrq %rcx4143; SSE2-NEXT: andl $1, %eax4144; SSE2-NEXT: orq %rcx, %rax4145; SSE2-NEXT: cvtsi2ss %rax, %xmm14146; SSE2-NEXT: addss %xmm1, %xmm14147; SSE2-NEXT: .LBB83_6:4148; SSE2-NEXT: movq (%rdi), %rax4149; SSE2-NEXT: movq 8(%rdi), %rcx4150; SSE2-NEXT: testq %rcx, %rcx4151; SSE2-NEXT: js .LBB83_74152; SSE2-NEXT: # %bb.8:4153; SSE2-NEXT: cvtsi2ss %rcx, %xmm24154; SSE2-NEXT: jmp .LBB83_94155; SSE2-NEXT: .LBB83_7:4156; SSE2-NEXT: movq %rcx, %rdx4157; SSE2-NEXT: shrq %rdx4158; SSE2-NEXT: andl $1, %ecx4159; SSE2-NEXT: orq %rdx, %rcx4160; SSE2-NEXT: cvtsi2ss %rcx, %xmm24161; SSE2-NEXT: addss %xmm2, %xmm24162; SSE2-NEXT: .LBB83_9:4163; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]4164; SSE2-NEXT: testq %rax, %rax4165; SSE2-NEXT: js .LBB83_104166; SSE2-NEXT: # %bb.11:4167; SSE2-NEXT: xorps %xmm0, %xmm04168; SSE2-NEXT: cvtsi2ss %rax, %xmm04169; SSE2-NEXT: jmp .LBB83_124170; SSE2-NEXT: .LBB83_10:4171; SSE2-NEXT: movq %rax, %rcx4172; SSE2-NEXT: shrq %rcx4173; SSE2-NEXT: andl $1, %eax4174; SSE2-NEXT: orq %rcx, %rax4175; SSE2-NEXT: xorps %xmm0, %xmm04176; SSE2-NEXT: cvtsi2ss %rax, %xmm04177; SSE2-NEXT: addss %xmm0, %xmm04178; SSE2-NEXT: .LBB83_12:4179; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]4180; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]4181; SSE2-NEXT: retq4182;4183; SSE41-LABEL: uitofp_load_4i64_to_4f32:4184; SSE41: # %bb.0:4185; SSE41-NEXT: movdqa (%rdi), %xmm14186; SSE41-NEXT: movdqa 16(%rdi), %xmm24187; SSE41-NEXT: pmovsxbq {{.*#+}} xmm4 = [1,1]4188; SSE41-NEXT: movdqa %xmm1, %xmm04189; SSE41-NEXT: pand %xmm4, %xmm04190; SSE41-NEXT: movdqa %xmm1, %xmm34191; SSE41-NEXT: psrlq $1, %xmm34192; SSE41-NEXT: por %xmm0, %xmm34193; SSE41-NEXT: movdqa %xmm1, %xmm54194; SSE41-NEXT: movdqa %xmm1, %xmm04195; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm54196; SSE41-NEXT: pextrq $1, %xmm5, %rax4197; SSE41-NEXT: xorps %xmm0, %xmm04198; SSE41-NEXT: cvtsi2ss %rax, %xmm04199; SSE41-NEXT: movq %xmm5, %rax4200; SSE41-NEXT: xorps %xmm3, %xmm34201; SSE41-NEXT: cvtsi2ss %rax, %xmm34202; SSE41-NEXT: insertps {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[2,3]4203; SSE41-NEXT: pand %xmm2, %xmm44204; SSE41-NEXT: movdqa %xmm2, %xmm54205; SSE41-NEXT: psrlq $1, %xmm54206; SSE41-NEXT: por %xmm4, %xmm54207; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm2[1,3]4208; SSE41-NEXT: movaps %xmm2, %xmm04209; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm24210; SSE41-NEXT: movq %xmm2, %rax4211; SSE41-NEXT: xorps %xmm0, %xmm04212; SSE41-NEXT: cvtsi2ss %rax, %xmm04213; SSE41-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1],xmm0[0],xmm3[3]4214; SSE41-NEXT: pextrq $1, %xmm2, %rax4215; SSE41-NEXT: xorps %xmm0, %xmm04216; SSE41-NEXT: cvtsi2ss %rax, %xmm04217; SSE41-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1,2],xmm0[0]4218; SSE41-NEXT: movaps %xmm3, %xmm24219; SSE41-NEXT: addps %xmm3, %xmm24220; SSE41-NEXT: movaps %xmm1, %xmm04221; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm34222; SSE41-NEXT: movaps %xmm3, %xmm04223; SSE41-NEXT: retq4224;4225; AVX1-LABEL: uitofp_load_4i64_to_4f32:4226; AVX1: # %bb.0:4227; AVX1-NEXT: vmovdqa (%rdi), %ymm04228; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm14229; AVX1-NEXT: vmovdqa 16(%rdi), %xmm24230; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm34231; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm14232; AVX1-NEXT: vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm34233; AVX1-NEXT: vorpd %ymm3, %ymm1, %ymm14234; AVX1-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm14235; AVX1-NEXT: vpextrq $1, %xmm1, %rax4236; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm34237; AVX1-NEXT: vmovq %xmm1, %rax4238; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm44239; AVX1-NEXT: vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]4240; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm14241; AVX1-NEXT: vmovq %xmm1, %rax4242; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm44243; AVX1-NEXT: vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]4244; AVX1-NEXT: vpextrq $1, %xmm1, %rax4245; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm14246; AVX1-NEXT: vinsertps {{.*#+}} xmm1 = xmm3[0,1,2],xmm1[0]4247; AVX1-NEXT: vaddps %xmm1, %xmm1, %xmm34248; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm04249; AVX1-NEXT: vblendvps %xmm0, %xmm3, %xmm1, %xmm04250; AVX1-NEXT: vzeroupper4251; AVX1-NEXT: retq4252;4253; AVX2-LABEL: uitofp_load_4i64_to_4f32:4254; AVX2: # %bb.0:4255; AVX2-NEXT: vmovdqa (%rdi), %ymm04256; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]4257; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm14258; AVX2-NEXT: vpsrlq $1, %ymm0, %ymm24259; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm14260; AVX2-NEXT: vblendvpd %ymm0, %ymm1, %ymm0, %ymm14261; AVX2-NEXT: vpextrq $1, %xmm1, %rax4262; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm24263; AVX2-NEXT: vmovq %xmm1, %rax4264; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm34265; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[2,3]4266; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm14267; AVX2-NEXT: vmovq %xmm1, %rax4268; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm34269; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0],xmm2[3]4270; AVX2-NEXT: vpextrq $1, %xmm1, %rax4271; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm14272; AVX2-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0,1,2],xmm1[0]4273; AVX2-NEXT: vaddps %xmm1, %xmm1, %xmm24274; AVX2-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm04275; AVX2-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm04276; AVX2-NEXT: vzeroupper4277; AVX2-NEXT: retq4278;4279; AVX512F-LABEL: uitofp_load_4i64_to_4f32:4280; AVX512F: # %bb.0:4281; AVX512F-NEXT: vcvtusi2ssq 8(%rdi), %xmm15, %xmm04282; AVX512F-NEXT: vcvtusi2ssq (%rdi), %xmm15, %xmm14283; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]4284; AVX512F-NEXT: vcvtusi2ssq 16(%rdi), %xmm15, %xmm14285; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]4286; AVX512F-NEXT: vcvtusi2ssq 24(%rdi), %xmm15, %xmm14287; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]4288; AVX512F-NEXT: retq4289;4290; AVX512VL-LABEL: uitofp_load_4i64_to_4f32:4291; AVX512VL: # %bb.0:4292; AVX512VL-NEXT: vcvtusi2ssq 8(%rdi), %xmm15, %xmm04293; AVX512VL-NEXT: vcvtusi2ssq (%rdi), %xmm15, %xmm14294; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]4295; AVX512VL-NEXT: vcvtusi2ssq 16(%rdi), %xmm15, %xmm14296; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]4297; AVX512VL-NEXT: vcvtusi2ssq 24(%rdi), %xmm15, %xmm14298; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]4299; AVX512VL-NEXT: retq4300;4301; AVX512DQ-LABEL: uitofp_load_4i64_to_4f32:4302; AVX512DQ: # %bb.0:4303; AVX512DQ-NEXT: vmovaps (%rdi), %ymm04304; AVX512DQ-NEXT: vcvtuqq2ps %zmm0, %ymm04305; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm04306; AVX512DQ-NEXT: vzeroupper4307; AVX512DQ-NEXT: retq4308;4309; AVX512VLDQ-LABEL: uitofp_load_4i64_to_4f32:4310; AVX512VLDQ: # %bb.0:4311; AVX512VLDQ-NEXT: vcvtuqq2psy (%rdi), %xmm04312; AVX512VLDQ-NEXT: retq4313 %ld = load <4 x i64>, ptr%a4314 %cvt = uitofp <4 x i64> %ld to <4 x float>4315 ret <4 x float> %cvt4316}4317 4318define <4 x float> @uitofp_load_4i32_to_4f32(ptr%a) {4319; SSE2-LABEL: uitofp_load_4i32_to_4f32:4320; SSE2: # %bb.0:4321; SSE2-NEXT: movdqa (%rdi), %xmm04322; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]4323; SSE2-NEXT: pand %xmm0, %xmm14324; SSE2-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm14325; SSE2-NEXT: psrld $16, %xmm04326; SSE2-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm04327; SSE2-NEXT: subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm04328; SSE2-NEXT: addps %xmm1, %xmm04329; SSE2-NEXT: retq4330;4331; SSE41-LABEL: uitofp_load_4i32_to_4f32:4332; SSE41: # %bb.0:4333; SSE41-NEXT: movdqa (%rdi), %xmm04334; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [1258291200,1258291200,1258291200,1258291200]4335; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]4336; SSE41-NEXT: psrld $16, %xmm04337; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]4338; SSE41-NEXT: subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm04339; SSE41-NEXT: addps %xmm1, %xmm04340; SSE41-NEXT: retq4341;4342; AVX1-LABEL: uitofp_load_4i32_to_4f32:4343; AVX1: # %bb.0:4344; AVX1-NEXT: vmovdqa (%rdi), %xmm04345; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]4346; AVX1-NEXT: vpsrld $16, %xmm0, %xmm04347; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],mem[1],xmm0[2],mem[3],xmm0[4],mem[5],xmm0[6],mem[7]4348; AVX1-NEXT: vsubps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm04349; AVX1-NEXT: vaddps %xmm0, %xmm1, %xmm04350; AVX1-NEXT: retq4351;4352; AVX2-LABEL: uitofp_load_4i32_to_4f32:4353; AVX2: # %bb.0:4354; AVX2-NEXT: vmovdqa (%rdi), %xmm04355; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1258291200,1258291200,1258291200,1258291200]4356; AVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]4357; AVX2-NEXT: vpsrld $16, %xmm0, %xmm04358; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [1392508928,1392508928,1392508928,1392508928]4359; AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]4360; AVX2-NEXT: vbroadcastss {{.*#+}} xmm2 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]4361; AVX2-NEXT: vsubps %xmm2, %xmm0, %xmm04362; AVX2-NEXT: vaddps %xmm0, %xmm1, %xmm04363; AVX2-NEXT: retq4364;4365; AVX512F-LABEL: uitofp_load_4i32_to_4f32:4366; AVX512F: # %bb.0:4367; AVX512F-NEXT: vmovaps (%rdi), %xmm04368; AVX512F-NEXT: vcvtudq2ps %zmm0, %zmm04369; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm04370; AVX512F-NEXT: vzeroupper4371; AVX512F-NEXT: retq4372;4373; AVX512VL-LABEL: uitofp_load_4i32_to_4f32:4374; AVX512VL: # %bb.0:4375; AVX512VL-NEXT: vcvtudq2ps (%rdi), %xmm04376; AVX512VL-NEXT: retq4377;4378; AVX512DQ-LABEL: uitofp_load_4i32_to_4f32:4379; AVX512DQ: # %bb.0:4380; AVX512DQ-NEXT: vmovaps (%rdi), %xmm04381; AVX512DQ-NEXT: vcvtudq2ps %zmm0, %zmm04382; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm04383; AVX512DQ-NEXT: vzeroupper4384; AVX512DQ-NEXT: retq4385;4386; AVX512VLDQ-LABEL: uitofp_load_4i32_to_4f32:4387; AVX512VLDQ: # %bb.0:4388; AVX512VLDQ-NEXT: vcvtudq2ps (%rdi), %xmm04389; AVX512VLDQ-NEXT: retq4390 %ld = load <4 x i32>, ptr%a4391 %cvt = uitofp <4 x i32> %ld to <4 x float>4392 ret <4 x float> %cvt4393}4394 4395define <4 x float> @uitofp_load_4i16_to_4f32(ptr%a) {4396; SSE2-LABEL: uitofp_load_4i16_to_4f32:4397; SSE2: # %bb.0:4398; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero4399; SSE2-NEXT: pxor %xmm1, %xmm14400; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]4401; SSE2-NEXT: cvtdq2ps %xmm0, %xmm04402; SSE2-NEXT: retq4403;4404; SSE41-LABEL: uitofp_load_4i16_to_4f32:4405; SSE41: # %bb.0:4406; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero4407; SSE41-NEXT: cvtdq2ps %xmm0, %xmm04408; SSE41-NEXT: retq4409;4410; AVX-LABEL: uitofp_load_4i16_to_4f32:4411; AVX: # %bb.0:4412; AVX-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero4413; AVX-NEXT: vcvtdq2ps %xmm0, %xmm04414; AVX-NEXT: retq4415 %ld = load <4 x i16>, ptr%a4416 %cvt = uitofp <4 x i16> %ld to <4 x float>4417 ret <4 x float> %cvt4418}4419 4420define <4 x float> @uitofp_load_4i8_to_4f32(ptr%a) {4421; SSE2-LABEL: uitofp_load_4i8_to_4f32:4422; SSE2: # %bb.0:4423; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero4424; SSE2-NEXT: pxor %xmm1, %xmm14425; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]4426; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]4427; SSE2-NEXT: cvtdq2ps %xmm0, %xmm04428; SSE2-NEXT: retq4429;4430; SSE41-LABEL: uitofp_load_4i8_to_4f32:4431; SSE41: # %bb.0:4432; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero4433; SSE41-NEXT: cvtdq2ps %xmm0, %xmm04434; SSE41-NEXT: retq4435;4436; AVX-LABEL: uitofp_load_4i8_to_4f32:4437; AVX: # %bb.0:4438; AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero4439; AVX-NEXT: vcvtdq2ps %xmm0, %xmm04440; AVX-NEXT: retq4441 %ld = load <4 x i8>, ptr%a4442 %cvt = uitofp <4 x i8> %ld to <4 x float>4443 ret <4 x float> %cvt4444}4445 4446define <8 x float> @uitofp_load_8i64_to_8f32(ptr%a) {4447; SSE2-LABEL: uitofp_load_8i64_to_8f32:4448; SSE2: # %bb.0:4449; SSE2-NEXT: movq 24(%rdi), %rax4450; SSE2-NEXT: testq %rax, %rax4451; SSE2-NEXT: js .LBB87_14452; SSE2-NEXT: # %bb.2:4453; SSE2-NEXT: cvtsi2ss %rax, %xmm24454; SSE2-NEXT: jmp .LBB87_34455; SSE2-NEXT: .LBB87_1:4456; SSE2-NEXT: movq %rax, %rcx4457; SSE2-NEXT: shrq %rcx4458; SSE2-NEXT: andl $1, %eax4459; SSE2-NEXT: orq %rcx, %rax4460; SSE2-NEXT: cvtsi2ss %rax, %xmm24461; SSE2-NEXT: addss %xmm2, %xmm24462; SSE2-NEXT: .LBB87_3:4463; SSE2-NEXT: movq 16(%rdi), %rax4464; SSE2-NEXT: testq %rax, %rax4465; SSE2-NEXT: js .LBB87_44466; SSE2-NEXT: # %bb.5:4467; SSE2-NEXT: cvtsi2ss %rax, %xmm14468; SSE2-NEXT: jmp .LBB87_64469; SSE2-NEXT: .LBB87_4:4470; SSE2-NEXT: movq %rax, %rcx4471; SSE2-NEXT: shrq %rcx4472; SSE2-NEXT: andl $1, %eax4473; SSE2-NEXT: orq %rcx, %rax4474; SSE2-NEXT: cvtsi2ss %rax, %xmm14475; SSE2-NEXT: addss %xmm1, %xmm14476; SSE2-NEXT: .LBB87_6:4477; SSE2-NEXT: movq (%rdi), %rax4478; SSE2-NEXT: movq 8(%rdi), %rcx4479; SSE2-NEXT: testq %rcx, %rcx4480; SSE2-NEXT: js .LBB87_74481; SSE2-NEXT: # %bb.8:4482; SSE2-NEXT: cvtsi2ss %rcx, %xmm34483; SSE2-NEXT: testq %rax, %rax4484; SSE2-NEXT: jns .LBB87_114485; SSE2-NEXT: .LBB87_10:4486; SSE2-NEXT: movq %rax, %rcx4487; SSE2-NEXT: shrq %rcx4488; SSE2-NEXT: andl $1, %eax4489; SSE2-NEXT: orq %rcx, %rax4490; SSE2-NEXT: cvtsi2ss %rax, %xmm04491; SSE2-NEXT: addss %xmm0, %xmm04492; SSE2-NEXT: jmp .LBB87_124493; SSE2-NEXT: .LBB87_7:4494; SSE2-NEXT: movq %rcx, %rdx4495; SSE2-NEXT: shrq %rdx4496; SSE2-NEXT: andl $1, %ecx4497; SSE2-NEXT: orq %rdx, %rcx4498; SSE2-NEXT: cvtsi2ss %rcx, %xmm34499; SSE2-NEXT: addss %xmm3, %xmm34500; SSE2-NEXT: testq %rax, %rax4501; SSE2-NEXT: js .LBB87_104502; SSE2-NEXT: .LBB87_11:4503; SSE2-NEXT: cvtsi2ss %rax, %xmm04504; SSE2-NEXT: .LBB87_12:4505; SSE2-NEXT: movq 56(%rdi), %rax4506; SSE2-NEXT: testq %rax, %rax4507; SSE2-NEXT: js .LBB87_134508; SSE2-NEXT: # %bb.14:4509; SSE2-NEXT: cvtsi2ss %rax, %xmm54510; SSE2-NEXT: jmp .LBB87_154511; SSE2-NEXT: .LBB87_13:4512; SSE2-NEXT: movq %rax, %rcx4513; SSE2-NEXT: shrq %rcx4514; SSE2-NEXT: andl $1, %eax4515; SSE2-NEXT: orq %rcx, %rax4516; SSE2-NEXT: cvtsi2ss %rax, %xmm54517; SSE2-NEXT: addss %xmm5, %xmm54518; SSE2-NEXT: .LBB87_15:4519; SSE2-NEXT: movq 48(%rdi), %rax4520; SSE2-NEXT: testq %rax, %rax4521; SSE2-NEXT: js .LBB87_164522; SSE2-NEXT: # %bb.17:4523; SSE2-NEXT: cvtsi2ss %rax, %xmm44524; SSE2-NEXT: jmp .LBB87_184525; SSE2-NEXT: .LBB87_16:4526; SSE2-NEXT: movq %rax, %rcx4527; SSE2-NEXT: shrq %rcx4528; SSE2-NEXT: andl $1, %eax4529; SSE2-NEXT: orq %rcx, %rax4530; SSE2-NEXT: cvtsi2ss %rax, %xmm44531; SSE2-NEXT: addss %xmm4, %xmm44532; SSE2-NEXT: .LBB87_18:4533; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]4534; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]4535; SSE2-NEXT: movq 40(%rdi), %rax4536; SSE2-NEXT: testq %rax, %rax4537; SSE2-NEXT: js .LBB87_194538; SSE2-NEXT: # %bb.20:4539; SSE2-NEXT: xorps %xmm2, %xmm24540; SSE2-NEXT: cvtsi2ss %rax, %xmm24541; SSE2-NEXT: jmp .LBB87_214542; SSE2-NEXT: .LBB87_19:4543; SSE2-NEXT: movq %rax, %rcx4544; SSE2-NEXT: shrq %rcx4545; SSE2-NEXT: andl $1, %eax4546; SSE2-NEXT: orq %rcx, %rax4547; SSE2-NEXT: xorps %xmm2, %xmm24548; SSE2-NEXT: cvtsi2ss %rax, %xmm24549; SSE2-NEXT: addss %xmm2, %xmm24550; SSE2-NEXT: .LBB87_21:4551; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]4552; SSE2-NEXT: unpcklps {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]4553; SSE2-NEXT: movq 32(%rdi), %rax4554; SSE2-NEXT: testq %rax, %rax4555; SSE2-NEXT: js .LBB87_224556; SSE2-NEXT: # %bb.23:4557; SSE2-NEXT: xorps %xmm1, %xmm14558; SSE2-NEXT: cvtsi2ss %rax, %xmm14559; SSE2-NEXT: jmp .LBB87_244560; SSE2-NEXT: .LBB87_22:4561; SSE2-NEXT: movq %rax, %rcx4562; SSE2-NEXT: shrq %rcx4563; SSE2-NEXT: andl $1, %eax4564; SSE2-NEXT: orq %rcx, %rax4565; SSE2-NEXT: xorps %xmm1, %xmm14566; SSE2-NEXT: cvtsi2ss %rax, %xmm14567; SSE2-NEXT: addss %xmm1, %xmm14568; SSE2-NEXT: .LBB87_24:4569; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]4570; SSE2-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm4[0]4571; SSE2-NEXT: retq4572;4573; SSE41-LABEL: uitofp_load_8i64_to_8f32:4574; SSE41: # %bb.0:4575; SSE41-NEXT: movdqa (%rdi), %xmm44576; SSE41-NEXT: movdqa 16(%rdi), %xmm54577; SSE41-NEXT: movdqa 32(%rdi), %xmm64578; SSE41-NEXT: movdqa 48(%rdi), %xmm24579; SSE41-NEXT: pmovsxbq {{.*#+}} xmm7 = [1,1]4580; SSE41-NEXT: movdqa %xmm4, %xmm04581; SSE41-NEXT: pand %xmm7, %xmm04582; SSE41-NEXT: movdqa %xmm4, %xmm14583; SSE41-NEXT: psrlq $1, %xmm14584; SSE41-NEXT: por %xmm0, %xmm14585; SSE41-NEXT: movdqa %xmm4, %xmm34586; SSE41-NEXT: movdqa %xmm4, %xmm04587; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm34588; SSE41-NEXT: pextrq $1, %xmm3, %rax4589; SSE41-NEXT: xorps %xmm0, %xmm04590; SSE41-NEXT: cvtsi2ss %rax, %xmm04591; SSE41-NEXT: movq %xmm3, %rax4592; SSE41-NEXT: xorps %xmm3, %xmm34593; SSE41-NEXT: cvtsi2ss %rax, %xmm34594; SSE41-NEXT: insertps {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[2,3]4595; SSE41-NEXT: movdqa %xmm5, %xmm04596; SSE41-NEXT: pand %xmm7, %xmm04597; SSE41-NEXT: movdqa %xmm5, %xmm14598; SSE41-NEXT: psrlq $1, %xmm14599; SSE41-NEXT: por %xmm0, %xmm14600; SSE41-NEXT: shufps {{.*#+}} xmm4 = xmm4[1,3],xmm5[1,3]4601; SSE41-NEXT: movaps %xmm5, %xmm04602; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm54603; SSE41-NEXT: movq %xmm5, %rax4604; SSE41-NEXT: xorps %xmm0, %xmm04605; SSE41-NEXT: cvtsi2ss %rax, %xmm04606; SSE41-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1],xmm0[0],xmm3[3]4607; SSE41-NEXT: pextrq $1, %xmm5, %rax4608; SSE41-NEXT: xorps %xmm0, %xmm04609; SSE41-NEXT: cvtsi2ss %rax, %xmm04610; SSE41-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1,2],xmm0[0]4611; SSE41-NEXT: movaps %xmm3, %xmm14612; SSE41-NEXT: addps %xmm3, %xmm14613; SSE41-NEXT: movaps %xmm4, %xmm04614; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm34615; SSE41-NEXT: movdqa %xmm6, %xmm04616; SSE41-NEXT: pand %xmm7, %xmm04617; SSE41-NEXT: movdqa %xmm6, %xmm14618; SSE41-NEXT: psrlq $1, %xmm14619; SSE41-NEXT: por %xmm0, %xmm14620; SSE41-NEXT: movdqa %xmm6, %xmm44621; SSE41-NEXT: movdqa %xmm6, %xmm04622; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm44623; SSE41-NEXT: pextrq $1, %xmm4, %rax4624; SSE41-NEXT: xorps %xmm0, %xmm04625; SSE41-NEXT: cvtsi2ss %rax, %xmm04626; SSE41-NEXT: movq %xmm4, %rax4627; SSE41-NEXT: xorps %xmm1, %xmm14628; SSE41-NEXT: cvtsi2ss %rax, %xmm14629; SSE41-NEXT: insertps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[2,3]4630; SSE41-NEXT: pand %xmm2, %xmm74631; SSE41-NEXT: movdqa %xmm2, %xmm44632; SSE41-NEXT: psrlq $1, %xmm44633; SSE41-NEXT: por %xmm7, %xmm44634; SSE41-NEXT: shufps {{.*#+}} xmm6 = xmm6[1,3],xmm2[1,3]4635; SSE41-NEXT: movaps %xmm2, %xmm04636; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm24637; SSE41-NEXT: movq %xmm2, %rax4638; SSE41-NEXT: xorps %xmm0, %xmm04639; SSE41-NEXT: cvtsi2ss %rax, %xmm04640; SSE41-NEXT: insertps {{.*#+}} xmm1 = xmm1[0,1],xmm0[0],xmm1[3]4641; SSE41-NEXT: pextrq $1, %xmm2, %rax4642; SSE41-NEXT: xorps %xmm0, %xmm04643; SSE41-NEXT: cvtsi2ss %rax, %xmm04644; SSE41-NEXT: insertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm0[0]4645; SSE41-NEXT: movaps %xmm1, %xmm24646; SSE41-NEXT: addps %xmm1, %xmm24647; SSE41-NEXT: movaps %xmm6, %xmm04648; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm14649; SSE41-NEXT: movaps %xmm3, %xmm04650; SSE41-NEXT: retq4651;4652; AVX1-LABEL: uitofp_load_8i64_to_8f32:4653; AVX1: # %bb.0:4654; AVX1-NEXT: vmovaps (%rdi), %ymm04655; AVX1-NEXT: vmovaps 32(%rdi), %ymm14656; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm2 = [1,1,1,1]4657; AVX1-NEXT: vandps %ymm2, %ymm1, %ymm34658; AVX1-NEXT: vpsrlq $1, %xmm1, %xmm44659; AVX1-NEXT: vmovdqa 48(%rdi), %xmm54660; AVX1-NEXT: vpsrlq $1, %xmm5, %xmm64661; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm4, %ymm44662; AVX1-NEXT: vorps %ymm3, %ymm4, %ymm34663; AVX1-NEXT: vblendvpd %ymm1, %ymm3, %ymm1, %ymm34664; AVX1-NEXT: vpextrq $1, %xmm3, %rax4665; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm44666; AVX1-NEXT: vmovq %xmm3, %rax4667; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm64668; AVX1-NEXT: vinsertps {{.*#+}} xmm4 = xmm6[0],xmm4[0],xmm6[2,3]4669; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm34670; AVX1-NEXT: vmovq %xmm3, %rax4671; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm64672; AVX1-NEXT: vinsertps {{.*#+}} xmm4 = xmm4[0,1],xmm6[0],xmm4[3]4673; AVX1-NEXT: vpextrq $1, %xmm3, %rax4674; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm34675; AVX1-NEXT: vinsertps {{.*#+}} xmm3 = xmm4[0,1,2],xmm3[0]4676; AVX1-NEXT: vaddps %xmm3, %xmm3, %xmm44677; AVX1-NEXT: vpackssdw %xmm5, %xmm1, %xmm14678; AVX1-NEXT: vblendvps %xmm1, %xmm4, %xmm3, %xmm14679; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm24680; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm34681; AVX1-NEXT: vmovdqa 16(%rdi), %xmm44682; AVX1-NEXT: vpsrlq $1, %xmm4, %xmm54683; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm3, %ymm34684; AVX1-NEXT: vorps %ymm2, %ymm3, %ymm24685; AVX1-NEXT: vblendvpd %ymm0, %ymm2, %ymm0, %ymm24686; AVX1-NEXT: vpextrq $1, %xmm2, %rax4687; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm34688; AVX1-NEXT: vmovq %xmm2, %rax4689; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm54690; AVX1-NEXT: vinsertps {{.*#+}} xmm3 = xmm5[0],xmm3[0],xmm5[2,3]4691; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm24692; AVX1-NEXT: vmovq %xmm2, %rax4693; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm54694; AVX1-NEXT: vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm5[0],xmm3[3]4695; AVX1-NEXT: vpextrq $1, %xmm2, %rax4696; AVX1-NEXT: vcvtsi2ss %rax, %xmm15, %xmm24697; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm3[0,1,2],xmm2[0]4698; AVX1-NEXT: vaddps %xmm2, %xmm2, %xmm34699; AVX1-NEXT: vpackssdw %xmm4, %xmm0, %xmm04700; AVX1-NEXT: vblendvps %xmm0, %xmm3, %xmm2, %xmm04701; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm04702; AVX1-NEXT: retq4703;4704; AVX2-LABEL: uitofp_load_8i64_to_8f32:4705; AVX2: # %bb.0:4706; AVX2-NEXT: vmovaps (%rdi), %ymm04707; AVX2-NEXT: vmovdqa 32(%rdi), %ymm14708; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [1,1,1,1]4709; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm34710; AVX2-NEXT: vpsrlq $1, %ymm1, %ymm44711; AVX2-NEXT: vpor %ymm3, %ymm4, %ymm34712; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm1, %ymm34713; AVX2-NEXT: vpextrq $1, %xmm3, %rax4714; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm44715; AVX2-NEXT: vmovq %xmm3, %rax4716; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm54717; AVX2-NEXT: vinsertps {{.*#+}} xmm4 = xmm5[0],xmm4[0],xmm5[2,3]4718; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm34719; AVX2-NEXT: vmovq %xmm3, %rax4720; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm54721; AVX2-NEXT: vinsertps {{.*#+}} xmm4 = xmm4[0,1],xmm5[0],xmm4[3]4722; AVX2-NEXT: vpextrq $1, %xmm3, %rax4723; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm34724; AVX2-NEXT: vinsertps {{.*#+}} xmm3 = xmm4[0,1,2],xmm3[0]4725; AVX2-NEXT: vaddps %xmm3, %xmm3, %xmm44726; AVX2-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm14727; AVX2-NEXT: vblendvps %xmm1, %xmm4, %xmm3, %xmm14728; AVX2-NEXT: vandps %ymm2, %ymm0, %ymm24729; AVX2-NEXT: vpsrlq $1, %ymm0, %ymm34730; AVX2-NEXT: vpor %ymm2, %ymm3, %ymm24731; AVX2-NEXT: vblendvpd %ymm0, %ymm2, %ymm0, %ymm24732; AVX2-NEXT: vpextrq $1, %xmm2, %rax4733; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm34734; AVX2-NEXT: vmovq %xmm2, %rax4735; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm44736; AVX2-NEXT: vinsertps {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[2,3]4737; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm24738; AVX2-NEXT: vmovq %xmm2, %rax4739; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm44740; AVX2-NEXT: vinsertps {{.*#+}} xmm3 = xmm3[0,1],xmm4[0],xmm3[3]4741; AVX2-NEXT: vpextrq $1, %xmm2, %rax4742; AVX2-NEXT: vcvtsi2ss %rax, %xmm15, %xmm24743; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm3[0,1,2],xmm2[0]4744; AVX2-NEXT: vaddps %xmm2, %xmm2, %xmm34745; AVX2-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm04746; AVX2-NEXT: vblendvps %xmm0, %xmm3, %xmm2, %xmm04747; AVX2-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm04748; AVX2-NEXT: retq4749;4750; AVX512F-LABEL: uitofp_load_8i64_to_8f32:4751; AVX512F: # %bb.0:4752; AVX512F-NEXT: vcvtusi2ssq 40(%rdi), %xmm15, %xmm04753; AVX512F-NEXT: vcvtusi2ssq 32(%rdi), %xmm15, %xmm14754; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]4755; AVX512F-NEXT: vcvtusi2ssq 48(%rdi), %xmm15, %xmm14756; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]4757; AVX512F-NEXT: vcvtusi2ssq 56(%rdi), %xmm15, %xmm14758; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]4759; AVX512F-NEXT: vcvtusi2ssq 8(%rdi), %xmm15, %xmm14760; AVX512F-NEXT: vcvtusi2ssq (%rdi), %xmm15, %xmm24761; AVX512F-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]4762; AVX512F-NEXT: vcvtusi2ssq 16(%rdi), %xmm15, %xmm24763; AVX512F-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]4764; AVX512F-NEXT: vcvtusi2ssq 24(%rdi), %xmm15, %xmm24765; AVX512F-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]4766; AVX512F-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm04767; AVX512F-NEXT: retq4768;4769; AVX512VL-LABEL: uitofp_load_8i64_to_8f32:4770; AVX512VL: # %bb.0:4771; AVX512VL-NEXT: vcvtusi2ssq 40(%rdi), %xmm15, %xmm04772; AVX512VL-NEXT: vcvtusi2ssq 32(%rdi), %xmm15, %xmm14773; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[2,3]4774; AVX512VL-NEXT: vcvtusi2ssq 48(%rdi), %xmm15, %xmm14775; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]4776; AVX512VL-NEXT: vcvtusi2ssq 56(%rdi), %xmm15, %xmm14777; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]4778; AVX512VL-NEXT: vcvtusi2ssq 8(%rdi), %xmm15, %xmm14779; AVX512VL-NEXT: vcvtusi2ssq (%rdi), %xmm15, %xmm24780; AVX512VL-NEXT: vinsertps {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[2,3]4781; AVX512VL-NEXT: vcvtusi2ssq 16(%rdi), %xmm15, %xmm24782; AVX512VL-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0],xmm1[3]4783; AVX512VL-NEXT: vcvtusi2ssq 24(%rdi), %xmm15, %xmm24784; AVX512VL-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,1,2],xmm2[0]4785; AVX512VL-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm04786; AVX512VL-NEXT: retq4787;4788; AVX512DQ-LABEL: uitofp_load_8i64_to_8f32:4789; AVX512DQ: # %bb.0:4790; AVX512DQ-NEXT: vcvtuqq2ps (%rdi), %ymm04791; AVX512DQ-NEXT: retq4792;4793; AVX512VLDQ-LABEL: uitofp_load_8i64_to_8f32:4794; AVX512VLDQ: # %bb.0:4795; AVX512VLDQ-NEXT: vcvtuqq2ps (%rdi), %ymm04796; AVX512VLDQ-NEXT: retq4797 %ld = load <8 x i64>, ptr%a4798 %cvt = uitofp <8 x i64> %ld to <8 x float>4799 ret <8 x float> %cvt4800}4801 4802define <8 x float> @uitofp_load_8i32_to_8f32(ptr%a) {4803; SSE2-LABEL: uitofp_load_8i32_to_8f32:4804; SSE2: # %bb.0:4805; SSE2-NEXT: movdqa (%rdi), %xmm04806; SSE2-NEXT: movdqa 16(%rdi), %xmm14807; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]4808; SSE2-NEXT: movdqa %xmm0, %xmm34809; SSE2-NEXT: pand %xmm2, %xmm34810; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [1258291200,1258291200,1258291200,1258291200]4811; SSE2-NEXT: por %xmm4, %xmm34812; SSE2-NEXT: psrld $16, %xmm04813; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [1392508928,1392508928,1392508928,1392508928]4814; SSE2-NEXT: por %xmm5, %xmm04815; SSE2-NEXT: movaps {{.*#+}} xmm6 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]4816; SSE2-NEXT: subps %xmm6, %xmm04817; SSE2-NEXT: addps %xmm3, %xmm04818; SSE2-NEXT: pand %xmm1, %xmm24819; SSE2-NEXT: por %xmm4, %xmm24820; SSE2-NEXT: psrld $16, %xmm14821; SSE2-NEXT: por %xmm5, %xmm14822; SSE2-NEXT: subps %xmm6, %xmm14823; SSE2-NEXT: addps %xmm2, %xmm14824; SSE2-NEXT: retq4825;4826; SSE41-LABEL: uitofp_load_8i32_to_8f32:4827; SSE41: # %bb.0:4828; SSE41-NEXT: movdqa (%rdi), %xmm04829; SSE41-NEXT: movdqa 16(%rdi), %xmm14830; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [1258291200,1258291200,1258291200,1258291200]4831; SSE41-NEXT: movdqa %xmm0, %xmm34832; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1],xmm3[2],xmm2[3],xmm3[4],xmm2[5],xmm3[6],xmm2[7]4833; SSE41-NEXT: psrld $16, %xmm04834; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [1392508928,1392508928,1392508928,1392508928]4835; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1],xmm0[2],xmm4[3],xmm0[4],xmm4[5],xmm0[6],xmm4[7]4836; SSE41-NEXT: movaps {{.*#+}} xmm5 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]4837; SSE41-NEXT: subps %xmm5, %xmm04838; SSE41-NEXT: addps %xmm3, %xmm04839; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]4840; SSE41-NEXT: psrld $16, %xmm14841; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7]4842; SSE41-NEXT: subps %xmm5, %xmm14843; SSE41-NEXT: addps %xmm2, %xmm14844; SSE41-NEXT: retq4845;4846; AVX1-LABEL: uitofp_load_8i32_to_8f32:4847; AVX1: # %bb.0:4848; AVX1-NEXT: vmovdqa (%rdi), %ymm04849; AVX1-NEXT: vpsrld $16, %xmm0, %xmm14850; AVX1-NEXT: vmovdqa 16(%rdi), %xmm24851; AVX1-NEXT: vpsrld $16, %xmm2, %xmm24852; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm14853; AVX1-NEXT: vcvtdq2ps %ymm1, %ymm14854; AVX1-NEXT: vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm14855; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm04856; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm04857; AVX1-NEXT: vaddps %ymm0, %ymm1, %ymm04858; AVX1-NEXT: retq4859;4860; AVX2-LABEL: uitofp_load_8i32_to_8f32:4861; AVX2: # %bb.0:4862; AVX2-NEXT: vmovdqa (%rdi), %ymm04863; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1258291200,1258291200,1258291200,1258291200,1258291200,1258291200,1258291200,1258291200]4864; AVX2-NEXT: vpblendw {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7],ymm0[8],ymm1[9],ymm0[10],ymm1[11],ymm0[12],ymm1[13],ymm0[14],ymm1[15]4865; AVX2-NEXT: vpsrld $16, %ymm0, %ymm04866; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [1392508928,1392508928,1392508928,1392508928,1392508928,1392508928,1392508928,1392508928]4867; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm2[1],ymm0[2],ymm2[3],ymm0[4],ymm2[5],ymm0[6],ymm2[7],ymm0[8],ymm2[9],ymm0[10],ymm2[11],ymm0[12],ymm2[13],ymm0[14],ymm2[15]4868; AVX2-NEXT: vbroadcastss {{.*#+}} ymm2 = [5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11,5.49764202E+11]4869; AVX2-NEXT: vsubps %ymm2, %ymm0, %ymm04870; AVX2-NEXT: vaddps %ymm0, %ymm1, %ymm04871; AVX2-NEXT: retq4872;4873; AVX512F-LABEL: uitofp_load_8i32_to_8f32:4874; AVX512F: # %bb.0:4875; AVX512F-NEXT: vmovaps (%rdi), %ymm04876; AVX512F-NEXT: vcvtudq2ps %zmm0, %zmm04877; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm04878; AVX512F-NEXT: retq4879;4880; AVX512VL-LABEL: uitofp_load_8i32_to_8f32:4881; AVX512VL: # %bb.0:4882; AVX512VL-NEXT: vcvtudq2ps (%rdi), %ymm04883; AVX512VL-NEXT: retq4884;4885; AVX512DQ-LABEL: uitofp_load_8i32_to_8f32:4886; AVX512DQ: # %bb.0:4887; AVX512DQ-NEXT: vmovaps (%rdi), %ymm04888; AVX512DQ-NEXT: vcvtudq2ps %zmm0, %zmm04889; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm04890; AVX512DQ-NEXT: retq4891;4892; AVX512VLDQ-LABEL: uitofp_load_8i32_to_8f32:4893; AVX512VLDQ: # %bb.0:4894; AVX512VLDQ-NEXT: vcvtudq2ps (%rdi), %ymm04895; AVX512VLDQ-NEXT: retq4896 %ld = load <8 x i32>, ptr%a4897 %cvt = uitofp <8 x i32> %ld to <8 x float>4898 ret <8 x float> %cvt4899}4900 4901define <8 x float> @uitofp_load_8i16_to_8f32(ptr%a) {4902; SSE2-LABEL: uitofp_load_8i16_to_8f32:4903; SSE2: # %bb.0:4904; SSE2-NEXT: movdqa (%rdi), %xmm14905; SSE2-NEXT: pxor %xmm2, %xmm24906; SSE2-NEXT: movdqa %xmm1, %xmm04907; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]4908; SSE2-NEXT: cvtdq2ps %xmm0, %xmm04909; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]4910; SSE2-NEXT: cvtdq2ps %xmm1, %xmm14911; SSE2-NEXT: retq4912;4913; SSE41-LABEL: uitofp_load_8i16_to_8f32:4914; SSE41: # %bb.0:4915; SSE41-NEXT: pmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero4916; SSE41-NEXT: pmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero4917; SSE41-NEXT: cvtdq2ps %xmm0, %xmm04918; SSE41-NEXT: cvtdq2ps %xmm1, %xmm14919; SSE41-NEXT: retq4920;4921; AVX1-LABEL: uitofp_load_8i16_to_8f32:4922; AVX1: # %bb.0:4923; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero4924; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero4925; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm04926; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm04927; AVX1-NEXT: retq4928;4929; AVX2-LABEL: uitofp_load_8i16_to_8f32:4930; AVX2: # %bb.0:4931; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero4932; AVX2-NEXT: vcvtdq2ps %ymm0, %ymm04933; AVX2-NEXT: retq4934;4935; AVX512-LABEL: uitofp_load_8i16_to_8f32:4936; AVX512: # %bb.0:4937; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero4938; AVX512-NEXT: vcvtdq2ps %ymm0, %ymm04939; AVX512-NEXT: retq4940 %ld = load <8 x i16>, ptr%a4941 %cvt = uitofp <8 x i16> %ld to <8 x float>4942 ret <8 x float> %cvt4943}4944 4945define <8 x float> @uitofp_load_8i8_to_8f32(ptr%a) {4946; SSE2-LABEL: uitofp_load_8i8_to_8f32:4947; SSE2: # %bb.0:4948; SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero4949; SSE2-NEXT: pxor %xmm2, %xmm24950; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]4951; SSE2-NEXT: movdqa %xmm1, %xmm04952; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]4953; SSE2-NEXT: cvtdq2ps %xmm0, %xmm04954; SSE2-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]4955; SSE2-NEXT: cvtdq2ps %xmm1, %xmm14956; SSE2-NEXT: retq4957;4958; SSE41-LABEL: uitofp_load_8i8_to_8f32:4959; SSE41: # %bb.0:4960; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero4961; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero4962; SSE41-NEXT: cvtdq2ps %xmm0, %xmm04963; SSE41-NEXT: cvtdq2ps %xmm1, %xmm14964; SSE41-NEXT: retq4965;4966; AVX1-LABEL: uitofp_load_8i8_to_8f32:4967; AVX1: # %bb.0:4968; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero4969; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero4970; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm04971; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm04972; AVX1-NEXT: retq4973;4974; AVX2-LABEL: uitofp_load_8i8_to_8f32:4975; AVX2: # %bb.0:4976; AVX2-NEXT: vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero4977; AVX2-NEXT: vcvtdq2ps %ymm0, %ymm04978; AVX2-NEXT: retq4979;4980; AVX512-LABEL: uitofp_load_8i8_to_8f32:4981; AVX512: # %bb.0:4982; AVX512-NEXT: vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero4983; AVX512-NEXT: vcvtdq2ps %ymm0, %ymm04984; AVX512-NEXT: retq4985 %ld = load <8 x i8>, ptr%a4986 %cvt = uitofp <8 x i8> %ld to <8 x float>4987 ret <8 x float> %cvt4988}4989 4990;4991; Aggregates4992;4993 4994%Arguments = type <{ <8 x i8>, <8 x i16>, ptr }>4995define void @aggregate_sitofp_8i16_to_8f32(ptr nocapture readonly %a0) {4996; SSE2-LABEL: aggregate_sitofp_8i16_to_8f32:4997; SSE2: # %bb.0:4998; SSE2-NEXT: movq 24(%rdi), %rax4999; SSE2-NEXT: movdqu 8(%rdi), %xmm05000; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]5001; SSE2-NEXT: psrad $16, %xmm15002; SSE2-NEXT: cvtdq2ps %xmm1, %xmm15003; SSE2-NEXT: punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]5004; SSE2-NEXT: psrad $16, %xmm05005; SSE2-NEXT: cvtdq2ps %xmm0, %xmm05006; SSE2-NEXT: movaps %xmm0, 16(%rax)5007; SSE2-NEXT: movaps %xmm1, (%rax)5008; SSE2-NEXT: retq5009;5010; SSE41-LABEL: aggregate_sitofp_8i16_to_8f32:5011; SSE41: # %bb.0:5012; SSE41-NEXT: movq 24(%rdi), %rax5013; SSE41-NEXT: pmovsxwd 16(%rdi), %xmm05014; SSE41-NEXT: pmovsxwd 8(%rdi), %xmm15015; SSE41-NEXT: cvtdq2ps %xmm1, %xmm15016; SSE41-NEXT: cvtdq2ps %xmm0, %xmm05017; SSE41-NEXT: movaps %xmm0, 16(%rax)5018; SSE41-NEXT: movaps %xmm1, (%rax)5019; SSE41-NEXT: retq5020;5021; AVX1-LABEL: aggregate_sitofp_8i16_to_8f32:5022; AVX1: # %bb.0:5023; AVX1-NEXT: movq 24(%rdi), %rax5024; AVX1-NEXT: vpmovsxwd 16(%rdi), %xmm05025; AVX1-NEXT: vpmovsxwd 8(%rdi), %xmm15026; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm05027; AVX1-NEXT: vcvtdq2ps %ymm0, %ymm05028; AVX1-NEXT: vmovaps %ymm0, (%rax)5029; AVX1-NEXT: vzeroupper5030; AVX1-NEXT: retq5031;5032; AVX2-LABEL: aggregate_sitofp_8i16_to_8f32:5033; AVX2: # %bb.0:5034; AVX2-NEXT: movq 24(%rdi), %rax5035; AVX2-NEXT: vpmovsxwd 8(%rdi), %ymm05036; AVX2-NEXT: vcvtdq2ps %ymm0, %ymm05037; AVX2-NEXT: vmovaps %ymm0, (%rax)5038; AVX2-NEXT: vzeroupper5039; AVX2-NEXT: retq5040;5041; AVX512-LABEL: aggregate_sitofp_8i16_to_8f32:5042; AVX512: # %bb.0:5043; AVX512-NEXT: movq 24(%rdi), %rax5044; AVX512-NEXT: vpmovsxwd 8(%rdi), %ymm05045; AVX512-NEXT: vcvtdq2ps %ymm0, %ymm05046; AVX512-NEXT: vmovaps %ymm0, (%rax)5047; AVX512-NEXT: vzeroupper5048; AVX512-NEXT: retq5049 %1 = load %Arguments, ptr %a0, align 15050 %2 = extractvalue %Arguments %1, 15051 %3 = extractvalue %Arguments %1, 25052 %4 = sitofp <8 x i16> %2 to <8 x float>5053 store <8 x float> %4, ptr %3, align 325054 ret void5055}5056 5057define <2 x double> @sitofp_i32_to_2f64(<2 x double> %a0, i32 %a1) nounwind {5058; SSE-LABEL: sitofp_i32_to_2f64:5059; SSE: # %bb.0:5060; SSE-NEXT: cvtsi2sd %edi, %xmm05061; SSE-NEXT: retq5062;5063; AVX-LABEL: sitofp_i32_to_2f64:5064; AVX: # %bb.0:5065; AVX-NEXT: vcvtsi2sd %edi, %xmm0, %xmm05066; AVX-NEXT: retq5067 %cvt = sitofp i32 %a1 to double5068 %res = insertelement <2 x double> %a0, double %cvt, i32 05069 ret <2 x double> %res5070}5071 5072define <4 x float> @sitofp_i32_to_4f32(<4 x float> %a0, i32 %a1) nounwind {5073; SSE-LABEL: sitofp_i32_to_4f32:5074; SSE: # %bb.0:5075; SSE-NEXT: cvtsi2ss %edi, %xmm05076; SSE-NEXT: retq5077;5078; AVX-LABEL: sitofp_i32_to_4f32:5079; AVX: # %bb.0:5080; AVX-NEXT: vcvtsi2ss %edi, %xmm0, %xmm05081; AVX-NEXT: retq5082 %cvt = sitofp i32 %a1 to float5083 %res = insertelement <4 x float> %a0, float %cvt, i32 05084 ret <4 x float> %res5085}5086 5087define <2 x double> @sitofp_i64_to_2f64(<2 x double> %a0, i64 %a1) nounwind {5088; SSE-LABEL: sitofp_i64_to_2f64:5089; SSE: # %bb.0:5090; SSE-NEXT: cvtsi2sd %rdi, %xmm05091; SSE-NEXT: retq5092;5093; AVX-LABEL: sitofp_i64_to_2f64:5094; AVX: # %bb.0:5095; AVX-NEXT: vcvtsi2sd %rdi, %xmm0, %xmm05096; AVX-NEXT: retq5097 %cvt = sitofp i64 %a1 to double5098 %res = insertelement <2 x double> %a0, double %cvt, i32 05099 ret <2 x double> %res5100}5101 5102define <4 x float> @sitofp_i64_to_4f32(<4 x float> %a0, i64 %a1) nounwind {5103; SSE-LABEL: sitofp_i64_to_4f32:5104; SSE: # %bb.0:5105; SSE-NEXT: cvtsi2ss %rdi, %xmm05106; SSE-NEXT: retq5107;5108; AVX-LABEL: sitofp_i64_to_4f32:5109; AVX: # %bb.0:5110; AVX-NEXT: vcvtsi2ss %rdi, %xmm0, %xmm05111; AVX-NEXT: retq5112 %cvt = sitofp i64 %a1 to float5113 %res = insertelement <4 x float> %a0, float %cvt, i32 05114 ret <4 x float> %res5115}5116 5117; Extract from int vector and convert to FP.5118 5119define float @extract0_sitofp_v4i32_f32(<4 x i32> %x) nounwind {5120; SSE-LABEL: extract0_sitofp_v4i32_f32:5121; SSE: # %bb.0:5122; SSE-NEXT: cvtdq2ps %xmm0, %xmm05123; SSE-NEXT: retq5124;5125; AVX-LABEL: extract0_sitofp_v4i32_f32:5126; AVX: # %bb.0:5127; AVX-NEXT: vcvtdq2ps %xmm0, %xmm05128; AVX-NEXT: retq5129 %e = extractelement <4 x i32> %x, i32 05130 %r = sitofp i32 %e to float5131 ret float %r5132}5133 5134define float @extract0_sitofp_v4i32_f32i_multiuse1(<4 x i32> %x) nounwind {5135; SSE-LABEL: extract0_sitofp_v4i32_f32i_multiuse1:5136; SSE: # %bb.0:5137; SSE-NEXT: movd %xmm0, %eax5138; SSE-NEXT: cvtdq2ps %xmm0, %xmm05139; SSE-NEXT: incl %eax5140; SSE-NEXT: cvtsi2ss %eax, %xmm15141; SSE-NEXT: divss %xmm1, %xmm05142; SSE-NEXT: retq5143;5144; AVX-LABEL: extract0_sitofp_v4i32_f32i_multiuse1:5145; AVX: # %bb.0:5146; AVX-NEXT: vmovd %xmm0, %eax5147; AVX-NEXT: vcvtdq2ps %xmm0, %xmm05148; AVX-NEXT: incl %eax5149; AVX-NEXT: vcvtsi2ss %eax, %xmm15, %xmm15150; AVX-NEXT: vdivss %xmm1, %xmm0, %xmm05151; AVX-NEXT: retq5152 %e = extractelement <4 x i32> %x, i32 05153 %f = sitofp i32 %e to float5154 %e1 = add i32 %e, 15155 %f1 = sitofp i32 %e1 to float5156 %r = fdiv float %f, %f15157 ret float %r5158}5159 5160define float @extract0_sitofp_v4i32_f32_multiuse2(<4 x i32> %x, ptr %p) nounwind {5161; SSE-LABEL: extract0_sitofp_v4i32_f32_multiuse2:5162; SSE: # %bb.0:5163; SSE-NEXT: cvtdq2ps %xmm0, %xmm15164; SSE-NEXT: movss %xmm0, (%rdi)5165; SSE-NEXT: movaps %xmm1, %xmm05166; SSE-NEXT: retq5167;5168; AVX-LABEL: extract0_sitofp_v4i32_f32_multiuse2:5169; AVX: # %bb.0:5170; AVX-NEXT: vcvtdq2ps %xmm0, %xmm15171; AVX-NEXT: vmovss %xmm0, (%rdi)5172; AVX-NEXT: vmovaps %xmm1, %xmm05173; AVX-NEXT: retq5174 %e = extractelement <4 x i32> %x, i32 05175 %r = sitofp i32 %e to float5176 store i32 %e, ptr %p5177 ret float %r5178}5179 5180define double @extract0_sitofp_v4i32_f64(<4 x i32> %x) nounwind {5181; SSE-LABEL: extract0_sitofp_v4i32_f64:5182; SSE: # %bb.0:5183; SSE-NEXT: movd %xmm0, %eax5184; SSE-NEXT: xorps %xmm0, %xmm05185; SSE-NEXT: cvtsi2sd %eax, %xmm05186; SSE-NEXT: retq5187;5188; AVX-LABEL: extract0_sitofp_v4i32_f64:5189; AVX: # %bb.0:5190; AVX-NEXT: vcvtdq2pd %xmm0, %xmm05191; AVX-NEXT: retq5192 %e = extractelement <4 x i32> %x, i32 05193 %r = sitofp i32 %e to double5194 ret double %r5195}5196 5197define float @extract0_uitofp_v4i32_f32(<4 x i32> %x) nounwind {5198; SSE-LABEL: extract0_uitofp_v4i32_f32:5199; SSE: # %bb.0:5200; SSE-NEXT: movd %xmm0, %eax5201; SSE-NEXT: xorps %xmm0, %xmm05202; SSE-NEXT: cvtsi2ss %rax, %xmm05203; SSE-NEXT: retq5204;5205; VEX-LABEL: extract0_uitofp_v4i32_f32:5206; VEX: # %bb.0:5207; VEX-NEXT: vmovd %xmm0, %eax5208; VEX-NEXT: vcvtsi2ss %rax, %xmm15, %xmm05209; VEX-NEXT: retq5210;5211; AVX512F-LABEL: extract0_uitofp_v4i32_f32:5212; AVX512F: # %bb.0:5213; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm05214; AVX512F-NEXT: vcvtudq2ps %zmm0, %zmm05215; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm05216; AVX512F-NEXT: vzeroupper5217; AVX512F-NEXT: retq5218;5219; AVX512VL-LABEL: extract0_uitofp_v4i32_f32:5220; AVX512VL: # %bb.0:5221; AVX512VL-NEXT: vcvtudq2ps %xmm0, %xmm05222; AVX512VL-NEXT: retq5223;5224; AVX512DQ-LABEL: extract0_uitofp_v4i32_f32:5225; AVX512DQ: # %bb.0:5226; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm05227; AVX512DQ-NEXT: vcvtudq2ps %zmm0, %zmm05228; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm05229; AVX512DQ-NEXT: vzeroupper5230; AVX512DQ-NEXT: retq5231;5232; AVX512VLDQ-LABEL: extract0_uitofp_v4i32_f32:5233; AVX512VLDQ: # %bb.0:5234; AVX512VLDQ-NEXT: vcvtudq2ps %xmm0, %xmm05235; AVX512VLDQ-NEXT: retq5236 %e = extractelement <4 x i32> %x, i32 05237 %r = uitofp i32 %e to float5238 ret float %r5239}5240 5241define double @extract0_uitofp_v4i32_f64(<4 x i32> %x) nounwind {5242; SSE-LABEL: extract0_uitofp_v4i32_f64:5243; SSE: # %bb.0:5244; SSE-NEXT: movd %xmm0, %eax5245; SSE-NEXT: xorps %xmm0, %xmm05246; SSE-NEXT: cvtsi2sd %rax, %xmm05247; SSE-NEXT: retq5248;5249; VEX-LABEL: extract0_uitofp_v4i32_f64:5250; VEX: # %bb.0:5251; VEX-NEXT: vmovd %xmm0, %eax5252; VEX-NEXT: vcvtsi2sd %rax, %xmm15, %xmm05253; VEX-NEXT: retq5254;5255; AVX512F-LABEL: extract0_uitofp_v4i32_f64:5256; AVX512F: # %bb.0:5257; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm05258; AVX512F-NEXT: vcvtudq2pd %ymm0, %zmm05259; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm05260; AVX512F-NEXT: vzeroupper5261; AVX512F-NEXT: retq5262;5263; AVX512VL-LABEL: extract0_uitofp_v4i32_f64:5264; AVX512VL: # %bb.0:5265; AVX512VL-NEXT: vcvtudq2pd %xmm0, %xmm05266; AVX512VL-NEXT: retq5267;5268; AVX512DQ-LABEL: extract0_uitofp_v4i32_f64:5269; AVX512DQ: # %bb.0:5270; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm05271; AVX512DQ-NEXT: vcvtudq2pd %ymm0, %zmm05272; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm05273; AVX512DQ-NEXT: vzeroupper5274; AVX512DQ-NEXT: retq5275;5276; AVX512VLDQ-LABEL: extract0_uitofp_v4i32_f64:5277; AVX512VLDQ: # %bb.0:5278; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %xmm05279; AVX512VLDQ-NEXT: retq5280 %e = extractelement <4 x i32> %x, i32 05281 %r = uitofp i32 %e to double5282 ret double %r5283}5284 5285; Extract non-zero element from int vector and convert to FP.5286 5287define float @extract3_sitofp_v4i32_f32(<4 x i32> %x) nounwind {5288; SSE-LABEL: extract3_sitofp_v4i32_f32:5289; SSE: # %bb.0:5290; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]5291; SSE-NEXT: cvtdq2ps %xmm0, %xmm05292; SSE-NEXT: retq5293;5294; AVX-LABEL: extract3_sitofp_v4i32_f32:5295; AVX: # %bb.0:5296; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]5297; AVX-NEXT: vcvtdq2ps %xmm0, %xmm05298; AVX-NEXT: retq5299 %e = extractelement <4 x i32> %x, i32 35300 %r = sitofp i32 %e to float5301 ret float %r5302}5303 5304define double @extract3_sitofp_v4i32_f64(<4 x i32> %x) nounwind {5305; SSE2-LABEL: extract3_sitofp_v4i32_f64:5306; SSE2: # %bb.0:5307; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]5308; SSE2-NEXT: movd %xmm0, %eax5309; SSE2-NEXT: xorps %xmm0, %xmm05310; SSE2-NEXT: cvtsi2sd %eax, %xmm05311; SSE2-NEXT: retq5312;5313; SSE41-LABEL: extract3_sitofp_v4i32_f64:5314; SSE41: # %bb.0:5315; SSE41-NEXT: extractps $3, %xmm0, %eax5316; SSE41-NEXT: xorps %xmm0, %xmm05317; SSE41-NEXT: cvtsi2sd %eax, %xmm05318; SSE41-NEXT: retq5319;5320; AVX-LABEL: extract3_sitofp_v4i32_f64:5321; AVX: # %bb.0:5322; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]5323; AVX-NEXT: vcvtdq2pd %xmm0, %xmm05324; AVX-NEXT: retq5325 %e = extractelement <4 x i32> %x, i32 35326 %r = sitofp i32 %e to double5327 ret double %r5328}5329 5330define float @extract3_uitofp_v4i32_f32(<4 x i32> %x) nounwind {5331; SSE2-LABEL: extract3_uitofp_v4i32_f32:5332; SSE2: # %bb.0:5333; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]5334; SSE2-NEXT: movd %xmm0, %eax5335; SSE2-NEXT: xorps %xmm0, %xmm05336; SSE2-NEXT: cvtsi2ss %rax, %xmm05337; SSE2-NEXT: retq5338;5339; SSE41-LABEL: extract3_uitofp_v4i32_f32:5340; SSE41: # %bb.0:5341; SSE41-NEXT: extractps $3, %xmm0, %eax5342; SSE41-NEXT: xorps %xmm0, %xmm05343; SSE41-NEXT: cvtsi2ss %rax, %xmm05344; SSE41-NEXT: retq5345;5346; VEX-LABEL: extract3_uitofp_v4i32_f32:5347; VEX: # %bb.0:5348; VEX-NEXT: vextractps $3, %xmm0, %eax5349; VEX-NEXT: vcvtsi2ss %rax, %xmm15, %xmm05350; VEX-NEXT: retq5351;5352; AVX512F-LABEL: extract3_uitofp_v4i32_f32:5353; AVX512F: # %bb.0:5354; AVX512F-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]5355; AVX512F-NEXT: vcvtudq2ps %zmm0, %zmm05356; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm05357; AVX512F-NEXT: vzeroupper5358; AVX512F-NEXT: retq5359;5360; AVX512VL-LABEL: extract3_uitofp_v4i32_f32:5361; AVX512VL: # %bb.0:5362; AVX512VL-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]5363; AVX512VL-NEXT: vcvtudq2ps %xmm0, %xmm05364; AVX512VL-NEXT: retq5365;5366; AVX512DQ-LABEL: extract3_uitofp_v4i32_f32:5367; AVX512DQ: # %bb.0:5368; AVX512DQ-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]5369; AVX512DQ-NEXT: vcvtudq2ps %zmm0, %zmm05370; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm05371; AVX512DQ-NEXT: vzeroupper5372; AVX512DQ-NEXT: retq5373;5374; AVX512VLDQ-LABEL: extract3_uitofp_v4i32_f32:5375; AVX512VLDQ: # %bb.0:5376; AVX512VLDQ-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]5377; AVX512VLDQ-NEXT: vcvtudq2ps %xmm0, %xmm05378; AVX512VLDQ-NEXT: retq5379 %e = extractelement <4 x i32> %x, i32 35380 %r = uitofp i32 %e to float5381 ret float %r5382}5383 5384define double @extract3_uitofp_v4i32_f64(<4 x i32> %x) nounwind {5385; SSE2-LABEL: extract3_uitofp_v4i32_f64:5386; SSE2: # %bb.0:5387; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]5388; SSE2-NEXT: movd %xmm0, %eax5389; SSE2-NEXT: xorps %xmm0, %xmm05390; SSE2-NEXT: cvtsi2sd %rax, %xmm05391; SSE2-NEXT: retq5392;5393; SSE41-LABEL: extract3_uitofp_v4i32_f64:5394; SSE41: # %bb.0:5395; SSE41-NEXT: extractps $3, %xmm0, %eax5396; SSE41-NEXT: xorps %xmm0, %xmm05397; SSE41-NEXT: cvtsi2sd %rax, %xmm05398; SSE41-NEXT: retq5399;5400; VEX-LABEL: extract3_uitofp_v4i32_f64:5401; VEX: # %bb.0:5402; VEX-NEXT: vextractps $3, %xmm0, %eax5403; VEX-NEXT: vcvtsi2sd %rax, %xmm15, %xmm05404; VEX-NEXT: retq5405;5406; AVX512F-LABEL: extract3_uitofp_v4i32_f64:5407; AVX512F: # %bb.0:5408; AVX512F-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]5409; AVX512F-NEXT: vcvtudq2pd %ymm0, %zmm05410; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm05411; AVX512F-NEXT: vzeroupper5412; AVX512F-NEXT: retq5413;5414; AVX512VL-LABEL: extract3_uitofp_v4i32_f64:5415; AVX512VL: # %bb.0:5416; AVX512VL-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]5417; AVX512VL-NEXT: vcvtudq2pd %xmm0, %xmm05418; AVX512VL-NEXT: retq5419;5420; AVX512DQ-LABEL: extract3_uitofp_v4i32_f64:5421; AVX512DQ: # %bb.0:5422; AVX512DQ-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]5423; AVX512DQ-NEXT: vcvtudq2pd %ymm0, %zmm05424; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm05425; AVX512DQ-NEXT: vzeroupper5426; AVX512DQ-NEXT: retq5427;5428; AVX512VLDQ-LABEL: extract3_uitofp_v4i32_f64:5429; AVX512VLDQ: # %bb.0:5430; AVX512VLDQ-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]5431; AVX512VLDQ-NEXT: vcvtudq2pd %xmm0, %xmm05432; AVX512VLDQ-NEXT: retq5433 %e = extractelement <4 x i32> %x, i32 35434 %r = uitofp i32 %e to double5435 ret double %r5436}5437 5438define void @PR43609(ptr nocapture %x, <2 x i64> %y) {5439; SSE2-LABEL: PR43609:5440; SSE2: # %bb.0:5441; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2,2]5442; SSE2-NEXT: paddq %xmm0, %xmm15443; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [4294967295,4294967295]5444; SSE2-NEXT: movdqa %xmm0, %xmm35445; SSE2-NEXT: pand %xmm2, %xmm35446; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]5447; SSE2-NEXT: por %xmm4, %xmm35448; SSE2-NEXT: psrlq $32, %xmm05449; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]5450; SSE2-NEXT: por %xmm5, %xmm05451; SSE2-NEXT: movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]5452; SSE2-NEXT: subpd %xmm6, %xmm05453; SSE2-NEXT: addpd %xmm3, %xmm05454; SSE2-NEXT: pand %xmm1, %xmm25455; SSE2-NEXT: por %xmm4, %xmm25456; SSE2-NEXT: psrlq $32, %xmm15457; SSE2-NEXT: por %xmm5, %xmm15458; SSE2-NEXT: subpd %xmm6, %xmm15459; SSE2-NEXT: addpd %xmm2, %xmm15460; SSE2-NEXT: movapd {{.*#+}} xmm2 = [5.0E-1,5.0E-1]5461; SSE2-NEXT: addpd %xmm2, %xmm05462; SSE2-NEXT: addpd %xmm2, %xmm15463; SSE2-NEXT: movupd %xmm0, (%rdi)5464; SSE2-NEXT: movupd %xmm1, 16(%rdi)5465; SSE2-NEXT: retq5466;5467; SSE41-LABEL: PR43609:5468; SSE41: # %bb.0:5469; SSE41-NEXT: pmovsxbq {{.*#+}} xmm1 = [2,2]5470; SSE41-NEXT: paddq %xmm0, %xmm15471; SSE41-NEXT: pxor %xmm2, %xmm25472; SSE41-NEXT: movdqa %xmm0, %xmm35473; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]5474; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]5475; SSE41-NEXT: por %xmm4, %xmm35476; SSE41-NEXT: psrlq $32, %xmm05477; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]5478; SSE41-NEXT: por %xmm5, %xmm05479; SSE41-NEXT: movapd {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]5480; SSE41-NEXT: subpd %xmm6, %xmm05481; SSE41-NEXT: addpd %xmm3, %xmm05482; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]5483; SSE41-NEXT: por %xmm4, %xmm25484; SSE41-NEXT: psrlq $32, %xmm15485; SSE41-NEXT: por %xmm5, %xmm15486; SSE41-NEXT: subpd %xmm6, %xmm15487; SSE41-NEXT: addpd %xmm2, %xmm15488; SSE41-NEXT: movapd {{.*#+}} xmm2 = [5.0E-1,5.0E-1]5489; SSE41-NEXT: addpd %xmm2, %xmm05490; SSE41-NEXT: addpd %xmm2, %xmm15491; SSE41-NEXT: movupd %xmm0, (%rdi)5492; SSE41-NEXT: movupd %xmm1, 16(%rdi)5493; SSE41-NEXT: retq5494;5495; AVX1-LABEL: PR43609:5496; AVX1: # %bb.0:5497; AVX1-NEXT: vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm15498; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm25499; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]5500; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]5501; AVX1-NEXT: # xmm4 = mem[0,0]5502; AVX1-NEXT: vpor %xmm4, %xmm3, %xmm35503; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm05504; AVX1-NEXT: vmovddup {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]5505; AVX1-NEXT: # xmm5 = mem[0,0]5506; AVX1-NEXT: vpor %xmm5, %xmm0, %xmm05507; AVX1-NEXT: vmovddup {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]5508; AVX1-NEXT: # xmm6 = mem[0,0]5509; AVX1-NEXT: vsubpd %xmm6, %xmm0, %xmm05510; AVX1-NEXT: vaddpd %xmm0, %xmm3, %xmm05511; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]5512; AVX1-NEXT: vpor %xmm4, %xmm2, %xmm25513; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm15514; AVX1-NEXT: vpor %xmm5, %xmm1, %xmm15515; AVX1-NEXT: vsubpd %xmm6, %xmm1, %xmm15516; AVX1-NEXT: vaddpd %xmm1, %xmm2, %xmm15517; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [5.0E-1,5.0E-1]5518; AVX1-NEXT: # xmm2 = mem[0,0]5519; AVX1-NEXT: vaddpd %xmm2, %xmm0, %xmm05520; AVX1-NEXT: vaddpd %xmm2, %xmm1, %xmm15521; AVX1-NEXT: vmovupd %xmm0, (%rdi)5522; AVX1-NEXT: vmovupd %xmm1, 16(%rdi)5523; AVX1-NEXT: retq5524;5525; AVX2-LABEL: PR43609:5526; AVX2: # %bb.0:5527; AVX2-NEXT: vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm15528; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm25529; AVX2-NEXT: vpblendd {{.*#+}} xmm3 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]5530; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]5531; AVX2-NEXT: vpor %xmm4, %xmm3, %xmm35532; AVX2-NEXT: vpsrlq $32, %xmm0, %xmm05533; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]5534; AVX2-NEXT: vpor %xmm5, %xmm0, %xmm05535; AVX2-NEXT: vmovddup {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]5536; AVX2-NEXT: # xmm6 = mem[0,0]5537; AVX2-NEXT: vsubpd %xmm6, %xmm0, %xmm05538; AVX2-NEXT: vaddpd %xmm0, %xmm3, %xmm05539; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]5540; AVX2-NEXT: vpor %xmm4, %xmm2, %xmm25541; AVX2-NEXT: vpsrlq $32, %xmm1, %xmm15542; AVX2-NEXT: vpor %xmm5, %xmm1, %xmm15543; AVX2-NEXT: vsubpd %xmm6, %xmm1, %xmm15544; AVX2-NEXT: vaddpd %xmm1, %xmm2, %xmm15545; AVX2-NEXT: vmovddup {{.*#+}} xmm2 = [5.0E-1,5.0E-1]5546; AVX2-NEXT: # xmm2 = mem[0,0]5547; AVX2-NEXT: vaddpd %xmm2, %xmm0, %xmm05548; AVX2-NEXT: vaddpd %xmm2, %xmm1, %xmm15549; AVX2-NEXT: vmovupd %xmm0, (%rdi)5550; AVX2-NEXT: vmovupd %xmm1, 16(%rdi)5551; AVX2-NEXT: retq5552;5553; AVX512F-LABEL: PR43609:5554; AVX512F: # %bb.0:5555; AVX512F-NEXT: vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm15556; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm25557; AVX512F-NEXT: vpblendd {{.*#+}} xmm3 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]5558; AVX512F-NEXT: vpbroadcastq {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]5559; AVX512F-NEXT: vpor %xmm4, %xmm3, %xmm35560; AVX512F-NEXT: vpsrlq $32, %xmm0, %xmm05561; AVX512F-NEXT: vpbroadcastq {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]5562; AVX512F-NEXT: vpor %xmm5, %xmm0, %xmm05563; AVX512F-NEXT: vmovddup {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]5564; AVX512F-NEXT: # xmm6 = mem[0,0]5565; AVX512F-NEXT: vsubpd %xmm6, %xmm0, %xmm05566; AVX512F-NEXT: vaddpd %xmm0, %xmm3, %xmm05567; AVX512F-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]5568; AVX512F-NEXT: vpor %xmm4, %xmm2, %xmm25569; AVX512F-NEXT: vpsrlq $32, %xmm1, %xmm15570; AVX512F-NEXT: vpor %xmm5, %xmm1, %xmm15571; AVX512F-NEXT: vsubpd %xmm6, %xmm1, %xmm15572; AVX512F-NEXT: vaddpd %xmm1, %xmm2, %xmm15573; AVX512F-NEXT: vmovddup {{.*#+}} xmm2 = [5.0E-1,5.0E-1]5574; AVX512F-NEXT: # xmm2 = mem[0,0]5575; AVX512F-NEXT: vaddpd %xmm2, %xmm0, %xmm05576; AVX512F-NEXT: vaddpd %xmm2, %xmm1, %xmm15577; AVX512F-NEXT: vmovupd %xmm0, (%rdi)5578; AVX512F-NEXT: vmovupd %xmm1, 16(%rdi)5579; AVX512F-NEXT: retq5580;5581; AVX512VL-LABEL: PR43609:5582; AVX512VL: # %bb.0:5583; AVX512VL-NEXT: vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm15584; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm25585; AVX512VL-NEXT: vpblendd {{.*#+}} xmm3 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]5586; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm4 = [4841369599423283200,4841369599423283200]5587; AVX512VL-NEXT: vpor %xmm4, %xmm3, %xmm35588; AVX512VL-NEXT: vpsrlq $32, %xmm0, %xmm05589; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm5 = [4985484787499139072,4985484787499139072]5590; AVX512VL-NEXT: vpor %xmm5, %xmm0, %xmm05591; AVX512VL-NEXT: vmovddup {{.*#+}} xmm6 = [1.9342813118337666E+25,1.9342813118337666E+25]5592; AVX512VL-NEXT: # xmm6 = mem[0,0]5593; AVX512VL-NEXT: vsubpd %xmm6, %xmm0, %xmm05594; AVX512VL-NEXT: vaddpd %xmm0, %xmm3, %xmm05595; AVX512VL-NEXT: vpblendd {{.*#+}} xmm2 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]5596; AVX512VL-NEXT: vpor %xmm4, %xmm2, %xmm25597; AVX512VL-NEXT: vpsrlq $32, %xmm1, %xmm15598; AVX512VL-NEXT: vpor %xmm5, %xmm1, %xmm15599; AVX512VL-NEXT: vsubpd %xmm6, %xmm1, %xmm15600; AVX512VL-NEXT: vaddpd %xmm1, %xmm2, %xmm15601; AVX512VL-NEXT: vmovddup {{.*#+}} xmm2 = [5.0E-1,5.0E-1]5602; AVX512VL-NEXT: # xmm2 = mem[0,0]5603; AVX512VL-NEXT: vaddpd %xmm2, %xmm0, %xmm05604; AVX512VL-NEXT: vaddpd %xmm2, %xmm1, %xmm15605; AVX512VL-NEXT: vmovupd %xmm0, (%rdi)5606; AVX512VL-NEXT: vmovupd %xmm1, 16(%rdi)5607; AVX512VL-NEXT: retq5608;5609; AVX512DQ-LABEL: PR43609:5610; AVX512DQ: # %bb.0:5611; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm05612; AVX512DQ-NEXT: vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm15613; AVX512DQ-NEXT: vcvtuqq2pd %zmm0, %zmm05614; AVX512DQ-NEXT: vcvtuqq2pd %zmm1, %zmm15615; AVX512DQ-NEXT: vmovddup {{.*#+}} xmm2 = [5.0E-1,5.0E-1]5616; AVX512DQ-NEXT: # xmm2 = mem[0,0]5617; AVX512DQ-NEXT: vaddpd %xmm2, %xmm0, %xmm05618; AVX512DQ-NEXT: vaddpd %xmm2, %xmm1, %xmm15619; AVX512DQ-NEXT: vmovupd %xmm0, (%rdi)5620; AVX512DQ-NEXT: vmovupd %xmm1, 16(%rdi)5621; AVX512DQ-NEXT: vzeroupper5622; AVX512DQ-NEXT: retq5623;5624; AVX512VLDQ-LABEL: PR43609:5625; AVX512VLDQ: # %bb.0:5626; AVX512VLDQ-NEXT: vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm15627; AVX512VLDQ-NEXT: vcvtuqq2pd %xmm0, %xmm05628; AVX512VLDQ-NEXT: vcvtuqq2pd %xmm1, %xmm15629; AVX512VLDQ-NEXT: vmovddup {{.*#+}} xmm2 = [5.0E-1,5.0E-1]5630; AVX512VLDQ-NEXT: # xmm2 = mem[0,0]5631; AVX512VLDQ-NEXT: vaddpd %xmm2, %xmm0, %xmm05632; AVX512VLDQ-NEXT: vaddpd %xmm2, %xmm1, %xmm15633; AVX512VLDQ-NEXT: vmovupd %xmm0, (%rdi)5634; AVX512VLDQ-NEXT: vmovupd %xmm1, 16(%rdi)5635; AVX512VLDQ-NEXT: retq5636 %step.add.epil = add <2 x i64> %y, <i64 2, i64 2>5637 %t20 = uitofp <2 x i64> %y to <2 x double>5638 %t21 = uitofp <2 x i64> %step.add.epil to <2 x double>5639 %t22 = fadd fast <2 x double> %t20, <double 5.0e-01, double 5.0e-01>5640 %t23 = fadd fast <2 x double> %t21, <double 5.0e-01, double 5.0e-01>5641 store <2 x double> %t22, ptr %x, align 85642 %t26 = getelementptr inbounds double, ptr %x, i64 25643 store <2 x double> %t23, ptr %t26, align 85644 ret void5645}5646