2839 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,VEX,AVX14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,VEX,AVX25; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VL7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefixes=AVX,AVX512,AVX512DQ8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VLDQ9;10; 32-bit tests to make sure we're not doing anything stupid.11; RUN: llc < %s -mtriple=i686-unknown-unknown12; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse13; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse214 15;16; Double to Signed Integer17;18 19define <2 x i64> @fptosi_2f64_to_2i64(<2 x double> %a) {20; SSE-LABEL: fptosi_2f64_to_2i64:21; SSE: # %bb.0:22; SSE-NEXT: cvttsd2si %xmm0, %rax23; SSE-NEXT: movq %rax, %xmm124; SSE-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1,1]25; SSE-NEXT: cvttsd2si %xmm0, %rax26; SSE-NEXT: movq %rax, %xmm027; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]28; SSE-NEXT: movdqa %xmm1, %xmm029; SSE-NEXT: retq30;31; VEX-LABEL: fptosi_2f64_to_2i64:32; VEX: # %bb.0:33; VEX-NEXT: vcvttsd2si %xmm0, %rax34; VEX-NEXT: vmovq %rax, %xmm135; VEX-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]36; VEX-NEXT: vcvttsd2si %xmm0, %rax37; VEX-NEXT: vmovq %rax, %xmm038; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]39; VEX-NEXT: retq40;41; AVX512F-LABEL: fptosi_2f64_to_2i64:42; AVX512F: # %bb.0:43; AVX512F-NEXT: vcvttsd2si %xmm0, %rax44; AVX512F-NEXT: vmovq %rax, %xmm145; AVX512F-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]46; AVX512F-NEXT: vcvttsd2si %xmm0, %rax47; AVX512F-NEXT: vmovq %rax, %xmm048; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]49; AVX512F-NEXT: retq50;51; AVX512VL-LABEL: fptosi_2f64_to_2i64:52; AVX512VL: # %bb.0:53; AVX512VL-NEXT: vcvttsd2si %xmm0, %rax54; AVX512VL-NEXT: vmovq %rax, %xmm155; AVX512VL-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]56; AVX512VL-NEXT: vcvttsd2si %xmm0, %rax57; AVX512VL-NEXT: vmovq %rax, %xmm058; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]59; AVX512VL-NEXT: retq60;61; AVX512DQ-LABEL: fptosi_2f64_to_2i64:62; AVX512DQ: # %bb.0:63; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm064; AVX512DQ-NEXT: vcvttpd2qq %zmm0, %zmm065; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm066; AVX512DQ-NEXT: vzeroupper67; AVX512DQ-NEXT: retq68;69; AVX512VLDQ-LABEL: fptosi_2f64_to_2i64:70; AVX512VLDQ: # %bb.0:71; AVX512VLDQ-NEXT: vcvttpd2qq %xmm0, %xmm072; AVX512VLDQ-NEXT: retq73 %cvt = fptosi <2 x double> %a to <2 x i64>74 ret <2 x i64> %cvt75}76 77define <4 x i32> @fptosi_2f64_to_4i32(<2 x double> %a) {78; SSE-LABEL: fptosi_2f64_to_4i32:79; SSE: # %bb.0:80; SSE-NEXT: cvttpd2dq %xmm0, %xmm081; SSE-NEXT: retq82;83; AVX-LABEL: fptosi_2f64_to_4i32:84; AVX: # %bb.0:85; AVX-NEXT: vcvttpd2dq %xmm0, %xmm086; AVX-NEXT: retq87 %cvt = fptosi <2 x double> %a to <2 x i32>88 %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>89 ret <4 x i32> %ext90}91 92define <2 x i32> @fptosi_2f64_to_2i32(<2 x double> %a) {93; SSE-LABEL: fptosi_2f64_to_2i32:94; SSE: # %bb.0:95; SSE-NEXT: cvttpd2dq %xmm0, %xmm096; SSE-NEXT: retq97;98; AVX-LABEL: fptosi_2f64_to_2i32:99; AVX: # %bb.0:100; AVX-NEXT: vcvttpd2dq %xmm0, %xmm0101; AVX-NEXT: retq102 %cvt = fptosi <2 x double> %a to <2 x i32>103 ret <2 x i32> %cvt104}105 106define <4 x i32> @fptosi_4f64_to_2i32(<2 x double> %a) {107; SSE-LABEL: fptosi_4f64_to_2i32:108; SSE: # %bb.0:109; SSE-NEXT: cvttpd2dq %xmm0, %xmm0110; SSE-NEXT: retq111;112; AVX-LABEL: fptosi_4f64_to_2i32:113; AVX: # %bb.0:114; AVX-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0115; AVX-NEXT: vcvttpd2dq %ymm0, %xmm0116; AVX-NEXT: vzeroupper117; AVX-NEXT: retq118 %ext = shufflevector <2 x double> %a, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>119 %cvt = fptosi <4 x double> %ext to <4 x i32>120 ret <4 x i32> %cvt121}122 123define <4 x i64> @fptosi_4f64_to_4i64(<4 x double> %a) {124; SSE-LABEL: fptosi_4f64_to_4i64:125; SSE: # %bb.0:126; SSE-NEXT: cvttsd2si %xmm0, %rax127; SSE-NEXT: movq %rax, %xmm2128; SSE-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1,1]129; SSE-NEXT: cvttsd2si %xmm0, %rax130; SSE-NEXT: movq %rax, %xmm0131; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]132; SSE-NEXT: cvttsd2si %xmm1, %rax133; SSE-NEXT: movq %rax, %xmm3134; SSE-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1,1]135; SSE-NEXT: cvttsd2si %xmm1, %rax136; SSE-NEXT: movq %rax, %xmm0137; SSE-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]138; SSE-NEXT: movdqa %xmm2, %xmm0139; SSE-NEXT: movdqa %xmm3, %xmm1140; SSE-NEXT: retq141;142; AVX1-LABEL: fptosi_4f64_to_4i64:143; AVX1: # %bb.0:144; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1145; AVX1-NEXT: vcvttsd2si %xmm1, %rax146; AVX1-NEXT: vmovq %rax, %xmm2147; AVX1-NEXT: vshufpd {{.*#+}} xmm1 = xmm1[1,0]148; AVX1-NEXT: vcvttsd2si %xmm1, %rax149; AVX1-NEXT: vmovq %rax, %xmm1150; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]151; AVX1-NEXT: vcvttsd2si %xmm0, %rax152; AVX1-NEXT: vmovq %rax, %xmm2153; AVX1-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]154; AVX1-NEXT: vcvttsd2si %xmm0, %rax155; AVX1-NEXT: vmovq %rax, %xmm0156; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]157; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0158; AVX1-NEXT: retq159;160; AVX2-LABEL: fptosi_4f64_to_4i64:161; AVX2: # %bb.0:162; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1163; AVX2-NEXT: vcvttsd2si %xmm1, %rax164; AVX2-NEXT: vmovq %rax, %xmm2165; AVX2-NEXT: vshufpd {{.*#+}} xmm1 = xmm1[1,0]166; AVX2-NEXT: vcvttsd2si %xmm1, %rax167; AVX2-NEXT: vmovq %rax, %xmm1168; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]169; AVX2-NEXT: vcvttsd2si %xmm0, %rax170; AVX2-NEXT: vmovq %rax, %xmm2171; AVX2-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]172; AVX2-NEXT: vcvttsd2si %xmm0, %rax173; AVX2-NEXT: vmovq %rax, %xmm0174; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]175; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0176; AVX2-NEXT: retq177;178; AVX512F-LABEL: fptosi_4f64_to_4i64:179; AVX512F: # %bb.0:180; AVX512F-NEXT: vextractf128 $1, %ymm0, %xmm1181; AVX512F-NEXT: vcvttsd2si %xmm1, %rax182; AVX512F-NEXT: vmovq %rax, %xmm2183; AVX512F-NEXT: vshufpd {{.*#+}} xmm1 = xmm1[1,0]184; AVX512F-NEXT: vcvttsd2si %xmm1, %rax185; AVX512F-NEXT: vmovq %rax, %xmm1186; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]187; AVX512F-NEXT: vcvttsd2si %xmm0, %rax188; AVX512F-NEXT: vmovq %rax, %xmm2189; AVX512F-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]190; AVX512F-NEXT: vcvttsd2si %xmm0, %rax191; AVX512F-NEXT: vmovq %rax, %xmm0192; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]193; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0194; AVX512F-NEXT: retq195;196; AVX512VL-LABEL: fptosi_4f64_to_4i64:197; AVX512VL: # %bb.0:198; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm1199; AVX512VL-NEXT: vcvttsd2si %xmm1, %rax200; AVX512VL-NEXT: vmovq %rax, %xmm2201; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm1[1,0]202; AVX512VL-NEXT: vcvttsd2si %xmm1, %rax203; AVX512VL-NEXT: vmovq %rax, %xmm1204; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]205; AVX512VL-NEXT: vcvttsd2si %xmm0, %rax206; AVX512VL-NEXT: vmovq %rax, %xmm2207; AVX512VL-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]208; AVX512VL-NEXT: vcvttsd2si %xmm0, %rax209; AVX512VL-NEXT: vmovq %rax, %xmm0210; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]211; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0212; AVX512VL-NEXT: retq213;214; AVX512DQ-LABEL: fptosi_4f64_to_4i64:215; AVX512DQ: # %bb.0:216; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0217; AVX512DQ-NEXT: vcvttpd2qq %zmm0, %zmm0218; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0219; AVX512DQ-NEXT: retq220;221; AVX512VLDQ-LABEL: fptosi_4f64_to_4i64:222; AVX512VLDQ: # %bb.0:223; AVX512VLDQ-NEXT: vcvttpd2qq %ymm0, %ymm0224; AVX512VLDQ-NEXT: retq225 %cvt = fptosi <4 x double> %a to <4 x i64>226 ret <4 x i64> %cvt227}228 229define <4 x i32> @fptosi_4f64_to_4i32(<4 x double> %a) {230; SSE-LABEL: fptosi_4f64_to_4i32:231; SSE: # %bb.0:232; SSE-NEXT: cvttpd2dq %xmm1, %xmm1233; SSE-NEXT: cvttpd2dq %xmm0, %xmm0234; SSE-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]235; SSE-NEXT: retq236;237; AVX-LABEL: fptosi_4f64_to_4i32:238; AVX: # %bb.0:239; AVX-NEXT: vcvttpd2dq %ymm0, %xmm0240; AVX-NEXT: vzeroupper241; AVX-NEXT: retq242 %cvt = fptosi <4 x double> %a to <4 x i32>243 ret <4 x i32> %cvt244}245 246;247; Double to Unsigned Integer248;249 250define <2 x i64> @fptoui_2f64_to_2i64(<2 x double> %a) {251; SSE-LABEL: fptoui_2f64_to_2i64:252; SSE: # %bb.0:253; SSE-NEXT: movsd {{.*#+}} xmm2 = [9.2233720368547758E+18,0.0E+0]254; SSE-NEXT: movapd %xmm0, %xmm1255; SSE-NEXT: subsd %xmm2, %xmm1256; SSE-NEXT: cvttsd2si %xmm1, %rax257; SSE-NEXT: cvttsd2si %xmm0, %rcx258; SSE-NEXT: movq %rcx, %rdx259; SSE-NEXT: sarq $63, %rdx260; SSE-NEXT: andq %rax, %rdx261; SSE-NEXT: orq %rcx, %rdx262; SSE-NEXT: movq %rdx, %xmm1263; SSE-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1,1]264; SSE-NEXT: cvttsd2si %xmm0, %rax265; SSE-NEXT: subsd %xmm2, %xmm0266; SSE-NEXT: cvttsd2si %xmm0, %rcx267; SSE-NEXT: movq %rax, %rdx268; SSE-NEXT: sarq $63, %rdx269; SSE-NEXT: andq %rcx, %rdx270; SSE-NEXT: orq %rax, %rdx271; SSE-NEXT: movq %rdx, %xmm0272; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]273; SSE-NEXT: movdqa %xmm1, %xmm0274; SSE-NEXT: retq275;276; VEX-LABEL: fptoui_2f64_to_2i64:277; VEX: # %bb.0:278; VEX-NEXT: vmovsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]279; VEX-NEXT: vsubsd %xmm1, %xmm0, %xmm2280; VEX-NEXT: vcvttsd2si %xmm2, %rax281; VEX-NEXT: vcvttsd2si %xmm0, %rcx282; VEX-NEXT: movq %rcx, %rdx283; VEX-NEXT: sarq $63, %rdx284; VEX-NEXT: andq %rax, %rdx285; VEX-NEXT: orq %rcx, %rdx286; VEX-NEXT: vmovq %rdx, %xmm2287; VEX-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]288; VEX-NEXT: vsubsd %xmm1, %xmm0, %xmm1289; VEX-NEXT: vcvttsd2si %xmm1, %rax290; VEX-NEXT: vcvttsd2si %xmm0, %rcx291; VEX-NEXT: movq %rcx, %rdx292; VEX-NEXT: sarq $63, %rdx293; VEX-NEXT: andq %rax, %rdx294; VEX-NEXT: orq %rcx, %rdx295; VEX-NEXT: vmovq %rdx, %xmm0296; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]297; VEX-NEXT: retq298;299; AVX512F-LABEL: fptoui_2f64_to_2i64:300; AVX512F: # %bb.0:301; AVX512F-NEXT: vcvttsd2usi %xmm0, %rax302; AVX512F-NEXT: vmovq %rax, %xmm1303; AVX512F-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]304; AVX512F-NEXT: vcvttsd2usi %xmm0, %rax305; AVX512F-NEXT: vmovq %rax, %xmm0306; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]307; AVX512F-NEXT: retq308;309; AVX512VL-LABEL: fptoui_2f64_to_2i64:310; AVX512VL: # %bb.0:311; AVX512VL-NEXT: vcvttsd2usi %xmm0, %rax312; AVX512VL-NEXT: vmovq %rax, %xmm1313; AVX512VL-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]314; AVX512VL-NEXT: vcvttsd2usi %xmm0, %rax315; AVX512VL-NEXT: vmovq %rax, %xmm0316; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]317; AVX512VL-NEXT: retq318;319; AVX512DQ-LABEL: fptoui_2f64_to_2i64:320; AVX512DQ: # %bb.0:321; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0322; AVX512DQ-NEXT: vcvttpd2uqq %zmm0, %zmm0323; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0324; AVX512DQ-NEXT: vzeroupper325; AVX512DQ-NEXT: retq326;327; AVX512VLDQ-LABEL: fptoui_2f64_to_2i64:328; AVX512VLDQ: # %bb.0:329; AVX512VLDQ-NEXT: vcvttpd2uqq %xmm0, %xmm0330; AVX512VLDQ-NEXT: retq331 %cvt = fptoui <2 x double> %a to <2 x i64>332 ret <2 x i64> %cvt333}334 335define <4 x i32> @fptoui_2f64_to_4i32(<2 x double> %a) {336; SSE-LABEL: fptoui_2f64_to_4i32:337; SSE: # %bb.0:338; SSE-NEXT: cvttpd2dq %xmm0, %xmm1339; SSE-NEXT: movapd %xmm1, %xmm2340; SSE-NEXT: psrad $31, %xmm2341; SSE-NEXT: addpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0342; SSE-NEXT: cvttpd2dq %xmm0, %xmm0343; SSE-NEXT: andpd %xmm2, %xmm0344; SSE-NEXT: orpd %xmm1, %xmm0345; SSE-NEXT: retq346;347; VEX-LABEL: fptoui_2f64_to_4i32:348; VEX: # %bb.0:349; VEX-NEXT: vcvttpd2dq %xmm0, %xmm1350; VEX-NEXT: vpsrad $31, %xmm1, %xmm2351; VEX-NEXT: vaddpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0352; VEX-NEXT: vcvttpd2dq %xmm0, %xmm0353; VEX-NEXT: vandpd %xmm2, %xmm0, %xmm0354; VEX-NEXT: vorpd %xmm0, %xmm1, %xmm0355; VEX-NEXT: retq356;357; AVX512F-LABEL: fptoui_2f64_to_4i32:358; AVX512F: # %bb.0:359; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0360; AVX512F-NEXT: vcvttpd2udq %zmm0, %ymm0361; AVX512F-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero362; AVX512F-NEXT: vzeroupper363; AVX512F-NEXT: retq364;365; AVX512VL-LABEL: fptoui_2f64_to_4i32:366; AVX512VL: # %bb.0:367; AVX512VL-NEXT: vcvttpd2udq %xmm0, %xmm0368; AVX512VL-NEXT: retq369;370; AVX512DQ-LABEL: fptoui_2f64_to_4i32:371; AVX512DQ: # %bb.0:372; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0373; AVX512DQ-NEXT: vcvttpd2udq %zmm0, %ymm0374; AVX512DQ-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero375; AVX512DQ-NEXT: vzeroupper376; AVX512DQ-NEXT: retq377;378; AVX512VLDQ-LABEL: fptoui_2f64_to_4i32:379; AVX512VLDQ: # %bb.0:380; AVX512VLDQ-NEXT: vcvttpd2udq %xmm0, %xmm0381; AVX512VLDQ-NEXT: retq382 %cvt = fptoui <2 x double> %a to <2 x i32>383 %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>384 ret <4 x i32> %ext385}386 387define <4 x i32> @fptoui_2f64_to_2i32(<2 x double> %a) {388; SSE-LABEL: fptoui_2f64_to_2i32:389; SSE: # %bb.0:390; SSE-NEXT: cvttpd2dq %xmm0, %xmm1391; SSE-NEXT: movapd %xmm1, %xmm2392; SSE-NEXT: psrad $31, %xmm2393; SSE-NEXT: addpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0394; SSE-NEXT: cvttpd2dq %xmm0, %xmm0395; SSE-NEXT: andpd %xmm2, %xmm0396; SSE-NEXT: orpd %xmm1, %xmm0397; SSE-NEXT: retq398;399; VEX-LABEL: fptoui_2f64_to_2i32:400; VEX: # %bb.0:401; VEX-NEXT: vcvttpd2dq %xmm0, %xmm1402; VEX-NEXT: vpsrad $31, %xmm1, %xmm2403; VEX-NEXT: vaddpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0404; VEX-NEXT: vcvttpd2dq %xmm0, %xmm0405; VEX-NEXT: vandpd %xmm2, %xmm0, %xmm0406; VEX-NEXT: vorpd %xmm0, %xmm1, %xmm0407; VEX-NEXT: retq408;409; AVX512F-LABEL: fptoui_2f64_to_2i32:410; AVX512F: # %bb.0:411; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0412; AVX512F-NEXT: vcvttpd2udq %zmm0, %ymm0413; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0414; AVX512F-NEXT: vzeroupper415; AVX512F-NEXT: retq416;417; AVX512VL-LABEL: fptoui_2f64_to_2i32:418; AVX512VL: # %bb.0:419; AVX512VL-NEXT: vcvttpd2udq %xmm0, %xmm0420; AVX512VL-NEXT: retq421;422; AVX512DQ-LABEL: fptoui_2f64_to_2i32:423; AVX512DQ: # %bb.0:424; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0425; AVX512DQ-NEXT: vcvttpd2udq %zmm0, %ymm0426; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0427; AVX512DQ-NEXT: vzeroupper428; AVX512DQ-NEXT: retq429;430; AVX512VLDQ-LABEL: fptoui_2f64_to_2i32:431; AVX512VLDQ: # %bb.0:432; AVX512VLDQ-NEXT: vcvttpd2udq %xmm0, %xmm0433; AVX512VLDQ-NEXT: retq434 %cvt = fptoui <2 x double> %a to <2 x i32>435 %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>436 ret <4 x i32> %ext437}438 439define <4 x i32> @fptoui_4f64_to_2i32(<2 x double> %a) {440; SSE-LABEL: fptoui_4f64_to_2i32:441; SSE: # %bb.0:442; SSE-NEXT: cvttpd2dq %xmm0, %xmm1443; SSE-NEXT: movapd %xmm1, %xmm2444; SSE-NEXT: psrad $31, %xmm2445; SSE-NEXT: addpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0446; SSE-NEXT: cvttpd2dq %xmm0, %xmm0447; SSE-NEXT: andpd %xmm2, %xmm0448; SSE-NEXT: orpd %xmm1, %xmm0449; SSE-NEXT: retq450;451; AVX1-LABEL: fptoui_4f64_to_2i32:452; AVX1: # %bb.0:453; AVX1-NEXT: vmovapd %xmm0, %xmm0454; AVX1-NEXT: vcvttpd2dq %ymm0, %xmm1455; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2456; AVX1-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0457; AVX1-NEXT: vcvttpd2dq %ymm0, %xmm0458; AVX1-NEXT: vandpd %xmm2, %xmm0, %xmm0459; AVX1-NEXT: vorpd %xmm0, %xmm1, %xmm0460; AVX1-NEXT: vzeroupper461; AVX1-NEXT: retq462;463; AVX2-LABEL: fptoui_4f64_to_2i32:464; AVX2: # %bb.0:465; AVX2-NEXT: vmovapd %xmm0, %xmm0466; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm1 = [2.147483648E+9,2.147483648E+9,2.147483648E+9,2.147483648E+9]467; AVX2-NEXT: vsubpd %ymm1, %ymm0, %ymm1468; AVX2-NEXT: vcvttpd2dq %ymm1, %xmm1469; AVX2-NEXT: vcvttpd2dq %ymm0, %xmm0470; AVX2-NEXT: vpsrad $31, %xmm0, %xmm2471; AVX2-NEXT: vandpd %xmm2, %xmm1, %xmm1472; AVX2-NEXT: vorpd %xmm1, %xmm0, %xmm0473; AVX2-NEXT: vzeroupper474; AVX2-NEXT: retq475;476; AVX512F-LABEL: fptoui_4f64_to_2i32:477; AVX512F: # %bb.0:478; AVX512F-NEXT: vmovaps %xmm0, %xmm0479; AVX512F-NEXT: vcvttpd2udq %zmm0, %ymm0480; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0481; AVX512F-NEXT: vzeroupper482; AVX512F-NEXT: retq483;484; AVX512VL-LABEL: fptoui_4f64_to_2i32:485; AVX512VL: # %bb.0:486; AVX512VL-NEXT: vmovaps %xmm0, %xmm0487; AVX512VL-NEXT: vcvttpd2udq %ymm0, %xmm0488; AVX512VL-NEXT: vzeroupper489; AVX512VL-NEXT: retq490;491; AVX512DQ-LABEL: fptoui_4f64_to_2i32:492; AVX512DQ: # %bb.0:493; AVX512DQ-NEXT: vmovaps %xmm0, %xmm0494; AVX512DQ-NEXT: vcvttpd2udq %zmm0, %ymm0495; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0496; AVX512DQ-NEXT: vzeroupper497; AVX512DQ-NEXT: retq498;499; AVX512VLDQ-LABEL: fptoui_4f64_to_2i32:500; AVX512VLDQ: # %bb.0:501; AVX512VLDQ-NEXT: vmovaps %xmm0, %xmm0502; AVX512VLDQ-NEXT: vcvttpd2udq %ymm0, %xmm0503; AVX512VLDQ-NEXT: vzeroupper504; AVX512VLDQ-NEXT: retq505 %ext = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>506 %cvt = fptoui <4 x double> %ext to <4 x i32>507 ret <4 x i32> %cvt508}509 510define <4 x i64> @fptoui_4f64_to_4i64(<4 x double> %a) {511; SSE-LABEL: fptoui_4f64_to_4i64:512; SSE: # %bb.0:513; SSE-NEXT: movapd %xmm0, %xmm2514; SSE-NEXT: movsd {{.*#+}} xmm3 = [9.2233720368547758E+18,0.0E+0]515; SSE-NEXT: subsd %xmm3, %xmm0516; SSE-NEXT: cvttsd2si %xmm0, %rax517; SSE-NEXT: cvttsd2si %xmm2, %rcx518; SSE-NEXT: movq %rcx, %rdx519; SSE-NEXT: sarq $63, %rdx520; SSE-NEXT: andq %rax, %rdx521; SSE-NEXT: orq %rcx, %rdx522; SSE-NEXT: movq %rdx, %xmm0523; SSE-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1,1]524; SSE-NEXT: cvttsd2si %xmm2, %rax525; SSE-NEXT: subsd %xmm3, %xmm2526; SSE-NEXT: cvttsd2si %xmm2, %rcx527; SSE-NEXT: movq %rax, %rdx528; SSE-NEXT: sarq $63, %rdx529; SSE-NEXT: andq %rcx, %rdx530; SSE-NEXT: orq %rax, %rdx531; SSE-NEXT: movq %rdx, %xmm2532; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]533; SSE-NEXT: movapd %xmm1, %xmm2534; SSE-NEXT: subsd %xmm3, %xmm2535; SSE-NEXT: cvttsd2si %xmm2, %rax536; SSE-NEXT: cvttsd2si %xmm1, %rcx537; SSE-NEXT: movq %rcx, %rdx538; SSE-NEXT: sarq $63, %rdx539; SSE-NEXT: andq %rax, %rdx540; SSE-NEXT: orq %rcx, %rdx541; SSE-NEXT: movq %rdx, %xmm2542; SSE-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1,1]543; SSE-NEXT: cvttsd2si %xmm1, %rax544; SSE-NEXT: subsd %xmm3, %xmm1545; SSE-NEXT: cvttsd2si %xmm1, %rcx546; SSE-NEXT: movq %rax, %rdx547; SSE-NEXT: sarq $63, %rdx548; SSE-NEXT: andq %rcx, %rdx549; SSE-NEXT: orq %rax, %rdx550; SSE-NEXT: movq %rdx, %xmm1551; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]552; SSE-NEXT: movdqa %xmm2, %xmm1553; SSE-NEXT: retq554;555; AVX1-LABEL: fptoui_4f64_to_4i64:556; AVX1: # %bb.0:557; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2558; AVX1-NEXT: vmovsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]559; AVX1-NEXT: vsubsd %xmm1, %xmm2, %xmm3560; AVX1-NEXT: vcvttsd2si %xmm3, %rax561; AVX1-NEXT: vcvttsd2si %xmm2, %rcx562; AVX1-NEXT: movq %rcx, %rdx563; AVX1-NEXT: sarq $63, %rdx564; AVX1-NEXT: andq %rax, %rdx565; AVX1-NEXT: orq %rcx, %rdx566; AVX1-NEXT: vmovq %rdx, %xmm3567; AVX1-NEXT: vshufpd {{.*#+}} xmm2 = xmm2[1,0]568; AVX1-NEXT: vsubsd %xmm1, %xmm2, %xmm4569; AVX1-NEXT: vcvttsd2si %xmm4, %rax570; AVX1-NEXT: vcvttsd2si %xmm2, %rcx571; AVX1-NEXT: movq %rcx, %rdx572; AVX1-NEXT: sarq $63, %rdx573; AVX1-NEXT: andq %rax, %rdx574; AVX1-NEXT: orq %rcx, %rdx575; AVX1-NEXT: vmovq %rdx, %xmm2576; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]577; AVX1-NEXT: vsubsd %xmm1, %xmm0, %xmm3578; AVX1-NEXT: vcvttsd2si %xmm3, %rax579; AVX1-NEXT: vcvttsd2si %xmm0, %rcx580; AVX1-NEXT: movq %rcx, %rdx581; AVX1-NEXT: sarq $63, %rdx582; AVX1-NEXT: andq %rax, %rdx583; AVX1-NEXT: orq %rcx, %rdx584; AVX1-NEXT: vmovq %rdx, %xmm3585; AVX1-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]586; AVX1-NEXT: vsubsd %xmm1, %xmm0, %xmm1587; AVX1-NEXT: vcvttsd2si %xmm1, %rax588; AVX1-NEXT: vcvttsd2si %xmm0, %rcx589; AVX1-NEXT: movq %rcx, %rdx590; AVX1-NEXT: sarq $63, %rdx591; AVX1-NEXT: andq %rax, %rdx592; AVX1-NEXT: orq %rcx, %rdx593; AVX1-NEXT: vmovq %rdx, %xmm0594; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]595; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0596; AVX1-NEXT: retq597;598; AVX2-LABEL: fptoui_4f64_to_4i64:599; AVX2: # %bb.0:600; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm2601; AVX2-NEXT: vmovsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]602; AVX2-NEXT: vsubsd %xmm1, %xmm2, %xmm3603; AVX2-NEXT: vcvttsd2si %xmm3, %rax604; AVX2-NEXT: vcvttsd2si %xmm2, %rcx605; AVX2-NEXT: movq %rcx, %rdx606; AVX2-NEXT: sarq $63, %rdx607; AVX2-NEXT: andq %rax, %rdx608; AVX2-NEXT: orq %rcx, %rdx609; AVX2-NEXT: vmovq %rdx, %xmm3610; AVX2-NEXT: vshufpd {{.*#+}} xmm2 = xmm2[1,0]611; AVX2-NEXT: vsubsd %xmm1, %xmm2, %xmm4612; AVX2-NEXT: vcvttsd2si %xmm4, %rax613; AVX2-NEXT: vcvttsd2si %xmm2, %rcx614; AVX2-NEXT: movq %rcx, %rdx615; AVX2-NEXT: sarq $63, %rdx616; AVX2-NEXT: andq %rax, %rdx617; AVX2-NEXT: orq %rcx, %rdx618; AVX2-NEXT: vmovq %rdx, %xmm2619; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]620; AVX2-NEXT: vsubsd %xmm1, %xmm0, %xmm3621; AVX2-NEXT: vcvttsd2si %xmm3, %rax622; AVX2-NEXT: vcvttsd2si %xmm0, %rcx623; AVX2-NEXT: movq %rcx, %rdx624; AVX2-NEXT: sarq $63, %rdx625; AVX2-NEXT: andq %rax, %rdx626; AVX2-NEXT: orq %rcx, %rdx627; AVX2-NEXT: vmovq %rdx, %xmm3628; AVX2-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]629; AVX2-NEXT: vsubsd %xmm1, %xmm0, %xmm1630; AVX2-NEXT: vcvttsd2si %xmm1, %rax631; AVX2-NEXT: vcvttsd2si %xmm0, %rcx632; AVX2-NEXT: movq %rcx, %rdx633; AVX2-NEXT: sarq $63, %rdx634; AVX2-NEXT: andq %rax, %rdx635; AVX2-NEXT: orq %rcx, %rdx636; AVX2-NEXT: vmovq %rdx, %xmm0637; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]638; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0639; AVX2-NEXT: retq640;641; AVX512F-LABEL: fptoui_4f64_to_4i64:642; AVX512F: # %bb.0:643; AVX512F-NEXT: vextractf128 $1, %ymm0, %xmm1644; AVX512F-NEXT: vcvttsd2usi %xmm1, %rax645; AVX512F-NEXT: vmovq %rax, %xmm2646; AVX512F-NEXT: vshufpd {{.*#+}} xmm1 = xmm1[1,0]647; AVX512F-NEXT: vcvttsd2usi %xmm1, %rax648; AVX512F-NEXT: vmovq %rax, %xmm1649; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]650; AVX512F-NEXT: vcvttsd2usi %xmm0, %rax651; AVX512F-NEXT: vmovq %rax, %xmm2652; AVX512F-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]653; AVX512F-NEXT: vcvttsd2usi %xmm0, %rax654; AVX512F-NEXT: vmovq %rax, %xmm0655; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]656; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0657; AVX512F-NEXT: retq658;659; AVX512VL-LABEL: fptoui_4f64_to_4i64:660; AVX512VL: # %bb.0:661; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm1662; AVX512VL-NEXT: vcvttsd2usi %xmm1, %rax663; AVX512VL-NEXT: vmovq %rax, %xmm2664; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm1[1,0]665; AVX512VL-NEXT: vcvttsd2usi %xmm1, %rax666; AVX512VL-NEXT: vmovq %rax, %xmm1667; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]668; AVX512VL-NEXT: vcvttsd2usi %xmm0, %rax669; AVX512VL-NEXT: vmovq %rax, %xmm2670; AVX512VL-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]671; AVX512VL-NEXT: vcvttsd2usi %xmm0, %rax672; AVX512VL-NEXT: vmovq %rax, %xmm0673; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]674; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0675; AVX512VL-NEXT: retq676;677; AVX512DQ-LABEL: fptoui_4f64_to_4i64:678; AVX512DQ: # %bb.0:679; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0680; AVX512DQ-NEXT: vcvttpd2uqq %zmm0, %zmm0681; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0682; AVX512DQ-NEXT: retq683;684; AVX512VLDQ-LABEL: fptoui_4f64_to_4i64:685; AVX512VLDQ: # %bb.0:686; AVX512VLDQ-NEXT: vcvttpd2uqq %ymm0, %ymm0687; AVX512VLDQ-NEXT: retq688 %cvt = fptoui <4 x double> %a to <4 x i64>689 ret <4 x i64> %cvt690}691 692define <4 x i32> @fptoui_4f64_to_4i32(<4 x double> %a) {693; SSE-LABEL: fptoui_4f64_to_4i32:694; SSE: # %bb.0:695; SSE-NEXT: movapd {{.*#+}} xmm2 = [2.147483648E+9,2.147483648E+9]696; SSE-NEXT: cvttpd2dq %xmm1, %xmm3697; SSE-NEXT: subpd %xmm2, %xmm1698; SSE-NEXT: cvttpd2dq %xmm1, %xmm1699; SSE-NEXT: movapd %xmm3, %xmm4700; SSE-NEXT: psrad $31, %xmm4701; SSE-NEXT: pand %xmm1, %xmm4702; SSE-NEXT: por %xmm3, %xmm4703; SSE-NEXT: cvttpd2dq %xmm0, %xmm1704; SSE-NEXT: subpd %xmm2, %xmm0705; SSE-NEXT: cvttpd2dq %xmm0, %xmm2706; SSE-NEXT: movapd %xmm1, %xmm0707; SSE-NEXT: psrad $31, %xmm0708; SSE-NEXT: pand %xmm2, %xmm0709; SSE-NEXT: por %xmm1, %xmm0710; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm4[0]711; SSE-NEXT: retq712;713; AVX1-LABEL: fptoui_4f64_to_4i32:714; AVX1: # %bb.0:715; AVX1-NEXT: vcvttpd2dq %ymm0, %xmm1716; AVX1-NEXT: vpsrad $31, %xmm1, %xmm2717; AVX1-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0718; AVX1-NEXT: vcvttpd2dq %ymm0, %xmm0719; AVX1-NEXT: vandpd %xmm2, %xmm0, %xmm0720; AVX1-NEXT: vorpd %xmm0, %xmm1, %xmm0721; AVX1-NEXT: vzeroupper722; AVX1-NEXT: retq723;724; AVX2-LABEL: fptoui_4f64_to_4i32:725; AVX2: # %bb.0:726; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm1 = [2.147483648E+9,2.147483648E+9,2.147483648E+9,2.147483648E+9]727; AVX2-NEXT: vsubpd %ymm1, %ymm0, %ymm1728; AVX2-NEXT: vcvttpd2dq %ymm1, %xmm1729; AVX2-NEXT: vcvttpd2dq %ymm0, %xmm0730; AVX2-NEXT: vpsrad $31, %xmm0, %xmm2731; AVX2-NEXT: vandpd %xmm2, %xmm1, %xmm1732; AVX2-NEXT: vorpd %xmm1, %xmm0, %xmm0733; AVX2-NEXT: vzeroupper734; AVX2-NEXT: retq735;736; AVX512F-LABEL: fptoui_4f64_to_4i32:737; AVX512F: # %bb.0:738; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0739; AVX512F-NEXT: vcvttpd2udq %zmm0, %ymm0740; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0741; AVX512F-NEXT: vzeroupper742; AVX512F-NEXT: retq743;744; AVX512VL-LABEL: fptoui_4f64_to_4i32:745; AVX512VL: # %bb.0:746; AVX512VL-NEXT: vcvttpd2udq %ymm0, %xmm0747; AVX512VL-NEXT: vzeroupper748; AVX512VL-NEXT: retq749;750; AVX512DQ-LABEL: fptoui_4f64_to_4i32:751; AVX512DQ: # %bb.0:752; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0753; AVX512DQ-NEXT: vcvttpd2udq %zmm0, %ymm0754; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0755; AVX512DQ-NEXT: vzeroupper756; AVX512DQ-NEXT: retq757;758; AVX512VLDQ-LABEL: fptoui_4f64_to_4i32:759; AVX512VLDQ: # %bb.0:760; AVX512VLDQ-NEXT: vcvttpd2udq %ymm0, %xmm0761; AVX512VLDQ-NEXT: vzeroupper762; AVX512VLDQ-NEXT: retq763 %cvt = fptoui <4 x double> %a to <4 x i32>764 ret <4 x i32> %cvt765}766 767;768; Float to Signed Integer769;770 771define <2 x i32> @fptosi_2f32_to_2i32(<2 x float> %a) {772; SSE-LABEL: fptosi_2f32_to_2i32:773; SSE: # %bb.0:774; SSE-NEXT: cvttps2dq %xmm0, %xmm0775; SSE-NEXT: retq776;777; AVX-LABEL: fptosi_2f32_to_2i32:778; AVX: # %bb.0:779; AVX-NEXT: vcvttps2dq %xmm0, %xmm0780; AVX-NEXT: retq781 %cvt = fptosi <2 x float> %a to <2 x i32>782 ret <2 x i32> %cvt783}784 785define <4 x i32> @fptosi_4f32_to_4i32(<4 x float> %a) {786; SSE-LABEL: fptosi_4f32_to_4i32:787; SSE: # %bb.0:788; SSE-NEXT: cvttps2dq %xmm0, %xmm0789; SSE-NEXT: retq790;791; AVX-LABEL: fptosi_4f32_to_4i32:792; AVX: # %bb.0:793; AVX-NEXT: vcvttps2dq %xmm0, %xmm0794; AVX-NEXT: retq795 %cvt = fptosi <4 x float> %a to <4 x i32>796 ret <4 x i32> %cvt797}798 799define <2 x i64> @fptosi_2f32_to_2i64(<4 x float> %a) {800; SSE-LABEL: fptosi_2f32_to_2i64:801; SSE: # %bb.0:802; SSE-NEXT: cvttss2si %xmm0, %rax803; SSE-NEXT: movq %rax, %xmm1804; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]805; SSE-NEXT: cvttss2si %xmm0, %rax806; SSE-NEXT: movq %rax, %xmm0807; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]808; SSE-NEXT: movdqa %xmm1, %xmm0809; SSE-NEXT: retq810;811; VEX-LABEL: fptosi_2f32_to_2i64:812; VEX: # %bb.0:813; VEX-NEXT: vcvttss2si %xmm0, %rax814; VEX-NEXT: vmovq %rax, %xmm1815; VEX-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]816; VEX-NEXT: vcvttss2si %xmm0, %rax817; VEX-NEXT: vmovq %rax, %xmm0818; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]819; VEX-NEXT: retq820;821; AVX512F-LABEL: fptosi_2f32_to_2i64:822; AVX512F: # %bb.0:823; AVX512F-NEXT: vcvttss2si %xmm0, %rax824; AVX512F-NEXT: vmovq %rax, %xmm1825; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]826; AVX512F-NEXT: vcvttss2si %xmm0, %rax827; AVX512F-NEXT: vmovq %rax, %xmm0828; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]829; AVX512F-NEXT: retq830;831; AVX512VL-LABEL: fptosi_2f32_to_2i64:832; AVX512VL: # %bb.0:833; AVX512VL-NEXT: vcvttss2si %xmm0, %rax834; AVX512VL-NEXT: vmovq %rax, %xmm1835; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]836; AVX512VL-NEXT: vcvttss2si %xmm0, %rax837; AVX512VL-NEXT: vmovq %rax, %xmm0838; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]839; AVX512VL-NEXT: retq840;841; AVX512DQ-LABEL: fptosi_2f32_to_2i64:842; AVX512DQ: # %bb.0:843; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0844; AVX512DQ-NEXT: vcvttps2qq %ymm0, %zmm0845; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0846; AVX512DQ-NEXT: vzeroupper847; AVX512DQ-NEXT: retq848;849; AVX512VLDQ-LABEL: fptosi_2f32_to_2i64:850; AVX512VLDQ: # %bb.0:851; AVX512VLDQ-NEXT: vcvttps2qq %xmm0, %xmm0852; AVX512VLDQ-NEXT: retq853 %shuf = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 1>854 %cvt = fptosi <2 x float> %shuf to <2 x i64>855 ret <2 x i64> %cvt856}857 858define <2 x i64> @fptosi_4f32_to_2i64(<4 x float> %a) {859; SSE-LABEL: fptosi_4f32_to_2i64:860; SSE: # %bb.0:861; SSE-NEXT: cvttss2si %xmm0, %rax862; SSE-NEXT: movq %rax, %xmm1863; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]864; SSE-NEXT: cvttss2si %xmm0, %rax865; SSE-NEXT: movq %rax, %xmm0866; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]867; SSE-NEXT: movdqa %xmm1, %xmm0868; SSE-NEXT: retq869;870; VEX-LABEL: fptosi_4f32_to_2i64:871; VEX: # %bb.0:872; VEX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]873; VEX-NEXT: vcvttss2si %xmm1, %rax874; VEX-NEXT: vcvttss2si %xmm0, %rcx875; VEX-NEXT: vmovq %rcx, %xmm0876; VEX-NEXT: vmovq %rax, %xmm1877; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]878; VEX-NEXT: retq879;880; AVX512F-LABEL: fptosi_4f32_to_2i64:881; AVX512F: # %bb.0:882; AVX512F-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]883; AVX512F-NEXT: vcvttss2si %xmm1, %rax884; AVX512F-NEXT: vcvttss2si %xmm0, %rcx885; AVX512F-NEXT: vmovq %rcx, %xmm0886; AVX512F-NEXT: vmovq %rax, %xmm1887; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]888; AVX512F-NEXT: retq889;890; AVX512VL-LABEL: fptosi_4f32_to_2i64:891; AVX512VL: # %bb.0:892; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]893; AVX512VL-NEXT: vcvttss2si %xmm1, %rax894; AVX512VL-NEXT: vcvttss2si %xmm0, %rcx895; AVX512VL-NEXT: vmovq %rcx, %xmm0896; AVX512VL-NEXT: vmovq %rax, %xmm1897; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]898; AVX512VL-NEXT: retq899;900; AVX512DQ-LABEL: fptosi_4f32_to_2i64:901; AVX512DQ: # %bb.0:902; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0903; AVX512DQ-NEXT: vcvttps2qq %ymm0, %zmm0904; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0905; AVX512DQ-NEXT: vzeroupper906; AVX512DQ-NEXT: retq907;908; AVX512VLDQ-LABEL: fptosi_4f32_to_2i64:909; AVX512VLDQ: # %bb.0:910; AVX512VLDQ-NEXT: vcvttps2qq %xmm0, %ymm0911; AVX512VLDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0912; AVX512VLDQ-NEXT: vzeroupper913; AVX512VLDQ-NEXT: retq914 %cvt = fptosi <4 x float> %a to <4 x i64>915 %shuf = shufflevector <4 x i64> %cvt, <4 x i64> undef, <2 x i32> <i32 0, i32 1>916 ret <2 x i64> %shuf917}918 919define <8 x i32> @fptosi_8f32_to_8i32(<8 x float> %a) {920; SSE-LABEL: fptosi_8f32_to_8i32:921; SSE: # %bb.0:922; SSE-NEXT: cvttps2dq %xmm0, %xmm0923; SSE-NEXT: cvttps2dq %xmm1, %xmm1924; SSE-NEXT: retq925;926; AVX-LABEL: fptosi_8f32_to_8i32:927; AVX: # %bb.0:928; AVX-NEXT: vcvttps2dq %ymm0, %ymm0929; AVX-NEXT: retq930 %cvt = fptosi <8 x float> %a to <8 x i32>931 ret <8 x i32> %cvt932}933 934define <4 x i64> @fptosi_4f32_to_4i64(<8 x float> %a) {935; SSE-LABEL: fptosi_4f32_to_4i64:936; SSE: # %bb.0:937; SSE-NEXT: cvttss2si %xmm0, %rax938; SSE-NEXT: movq %rax, %xmm2939; SSE-NEXT: movaps %xmm0, %xmm1940; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]941; SSE-NEXT: cvttss2si %xmm1, %rax942; SSE-NEXT: movq %rax, %xmm1943; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]944; SSE-NEXT: movaps %xmm0, %xmm1945; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3],xmm0[3,3]946; SSE-NEXT: cvttss2si %xmm1, %rax947; SSE-NEXT: movq %rax, %xmm3948; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]949; SSE-NEXT: cvttss2si %xmm0, %rax950; SSE-NEXT: movq %rax, %xmm1951; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]952; SSE-NEXT: movdqa %xmm2, %xmm0953; SSE-NEXT: retq954;955; AVX1-LABEL: fptosi_4f32_to_4i64:956; AVX1: # %bb.0:957; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]958; AVX1-NEXT: vcvttss2si %xmm1, %rax959; AVX1-NEXT: vmovq %rax, %xmm1960; AVX1-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]961; AVX1-NEXT: vcvttss2si %xmm2, %rax962; AVX1-NEXT: vmovq %rax, %xmm2963; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]964; AVX1-NEXT: vcvttss2si %xmm0, %rax965; AVX1-NEXT: vmovq %rax, %xmm2966; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]967; AVX1-NEXT: vcvttss2si %xmm0, %rax968; AVX1-NEXT: vmovq %rax, %xmm0969; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]970; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0971; AVX1-NEXT: retq972;973; AVX2-LABEL: fptosi_4f32_to_4i64:974; AVX2: # %bb.0:975; AVX2-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]976; AVX2-NEXT: vcvttss2si %xmm1, %rax977; AVX2-NEXT: vmovq %rax, %xmm1978; AVX2-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]979; AVX2-NEXT: vcvttss2si %xmm2, %rax980; AVX2-NEXT: vmovq %rax, %xmm2981; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]982; AVX2-NEXT: vcvttss2si %xmm0, %rax983; AVX2-NEXT: vmovq %rax, %xmm2984; AVX2-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]985; AVX2-NEXT: vcvttss2si %xmm0, %rax986; AVX2-NEXT: vmovq %rax, %xmm0987; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]988; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0989; AVX2-NEXT: retq990;991; AVX512F-LABEL: fptosi_4f32_to_4i64:992; AVX512F: # %bb.0:993; AVX512F-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]994; AVX512F-NEXT: vcvttss2si %xmm1, %rax995; AVX512F-NEXT: vmovq %rax, %xmm1996; AVX512F-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]997; AVX512F-NEXT: vcvttss2si %xmm2, %rax998; AVX512F-NEXT: vmovq %rax, %xmm2999; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]1000; AVX512F-NEXT: vcvttss2si %xmm0, %rax1001; AVX512F-NEXT: vmovq %rax, %xmm21002; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1003; AVX512F-NEXT: vcvttss2si %xmm0, %rax1004; AVX512F-NEXT: vmovq %rax, %xmm01005; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]1006; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01007; AVX512F-NEXT: retq1008;1009; AVX512VL-LABEL: fptosi_4f32_to_4i64:1010; AVX512VL: # %bb.0:1011; AVX512VL-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]1012; AVX512VL-NEXT: vcvttss2si %xmm1, %rax1013; AVX512VL-NEXT: vmovq %rax, %xmm11014; AVX512VL-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]1015; AVX512VL-NEXT: vcvttss2si %xmm2, %rax1016; AVX512VL-NEXT: vmovq %rax, %xmm21017; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]1018; AVX512VL-NEXT: vcvttss2si %xmm0, %rax1019; AVX512VL-NEXT: vmovq %rax, %xmm21020; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1021; AVX512VL-NEXT: vcvttss2si %xmm0, %rax1022; AVX512VL-NEXT: vmovq %rax, %xmm01023; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]1024; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01025; AVX512VL-NEXT: retq1026;1027; AVX512DQ-LABEL: fptosi_4f32_to_4i64:1028; AVX512DQ: # %bb.0:1029; AVX512DQ-NEXT: vcvttps2qq %ymm0, %zmm01030; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01031; AVX512DQ-NEXT: retq1032;1033; AVX512VLDQ-LABEL: fptosi_4f32_to_4i64:1034; AVX512VLDQ: # %bb.0:1035; AVX512VLDQ-NEXT: vcvttps2qq %xmm0, %ymm01036; AVX512VLDQ-NEXT: retq1037 %shuf = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1038 %cvt = fptosi <4 x float> %shuf to <4 x i64>1039 ret <4 x i64> %cvt1040}1041 1042define <4 x i64> @fptosi_8f32_to_4i64(<8 x float> %a) {1043; SSE-LABEL: fptosi_8f32_to_4i64:1044; SSE: # %bb.0:1045; SSE-NEXT: cvttss2si %xmm0, %rax1046; SSE-NEXT: movq %rax, %xmm21047; SSE-NEXT: movaps %xmm0, %xmm11048; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]1049; SSE-NEXT: cvttss2si %xmm1, %rax1050; SSE-NEXT: movq %rax, %xmm11051; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]1052; SSE-NEXT: movaps %xmm0, %xmm11053; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,3],xmm0[3,3]1054; SSE-NEXT: cvttss2si %xmm1, %rax1055; SSE-NEXT: movq %rax, %xmm31056; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]1057; SSE-NEXT: cvttss2si %xmm0, %rax1058; SSE-NEXT: movq %rax, %xmm11059; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]1060; SSE-NEXT: movdqa %xmm2, %xmm01061; SSE-NEXT: retq1062;1063; AVX1-LABEL: fptosi_8f32_to_4i64:1064; AVX1: # %bb.0:1065; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]1066; AVX1-NEXT: vcvttss2si %xmm1, %rax1067; AVX1-NEXT: vmovq %rax, %xmm11068; AVX1-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]1069; AVX1-NEXT: vcvttss2si %xmm2, %rax1070; AVX1-NEXT: vmovq %rax, %xmm21071; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]1072; AVX1-NEXT: vcvttss2si %xmm0, %rax1073; AVX1-NEXT: vmovq %rax, %xmm21074; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1075; AVX1-NEXT: vcvttss2si %xmm0, %rax1076; AVX1-NEXT: vmovq %rax, %xmm01077; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]1078; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01079; AVX1-NEXT: retq1080;1081; AVX2-LABEL: fptosi_8f32_to_4i64:1082; AVX2: # %bb.0:1083; AVX2-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]1084; AVX2-NEXT: vcvttss2si %xmm1, %rax1085; AVX2-NEXT: vmovq %rax, %xmm11086; AVX2-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]1087; AVX2-NEXT: vcvttss2si %xmm2, %rax1088; AVX2-NEXT: vmovq %rax, %xmm21089; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]1090; AVX2-NEXT: vcvttss2si %xmm0, %rax1091; AVX2-NEXT: vmovq %rax, %xmm21092; AVX2-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1093; AVX2-NEXT: vcvttss2si %xmm0, %rax1094; AVX2-NEXT: vmovq %rax, %xmm01095; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]1096; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01097; AVX2-NEXT: retq1098;1099; AVX512F-LABEL: fptosi_8f32_to_4i64:1100; AVX512F: # %bb.0:1101; AVX512F-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]1102; AVX512F-NEXT: vcvttss2si %xmm1, %rax1103; AVX512F-NEXT: vcvttss2si %xmm0, %rcx1104; AVX512F-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]1105; AVX512F-NEXT: vcvttss2si %xmm1, %rdx1106; AVX512F-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]1107; AVX512F-NEXT: vcvttss2si %xmm0, %rsi1108; AVX512F-NEXT: vmovq %rsi, %xmm01109; AVX512F-NEXT: vmovq %rdx, %xmm11110; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1111; AVX512F-NEXT: vmovq %rcx, %xmm11112; AVX512F-NEXT: vmovq %rax, %xmm21113; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]1114; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm01115; AVX512F-NEXT: retq1116;1117; AVX512VL-LABEL: fptosi_8f32_to_4i64:1118; AVX512VL: # %bb.0:1119; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]1120; AVX512VL-NEXT: vcvttss2si %xmm1, %rax1121; AVX512VL-NEXT: vcvttss2si %xmm0, %rcx1122; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]1123; AVX512VL-NEXT: vcvttss2si %xmm1, %rdx1124; AVX512VL-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]1125; AVX512VL-NEXT: vcvttss2si %xmm0, %rsi1126; AVX512VL-NEXT: vmovq %rsi, %xmm01127; AVX512VL-NEXT: vmovq %rdx, %xmm11128; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1129; AVX512VL-NEXT: vmovq %rcx, %xmm11130; AVX512VL-NEXT: vmovq %rax, %xmm21131; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]1132; AVX512VL-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm01133; AVX512VL-NEXT: retq1134;1135; AVX512DQ-LABEL: fptosi_8f32_to_4i64:1136; AVX512DQ: # %bb.0:1137; AVX512DQ-NEXT: vcvttps2qq %ymm0, %zmm01138; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01139; AVX512DQ-NEXT: retq1140;1141; AVX512VLDQ-LABEL: fptosi_8f32_to_4i64:1142; AVX512VLDQ: # %bb.0:1143; AVX512VLDQ-NEXT: vcvttps2qq %ymm0, %zmm01144; AVX512VLDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01145; AVX512VLDQ-NEXT: retq1146 %cvt = fptosi <8 x float> %a to <8 x i64>1147 %shuf = shufflevector <8 x i64> %cvt, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1148 ret <4 x i64> %shuf1149}1150 1151;1152; Float to Unsigned Integer1153;1154 1155define <2 x i32> @fptoui_2f32_to_2i32(<2 x float> %a) {1156; SSE-LABEL: fptoui_2f32_to_2i32:1157; SSE: # %bb.0:1158; SSE-NEXT: cvttps2dq %xmm0, %xmm11159; SSE-NEXT: movdqa %xmm1, %xmm21160; SSE-NEXT: psrad $31, %xmm21161; SSE-NEXT: subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01162; SSE-NEXT: cvttps2dq %xmm0, %xmm01163; SSE-NEXT: pand %xmm2, %xmm01164; SSE-NEXT: por %xmm1, %xmm01165; SSE-NEXT: retq1166;1167; AVX1-LABEL: fptoui_2f32_to_2i32:1168; AVX1: # %bb.0:1169; AVX1-NEXT: vcvttps2dq %xmm0, %xmm11170; AVX1-NEXT: vpsrad $31, %xmm1, %xmm21171; AVX1-NEXT: vsubps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01172; AVX1-NEXT: vcvttps2dq %xmm0, %xmm01173; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm01174; AVX1-NEXT: vpor %xmm0, %xmm1, %xmm01175; AVX1-NEXT: retq1176;1177; AVX2-LABEL: fptoui_2f32_to_2i32:1178; AVX2: # %bb.0:1179; AVX2-NEXT: vbroadcastss {{.*#+}} xmm1 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]1180; AVX2-NEXT: vsubps %xmm1, %xmm0, %xmm11181; AVX2-NEXT: vcvttps2dq %xmm1, %xmm11182; AVX2-NEXT: vcvttps2dq %xmm0, %xmm01183; AVX2-NEXT: vpsrad $31, %xmm0, %xmm21184; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm11185; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01186; AVX2-NEXT: retq1187;1188; AVX512F-LABEL: fptoui_2f32_to_2i32:1189; AVX512F: # %bb.0:1190; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01191; AVX512F-NEXT: vcvttps2udq %zmm0, %zmm01192; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01193; AVX512F-NEXT: vzeroupper1194; AVX512F-NEXT: retq1195;1196; AVX512VL-LABEL: fptoui_2f32_to_2i32:1197; AVX512VL: # %bb.0:1198; AVX512VL-NEXT: vcvttps2udq %xmm0, %xmm01199; AVX512VL-NEXT: retq1200;1201; AVX512DQ-LABEL: fptoui_2f32_to_2i32:1202; AVX512DQ: # %bb.0:1203; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01204; AVX512DQ-NEXT: vcvttps2udq %zmm0, %zmm01205; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01206; AVX512DQ-NEXT: vzeroupper1207; AVX512DQ-NEXT: retq1208;1209; AVX512VLDQ-LABEL: fptoui_2f32_to_2i32:1210; AVX512VLDQ: # %bb.0:1211; AVX512VLDQ-NEXT: vcvttps2udq %xmm0, %xmm01212; AVX512VLDQ-NEXT: retq1213 %cvt = fptoui <2 x float> %a to <2 x i32>1214 ret <2 x i32> %cvt1215}1216 1217define <4 x i32> @fptoui_4f32_to_4i32(<4 x float> %a) {1218; SSE-LABEL: fptoui_4f32_to_4i32:1219; SSE: # %bb.0:1220; SSE-NEXT: cvttps2dq %xmm0, %xmm11221; SSE-NEXT: movdqa %xmm1, %xmm21222; SSE-NEXT: psrad $31, %xmm21223; SSE-NEXT: subps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01224; SSE-NEXT: cvttps2dq %xmm0, %xmm01225; SSE-NEXT: pand %xmm2, %xmm01226; SSE-NEXT: por %xmm1, %xmm01227; SSE-NEXT: retq1228;1229; AVX1-LABEL: fptoui_4f32_to_4i32:1230; AVX1: # %bb.0:1231; AVX1-NEXT: vcvttps2dq %xmm0, %xmm11232; AVX1-NEXT: vpsrad $31, %xmm1, %xmm21233; AVX1-NEXT: vsubps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01234; AVX1-NEXT: vcvttps2dq %xmm0, %xmm01235; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm01236; AVX1-NEXT: vpor %xmm0, %xmm1, %xmm01237; AVX1-NEXT: retq1238;1239; AVX2-LABEL: fptoui_4f32_to_4i32:1240; AVX2: # %bb.0:1241; AVX2-NEXT: vbroadcastss {{.*#+}} xmm1 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]1242; AVX2-NEXT: vsubps %xmm1, %xmm0, %xmm11243; AVX2-NEXT: vcvttps2dq %xmm1, %xmm11244; AVX2-NEXT: vcvttps2dq %xmm0, %xmm01245; AVX2-NEXT: vpsrad $31, %xmm0, %xmm21246; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm11247; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm01248; AVX2-NEXT: retq1249;1250; AVX512F-LABEL: fptoui_4f32_to_4i32:1251; AVX512F: # %bb.0:1252; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01253; AVX512F-NEXT: vcvttps2udq %zmm0, %zmm01254; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01255; AVX512F-NEXT: vzeroupper1256; AVX512F-NEXT: retq1257;1258; AVX512VL-LABEL: fptoui_4f32_to_4i32:1259; AVX512VL: # %bb.0:1260; AVX512VL-NEXT: vcvttps2udq %xmm0, %xmm01261; AVX512VL-NEXT: retq1262;1263; AVX512DQ-LABEL: fptoui_4f32_to_4i32:1264; AVX512DQ: # %bb.0:1265; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01266; AVX512DQ-NEXT: vcvttps2udq %zmm0, %zmm01267; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01268; AVX512DQ-NEXT: vzeroupper1269; AVX512DQ-NEXT: retq1270;1271; AVX512VLDQ-LABEL: fptoui_4f32_to_4i32:1272; AVX512VLDQ: # %bb.0:1273; AVX512VLDQ-NEXT: vcvttps2udq %xmm0, %xmm01274; AVX512VLDQ-NEXT: retq1275 %cvt = fptoui <4 x float> %a to <4 x i32>1276 ret <4 x i32> %cvt1277}1278 1279define <2 x i64> @fptoui_2f32_to_2i64(<4 x float> %a) {1280; SSE-LABEL: fptoui_2f32_to_2i64:1281; SSE: # %bb.0:1282; SSE-NEXT: movss {{.*#+}} xmm2 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]1283; SSE-NEXT: movaps %xmm0, %xmm11284; SSE-NEXT: subss %xmm2, %xmm11285; SSE-NEXT: cvttss2si %xmm1, %rax1286; SSE-NEXT: cvttss2si %xmm0, %rcx1287; SSE-NEXT: movq %rcx, %rdx1288; SSE-NEXT: sarq $63, %rdx1289; SSE-NEXT: andq %rax, %rdx1290; SSE-NEXT: orq %rcx, %rdx1291; SSE-NEXT: movq %rdx, %xmm11292; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]1293; SSE-NEXT: cvttss2si %xmm0, %rax1294; SSE-NEXT: subss %xmm2, %xmm01295; SSE-NEXT: cvttss2si %xmm0, %rcx1296; SSE-NEXT: movq %rax, %rdx1297; SSE-NEXT: sarq $63, %rdx1298; SSE-NEXT: andq %rcx, %rdx1299; SSE-NEXT: orq %rax, %rdx1300; SSE-NEXT: movq %rdx, %xmm01301; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]1302; SSE-NEXT: movdqa %xmm1, %xmm01303; SSE-NEXT: retq1304;1305; VEX-LABEL: fptoui_2f32_to_2i64:1306; VEX: # %bb.0:1307; VEX-NEXT: vmovss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]1308; VEX-NEXT: vsubss %xmm1, %xmm0, %xmm21309; VEX-NEXT: vcvttss2si %xmm2, %rax1310; VEX-NEXT: vcvttss2si %xmm0, %rcx1311; VEX-NEXT: movq %rcx, %rdx1312; VEX-NEXT: sarq $63, %rdx1313; VEX-NEXT: andq %rax, %rdx1314; VEX-NEXT: orq %rcx, %rdx1315; VEX-NEXT: vmovq %rdx, %xmm21316; VEX-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1317; VEX-NEXT: vsubss %xmm1, %xmm0, %xmm11318; VEX-NEXT: vcvttss2si %xmm1, %rax1319; VEX-NEXT: vcvttss2si %xmm0, %rcx1320; VEX-NEXT: movq %rcx, %rdx1321; VEX-NEXT: sarq $63, %rdx1322; VEX-NEXT: andq %rax, %rdx1323; VEX-NEXT: orq %rcx, %rdx1324; VEX-NEXT: vmovq %rdx, %xmm01325; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]1326; VEX-NEXT: retq1327;1328; AVX512F-LABEL: fptoui_2f32_to_2i64:1329; AVX512F: # %bb.0:1330; AVX512F-NEXT: vcvttss2usi %xmm0, %rax1331; AVX512F-NEXT: vmovq %rax, %xmm11332; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1333; AVX512F-NEXT: vcvttss2usi %xmm0, %rax1334; AVX512F-NEXT: vmovq %rax, %xmm01335; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1336; AVX512F-NEXT: retq1337;1338; AVX512VL-LABEL: fptoui_2f32_to_2i64:1339; AVX512VL: # %bb.0:1340; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax1341; AVX512VL-NEXT: vmovq %rax, %xmm11342; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1343; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax1344; AVX512VL-NEXT: vmovq %rax, %xmm01345; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1346; AVX512VL-NEXT: retq1347;1348; AVX512DQ-LABEL: fptoui_2f32_to_2i64:1349; AVX512DQ: # %bb.0:1350; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01351; AVX512DQ-NEXT: vcvttps2uqq %ymm0, %zmm01352; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01353; AVX512DQ-NEXT: vzeroupper1354; AVX512DQ-NEXT: retq1355;1356; AVX512VLDQ-LABEL: fptoui_2f32_to_2i64:1357; AVX512VLDQ: # %bb.0:1358; AVX512VLDQ-NEXT: vcvttps2uqq %xmm0, %xmm01359; AVX512VLDQ-NEXT: retq1360 %shuf = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 1>1361 %cvt = fptoui <2 x float> %shuf to <2 x i64>1362 ret <2 x i64> %cvt1363}1364 1365define <2 x i64> @fptoui_4f32_to_2i64(<4 x float> %a) {1366; SSE-LABEL: fptoui_4f32_to_2i64:1367; SSE: # %bb.0:1368; SSE-NEXT: movss {{.*#+}} xmm2 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]1369; SSE-NEXT: movaps %xmm0, %xmm11370; SSE-NEXT: subss %xmm2, %xmm11371; SSE-NEXT: cvttss2si %xmm1, %rax1372; SSE-NEXT: cvttss2si %xmm0, %rcx1373; SSE-NEXT: movq %rcx, %rdx1374; SSE-NEXT: sarq $63, %rdx1375; SSE-NEXT: andq %rax, %rdx1376; SSE-NEXT: orq %rcx, %rdx1377; SSE-NEXT: movq %rdx, %xmm11378; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]1379; SSE-NEXT: cvttss2si %xmm0, %rax1380; SSE-NEXT: subss %xmm2, %xmm01381; SSE-NEXT: cvttss2si %xmm0, %rcx1382; SSE-NEXT: movq %rax, %rdx1383; SSE-NEXT: sarq $63, %rdx1384; SSE-NEXT: andq %rcx, %rdx1385; SSE-NEXT: orq %rax, %rdx1386; SSE-NEXT: movq %rdx, %xmm01387; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]1388; SSE-NEXT: movdqa %xmm1, %xmm01389; SSE-NEXT: retq1390;1391; VEX-LABEL: fptoui_4f32_to_2i64:1392; VEX: # %bb.0:1393; VEX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]1394; VEX-NEXT: vmovss {{.*#+}} xmm2 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]1395; VEX-NEXT: vsubss %xmm2, %xmm1, %xmm31396; VEX-NEXT: vcvttss2si %xmm3, %rax1397; VEX-NEXT: vcvttss2si %xmm1, %rcx1398; VEX-NEXT: movq %rcx, %rdx1399; VEX-NEXT: sarq $63, %rdx1400; VEX-NEXT: andq %rax, %rdx1401; VEX-NEXT: orq %rcx, %rdx1402; VEX-NEXT: vsubss %xmm2, %xmm0, %xmm11403; VEX-NEXT: vcvttss2si %xmm1, %rax1404; VEX-NEXT: vcvttss2si %xmm0, %rcx1405; VEX-NEXT: movq %rcx, %rsi1406; VEX-NEXT: sarq $63, %rsi1407; VEX-NEXT: andq %rax, %rsi1408; VEX-NEXT: orq %rcx, %rsi1409; VEX-NEXT: vmovq %rsi, %xmm01410; VEX-NEXT: vmovq %rdx, %xmm11411; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1412; VEX-NEXT: retq1413;1414; AVX512F-LABEL: fptoui_4f32_to_2i64:1415; AVX512F: # %bb.0:1416; AVX512F-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]1417; AVX512F-NEXT: vcvttss2usi %xmm1, %rax1418; AVX512F-NEXT: vcvttss2usi %xmm0, %rcx1419; AVX512F-NEXT: vmovq %rcx, %xmm01420; AVX512F-NEXT: vmovq %rax, %xmm11421; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1422; AVX512F-NEXT: retq1423;1424; AVX512VL-LABEL: fptoui_4f32_to_2i64:1425; AVX512VL: # %bb.0:1426; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]1427; AVX512VL-NEXT: vcvttss2usi %xmm1, %rax1428; AVX512VL-NEXT: vcvttss2usi %xmm0, %rcx1429; AVX512VL-NEXT: vmovq %rcx, %xmm01430; AVX512VL-NEXT: vmovq %rax, %xmm11431; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1432; AVX512VL-NEXT: retq1433;1434; AVX512DQ-LABEL: fptoui_4f32_to_2i64:1435; AVX512DQ: # %bb.0:1436; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01437; AVX512DQ-NEXT: vcvttps2uqq %ymm0, %zmm01438; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01439; AVX512DQ-NEXT: vzeroupper1440; AVX512DQ-NEXT: retq1441;1442; AVX512VLDQ-LABEL: fptoui_4f32_to_2i64:1443; AVX512VLDQ: # %bb.0:1444; AVX512VLDQ-NEXT: vcvttps2uqq %xmm0, %ymm01445; AVX512VLDQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01446; AVX512VLDQ-NEXT: vzeroupper1447; AVX512VLDQ-NEXT: retq1448 %cvt = fptoui <4 x float> %a to <4 x i64>1449 %shuf = shufflevector <4 x i64> %cvt, <4 x i64> undef, <2 x i32> <i32 0, i32 1>1450 ret <2 x i64> %shuf1451}1452 1453define <8 x i32> @fptoui_8f32_to_8i32(<8 x float> %a) {1454; SSE-LABEL: fptoui_8f32_to_8i32:1455; SSE: # %bb.0:1456; SSE-NEXT: movaps {{.*#+}} xmm2 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]1457; SSE-NEXT: cvttps2dq %xmm0, %xmm31458; SSE-NEXT: subps %xmm2, %xmm01459; SSE-NEXT: cvttps2dq %xmm0, %xmm41460; SSE-NEXT: movdqa %xmm3, %xmm01461; SSE-NEXT: psrad $31, %xmm01462; SSE-NEXT: pand %xmm4, %xmm01463; SSE-NEXT: por %xmm3, %xmm01464; SSE-NEXT: cvttps2dq %xmm1, %xmm31465; SSE-NEXT: subps %xmm2, %xmm11466; SSE-NEXT: cvttps2dq %xmm1, %xmm21467; SSE-NEXT: movdqa %xmm3, %xmm11468; SSE-NEXT: psrad $31, %xmm11469; SSE-NEXT: pand %xmm2, %xmm11470; SSE-NEXT: por %xmm3, %xmm11471; SSE-NEXT: retq1472;1473; AVX1-LABEL: fptoui_8f32_to_8i32:1474; AVX1: # %bb.0:1475; AVX1-NEXT: vcvttps2dq %ymm0, %ymm11476; AVX1-NEXT: vsubps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01477; AVX1-NEXT: vcvttps2dq %ymm0, %ymm01478; AVX1-NEXT: vorps %ymm0, %ymm1, %ymm01479; AVX1-NEXT: vblendvps %ymm1, %ymm0, %ymm1, %ymm01480; AVX1-NEXT: retq1481;1482; AVX2-LABEL: fptoui_8f32_to_8i32:1483; AVX2: # %bb.0:1484; AVX2-NEXT: vbroadcastss {{.*#+}} ymm1 = [2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9,2.14748365E+9]1485; AVX2-NEXT: vsubps %ymm1, %ymm0, %ymm11486; AVX2-NEXT: vcvttps2dq %ymm1, %ymm11487; AVX2-NEXT: vcvttps2dq %ymm0, %ymm01488; AVX2-NEXT: vpsrad $31, %ymm0, %ymm21489; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm11490; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm01491; AVX2-NEXT: retq1492;1493; AVX512F-LABEL: fptoui_8f32_to_8i32:1494; AVX512F: # %bb.0:1495; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01496; AVX512F-NEXT: vcvttps2udq %zmm0, %zmm01497; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01498; AVX512F-NEXT: retq1499;1500; AVX512VL-LABEL: fptoui_8f32_to_8i32:1501; AVX512VL: # %bb.0:1502; AVX512VL-NEXT: vcvttps2udq %ymm0, %ymm01503; AVX512VL-NEXT: retq1504;1505; AVX512DQ-LABEL: fptoui_8f32_to_8i32:1506; AVX512DQ: # %bb.0:1507; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01508; AVX512DQ-NEXT: vcvttps2udq %zmm0, %zmm01509; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01510; AVX512DQ-NEXT: retq1511;1512; AVX512VLDQ-LABEL: fptoui_8f32_to_8i32:1513; AVX512VLDQ: # %bb.0:1514; AVX512VLDQ-NEXT: vcvttps2udq %ymm0, %ymm01515; AVX512VLDQ-NEXT: retq1516 %cvt = fptoui <8 x float> %a to <8 x i32>1517 ret <8 x i32> %cvt1518}1519 1520define <4 x i64> @fptoui_4f32_to_4i64(<8 x float> %a) {1521; SSE-LABEL: fptoui_4f32_to_4i64:1522; SSE: # %bb.0:1523; SSE-NEXT: movss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]1524; SSE-NEXT: movaps %xmm0, %xmm21525; SSE-NEXT: subss %xmm1, %xmm21526; SSE-NEXT: cvttss2si %xmm2, %rax1527; SSE-NEXT: cvttss2si %xmm0, %rcx1528; SSE-NEXT: movq %rcx, %rdx1529; SSE-NEXT: sarq $63, %rdx1530; SSE-NEXT: andq %rax, %rdx1531; SSE-NEXT: orq %rcx, %rdx1532; SSE-NEXT: movq %rdx, %xmm21533; SSE-NEXT: movaps %xmm0, %xmm31534; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[1,1]1535; SSE-NEXT: cvttss2si %xmm3, %rax1536; SSE-NEXT: subss %xmm1, %xmm31537; SSE-NEXT: cvttss2si %xmm3, %rcx1538; SSE-NEXT: movq %rax, %rdx1539; SSE-NEXT: sarq $63, %rdx1540; SSE-NEXT: andq %rcx, %rdx1541; SSE-NEXT: orq %rax, %rdx1542; SSE-NEXT: movq %rdx, %xmm31543; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]1544; SSE-NEXT: movaps %xmm0, %xmm31545; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[3,3],xmm0[3,3]1546; SSE-NEXT: cvttss2si %xmm3, %rax1547; SSE-NEXT: subss %xmm1, %xmm31548; SSE-NEXT: cvttss2si %xmm3, %rcx1549; SSE-NEXT: movq %rax, %rdx1550; SSE-NEXT: sarq $63, %rdx1551; SSE-NEXT: andq %rcx, %rdx1552; SSE-NEXT: orq %rax, %rdx1553; SSE-NEXT: movq %rdx, %xmm31554; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]1555; SSE-NEXT: cvttss2si %xmm0, %rax1556; SSE-NEXT: subss %xmm1, %xmm01557; SSE-NEXT: cvttss2si %xmm0, %rcx1558; SSE-NEXT: movq %rax, %rdx1559; SSE-NEXT: sarq $63, %rdx1560; SSE-NEXT: andq %rcx, %rdx1561; SSE-NEXT: orq %rax, %rdx1562; SSE-NEXT: movq %rdx, %xmm11563; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]1564; SSE-NEXT: movdqa %xmm2, %xmm01565; SSE-NEXT: retq1566;1567; AVX1-LABEL: fptoui_4f32_to_4i64:1568; AVX1: # %bb.0:1569; AVX1-NEXT: vshufps {{.*#+}} xmm2 = xmm0[3,3,3,3]1570; AVX1-NEXT: vmovss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]1571; AVX1-NEXT: vsubss %xmm1, %xmm2, %xmm31572; AVX1-NEXT: vcvttss2si %xmm3, %rax1573; AVX1-NEXT: vcvttss2si %xmm2, %rcx1574; AVX1-NEXT: movq %rcx, %rdx1575; AVX1-NEXT: sarq $63, %rdx1576; AVX1-NEXT: andq %rax, %rdx1577; AVX1-NEXT: orq %rcx, %rdx1578; AVX1-NEXT: vmovq %rdx, %xmm21579; AVX1-NEXT: vshufpd {{.*#+}} xmm3 = xmm0[1,0]1580; AVX1-NEXT: vsubss %xmm1, %xmm3, %xmm41581; AVX1-NEXT: vcvttss2si %xmm4, %rax1582; AVX1-NEXT: vcvttss2si %xmm3, %rcx1583; AVX1-NEXT: movq %rcx, %rdx1584; AVX1-NEXT: sarq $63, %rdx1585; AVX1-NEXT: andq %rax, %rdx1586; AVX1-NEXT: orq %rcx, %rdx1587; AVX1-NEXT: vmovq %rdx, %xmm31588; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]1589; AVX1-NEXT: vsubss %xmm1, %xmm0, %xmm31590; AVX1-NEXT: vcvttss2si %xmm3, %rax1591; AVX1-NEXT: vcvttss2si %xmm0, %rcx1592; AVX1-NEXT: movq %rcx, %rdx1593; AVX1-NEXT: sarq $63, %rdx1594; AVX1-NEXT: andq %rax, %rdx1595; AVX1-NEXT: orq %rcx, %rdx1596; AVX1-NEXT: vmovq %rdx, %xmm31597; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1598; AVX1-NEXT: vsubss %xmm1, %xmm0, %xmm11599; AVX1-NEXT: vcvttss2si %xmm1, %rax1600; AVX1-NEXT: vcvttss2si %xmm0, %rcx1601; AVX1-NEXT: movq %rcx, %rdx1602; AVX1-NEXT: sarq $63, %rdx1603; AVX1-NEXT: andq %rax, %rdx1604; AVX1-NEXT: orq %rcx, %rdx1605; AVX1-NEXT: vmovq %rdx, %xmm01606; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]1607; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01608; AVX1-NEXT: retq1609;1610; AVX2-LABEL: fptoui_4f32_to_4i64:1611; AVX2: # %bb.0:1612; AVX2-NEXT: vshufps {{.*#+}} xmm2 = xmm0[3,3,3,3]1613; AVX2-NEXT: vmovss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]1614; AVX2-NEXT: vsubss %xmm1, %xmm2, %xmm31615; AVX2-NEXT: vcvttss2si %xmm3, %rax1616; AVX2-NEXT: vcvttss2si %xmm2, %rcx1617; AVX2-NEXT: movq %rcx, %rdx1618; AVX2-NEXT: sarq $63, %rdx1619; AVX2-NEXT: andq %rax, %rdx1620; AVX2-NEXT: orq %rcx, %rdx1621; AVX2-NEXT: vmovq %rdx, %xmm21622; AVX2-NEXT: vshufpd {{.*#+}} xmm3 = xmm0[1,0]1623; AVX2-NEXT: vsubss %xmm1, %xmm3, %xmm41624; AVX2-NEXT: vcvttss2si %xmm4, %rax1625; AVX2-NEXT: vcvttss2si %xmm3, %rcx1626; AVX2-NEXT: movq %rcx, %rdx1627; AVX2-NEXT: sarq $63, %rdx1628; AVX2-NEXT: andq %rax, %rdx1629; AVX2-NEXT: orq %rcx, %rdx1630; AVX2-NEXT: vmovq %rdx, %xmm31631; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]1632; AVX2-NEXT: vsubss %xmm1, %xmm0, %xmm31633; AVX2-NEXT: vcvttss2si %xmm3, %rax1634; AVX2-NEXT: vcvttss2si %xmm0, %rcx1635; AVX2-NEXT: movq %rcx, %rdx1636; AVX2-NEXT: sarq $63, %rdx1637; AVX2-NEXT: andq %rax, %rdx1638; AVX2-NEXT: orq %rcx, %rdx1639; AVX2-NEXT: vmovq %rdx, %xmm31640; AVX2-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1641; AVX2-NEXT: vsubss %xmm1, %xmm0, %xmm11642; AVX2-NEXT: vcvttss2si %xmm1, %rax1643; AVX2-NEXT: vcvttss2si %xmm0, %rcx1644; AVX2-NEXT: movq %rcx, %rdx1645; AVX2-NEXT: sarq $63, %rdx1646; AVX2-NEXT: andq %rax, %rdx1647; AVX2-NEXT: orq %rcx, %rdx1648; AVX2-NEXT: vmovq %rdx, %xmm01649; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]1650; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm01651; AVX2-NEXT: retq1652;1653; AVX512F-LABEL: fptoui_4f32_to_4i64:1654; AVX512F: # %bb.0:1655; AVX512F-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]1656; AVX512F-NEXT: vcvttss2usi %xmm1, %rax1657; AVX512F-NEXT: vmovq %rax, %xmm11658; AVX512F-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]1659; AVX512F-NEXT: vcvttss2usi %xmm2, %rax1660; AVX512F-NEXT: vmovq %rax, %xmm21661; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]1662; AVX512F-NEXT: vcvttss2usi %xmm0, %rax1663; AVX512F-NEXT: vmovq %rax, %xmm21664; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1665; AVX512F-NEXT: vcvttss2usi %xmm0, %rax1666; AVX512F-NEXT: vmovq %rax, %xmm01667; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]1668; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01669; AVX512F-NEXT: retq1670;1671; AVX512VL-LABEL: fptoui_4f32_to_4i64:1672; AVX512VL: # %bb.0:1673; AVX512VL-NEXT: vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]1674; AVX512VL-NEXT: vcvttss2usi %xmm1, %rax1675; AVX512VL-NEXT: vmovq %rax, %xmm11676; AVX512VL-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]1677; AVX512VL-NEXT: vcvttss2usi %xmm2, %rax1678; AVX512VL-NEXT: vmovq %rax, %xmm21679; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]1680; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax1681; AVX512VL-NEXT: vmovq %rax, %xmm21682; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1683; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax1684; AVX512VL-NEXT: vmovq %rax, %xmm01685; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]1686; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01687; AVX512VL-NEXT: retq1688;1689; AVX512DQ-LABEL: fptoui_4f32_to_4i64:1690; AVX512DQ: # %bb.0:1691; AVX512DQ-NEXT: vcvttps2uqq %ymm0, %zmm01692; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01693; AVX512DQ-NEXT: retq1694;1695; AVX512VLDQ-LABEL: fptoui_4f32_to_4i64:1696; AVX512VLDQ: # %bb.0:1697; AVX512VLDQ-NEXT: vcvttps2uqq %xmm0, %ymm01698; AVX512VLDQ-NEXT: retq1699 %shuf = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1700 %cvt = fptoui <4 x float> %shuf to <4 x i64>1701 ret <4 x i64> %cvt1702}1703 1704define <4 x i64> @fptoui_8f32_to_4i64(<8 x float> %a) {1705; SSE-LABEL: fptoui_8f32_to_4i64:1706; SSE: # %bb.0:1707; SSE-NEXT: movss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]1708; SSE-NEXT: movaps %xmm0, %xmm21709; SSE-NEXT: subss %xmm1, %xmm21710; SSE-NEXT: cvttss2si %xmm2, %rax1711; SSE-NEXT: cvttss2si %xmm0, %rcx1712; SSE-NEXT: movq %rcx, %rdx1713; SSE-NEXT: sarq $63, %rdx1714; SSE-NEXT: andq %rax, %rdx1715; SSE-NEXT: orq %rcx, %rdx1716; SSE-NEXT: movq %rdx, %xmm21717; SSE-NEXT: movaps %xmm0, %xmm31718; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[1,1]1719; SSE-NEXT: cvttss2si %xmm3, %rax1720; SSE-NEXT: subss %xmm1, %xmm31721; SSE-NEXT: cvttss2si %xmm3, %rcx1722; SSE-NEXT: movq %rax, %rdx1723; SSE-NEXT: sarq $63, %rdx1724; SSE-NEXT: andq %rcx, %rdx1725; SSE-NEXT: orq %rax, %rdx1726; SSE-NEXT: movq %rdx, %xmm31727; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]1728; SSE-NEXT: movaps %xmm0, %xmm31729; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[3,3],xmm0[3,3]1730; SSE-NEXT: cvttss2si %xmm3, %rax1731; SSE-NEXT: subss %xmm1, %xmm31732; SSE-NEXT: cvttss2si %xmm3, %rcx1733; SSE-NEXT: movq %rax, %rdx1734; SSE-NEXT: sarq $63, %rdx1735; SSE-NEXT: andq %rcx, %rdx1736; SSE-NEXT: orq %rax, %rdx1737; SSE-NEXT: movq %rdx, %xmm31738; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]1739; SSE-NEXT: cvttss2si %xmm0, %rax1740; SSE-NEXT: subss %xmm1, %xmm01741; SSE-NEXT: cvttss2si %xmm0, %rcx1742; SSE-NEXT: movq %rax, %rdx1743; SSE-NEXT: sarq $63, %rdx1744; SSE-NEXT: andq %rcx, %rdx1745; SSE-NEXT: orq %rax, %rdx1746; SSE-NEXT: movq %rdx, %xmm11747; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]1748; SSE-NEXT: movdqa %xmm2, %xmm01749; SSE-NEXT: retq1750;1751; AVX1-LABEL: fptoui_8f32_to_4i64:1752; AVX1: # %bb.0:1753; AVX1-NEXT: vshufps {{.*#+}} xmm2 = xmm0[3,3,3,3]1754; AVX1-NEXT: vmovss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]1755; AVX1-NEXT: vsubss %xmm1, %xmm2, %xmm31756; AVX1-NEXT: vcvttss2si %xmm3, %rax1757; AVX1-NEXT: vcvttss2si %xmm2, %rcx1758; AVX1-NEXT: movq %rcx, %rdx1759; AVX1-NEXT: sarq $63, %rdx1760; AVX1-NEXT: andq %rax, %rdx1761; AVX1-NEXT: orq %rcx, %rdx1762; AVX1-NEXT: vmovq %rdx, %xmm21763; AVX1-NEXT: vshufpd {{.*#+}} xmm3 = xmm0[1,0]1764; AVX1-NEXT: vsubss %xmm1, %xmm3, %xmm41765; AVX1-NEXT: vcvttss2si %xmm4, %rax1766; AVX1-NEXT: vcvttss2si %xmm3, %rcx1767; AVX1-NEXT: movq %rcx, %rdx1768; AVX1-NEXT: sarq $63, %rdx1769; AVX1-NEXT: andq %rax, %rdx1770; AVX1-NEXT: orq %rcx, %rdx1771; AVX1-NEXT: vmovq %rdx, %xmm31772; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]1773; AVX1-NEXT: vsubss %xmm1, %xmm0, %xmm31774; AVX1-NEXT: vcvttss2si %xmm3, %rax1775; AVX1-NEXT: vcvttss2si %xmm0, %rcx1776; AVX1-NEXT: movq %rcx, %rdx1777; AVX1-NEXT: sarq $63, %rdx1778; AVX1-NEXT: andq %rax, %rdx1779; AVX1-NEXT: orq %rcx, %rdx1780; AVX1-NEXT: vmovq %rdx, %xmm31781; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1782; AVX1-NEXT: vsubss %xmm1, %xmm0, %xmm11783; AVX1-NEXT: vcvttss2si %xmm1, %rax1784; AVX1-NEXT: vcvttss2si %xmm0, %rcx1785; AVX1-NEXT: movq %rcx, %rdx1786; AVX1-NEXT: sarq $63, %rdx1787; AVX1-NEXT: andq %rax, %rdx1788; AVX1-NEXT: orq %rcx, %rdx1789; AVX1-NEXT: vmovq %rdx, %xmm01790; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]1791; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01792; AVX1-NEXT: retq1793;1794; AVX2-LABEL: fptoui_8f32_to_4i64:1795; AVX2: # %bb.0:1796; AVX2-NEXT: vshufps {{.*#+}} xmm2 = xmm0[3,3,3,3]1797; AVX2-NEXT: vmovss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]1798; AVX2-NEXT: vsubss %xmm1, %xmm2, %xmm31799; AVX2-NEXT: vcvttss2si %xmm3, %rax1800; AVX2-NEXT: vcvttss2si %xmm2, %rcx1801; AVX2-NEXT: movq %rcx, %rdx1802; AVX2-NEXT: sarq $63, %rdx1803; AVX2-NEXT: andq %rax, %rdx1804; AVX2-NEXT: orq %rcx, %rdx1805; AVX2-NEXT: vmovq %rdx, %xmm21806; AVX2-NEXT: vshufpd {{.*#+}} xmm3 = xmm0[1,0]1807; AVX2-NEXT: vsubss %xmm1, %xmm3, %xmm41808; AVX2-NEXT: vcvttss2si %xmm4, %rax1809; AVX2-NEXT: vcvttss2si %xmm3, %rcx1810; AVX2-NEXT: movq %rcx, %rdx1811; AVX2-NEXT: sarq $63, %rdx1812; AVX2-NEXT: andq %rax, %rdx1813; AVX2-NEXT: orq %rcx, %rdx1814; AVX2-NEXT: vmovq %rdx, %xmm31815; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0]1816; AVX2-NEXT: vsubss %xmm1, %xmm0, %xmm31817; AVX2-NEXT: vcvttss2si %xmm3, %rax1818; AVX2-NEXT: vcvttss2si %xmm0, %rcx1819; AVX2-NEXT: movq %rcx, %rdx1820; AVX2-NEXT: sarq $63, %rdx1821; AVX2-NEXT: andq %rax, %rdx1822; AVX2-NEXT: orq %rcx, %rdx1823; AVX2-NEXT: vmovq %rdx, %xmm31824; AVX2-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]1825; AVX2-NEXT: vsubss %xmm1, %xmm0, %xmm11826; AVX2-NEXT: vcvttss2si %xmm1, %rax1827; AVX2-NEXT: vcvttss2si %xmm0, %rcx1828; AVX2-NEXT: movq %rcx, %rdx1829; AVX2-NEXT: sarq $63, %rdx1830; AVX2-NEXT: andq %rax, %rdx1831; AVX2-NEXT: orq %rcx, %rdx1832; AVX2-NEXT: vmovq %rdx, %xmm01833; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0]1834; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm01835; AVX2-NEXT: retq1836;1837; AVX512F-LABEL: fptoui_8f32_to_4i64:1838; AVX512F: # %bb.0:1839; AVX512F-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]1840; AVX512F-NEXT: vcvttss2usi %xmm1, %rax1841; AVX512F-NEXT: vcvttss2usi %xmm0, %rcx1842; AVX512F-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]1843; AVX512F-NEXT: vcvttss2usi %xmm1, %rdx1844; AVX512F-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]1845; AVX512F-NEXT: vcvttss2usi %xmm0, %rsi1846; AVX512F-NEXT: vmovq %rsi, %xmm01847; AVX512F-NEXT: vmovq %rdx, %xmm11848; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1849; AVX512F-NEXT: vmovq %rcx, %xmm11850; AVX512F-NEXT: vmovq %rax, %xmm21851; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]1852; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm01853; AVX512F-NEXT: retq1854;1855; AVX512VL-LABEL: fptoui_8f32_to_4i64:1856; AVX512VL: # %bb.0:1857; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]1858; AVX512VL-NEXT: vcvttss2usi %xmm1, %rax1859; AVX512VL-NEXT: vcvttss2usi %xmm0, %rcx1860; AVX512VL-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]1861; AVX512VL-NEXT: vcvttss2usi %xmm1, %rdx1862; AVX512VL-NEXT: vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]1863; AVX512VL-NEXT: vcvttss2usi %xmm0, %rsi1864; AVX512VL-NEXT: vmovq %rsi, %xmm01865; AVX512VL-NEXT: vmovq %rdx, %xmm11866; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]1867; AVX512VL-NEXT: vmovq %rcx, %xmm11868; AVX512VL-NEXT: vmovq %rax, %xmm21869; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]1870; AVX512VL-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm01871; AVX512VL-NEXT: retq1872;1873; AVX512DQ-LABEL: fptoui_8f32_to_4i64:1874; AVX512DQ: # %bb.0:1875; AVX512DQ-NEXT: vcvttps2uqq %ymm0, %zmm01876; AVX512DQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01877; AVX512DQ-NEXT: retq1878;1879; AVX512VLDQ-LABEL: fptoui_8f32_to_4i64:1880; AVX512VLDQ: # %bb.0:1881; AVX512VLDQ-NEXT: vcvttps2uqq %ymm0, %zmm01882; AVX512VLDQ-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01883; AVX512VLDQ-NEXT: retq1884 %cvt = fptoui <8 x float> %a to <8 x i64>1885 %shuf = shufflevector <8 x i64> %cvt, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1886 ret <4 x i64> %shuf1887}1888 1889;1890; Constant Folding1891;1892 1893define <2 x i64> @fptosi_2f64_to_2i64_const() {1894; SSE-LABEL: fptosi_2f64_to_2i64_const:1895; SSE: # %bb.0:1896; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,18446744073709551615]1897; SSE-NEXT: retq1898;1899; VEX-LABEL: fptosi_2f64_to_2i64_const:1900; VEX: # %bb.0:1901; VEX-NEXT: vmovaps {{.*#+}} xmm0 = [1,18446744073709551615]1902; VEX-NEXT: retq1903;1904; AVX512-LABEL: fptosi_2f64_to_2i64_const:1905; AVX512: # %bb.0:1906; AVX512-NEXT: vpmovsxbq {{.*#+}} xmm0 = [1,18446744073709551615]1907; AVX512-NEXT: retq1908 %cvt = fptosi <2 x double> <double 1.0, double -1.0> to <2 x i64>1909 ret <2 x i64> %cvt1910}1911 1912define <4 x i32> @fptosi_2f64_to_2i32_const() {1913; SSE-LABEL: fptosi_2f64_to_2i32_const:1914; SSE: # %bb.0:1915; SSE-NEXT: movsd {{.*#+}} xmm0 = [4294967295,1,0,0]1916; SSE-NEXT: retq1917;1918; VEX-LABEL: fptosi_2f64_to_2i32_const:1919; VEX: # %bb.0:1920; VEX-NEXT: vmovsd {{.*#+}} xmm0 = [4294967295,1,0,0]1921; VEX-NEXT: retq1922;1923; AVX512-LABEL: fptosi_2f64_to_2i32_const:1924; AVX512: # %bb.0:1925; AVX512-NEXT: vpmovsxbd {{.*#+}} xmm0 = [4294967295,1,0,0]1926; AVX512-NEXT: retq1927 %cvt = fptosi <2 x double> <double -1.0, double 1.0> to <2 x i32>1928 %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>1929 ret <4 x i32> %ext1930}1931 1932define <4 x i64> @fptosi_4f64_to_4i64_const() {1933; SSE-LABEL: fptosi_4f64_to_4i64_const:1934; SSE: # %bb.0:1935; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,18446744073709551615]1936; SSE-NEXT: movaps {{.*#+}} xmm1 = [2,18446744073709551613]1937; SSE-NEXT: retq1938;1939; VEX-LABEL: fptosi_4f64_to_4i64_const:1940; VEX: # %bb.0:1941; VEX-NEXT: vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,18446744073709551613]1942; VEX-NEXT: retq1943;1944; AVX512-LABEL: fptosi_4f64_to_4i64_const:1945; AVX512: # %bb.0:1946; AVX512-NEXT: vpmovsxbq {{.*#+}} ymm0 = [1,18446744073709551615,2,18446744073709551613]1947; AVX512-NEXT: retq1948 %cvt = fptosi <4 x double> <double 1.0, double -1.0, double 2.0, double -3.0> to <4 x i64>1949 ret <4 x i64> %cvt1950}1951 1952define <4 x i32> @fptosi_4f64_to_4i32_const() {1953; SSE-LABEL: fptosi_4f64_to_4i32_const:1954; SSE: # %bb.0:1955; SSE-NEXT: movaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3]1956; SSE-NEXT: retq1957;1958; VEX-LABEL: fptosi_4f64_to_4i32_const:1959; VEX: # %bb.0:1960; VEX-NEXT: vmovaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3]1961; VEX-NEXT: retq1962;1963; AVX512-LABEL: fptosi_4f64_to_4i32_const:1964; AVX512: # %bb.0:1965; AVX512-NEXT: vpmovsxbd {{.*#+}} xmm0 = [4294967295,1,4294967294,3]1966; AVX512-NEXT: retq1967 %cvt = fptosi <4 x double> <double -1.0, double 1.0, double -2.0, double 3.0> to <4 x i32>1968 ret <4 x i32> %cvt1969}1970 1971define <2 x i64> @fptoui_2f64_to_2i64_const() {1972; SSE-LABEL: fptoui_2f64_to_2i64_const:1973; SSE: # %bb.0:1974; SSE-NEXT: movaps {{.*#+}} xmm0 = [2,4]1975; SSE-NEXT: retq1976;1977; VEX-LABEL: fptoui_2f64_to_2i64_const:1978; VEX: # %bb.0:1979; VEX-NEXT: vmovaps {{.*#+}} xmm0 = [2,4]1980; VEX-NEXT: retq1981;1982; AVX512-LABEL: fptoui_2f64_to_2i64_const:1983; AVX512: # %bb.0:1984; AVX512-NEXT: vpmovsxbq {{.*#+}} xmm0 = [2,4]1985; AVX512-NEXT: retq1986 %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i64>1987 ret <2 x i64> %cvt1988}1989 1990define <4 x i32> @fptoui_2f64_to_2i32_const(<2 x double> %a) {1991; SSE-LABEL: fptoui_2f64_to_2i32_const:1992; SSE: # %bb.0:1993; SSE-NEXT: movsd {{.*#+}} xmm0 = [2,4,0,0]1994; SSE-NEXT: retq1995;1996; VEX-LABEL: fptoui_2f64_to_2i32_const:1997; VEX: # %bb.0:1998; VEX-NEXT: vmovsd {{.*#+}} xmm0 = [2,4,0,0]1999; VEX-NEXT: retq2000;2001; AVX512-LABEL: fptoui_2f64_to_2i32_const:2002; AVX512: # %bb.0:2003; AVX512-NEXT: vpmovsxbd {{.*#+}} xmm0 = [2,4,0,0]2004; AVX512-NEXT: retq2005 %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i32>2006 %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>2007 ret <4 x i32> %ext2008}2009 2010define <4 x i64> @fptoui_4f64_to_4i64_const(<4 x double> %a) {2011; SSE-LABEL: fptoui_4f64_to_4i64_const:2012; SSE: # %bb.0:2013; SSE-NEXT: movaps {{.*#+}} xmm0 = [2,4]2014; SSE-NEXT: movaps {{.*#+}} xmm1 = [6,8]2015; SSE-NEXT: retq2016;2017; VEX-LABEL: fptoui_4f64_to_4i64_const:2018; VEX: # %bb.0:2019; VEX-NEXT: vmovaps {{.*#+}} ymm0 = [2,4,6,8]2020; VEX-NEXT: retq2021;2022; AVX512-LABEL: fptoui_4f64_to_4i64_const:2023; AVX512: # %bb.0:2024; AVX512-NEXT: vpmovsxbq {{.*#+}} ymm0 = [2,4,6,8]2025; AVX512-NEXT: retq2026 %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i64>2027 ret <4 x i64> %cvt2028}2029 2030define <4 x i32> @fptoui_4f64_to_4i32_const(<4 x double> %a) {2031; SSE-LABEL: fptoui_4f64_to_4i32_const:2032; SSE: # %bb.0:2033; SSE-NEXT: movaps {{.*#+}} xmm0 = [2,4,6,8]2034; SSE-NEXT: retq2035;2036; VEX-LABEL: fptoui_4f64_to_4i32_const:2037; VEX: # %bb.0:2038; VEX-NEXT: vmovaps {{.*#+}} xmm0 = [2,4,6,8]2039; VEX-NEXT: retq2040;2041; AVX512-LABEL: fptoui_4f64_to_4i32_const:2042; AVX512: # %bb.0:2043; AVX512-NEXT: vpmovsxbd {{.*#+}} xmm0 = [2,4,6,8]2044; AVX512-NEXT: retq2045 %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i32>2046 ret <4 x i32> %cvt2047}2048 2049define <4 x i32> @fptosi_4f32_to_4i32_const() {2050; SSE-LABEL: fptosi_4f32_to_4i32_const:2051; SSE: # %bb.0:2052; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,4294967295,2,3]2053; SSE-NEXT: retq2054;2055; VEX-LABEL: fptosi_4f32_to_4i32_const:2056; VEX: # %bb.0:2057; VEX-NEXT: vmovaps {{.*#+}} xmm0 = [1,4294967295,2,3]2058; VEX-NEXT: retq2059;2060; AVX512-LABEL: fptosi_4f32_to_4i32_const:2061; AVX512: # %bb.0:2062; AVX512-NEXT: vpmovsxbd {{.*#+}} xmm0 = [1,4294967295,2,3]2063; AVX512-NEXT: retq2064 %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i32>2065 ret <4 x i32> %cvt2066}2067 2068define <4 x i64> @fptosi_4f32_to_4i64_const() {2069; SSE-LABEL: fptosi_4f32_to_4i64_const:2070; SSE: # %bb.0:2071; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,18446744073709551615]2072; SSE-NEXT: movaps {{.*#+}} xmm1 = [2,3]2073; SSE-NEXT: retq2074;2075; VEX-LABEL: fptosi_4f32_to_4i64_const:2076; VEX: # %bb.0:2077; VEX-NEXT: vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,3]2078; VEX-NEXT: retq2079;2080; AVX512-LABEL: fptosi_4f32_to_4i64_const:2081; AVX512: # %bb.0:2082; AVX512-NEXT: vpmovsxbq {{.*#+}} ymm0 = [1,18446744073709551615,2,3]2083; AVX512-NEXT: retq2084 %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i64>2085 ret <4 x i64> %cvt2086}2087 2088define <8 x i32> @fptosi_8f32_to_8i32_const(<8 x float> %a) {2089; SSE-LABEL: fptosi_8f32_to_8i32_const:2090; SSE: # %bb.0:2091; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,4294967295,2,3]2092; SSE-NEXT: movaps {{.*#+}} xmm1 = [6,4294967288,2,4294967295]2093; SSE-NEXT: retq2094;2095; VEX-LABEL: fptosi_8f32_to_8i32_const:2096; VEX: # %bb.0:2097; VEX-NEXT: vmovaps {{.*#+}} ymm0 = [1,4294967295,2,3,6,4294967288,2,4294967295]2098; VEX-NEXT: retq2099;2100; AVX512-LABEL: fptosi_8f32_to_8i32_const:2101; AVX512: # %bb.0:2102; AVX512-NEXT: vpmovsxbd {{.*#+}} ymm0 = [1,4294967295,2,3,6,4294967288,2,4294967295]2103; AVX512-NEXT: retq2104 %cvt = fptosi <8 x float> <float 1.0, float -1.0, float 2.0, float 3.0, float 6.0, float -8.0, float 2.0, float -1.0> to <8 x i32>2105 ret <8 x i32> %cvt2106}2107 2108define <4 x i32> @fptoui_4f32_to_4i32_const(<4 x float> %a) {2109; SSE-LABEL: fptoui_4f32_to_4i32_const:2110; SSE: # %bb.0:2111; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,2,4,6]2112; SSE-NEXT: retq2113;2114; VEX-LABEL: fptoui_4f32_to_4i32_const:2115; VEX: # %bb.0:2116; VEX-NEXT: vmovaps {{.*#+}} xmm0 = [1,2,4,6]2117; VEX-NEXT: retq2118;2119; AVX512-LABEL: fptoui_4f32_to_4i32_const:2120; AVX512: # %bb.0:2121; AVX512-NEXT: vpmovsxbd {{.*#+}} xmm0 = [1,2,4,6]2122; AVX512-NEXT: retq2123 %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 6.0> to <4 x i32>2124 ret <4 x i32> %cvt2125}2126 2127define <4 x i64> @fptoui_4f32_to_4i64_const() {2128; SSE-LABEL: fptoui_4f32_to_4i64_const:2129; SSE: # %bb.0:2130; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,2]2131; SSE-NEXT: movaps {{.*#+}} xmm1 = [4,8]2132; SSE-NEXT: retq2133;2134; VEX-LABEL: fptoui_4f32_to_4i64_const:2135; VEX: # %bb.0:2136; VEX-NEXT: vmovaps {{.*#+}} ymm0 = [1,2,4,8]2137; VEX-NEXT: retq2138;2139; AVX512-LABEL: fptoui_4f32_to_4i64_const:2140; AVX512: # %bb.0:2141; AVX512-NEXT: vpmovsxbq {{.*#+}} ymm0 = [1,2,4,8]2142; AVX512-NEXT: retq2143 %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 8.0> to <4 x i64>2144 ret <4 x i64> %cvt2145}2146 2147define <8 x i32> @fptoui_8f32_to_8i32_const(<8 x float> %a) {2148; SSE-LABEL: fptoui_8f32_to_8i32_const:2149; SSE: # %bb.0:2150; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,2,4,6]2151; SSE-NEXT: movaps {{.*#+}} xmm1 = [8,6,4,1]2152; SSE-NEXT: retq2153;2154; VEX-LABEL: fptoui_8f32_to_8i32_const:2155; VEX: # %bb.0:2156; VEX-NEXT: vmovaps {{.*#+}} ymm0 = [1,2,4,6,8,6,4,1]2157; VEX-NEXT: retq2158;2159; AVX512-LABEL: fptoui_8f32_to_8i32_const:2160; AVX512: # %bb.0:2161; AVX512-NEXT: vpmovsxbd {{.*#+}} ymm0 = [1,2,4,6,8,6,4,1]2162; AVX512-NEXT: retq2163 %cvt = fptoui <8 x float> <float 1.0, float 2.0, float 4.0, float 6.0, float 8.0, float 6.0, float 4.0, float 1.0> to <8 x i32>2164 ret <8 x i32> %cvt2165}2166 2167define <4 x i32> @fptosi_2f80_to_4i32(<2 x x86_fp80> %a) nounwind {2168; SSE-LABEL: fptosi_2f80_to_4i32:2169; SSE: # %bb.0:2170; SSE-NEXT: fldt {{[0-9]+}}(%rsp)2171; SSE-NEXT: fldt {{[0-9]+}}(%rsp)2172; SSE-NEXT: fnstcw -{{[0-9]+}}(%rsp)2173; SSE-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax2174; SSE-NEXT: orl $3072, %eax # imm = 0xC002175; SSE-NEXT: movw %ax, -{{[0-9]+}}(%rsp)2176; SSE-NEXT: fldcw -{{[0-9]+}}(%rsp)2177; SSE-NEXT: fistpl -{{[0-9]+}}(%rsp)2178; SSE-NEXT: fldcw -{{[0-9]+}}(%rsp)2179; SSE-NEXT: fnstcw -{{[0-9]+}}(%rsp)2180; SSE-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax2181; SSE-NEXT: orl $3072, %eax # imm = 0xC002182; SSE-NEXT: movw %ax, -{{[0-9]+}}(%rsp)2183; SSE-NEXT: fldcw -{{[0-9]+}}(%rsp)2184; SSE-NEXT: fistpl -{{[0-9]+}}(%rsp)2185; SSE-NEXT: fldcw -{{[0-9]+}}(%rsp)2186; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero2187; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero2188; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]2189; SSE-NEXT: movq {{.*#+}} xmm0 = xmm1[0],zero2190; SSE-NEXT: retq2191;2192; AVX-LABEL: fptosi_2f80_to_4i32:2193; AVX: # %bb.0:2194; AVX-NEXT: fldt {{[0-9]+}}(%rsp)2195; AVX-NEXT: fldt {{[0-9]+}}(%rsp)2196; AVX-NEXT: fisttpl -{{[0-9]+}}(%rsp)2197; AVX-NEXT: fisttpl -{{[0-9]+}}(%rsp)2198; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero2199; AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero2200; AVX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]2201; AVX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero2202; AVX-NEXT: retq2203 %cvt = fptosi <2 x x86_fp80> %a to <2 x i32>2204 %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>2205 ret <4 x i32> %ext2206}2207 2208define <4 x i32> @fptosi_2f128_to_4i32(<2 x fp128> %a) nounwind {2209; SSE-LABEL: fptosi_2f128_to_4i32:2210; SSE: # %bb.0:2211; SSE-NEXT: pushq %rbx2212; SSE-NEXT: subq $16, %rsp2213; SSE-NEXT: movaps %xmm1, (%rsp) # 16-byte Spill2214; SSE-NEXT: callq __fixtfsi@PLT2215; SSE-NEXT: movl %eax, %ebx2216; SSE-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload2217; SSE-NEXT: callq __fixtfsi@PLT2218; SSE-NEXT: movd %eax, %xmm02219; SSE-NEXT: movd %ebx, %xmm12220; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]2221; SSE-NEXT: movq {{.*#+}} xmm0 = xmm1[0],zero2222; SSE-NEXT: addq $16, %rsp2223; SSE-NEXT: popq %rbx2224; SSE-NEXT: retq2225;2226; AVX-LABEL: fptosi_2f128_to_4i32:2227; AVX: # %bb.0:2228; AVX-NEXT: pushq %rbx2229; AVX-NEXT: subq $16, %rsp2230; AVX-NEXT: vmovaps %xmm1, (%rsp) # 16-byte Spill2231; AVX-NEXT: callq __fixtfsi@PLT2232; AVX-NEXT: movl %eax, %ebx2233; AVX-NEXT: vmovaps (%rsp), %xmm0 # 16-byte Reload2234; AVX-NEXT: callq __fixtfsi@PLT2235; AVX-NEXT: vmovd %eax, %xmm02236; AVX-NEXT: vmovd %ebx, %xmm12237; AVX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]2238; AVX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero2239; AVX-NEXT: addq $16, %rsp2240; AVX-NEXT: popq %rbx2241; AVX-NEXT: retq2242 %cvt = fptosi <2 x fp128> %a to <2 x i32>2243 %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>2244 ret <4 x i32> %ext2245}2246 2247define <2 x i8> @fptosi_2f32_to_2i8(<2 x float> %a) {2248; SSE-LABEL: fptosi_2f32_to_2i8:2249; SSE: # %bb.0:2250; SSE-NEXT: cvttps2dq %xmm0, %xmm02251; SSE-NEXT: packssdw %xmm0, %xmm02252; SSE-NEXT: packsswb %xmm0, %xmm02253; SSE-NEXT: retq2254;2255; VEX-LABEL: fptosi_2f32_to_2i8:2256; VEX: # %bb.0:2257; VEX-NEXT: vcvttps2dq %xmm0, %xmm02258; VEX-NEXT: vpackssdw %xmm0, %xmm0, %xmm02259; VEX-NEXT: vpacksswb %xmm0, %xmm0, %xmm02260; VEX-NEXT: retq2261;2262; AVX512F-LABEL: fptosi_2f32_to_2i8:2263; AVX512F: # %bb.0:2264; AVX512F-NEXT: vcvttps2dq %xmm0, %xmm02265; AVX512F-NEXT: vpackssdw %xmm0, %xmm0, %xmm02266; AVX512F-NEXT: vpacksswb %xmm0, %xmm0, %xmm02267; AVX512F-NEXT: retq2268;2269; AVX512VL-LABEL: fptosi_2f32_to_2i8:2270; AVX512VL: # %bb.0:2271; AVX512VL-NEXT: vcvttps2dq %xmm0, %xmm02272; AVX512VL-NEXT: vpmovdb %xmm0, %xmm02273; AVX512VL-NEXT: retq2274;2275; AVX512DQ-LABEL: fptosi_2f32_to_2i8:2276; AVX512DQ: # %bb.0:2277; AVX512DQ-NEXT: vcvttps2dq %xmm0, %xmm02278; AVX512DQ-NEXT: vpackssdw %xmm0, %xmm0, %xmm02279; AVX512DQ-NEXT: vpacksswb %xmm0, %xmm0, %xmm02280; AVX512DQ-NEXT: retq2281;2282; AVX512VLDQ-LABEL: fptosi_2f32_to_2i8:2283; AVX512VLDQ: # %bb.0:2284; AVX512VLDQ-NEXT: vcvttps2dq %xmm0, %xmm02285; AVX512VLDQ-NEXT: vpmovdb %xmm0, %xmm02286; AVX512VLDQ-NEXT: retq2287 %cvt = fptosi <2 x float> %a to <2 x i8>2288 ret <2 x i8> %cvt2289}2290 2291define <2 x i16> @fptosi_2f32_to_2i16(<2 x float> %a) {2292; SSE-LABEL: fptosi_2f32_to_2i16:2293; SSE: # %bb.0:2294; SSE-NEXT: cvttps2dq %xmm0, %xmm02295; SSE-NEXT: packssdw %xmm0, %xmm02296; SSE-NEXT: retq2297;2298; AVX-LABEL: fptosi_2f32_to_2i16:2299; AVX: # %bb.0:2300; AVX-NEXT: vcvttps2dq %xmm0, %xmm02301; AVX-NEXT: vpackssdw %xmm0, %xmm0, %xmm02302; AVX-NEXT: retq2303 %cvt = fptosi <2 x float> %a to <2 x i16>2304 ret <2 x i16> %cvt2305}2306 2307define <2 x i8> @fptoui_2f32_to_2i8(<2 x float> %a) {2308; SSE-LABEL: fptoui_2f32_to_2i8:2309; SSE: # %bb.0:2310; SSE-NEXT: cvttps2dq %xmm0, %xmm02311; SSE-NEXT: packuswb %xmm0, %xmm02312; SSE-NEXT: packuswb %xmm0, %xmm02313; SSE-NEXT: retq2314;2315; VEX-LABEL: fptoui_2f32_to_2i8:2316; VEX: # %bb.0:2317; VEX-NEXT: vcvttps2dq %xmm0, %xmm02318; VEX-NEXT: vpackusdw %xmm0, %xmm0, %xmm02319; VEX-NEXT: vpackuswb %xmm0, %xmm0, %xmm02320; VEX-NEXT: retq2321;2322; AVX512F-LABEL: fptoui_2f32_to_2i8:2323; AVX512F: # %bb.0:2324; AVX512F-NEXT: vcvttps2dq %xmm0, %xmm02325; AVX512F-NEXT: vpackusdw %xmm0, %xmm0, %xmm02326; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm02327; AVX512F-NEXT: retq2328;2329; AVX512VL-LABEL: fptoui_2f32_to_2i8:2330; AVX512VL: # %bb.0:2331; AVX512VL-NEXT: vcvttps2dq %xmm0, %xmm02332; AVX512VL-NEXT: vpmovdb %xmm0, %xmm02333; AVX512VL-NEXT: retq2334;2335; AVX512DQ-LABEL: fptoui_2f32_to_2i8:2336; AVX512DQ: # %bb.0:2337; AVX512DQ-NEXT: vcvttps2dq %xmm0, %xmm02338; AVX512DQ-NEXT: vpackusdw %xmm0, %xmm0, %xmm02339; AVX512DQ-NEXT: vpackuswb %xmm0, %xmm0, %xmm02340; AVX512DQ-NEXT: retq2341;2342; AVX512VLDQ-LABEL: fptoui_2f32_to_2i8:2343; AVX512VLDQ: # %bb.0:2344; AVX512VLDQ-NEXT: vcvttps2dq %xmm0, %xmm02345; AVX512VLDQ-NEXT: vpmovdb %xmm0, %xmm02346; AVX512VLDQ-NEXT: retq2347 %cvt = fptoui <2 x float> %a to <2 x i8>2348 ret <2 x i8> %cvt2349}2350 2351define <2 x i16> @fptoui_2f32_to_2i16(<2 x float> %a) {2352; SSE-LABEL: fptoui_2f32_to_2i16:2353; SSE: # %bb.0:2354; SSE-NEXT: cvttps2dq %xmm0, %xmm02355; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]2356; SSE-NEXT: retq2357;2358; AVX-LABEL: fptoui_2f32_to_2i16:2359; AVX: # %bb.0:2360; AVX-NEXT: vcvttps2dq %xmm0, %xmm02361; AVX-NEXT: vpackusdw %xmm0, %xmm0, %xmm02362; AVX-NEXT: retq2363 %cvt = fptoui <2 x float> %a to <2 x i16>2364 ret <2 x i16> %cvt2365}2366 2367define <2 x i8> @fptosi_2f64_to_2i8(<2 x double> %a) {2368; SSE-LABEL: fptosi_2f64_to_2i8:2369; SSE: # %bb.0:2370; SSE-NEXT: cvttpd2dq %xmm0, %xmm02371; SSE-NEXT: packssdw %xmm0, %xmm02372; SSE-NEXT: packsswb %xmm0, %xmm02373; SSE-NEXT: retq2374;2375; VEX-LABEL: fptosi_2f64_to_2i8:2376; VEX: # %bb.0:2377; VEX-NEXT: vcvttpd2dq %xmm0, %xmm02378; VEX-NEXT: vpackssdw %xmm0, %xmm0, %xmm02379; VEX-NEXT: vpacksswb %xmm0, %xmm0, %xmm02380; VEX-NEXT: retq2381;2382; AVX512F-LABEL: fptosi_2f64_to_2i8:2383; AVX512F: # %bb.0:2384; AVX512F-NEXT: vcvttpd2dq %xmm0, %xmm02385; AVX512F-NEXT: vpackssdw %xmm0, %xmm0, %xmm02386; AVX512F-NEXT: vpacksswb %xmm0, %xmm0, %xmm02387; AVX512F-NEXT: retq2388;2389; AVX512VL-LABEL: fptosi_2f64_to_2i8:2390; AVX512VL: # %bb.0:2391; AVX512VL-NEXT: vcvttpd2dq %xmm0, %xmm02392; AVX512VL-NEXT: vpmovdb %xmm0, %xmm02393; AVX512VL-NEXT: retq2394;2395; AVX512DQ-LABEL: fptosi_2f64_to_2i8:2396; AVX512DQ: # %bb.0:2397; AVX512DQ-NEXT: vcvttpd2dq %xmm0, %xmm02398; AVX512DQ-NEXT: vpackssdw %xmm0, %xmm0, %xmm02399; AVX512DQ-NEXT: vpacksswb %xmm0, %xmm0, %xmm02400; AVX512DQ-NEXT: retq2401;2402; AVX512VLDQ-LABEL: fptosi_2f64_to_2i8:2403; AVX512VLDQ: # %bb.0:2404; AVX512VLDQ-NEXT: vcvttpd2dq %xmm0, %xmm02405; AVX512VLDQ-NEXT: vpmovdb %xmm0, %xmm02406; AVX512VLDQ-NEXT: retq2407 %cvt = fptosi <2 x double> %a to <2 x i8>2408 ret <2 x i8> %cvt2409}2410 2411define <2 x i16> @fptosi_2f64_to_2i16(<2 x double> %a) {2412; SSE-LABEL: fptosi_2f64_to_2i16:2413; SSE: # %bb.0:2414; SSE-NEXT: cvttpd2dq %xmm0, %xmm02415; SSE-NEXT: packssdw %xmm0, %xmm02416; SSE-NEXT: retq2417;2418; AVX-LABEL: fptosi_2f64_to_2i16:2419; AVX: # %bb.0:2420; AVX-NEXT: vcvttpd2dq %xmm0, %xmm02421; AVX-NEXT: vpackssdw %xmm0, %xmm0, %xmm02422; AVX-NEXT: retq2423 %cvt = fptosi <2 x double> %a to <2 x i16>2424 ret <2 x i16> %cvt2425}2426 2427define <2 x i8> @fptoui_2f64_to_2i8(<2 x double> %a) {2428; SSE-LABEL: fptoui_2f64_to_2i8:2429; SSE: # %bb.0:2430; SSE-NEXT: cvttpd2dq %xmm0, %xmm02431; SSE-NEXT: packuswb %xmm0, %xmm02432; SSE-NEXT: packuswb %xmm0, %xmm02433; SSE-NEXT: retq2434;2435; VEX-LABEL: fptoui_2f64_to_2i8:2436; VEX: # %bb.0:2437; VEX-NEXT: vcvttpd2dq %xmm0, %xmm02438; VEX-NEXT: vpackusdw %xmm0, %xmm0, %xmm02439; VEX-NEXT: vpackuswb %xmm0, %xmm0, %xmm02440; VEX-NEXT: retq2441;2442; AVX512F-LABEL: fptoui_2f64_to_2i8:2443; AVX512F: # %bb.0:2444; AVX512F-NEXT: vcvttpd2dq %xmm0, %xmm02445; AVX512F-NEXT: vpackusdw %xmm0, %xmm0, %xmm02446; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm02447; AVX512F-NEXT: retq2448;2449; AVX512VL-LABEL: fptoui_2f64_to_2i8:2450; AVX512VL: # %bb.0:2451; AVX512VL-NEXT: vcvttpd2dq %xmm0, %xmm02452; AVX512VL-NEXT: vpmovdb %xmm0, %xmm02453; AVX512VL-NEXT: retq2454;2455; AVX512DQ-LABEL: fptoui_2f64_to_2i8:2456; AVX512DQ: # %bb.0:2457; AVX512DQ-NEXT: vcvttpd2dq %xmm0, %xmm02458; AVX512DQ-NEXT: vpackusdw %xmm0, %xmm0, %xmm02459; AVX512DQ-NEXT: vpackuswb %xmm0, %xmm0, %xmm02460; AVX512DQ-NEXT: retq2461;2462; AVX512VLDQ-LABEL: fptoui_2f64_to_2i8:2463; AVX512VLDQ: # %bb.0:2464; AVX512VLDQ-NEXT: vcvttpd2dq %xmm0, %xmm02465; AVX512VLDQ-NEXT: vpmovdb %xmm0, %xmm02466; AVX512VLDQ-NEXT: retq2467 %cvt = fptoui <2 x double> %a to <2 x i8>2468 ret <2 x i8> %cvt2469}2470 2471define <2 x i16> @fptoui_2f64_to_2i16(<2 x double> %a) {2472; SSE-LABEL: fptoui_2f64_to_2i16:2473; SSE: # %bb.0:2474; SSE-NEXT: cvttpd2dq %xmm0, %xmm02475; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]2476; SSE-NEXT: retq2477;2478; AVX-LABEL: fptoui_2f64_to_2i16:2479; AVX: # %bb.0:2480; AVX-NEXT: vcvttpd2dq %xmm0, %xmm02481; AVX-NEXT: vpackusdw %xmm0, %xmm0, %xmm02482; AVX-NEXT: retq2483 %cvt = fptoui <2 x double> %a to <2 x i16>2484 ret <2 x i16> %cvt2485}2486 2487define <8 x i16> @fptosi_8f64_to_8i16(<8 x double> %a) {2488; SSE-LABEL: fptosi_8f64_to_8i16:2489; SSE: # %bb.0:2490; SSE-NEXT: cvttpd2dq %xmm3, %xmm32491; SSE-NEXT: cvttpd2dq %xmm2, %xmm22492; SSE-NEXT: unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]2493; SSE-NEXT: cvttpd2dq %xmm1, %xmm12494; SSE-NEXT: cvttpd2dq %xmm0, %xmm02495; SSE-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]2496; SSE-NEXT: packssdw %xmm2, %xmm02497; SSE-NEXT: retq2498;2499; VEX-LABEL: fptosi_8f64_to_8i16:2500; VEX: # %bb.0:2501; VEX-NEXT: vcvttpd2dq %ymm1, %xmm12502; VEX-NEXT: vcvttpd2dq %ymm0, %xmm02503; VEX-NEXT: vpackssdw %xmm1, %xmm0, %xmm02504; VEX-NEXT: vzeroupper2505; VEX-NEXT: retq2506;2507; AVX512F-LABEL: fptosi_8f64_to_8i16:2508; AVX512F: # %bb.0:2509; AVX512F-NEXT: vcvttpd2dq %zmm0, %ymm02510; AVX512F-NEXT: vpmovdw %zmm0, %ymm02511; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02512; AVX512F-NEXT: vzeroupper2513; AVX512F-NEXT: retq2514;2515; AVX512VL-LABEL: fptosi_8f64_to_8i16:2516; AVX512VL: # %bb.0:2517; AVX512VL-NEXT: vcvttpd2dq %zmm0, %ymm02518; AVX512VL-NEXT: vpmovdw %ymm0, %xmm02519; AVX512VL-NEXT: vzeroupper2520; AVX512VL-NEXT: retq2521;2522; AVX512DQ-LABEL: fptosi_8f64_to_8i16:2523; AVX512DQ: # %bb.0:2524; AVX512DQ-NEXT: vcvttpd2dq %zmm0, %ymm02525; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm02526; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02527; AVX512DQ-NEXT: vzeroupper2528; AVX512DQ-NEXT: retq2529;2530; AVX512VLDQ-LABEL: fptosi_8f64_to_8i16:2531; AVX512VLDQ: # %bb.0:2532; AVX512VLDQ-NEXT: vcvttpd2dq %zmm0, %ymm02533; AVX512VLDQ-NEXT: vpmovdw %ymm0, %xmm02534; AVX512VLDQ-NEXT: vzeroupper2535; AVX512VLDQ-NEXT: retq2536 %cvt = fptosi <8 x double> %a to <8 x i16>2537 ret <8 x i16> %cvt2538}2539 2540define <8 x i16> @fptoui_8f64_to_8i16(<8 x double> %a) {2541; SSE-LABEL: fptoui_8f64_to_8i16:2542; SSE: # %bb.0:2543; SSE-NEXT: cvttpd2dq %xmm3, %xmm32544; SSE-NEXT: cvttpd2dq %xmm2, %xmm22545; SSE-NEXT: unpcklpd {{.*#+}} xmm2 = xmm2[0],xmm3[0]2546; SSE-NEXT: pslld $16, %xmm22547; SSE-NEXT: psrad $16, %xmm22548; SSE-NEXT: cvttpd2dq %xmm1, %xmm12549; SSE-NEXT: cvttpd2dq %xmm0, %xmm02550; SSE-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]2551; SSE-NEXT: pslld $16, %xmm02552; SSE-NEXT: psrad $16, %xmm02553; SSE-NEXT: packssdw %xmm2, %xmm02554; SSE-NEXT: retq2555;2556; VEX-LABEL: fptoui_8f64_to_8i16:2557; VEX: # %bb.0:2558; VEX-NEXT: vcvttpd2dq %ymm1, %xmm12559; VEX-NEXT: vcvttpd2dq %ymm0, %xmm02560; VEX-NEXT: vpackusdw %xmm1, %xmm0, %xmm02561; VEX-NEXT: vzeroupper2562; VEX-NEXT: retq2563;2564; AVX512F-LABEL: fptoui_8f64_to_8i16:2565; AVX512F: # %bb.0:2566; AVX512F-NEXT: vcvttpd2dq %zmm0, %ymm02567; AVX512F-NEXT: vpmovdw %zmm0, %ymm02568; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02569; AVX512F-NEXT: vzeroupper2570; AVX512F-NEXT: retq2571;2572; AVX512VL-LABEL: fptoui_8f64_to_8i16:2573; AVX512VL: # %bb.0:2574; AVX512VL-NEXT: vcvttpd2dq %zmm0, %ymm02575; AVX512VL-NEXT: vpmovdw %ymm0, %xmm02576; AVX512VL-NEXT: vzeroupper2577; AVX512VL-NEXT: retq2578;2579; AVX512DQ-LABEL: fptoui_8f64_to_8i16:2580; AVX512DQ: # %bb.0:2581; AVX512DQ-NEXT: vcvttpd2dq %zmm0, %ymm02582; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm02583; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm02584; AVX512DQ-NEXT: vzeroupper2585; AVX512DQ-NEXT: retq2586;2587; AVX512VLDQ-LABEL: fptoui_8f64_to_8i16:2588; AVX512VLDQ: # %bb.0:2589; AVX512VLDQ-NEXT: vcvttpd2dq %zmm0, %ymm02590; AVX512VLDQ-NEXT: vpmovdw %ymm0, %xmm02591; AVX512VLDQ-NEXT: vzeroupper2592; AVX512VLDQ-NEXT: retq2593 %cvt = fptoui <8 x double> %a to <8 x i16>2594 ret <8 x i16> %cvt2595}2596 2597define <16 x i8> @fptosi_16f32_to_16i8(<16 x float> %a) {2598; SSE-LABEL: fptosi_16f32_to_16i8:2599; SSE: # %bb.0:2600; SSE-NEXT: cvttps2dq %xmm3, %xmm32601; SSE-NEXT: cvttps2dq %xmm2, %xmm22602; SSE-NEXT: packssdw %xmm3, %xmm22603; SSE-NEXT: cvttps2dq %xmm1, %xmm12604; SSE-NEXT: cvttps2dq %xmm0, %xmm02605; SSE-NEXT: packssdw %xmm1, %xmm02606; SSE-NEXT: packsswb %xmm2, %xmm02607; SSE-NEXT: retq2608;2609; AVX1-LABEL: fptosi_16f32_to_16i8:2610; AVX1: # %bb.0:2611; AVX1-NEXT: vcvttps2dq %ymm1, %ymm12612; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22613; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm12614; AVX1-NEXT: vcvttps2dq %ymm0, %ymm02615; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22616; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm02617; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm02618; AVX1-NEXT: vzeroupper2619; AVX1-NEXT: retq2620;2621; AVX2-LABEL: fptosi_16f32_to_16i8:2622; AVX2: # %bb.0:2623; AVX2-NEXT: vcvttps2dq %ymm1, %ymm12624; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm22625; AVX2-NEXT: vpackssdw %xmm2, %xmm1, %xmm12626; AVX2-NEXT: vcvttps2dq %ymm0, %ymm02627; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm22628; AVX2-NEXT: vpackssdw %xmm2, %xmm0, %xmm02629; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm02630; AVX2-NEXT: vzeroupper2631; AVX2-NEXT: retq2632;2633; AVX512-LABEL: fptosi_16f32_to_16i8:2634; AVX512: # %bb.0:2635; AVX512-NEXT: vcvttps2dq %zmm0, %zmm02636; AVX512-NEXT: vpmovdb %zmm0, %xmm02637; AVX512-NEXT: vzeroupper2638; AVX512-NEXT: retq2639 %cvt = fptosi <16 x float> %a to <16 x i8>2640 ret <16 x i8> %cvt2641}2642 2643define <16 x i8> @fptoui_16f32_to_16i8(<16 x float> %a) {2644; SSE-LABEL: fptoui_16f32_to_16i8:2645; SSE: # %bb.0:2646; SSE-NEXT: cvttps2dq %xmm3, %xmm32647; SSE-NEXT: cvttps2dq %xmm2, %xmm22648; SSE-NEXT: packssdw %xmm3, %xmm22649; SSE-NEXT: cvttps2dq %xmm1, %xmm12650; SSE-NEXT: cvttps2dq %xmm0, %xmm02651; SSE-NEXT: packssdw %xmm1, %xmm02652; SSE-NEXT: packuswb %xmm2, %xmm02653; SSE-NEXT: retq2654;2655; AVX1-LABEL: fptoui_16f32_to_16i8:2656; AVX1: # %bb.0:2657; AVX1-NEXT: vcvttps2dq %ymm1, %ymm12658; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm22659; AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm12660; AVX1-NEXT: vcvttps2dq %ymm0, %ymm02661; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm22662; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm02663; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm02664; AVX1-NEXT: vzeroupper2665; AVX1-NEXT: retq2666;2667; AVX2-LABEL: fptoui_16f32_to_16i8:2668; AVX2: # %bb.0:2669; AVX2-NEXT: vcvttps2dq %ymm1, %ymm12670; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm22671; AVX2-NEXT: vpackssdw %xmm2, %xmm1, %xmm12672; AVX2-NEXT: vcvttps2dq %ymm0, %ymm02673; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm22674; AVX2-NEXT: vpackssdw %xmm2, %xmm0, %xmm02675; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm02676; AVX2-NEXT: vzeroupper2677; AVX2-NEXT: retq2678;2679; AVX512-LABEL: fptoui_16f32_to_16i8:2680; AVX512: # %bb.0:2681; AVX512-NEXT: vcvttps2dq %zmm0, %zmm02682; AVX512-NEXT: vpmovdb %zmm0, %xmm02683; AVX512-NEXT: vzeroupper2684; AVX512-NEXT: retq2685 %cvt = fptoui <16 x float> %a to <16 x i8>2686 ret <16 x i8> %cvt2687}2688 2689define <2 x i64> @fptosi_2f32_to_2i64_load(ptr %x) {2690; SSE-LABEL: fptosi_2f32_to_2i64_load:2691; SSE: # %bb.0:2692; SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero2693; SSE-NEXT: cvttss2si %xmm1, %rax2694; SSE-NEXT: movq %rax, %xmm02695; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]2696; SSE-NEXT: cvttss2si %xmm1, %rax2697; SSE-NEXT: movq %rax, %xmm12698; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]2699; SSE-NEXT: retq2700;2701; VEX-LABEL: fptosi_2f32_to_2i64_load:2702; VEX: # %bb.0:2703; VEX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero2704; VEX-NEXT: vcvttss2si %xmm0, %rax2705; VEX-NEXT: vmovq %rax, %xmm12706; VEX-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]2707; VEX-NEXT: vcvttss2si %xmm0, %rax2708; VEX-NEXT: vmovq %rax, %xmm02709; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]2710; VEX-NEXT: retq2711;2712; AVX512F-LABEL: fptosi_2f32_to_2i64_load:2713; AVX512F: # %bb.0:2714; AVX512F-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero2715; AVX512F-NEXT: vcvttss2si %xmm0, %rax2716; AVX512F-NEXT: vmovq %rax, %xmm12717; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]2718; AVX512F-NEXT: vcvttss2si %xmm0, %rax2719; AVX512F-NEXT: vmovq %rax, %xmm02720; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]2721; AVX512F-NEXT: retq2722;2723; AVX512VL-LABEL: fptosi_2f32_to_2i64_load:2724; AVX512VL: # %bb.0:2725; AVX512VL-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero2726; AVX512VL-NEXT: vcvttss2si %xmm0, %rax2727; AVX512VL-NEXT: vmovq %rax, %xmm12728; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]2729; AVX512VL-NEXT: vcvttss2si %xmm0, %rax2730; AVX512VL-NEXT: vmovq %rax, %xmm02731; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]2732; AVX512VL-NEXT: retq2733;2734; AVX512DQ-LABEL: fptosi_2f32_to_2i64_load:2735; AVX512DQ: # %bb.0:2736; AVX512DQ-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero2737; AVX512DQ-NEXT: vcvttps2qq %ymm0, %zmm02738; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02739; AVX512DQ-NEXT: vzeroupper2740; AVX512DQ-NEXT: retq2741;2742; AVX512VLDQ-LABEL: fptosi_2f32_to_2i64_load:2743; AVX512VLDQ: # %bb.0:2744; AVX512VLDQ-NEXT: vcvttps2qq (%rdi), %xmm02745; AVX512VLDQ-NEXT: retq2746 %a = load <2 x float>, ptr %x2747 %b = fptosi <2 x float> %a to <2 x i64>2748 ret <2 x i64> %b2749}2750 2751define <2 x i64> @fptoui_2f32_to_2i64_load(ptr %x) {2752; SSE-LABEL: fptoui_2f32_to_2i64_load:2753; SSE: # %bb.0:2754; SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero2755; SSE-NEXT: movss {{.*#+}} xmm2 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]2756; SSE-NEXT: movaps %xmm1, %xmm02757; SSE-NEXT: subss %xmm2, %xmm02758; SSE-NEXT: cvttss2si %xmm0, %rax2759; SSE-NEXT: cvttss2si %xmm1, %rcx2760; SSE-NEXT: movq %rcx, %rdx2761; SSE-NEXT: sarq $63, %rdx2762; SSE-NEXT: andq %rax, %rdx2763; SSE-NEXT: orq %rcx, %rdx2764; SSE-NEXT: movq %rdx, %xmm02765; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]2766; SSE-NEXT: cvttss2si %xmm1, %rax2767; SSE-NEXT: subss %xmm2, %xmm12768; SSE-NEXT: cvttss2si %xmm1, %rcx2769; SSE-NEXT: movq %rax, %rdx2770; SSE-NEXT: sarq $63, %rdx2771; SSE-NEXT: andq %rcx, %rdx2772; SSE-NEXT: orq %rax, %rdx2773; SSE-NEXT: movq %rdx, %xmm12774; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]2775; SSE-NEXT: retq2776;2777; VEX-LABEL: fptoui_2f32_to_2i64_load:2778; VEX: # %bb.0:2779; VEX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero2780; VEX-NEXT: vmovss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]2781; VEX-NEXT: vsubss %xmm1, %xmm0, %xmm22782; VEX-NEXT: vcvttss2si %xmm2, %rax2783; VEX-NEXT: vcvttss2si %xmm0, %rcx2784; VEX-NEXT: movq %rcx, %rdx2785; VEX-NEXT: sarq $63, %rdx2786; VEX-NEXT: andq %rax, %rdx2787; VEX-NEXT: orq %rcx, %rdx2788; VEX-NEXT: vmovq %rdx, %xmm22789; VEX-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]2790; VEX-NEXT: vsubss %xmm1, %xmm0, %xmm12791; VEX-NEXT: vcvttss2si %xmm1, %rax2792; VEX-NEXT: vcvttss2si %xmm0, %rcx2793; VEX-NEXT: movq %rcx, %rdx2794; VEX-NEXT: sarq $63, %rdx2795; VEX-NEXT: andq %rax, %rdx2796; VEX-NEXT: orq %rcx, %rdx2797; VEX-NEXT: vmovq %rdx, %xmm02798; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]2799; VEX-NEXT: retq2800;2801; AVX512F-LABEL: fptoui_2f32_to_2i64_load:2802; AVX512F: # %bb.0:2803; AVX512F-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero2804; AVX512F-NEXT: vcvttss2usi %xmm0, %rax2805; AVX512F-NEXT: vmovq %rax, %xmm12806; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]2807; AVX512F-NEXT: vcvttss2usi %xmm0, %rax2808; AVX512F-NEXT: vmovq %rax, %xmm02809; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]2810; AVX512F-NEXT: retq2811;2812; AVX512VL-LABEL: fptoui_2f32_to_2i64_load:2813; AVX512VL: # %bb.0:2814; AVX512VL-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero2815; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax2816; AVX512VL-NEXT: vmovq %rax, %xmm12817; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]2818; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax2819; AVX512VL-NEXT: vmovq %rax, %xmm02820; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]2821; AVX512VL-NEXT: retq2822;2823; AVX512DQ-LABEL: fptoui_2f32_to_2i64_load:2824; AVX512DQ: # %bb.0:2825; AVX512DQ-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero2826; AVX512DQ-NEXT: vcvttps2uqq %ymm0, %zmm02827; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02828; AVX512DQ-NEXT: vzeroupper2829; AVX512DQ-NEXT: retq2830;2831; AVX512VLDQ-LABEL: fptoui_2f32_to_2i64_load:2832; AVX512VLDQ: # %bb.0:2833; AVX512VLDQ-NEXT: vcvttps2uqq (%rdi), %xmm02834; AVX512VLDQ-NEXT: retq2835 %a = load <2 x float>, ptr %x2836 %b = fptoui <2 x float> %a to <2 x i64>2837 ret <2 x i64> %b2838}2839