1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=VEX --check-prefix=AVX1 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=VEX --check-prefix=AVX2 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512VL 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512DQ 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512VLDQ 9; 10; 32-bit tests to make sure we're not doing anything stupid. 11; RUN: llc < %s -mtriple=i686-unknown-unknown 12; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse 13; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 14 15; 16; Double to Signed Integer 17; 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, %rax 23; SSE-NEXT: movd %rax, %xmm1 24; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 25; SSE-NEXT: cvttsd2si %xmm0, %rax 26; SSE-NEXT: movd %rax, %xmm0 27; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 28; SSE-NEXT: movdqa %xmm1, %xmm0 29; SSE-NEXT: retq 30; 31; VEX-LABEL: fptosi_2f64_to_2i64: 32; VEX: # BB#0: 33; VEX-NEXT: vcvttsd2si %xmm0, %rax 34; VEX-NEXT: vmovq %rax, %xmm1 35; VEX-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 36; VEX-NEXT: vcvttsd2si %xmm0, %rax 37; VEX-NEXT: vmovq %rax, %xmm0 38; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 39; VEX-NEXT: retq 40; 41; AVX512F-LABEL: fptosi_2f64_to_2i64: 42; AVX512F: # BB#0: 43; AVX512F-NEXT: vcvttsd2si %xmm0, %rax 44; AVX512F-NEXT: vmovq %rax, %xmm1 45; AVX512F-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 46; AVX512F-NEXT: vcvttsd2si %xmm0, %rax 47; AVX512F-NEXT: vmovq %rax, %xmm0 48; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 49; AVX512F-NEXT: retq 50; 51; AVX512VL-LABEL: fptosi_2f64_to_2i64: 52; AVX512VL: # BB#0: 53; AVX512VL-NEXT: vcvttsd2si %xmm0, %rax 54; AVX512VL-NEXT: vmovq %rax, %xmm1 55; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 56; AVX512VL-NEXT: vcvttsd2si %xmm0, %rax 57; AVX512VL-NEXT: vmovq %rax, %xmm0 58; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 59; AVX512VL-NEXT: retq 60; 61; AVX512DQ-LABEL: fptosi_2f64_to_2i64: 62; AVX512DQ: # BB#0: 63; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 64; AVX512DQ-NEXT: vcvttpd2qq %zmm0, %zmm0 65; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 66; AVX512DQ-NEXT: retq 67; 68; AVX512VLDQ-LABEL: fptosi_2f64_to_2i64: 69; AVX512VLDQ: # BB#0: 70; AVX512VLDQ-NEXT: vcvttpd2qq %xmm0, %xmm0 71; AVX512VLDQ-NEXT: retq 72 %cvt = fptosi <2 x double> %a to <2 x i64> 73 ret <2 x i64> %cvt 74} 75 76define <4 x i32> @fptosi_2f64_to_4i32(<2 x double> %a) { 77; SSE-LABEL: fptosi_2f64_to_4i32: 78; SSE: # BB#0: 79; SSE-NEXT: cvttpd2dq %xmm0, %xmm0 80; SSE-NEXT: retq 81; 82; AVX-LABEL: fptosi_2f64_to_4i32: 83; AVX: # BB#0: 84; AVX-NEXT: vcvttpd2dq %xmm0, %xmm0 85; AVX-NEXT: retq 86 %cvt = fptosi <2 x double> %a to <2 x i32> 87 %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 88 ret <4 x i32> %ext 89} 90 91define <2 x i32> @fptosi_2f64_to_2i32(<2 x double> %a) { 92; SSE-LABEL: fptosi_2f64_to_2i32: 93; SSE: # BB#0: 94; SSE-NEXT: cvttpd2dq %xmm0, %xmm0 95; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3] 96; SSE-NEXT: retq 97; 98; AVX-LABEL: fptosi_2f64_to_2i32: 99; AVX: # BB#0: 100; AVX-NEXT: vcvttpd2dq %xmm0, %xmm0 101; AVX-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 102; AVX-NEXT: retq 103 %cvt = fptosi <2 x double> %a to <2 x i32> 104 ret <2 x i32> %cvt 105} 106 107define <4 x i32> @fptosi_4f64_to_2i32(<2 x double> %a) { 108; SSE-LABEL: fptosi_4f64_to_2i32: 109; SSE: # BB#0: 110; SSE-NEXT: cvttpd2dq %xmm0, %xmm1 111; SSE-NEXT: cvttpd2dq %xmm0, %xmm0 112; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 113; SSE-NEXT: retq 114; 115; VEX-LABEL: fptosi_4f64_to_2i32: 116; VEX: # BB#0: 117; VEX-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def> 118; VEX-NEXT: vcvttpd2dq %ymm0, %xmm0 119; VEX-NEXT: vzeroupper 120; VEX-NEXT: retq 121; 122; AVX512-LABEL: fptosi_4f64_to_2i32: 123; AVX512: # BB#0: 124; AVX512-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def> 125; AVX512-NEXT: vcvttpd2dq %ymm0, %xmm0 126; AVX512-NEXT: retq 127 %ext = shufflevector <2 x double> %a, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> 128 %cvt = fptosi <4 x double> %ext to <4 x i32> 129 ret <4 x i32> %cvt 130} 131 132define <4 x i64> @fptosi_4f64_to_4i64(<4 x double> %a) { 133; SSE-LABEL: fptosi_4f64_to_4i64: 134; SSE: # BB#0: 135; SSE-NEXT: cvttsd2si %xmm0, %rax 136; SSE-NEXT: movd %rax, %xmm2 137; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 138; SSE-NEXT: cvttsd2si %xmm0, %rax 139; SSE-NEXT: movd %rax, %xmm0 140; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0] 141; SSE-NEXT: cvttsd2si %xmm1, %rax 142; SSE-NEXT: movd %rax, %xmm3 143; SSE-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1] 144; SSE-NEXT: cvttsd2si %xmm1, %rax 145; SSE-NEXT: movd %rax, %xmm0 146; SSE-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0] 147; SSE-NEXT: movdqa %xmm2, %xmm0 148; SSE-NEXT: movdqa %xmm3, %xmm1 149; SSE-NEXT: retq 150; 151; AVX1-LABEL: fptosi_4f64_to_4i64: 152; AVX1: # BB#0: 153; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 154; AVX1-NEXT: vcvttsd2si %xmm1, %rax 155; AVX1-NEXT: vmovq %rax, %xmm2 156; AVX1-NEXT: vpermilpd {{.*#+}} xmm1 = xmm1[1,0] 157; AVX1-NEXT: vcvttsd2si %xmm1, %rax 158; AVX1-NEXT: vmovq %rax, %xmm1 159; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 160; AVX1-NEXT: vcvttsd2si %xmm0, %rax 161; AVX1-NEXT: vmovq %rax, %xmm2 162; AVX1-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 163; AVX1-NEXT: vcvttsd2si %xmm0, %rax 164; AVX1-NEXT: vmovq %rax, %xmm0 165; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 166; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 167; AVX1-NEXT: retq 168; 169; AVX2-LABEL: fptosi_4f64_to_4i64: 170; AVX2: # BB#0: 171; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1 172; AVX2-NEXT: vcvttsd2si %xmm1, %rax 173; AVX2-NEXT: vmovq %rax, %xmm2 174; AVX2-NEXT: vpermilpd {{.*#+}} xmm1 = xmm1[1,0] 175; AVX2-NEXT: vcvttsd2si %xmm1, %rax 176; AVX2-NEXT: vmovq %rax, %xmm1 177; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 178; AVX2-NEXT: vcvttsd2si %xmm0, %rax 179; AVX2-NEXT: vmovq %rax, %xmm2 180; AVX2-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 181; AVX2-NEXT: vcvttsd2si %xmm0, %rax 182; AVX2-NEXT: vmovq %rax, %xmm0 183; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 184; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 185; AVX2-NEXT: retq 186; 187; AVX512F-LABEL: fptosi_4f64_to_4i64: 188; AVX512F: # BB#0: 189; AVX512F-NEXT: vextractf128 $1, %ymm0, %xmm1 190; AVX512F-NEXT: vcvttsd2si %xmm1, %rax 191; AVX512F-NEXT: vmovq %rax, %xmm2 192; AVX512F-NEXT: vpermilpd {{.*#+}} xmm1 = xmm1[1,0] 193; AVX512F-NEXT: vcvttsd2si %xmm1, %rax 194; AVX512F-NEXT: vmovq %rax, %xmm1 195; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 196; AVX512F-NEXT: vcvttsd2si %xmm0, %rax 197; AVX512F-NEXT: vmovq %rax, %xmm2 198; AVX512F-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 199; AVX512F-NEXT: vcvttsd2si %xmm0, %rax 200; AVX512F-NEXT: vmovq %rax, %xmm0 201; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 202; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 203; AVX512F-NEXT: retq 204; 205; AVX512VL-LABEL: fptosi_4f64_to_4i64: 206; AVX512VL: # BB#0: 207; AVX512VL-NEXT: vextractf32x4 $1, %ymm0, %xmm1 208; AVX512VL-NEXT: vcvttsd2si %xmm1, %rax 209; AVX512VL-NEXT: vmovq %rax, %xmm2 210; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm1 = xmm1[1,0] 211; AVX512VL-NEXT: vcvttsd2si %xmm1, %rax 212; AVX512VL-NEXT: vmovq %rax, %xmm1 213; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 214; AVX512VL-NEXT: vcvttsd2si %xmm0, %rax 215; AVX512VL-NEXT: vmovq %rax, %xmm2 216; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 217; AVX512VL-NEXT: vcvttsd2si %xmm0, %rax 218; AVX512VL-NEXT: vmovq %rax, %xmm0 219; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 220; AVX512VL-NEXT: vinserti32x4 $1, %xmm1, %ymm0, %ymm0 221; AVX512VL-NEXT: retq 222; 223; AVX512DQ-LABEL: fptosi_4f64_to_4i64: 224; AVX512DQ: # BB#0: 225; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 226; AVX512DQ-NEXT: vcvttpd2qq %zmm0, %zmm0 227; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 228; AVX512DQ-NEXT: retq 229; 230; AVX512VLDQ-LABEL: fptosi_4f64_to_4i64: 231; AVX512VLDQ: # BB#0: 232; AVX512VLDQ-NEXT: vcvttpd2qq %ymm0, %ymm0 233; AVX512VLDQ-NEXT: retq 234 %cvt = fptosi <4 x double> %a to <4 x i64> 235 ret <4 x i64> %cvt 236} 237 238define <4 x i32> @fptosi_4f64_to_4i32(<4 x double> %a) { 239; SSE-LABEL: fptosi_4f64_to_4i32: 240; SSE: # BB#0: 241; SSE-NEXT: cvttpd2dq %xmm1, %xmm1 242; SSE-NEXT: cvttpd2dq %xmm0, %xmm0 243; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 244; SSE-NEXT: retq 245; 246; VEX-LABEL: fptosi_4f64_to_4i32: 247; VEX: # BB#0: 248; VEX-NEXT: vcvttpd2dq %ymm0, %xmm0 249; VEX-NEXT: vzeroupper 250; VEX-NEXT: retq 251; 252; AVX512-LABEL: fptosi_4f64_to_4i32: 253; AVX512: # BB#0: 254; AVX512-NEXT: vcvttpd2dq %ymm0, %xmm0 255; AVX512-NEXT: retq 256 %cvt = fptosi <4 x double> %a to <4 x i32> 257 ret <4 x i32> %cvt 258} 259 260; 261; Double to Unsigned Integer 262; 263 264define <2 x i64> @fptoui_2f64_to_2i64(<2 x double> %a) { 265; SSE-LABEL: fptoui_2f64_to_2i64: 266; SSE: # BB#0: 267; SSE-NEXT: movsd {{.*#+}} xmm2 = mem[0],zero 268; SSE-NEXT: movapd %xmm0, %xmm1 269; SSE-NEXT: subsd %xmm2, %xmm1 270; SSE-NEXT: cvttsd2si %xmm1, %rax 271; SSE-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 272; SSE-NEXT: xorq %rcx, %rax 273; SSE-NEXT: cvttsd2si %xmm0, %rdx 274; SSE-NEXT: ucomisd %xmm2, %xmm0 275; SSE-NEXT: cmovaeq %rax, %rdx 276; SSE-NEXT: movd %rdx, %xmm1 277; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 278; SSE-NEXT: movaps %xmm0, %xmm3 279; SSE-NEXT: subsd %xmm2, %xmm3 280; SSE-NEXT: cvttsd2si %xmm3, %rax 281; SSE-NEXT: xorq %rcx, %rax 282; SSE-NEXT: cvttsd2si %xmm0, %rcx 283; SSE-NEXT: ucomisd %xmm2, %xmm0 284; SSE-NEXT: cmovaeq %rax, %rcx 285; SSE-NEXT: movd %rcx, %xmm0 286; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 287; SSE-NEXT: movdqa %xmm1, %xmm0 288; SSE-NEXT: retq 289; 290; VEX-LABEL: fptoui_2f64_to_2i64: 291; VEX: # BB#0: 292; VEX-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero 293; VEX-NEXT: vsubsd %xmm1, %xmm0, %xmm2 294; VEX-NEXT: vcvttsd2si %xmm2, %rax 295; VEX-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 296; VEX-NEXT: xorq %rcx, %rax 297; VEX-NEXT: vcvttsd2si %xmm0, %rdx 298; VEX-NEXT: vucomisd %xmm1, %xmm0 299; VEX-NEXT: cmovaeq %rax, %rdx 300; VEX-NEXT: vmovq %rdx, %xmm2 301; VEX-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 302; VEX-NEXT: vsubsd %xmm1, %xmm0, %xmm3 303; VEX-NEXT: vcvttsd2si %xmm3, %rax 304; VEX-NEXT: xorq %rcx, %rax 305; VEX-NEXT: vcvttsd2si %xmm0, %rcx 306; VEX-NEXT: vucomisd %xmm1, %xmm0 307; VEX-NEXT: cmovaeq %rax, %rcx 308; VEX-NEXT: vmovq %rcx, %xmm0 309; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 310; VEX-NEXT: retq 311; 312; AVX512F-LABEL: fptoui_2f64_to_2i64: 313; AVX512F: # BB#0: 314; AVX512F-NEXT: vcvttsd2usi %xmm0, %rax 315; AVX512F-NEXT: vmovq %rax, %xmm1 316; AVX512F-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 317; AVX512F-NEXT: vcvttsd2usi %xmm0, %rax 318; AVX512F-NEXT: vmovq %rax, %xmm0 319; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 320; AVX512F-NEXT: retq 321; 322; AVX512VL-LABEL: fptoui_2f64_to_2i64: 323; AVX512VL: # BB#0: 324; AVX512VL-NEXT: vcvttsd2usi %xmm0, %rax 325; AVX512VL-NEXT: vmovq %rax, %xmm1 326; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 327; AVX512VL-NEXT: vcvttsd2usi %xmm0, %rax 328; AVX512VL-NEXT: vmovq %rax, %xmm0 329; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 330; AVX512VL-NEXT: retq 331; 332; AVX512DQ-LABEL: fptoui_2f64_to_2i64: 333; AVX512DQ: # BB#0: 334; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 335; AVX512DQ-NEXT: vcvttpd2uqq %zmm0, %zmm0 336; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 337; AVX512DQ-NEXT: retq 338; 339; AVX512VLDQ-LABEL: fptoui_2f64_to_2i64: 340; AVX512VLDQ: # BB#0: 341; AVX512VLDQ-NEXT: vcvttpd2uqq %xmm0, %xmm0 342; AVX512VLDQ-NEXT: retq 343 %cvt = fptoui <2 x double> %a to <2 x i64> 344 ret <2 x i64> %cvt 345} 346 347define <4 x i32> @fptoui_2f64_to_4i32(<2 x double> %a) { 348; SSE-LABEL: fptoui_2f64_to_4i32: 349; SSE: # BB#0: 350; SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero 351; SSE-NEXT: movapd %xmm0, %xmm2 352; SSE-NEXT: subsd %xmm1, %xmm2 353; SSE-NEXT: cvttsd2si %xmm2, %rax 354; SSE-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 355; SSE-NEXT: xorq %rcx, %rax 356; SSE-NEXT: cvttsd2si %xmm0, %rdx 357; SSE-NEXT: ucomisd %xmm1, %xmm0 358; SSE-NEXT: cmovaeq %rax, %rdx 359; SSE-NEXT: movd %rdx, %xmm2 360; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 361; SSE-NEXT: movaps %xmm0, %xmm3 362; SSE-NEXT: subsd %xmm1, %xmm3 363; SSE-NEXT: cvttsd2si %xmm3, %rax 364; SSE-NEXT: xorq %rcx, %rax 365; SSE-NEXT: cvttsd2si %xmm0, %rcx 366; SSE-NEXT: ucomisd %xmm1, %xmm0 367; SSE-NEXT: cmovaeq %rax, %rcx 368; SSE-NEXT: movd %rcx, %xmm0 369; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0] 370; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,1,0,2] 371; SSE-NEXT: psrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero 372; SSE-NEXT: retq 373; 374; VEX-LABEL: fptoui_2f64_to_4i32: 375; VEX: # BB#0: 376; VEX-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero 377; VEX-NEXT: vsubsd %xmm1, %xmm0, %xmm2 378; VEX-NEXT: vcvttsd2si %xmm2, %rax 379; VEX-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 380; VEX-NEXT: xorq %rcx, %rax 381; VEX-NEXT: vcvttsd2si %xmm0, %rdx 382; VEX-NEXT: vucomisd %xmm1, %xmm0 383; VEX-NEXT: cmovaeq %rax, %rdx 384; VEX-NEXT: vmovq %rdx, %xmm2 385; VEX-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 386; VEX-NEXT: vsubsd %xmm1, %xmm0, %xmm3 387; VEX-NEXT: vcvttsd2si %xmm3, %rax 388; VEX-NEXT: xorq %rcx, %rax 389; VEX-NEXT: vcvttsd2si %xmm0, %rcx 390; VEX-NEXT: vucomisd %xmm1, %xmm0 391; VEX-NEXT: cmovaeq %rax, %rcx 392; VEX-NEXT: vmovq %rcx, %xmm0 393; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 394; VEX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 395; VEX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 396; VEX-NEXT: retq 397; 398; AVX512F-LABEL: fptoui_2f64_to_4i32: 399; AVX512F: # BB#0: 400; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 401; AVX512F-NEXT: vcvttpd2udq %zmm0, %ymm0 402; AVX512F-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 403; AVX512F-NEXT: retq 404; 405; AVX512VL-LABEL: fptoui_2f64_to_4i32: 406; AVX512VL: # BB#0: 407; AVX512VL-NEXT: vcvttpd2udq %xmm0, %xmm0 408; AVX512VL-NEXT: retq 409; 410; AVX512DQ-LABEL: fptoui_2f64_to_4i32: 411; AVX512DQ: # BB#0: 412; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 413; AVX512DQ-NEXT: vcvttpd2udq %zmm0, %ymm0 414; AVX512DQ-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 415; AVX512DQ-NEXT: retq 416; 417; AVX512VLDQ-LABEL: fptoui_2f64_to_4i32: 418; AVX512VLDQ: # BB#0: 419; AVX512VLDQ-NEXT: vcvttpd2udq %xmm0, %xmm0 420; AVX512VLDQ-NEXT: retq 421 %cvt = fptoui <2 x double> %a to <2 x i32> 422 %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 423 ret <4 x i32> %ext 424} 425 426define <4 x i32> @fptoui_2f64_to_2i32(<2 x double> %a) { 427; SSE-LABEL: fptoui_2f64_to_2i32: 428; SSE: # BB#0: 429; SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero 430; SSE-NEXT: movapd %xmm0, %xmm2 431; SSE-NEXT: subsd %xmm1, %xmm2 432; SSE-NEXT: cvttsd2si %xmm2, %rax 433; SSE-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 434; SSE-NEXT: xorq %rcx, %rax 435; SSE-NEXT: cvttsd2si %xmm0, %rdx 436; SSE-NEXT: ucomisd %xmm1, %xmm0 437; SSE-NEXT: cmovaeq %rax, %rdx 438; SSE-NEXT: movd %rdx, %xmm2 439; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 440; SSE-NEXT: movaps %xmm0, %xmm3 441; SSE-NEXT: subsd %xmm1, %xmm3 442; SSE-NEXT: cvttsd2si %xmm3, %rax 443; SSE-NEXT: xorq %rcx, %rax 444; SSE-NEXT: cvttsd2si %xmm0, %rcx 445; SSE-NEXT: ucomisd %xmm1, %xmm0 446; SSE-NEXT: cmovaeq %rax, %rcx 447; SSE-NEXT: movd %rcx, %xmm0 448; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0] 449; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 450; SSE-NEXT: retq 451; 452; VEX-LABEL: fptoui_2f64_to_2i32: 453; VEX: # BB#0: 454; VEX-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero 455; VEX-NEXT: vsubsd %xmm1, %xmm0, %xmm2 456; VEX-NEXT: vcvttsd2si %xmm2, %rax 457; VEX-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 458; VEX-NEXT: xorq %rcx, %rax 459; VEX-NEXT: vcvttsd2si %xmm0, %rdx 460; VEX-NEXT: vucomisd %xmm1, %xmm0 461; VEX-NEXT: cmovaeq %rax, %rdx 462; VEX-NEXT: vmovq %rdx, %xmm2 463; VEX-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 464; VEX-NEXT: vsubsd %xmm1, %xmm0, %xmm3 465; VEX-NEXT: vcvttsd2si %xmm3, %rax 466; VEX-NEXT: xorq %rcx, %rax 467; VEX-NEXT: vcvttsd2si %xmm0, %rcx 468; VEX-NEXT: vucomisd %xmm1, %xmm0 469; VEX-NEXT: cmovaeq %rax, %rcx 470; VEX-NEXT: vmovq %rcx, %xmm0 471; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 472; VEX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 473; VEX-NEXT: retq 474; 475; AVX512F-LABEL: fptoui_2f64_to_2i32: 476; AVX512F: # BB#0: 477; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 478; AVX512F-NEXT: vcvttpd2udq %zmm0, %ymm0 479; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 480; AVX512F-NEXT: retq 481; 482; AVX512VL-LABEL: fptoui_2f64_to_2i32: 483; AVX512VL: # BB#0: 484; AVX512VL-NEXT: vcvttpd2udq %xmm0, %xmm0 485; AVX512VL-NEXT: retq 486; 487; AVX512DQ-LABEL: fptoui_2f64_to_2i32: 488; AVX512DQ: # BB#0: 489; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 490; AVX512DQ-NEXT: vcvttpd2udq %zmm0, %ymm0 491; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 492; AVX512DQ-NEXT: retq 493; 494; AVX512VLDQ-LABEL: fptoui_2f64_to_2i32: 495; AVX512VLDQ: # BB#0: 496; AVX512VLDQ-NEXT: vcvttpd2udq %xmm0, %xmm0 497; AVX512VLDQ-NEXT: retq 498 %cvt = fptoui <2 x double> %a to <2 x i32> 499 %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> 500 ret <4 x i32> %ext 501} 502 503define <4 x i32> @fptoui_4f64_to_2i32(<2 x double> %a) { 504; SSE-LABEL: fptoui_4f64_to_2i32: 505; SSE: # BB#0: 506; SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero 507; SSE-NEXT: movapd %xmm0, %xmm2 508; SSE-NEXT: subsd %xmm1, %xmm2 509; SSE-NEXT: cvttsd2si %xmm2, %rax 510; SSE-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 511; SSE-NEXT: xorq %rcx, %rax 512; SSE-NEXT: cvttsd2si %xmm0, %rdx 513; SSE-NEXT: ucomisd %xmm1, %xmm0 514; SSE-NEXT: cmovaeq %rax, %rdx 515; SSE-NEXT: movd %rdx, %xmm2 516; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 517; SSE-NEXT: movaps %xmm0, %xmm3 518; SSE-NEXT: subsd %xmm1, %xmm3 519; SSE-NEXT: cvttsd2si %xmm3, %rax 520; SSE-NEXT: xorq %rcx, %rax 521; SSE-NEXT: cvttsd2si %xmm0, %rdx 522; SSE-NEXT: ucomisd %xmm1, %xmm0 523; SSE-NEXT: cmovaeq %rax, %rdx 524; SSE-NEXT: movd %rdx, %xmm0 525; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0] 526; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 527; SSE-NEXT: cvttsd2si %xmm0, %rax 528; SSE-NEXT: xorq %rax, %rcx 529; SSE-NEXT: ucomisd %xmm1, %xmm0 530; SSE-NEXT: cmovbq %rax, %rcx 531; SSE-NEXT: movd %rcx, %xmm1 532; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1] 533; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 534; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 535; SSE-NEXT: retq 536; 537; VEX-LABEL: fptoui_4f64_to_2i32: 538; VEX: # BB#0: 539; VEX-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0] 540; VEX-NEXT: vcvttsd2si %xmm1, %rax 541; VEX-NEXT: vcvttsd2si %xmm0, %rcx 542; VEX-NEXT: vmovd %ecx, %xmm0 543; VEX-NEXT: vpinsrd $1, %eax, %xmm0, %xmm0 544; VEX-NEXT: vcvttsd2si %xmm0, %rax 545; VEX-NEXT: vpinsrd $2, %eax, %xmm0, %xmm0 546; VEX-NEXT: vpinsrd $3, %eax, %xmm0, %xmm0 547; VEX-NEXT: retq 548; 549; AVX512F-LABEL: fptoui_4f64_to_2i32: 550; AVX512F: # BB#0: 551; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 552; AVX512F-NEXT: vcvttpd2udq %zmm0, %ymm0 553; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 554; AVX512F-NEXT: retq 555; 556; AVX512VL-LABEL: fptoui_4f64_to_2i32: 557; AVX512VL: # BB#0: 558; AVX512VL-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def> 559; AVX512VL-NEXT: vcvttpd2udq %ymm0, %xmm0 560; AVX512VL-NEXT: retq 561; 562; AVX512DQ-LABEL: fptoui_4f64_to_2i32: 563; AVX512DQ: # BB#0: 564; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 565; AVX512DQ-NEXT: vcvttpd2udq %zmm0, %ymm0 566; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 567; AVX512DQ-NEXT: retq 568; 569; AVX512VLDQ-LABEL: fptoui_4f64_to_2i32: 570; AVX512VLDQ: # BB#0: 571; AVX512VLDQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def> 572; AVX512VLDQ-NEXT: vcvttpd2udq %ymm0, %xmm0 573; AVX512VLDQ-NEXT: retq 574 %ext = shufflevector <2 x double> %a, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> 575 %cvt = fptoui <4 x double> %ext to <4 x i32> 576 ret <4 x i32> %cvt 577} 578 579define <4 x i64> @fptoui_4f64_to_4i64(<4 x double> %a) { 580; SSE-LABEL: fptoui_4f64_to_4i64: 581; SSE: # BB#0: 582; SSE-NEXT: movapd %xmm0, %xmm2 583; SSE-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero 584; SSE-NEXT: subsd %xmm3, %xmm0 585; SSE-NEXT: cvttsd2si %xmm0, %rcx 586; SSE-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000 587; SSE-NEXT: xorq %rax, %rcx 588; SSE-NEXT: cvttsd2si %xmm2, %rdx 589; SSE-NEXT: ucomisd %xmm3, %xmm2 590; SSE-NEXT: cmovaeq %rcx, %rdx 591; SSE-NEXT: movd %rdx, %xmm0 592; SSE-NEXT: movhlps {{.*#+}} xmm2 = xmm2[1,1] 593; SSE-NEXT: movaps %xmm2, %xmm4 594; SSE-NEXT: subsd %xmm3, %xmm4 595; SSE-NEXT: cvttsd2si %xmm4, %rcx 596; SSE-NEXT: xorq %rax, %rcx 597; SSE-NEXT: cvttsd2si %xmm2, %rdx 598; SSE-NEXT: ucomisd %xmm3, %xmm2 599; SSE-NEXT: cmovaeq %rcx, %rdx 600; SSE-NEXT: movd %rdx, %xmm2 601; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 602; SSE-NEXT: movapd %xmm1, %xmm2 603; SSE-NEXT: subsd %xmm3, %xmm2 604; SSE-NEXT: cvttsd2si %xmm2, %rcx 605; SSE-NEXT: xorq %rax, %rcx 606; SSE-NEXT: cvttsd2si %xmm1, %rdx 607; SSE-NEXT: ucomisd %xmm3, %xmm1 608; SSE-NEXT: cmovaeq %rcx, %rdx 609; SSE-NEXT: movd %rdx, %xmm2 610; SSE-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1] 611; SSE-NEXT: movaps %xmm1, %xmm4 612; SSE-NEXT: subsd %xmm3, %xmm4 613; SSE-NEXT: cvttsd2si %xmm4, %rcx 614; SSE-NEXT: xorq %rax, %rcx 615; SSE-NEXT: cvttsd2si %xmm1, %rax 616; SSE-NEXT: ucomisd %xmm3, %xmm1 617; SSE-NEXT: cmovaeq %rcx, %rax 618; SSE-NEXT: movd %rax, %xmm1 619; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 620; SSE-NEXT: movdqa %xmm2, %xmm1 621; SSE-NEXT: retq 622; 623; AVX1-LABEL: fptoui_4f64_to_4i64: 624; AVX1: # BB#0: 625; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 626; AVX1-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero 627; AVX1-NEXT: vsubsd %xmm1, %xmm2, %xmm3 628; AVX1-NEXT: vcvttsd2si %xmm3, %rax 629; AVX1-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 630; AVX1-NEXT: xorq %rcx, %rax 631; AVX1-NEXT: vcvttsd2si %xmm2, %rdx 632; AVX1-NEXT: vucomisd %xmm1, %xmm2 633; AVX1-NEXT: cmovaeq %rax, %rdx 634; AVX1-NEXT: vmovq %rdx, %xmm3 635; AVX1-NEXT: vpermilpd {{.*#+}} xmm2 = xmm2[1,0] 636; AVX1-NEXT: vsubsd %xmm1, %xmm2, %xmm4 637; AVX1-NEXT: vcvttsd2si %xmm4, %rax 638; AVX1-NEXT: xorq %rcx, %rax 639; AVX1-NEXT: vcvttsd2si %xmm2, %rdx 640; AVX1-NEXT: vucomisd %xmm1, %xmm2 641; AVX1-NEXT: cmovaeq %rax, %rdx 642; AVX1-NEXT: vmovq %rdx, %xmm2 643; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0] 644; AVX1-NEXT: vsubsd %xmm1, %xmm0, %xmm3 645; AVX1-NEXT: vcvttsd2si %xmm3, %rax 646; AVX1-NEXT: xorq %rcx, %rax 647; AVX1-NEXT: vcvttsd2si %xmm0, %rdx 648; AVX1-NEXT: vucomisd %xmm1, %xmm0 649; AVX1-NEXT: cmovaeq %rax, %rdx 650; AVX1-NEXT: vmovq %rdx, %xmm3 651; AVX1-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 652; AVX1-NEXT: vsubsd %xmm1, %xmm0, %xmm4 653; AVX1-NEXT: vcvttsd2si %xmm4, %rax 654; AVX1-NEXT: xorq %rcx, %rax 655; AVX1-NEXT: vcvttsd2si %xmm0, %rcx 656; AVX1-NEXT: vucomisd %xmm1, %xmm0 657; AVX1-NEXT: cmovaeq %rax, %rcx 658; AVX1-NEXT: vmovq %rcx, %xmm0 659; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0] 660; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 661; AVX1-NEXT: retq 662; 663; AVX2-LABEL: fptoui_4f64_to_4i64: 664; AVX2: # BB#0: 665; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm2 666; AVX2-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero 667; AVX2-NEXT: vsubsd %xmm1, %xmm2, %xmm3 668; AVX2-NEXT: vcvttsd2si %xmm3, %rax 669; AVX2-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 670; AVX2-NEXT: xorq %rcx, %rax 671; AVX2-NEXT: vcvttsd2si %xmm2, %rdx 672; AVX2-NEXT: vucomisd %xmm1, %xmm2 673; AVX2-NEXT: cmovaeq %rax, %rdx 674; AVX2-NEXT: vmovq %rdx, %xmm3 675; AVX2-NEXT: vpermilpd {{.*#+}} xmm2 = xmm2[1,0] 676; AVX2-NEXT: vsubsd %xmm1, %xmm2, %xmm4 677; AVX2-NEXT: vcvttsd2si %xmm4, %rax 678; AVX2-NEXT: xorq %rcx, %rax 679; AVX2-NEXT: vcvttsd2si %xmm2, %rdx 680; AVX2-NEXT: vucomisd %xmm1, %xmm2 681; AVX2-NEXT: cmovaeq %rax, %rdx 682; AVX2-NEXT: vmovq %rdx, %xmm2 683; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0] 684; AVX2-NEXT: vsubsd %xmm1, %xmm0, %xmm3 685; AVX2-NEXT: vcvttsd2si %xmm3, %rax 686; AVX2-NEXT: xorq %rcx, %rax 687; AVX2-NEXT: vcvttsd2si %xmm0, %rdx 688; AVX2-NEXT: vucomisd %xmm1, %xmm0 689; AVX2-NEXT: cmovaeq %rax, %rdx 690; AVX2-NEXT: vmovq %rdx, %xmm3 691; AVX2-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 692; AVX2-NEXT: vsubsd %xmm1, %xmm0, %xmm4 693; AVX2-NEXT: vcvttsd2si %xmm4, %rax 694; AVX2-NEXT: xorq %rcx, %rax 695; AVX2-NEXT: vcvttsd2si %xmm0, %rcx 696; AVX2-NEXT: vucomisd %xmm1, %xmm0 697; AVX2-NEXT: cmovaeq %rax, %rcx 698; AVX2-NEXT: vmovq %rcx, %xmm0 699; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0] 700; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 701; AVX2-NEXT: retq 702; 703; AVX512F-LABEL: fptoui_4f64_to_4i64: 704; AVX512F: # BB#0: 705; AVX512F-NEXT: vextractf128 $1, %ymm0, %xmm1 706; AVX512F-NEXT: vcvttsd2usi %xmm1, %rax 707; AVX512F-NEXT: vmovq %rax, %xmm2 708; AVX512F-NEXT: vpermilpd {{.*#+}} xmm1 = xmm1[1,0] 709; AVX512F-NEXT: vcvttsd2usi %xmm1, %rax 710; AVX512F-NEXT: vmovq %rax, %xmm1 711; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 712; AVX512F-NEXT: vcvttsd2usi %xmm0, %rax 713; AVX512F-NEXT: vmovq %rax, %xmm2 714; AVX512F-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 715; AVX512F-NEXT: vcvttsd2usi %xmm0, %rax 716; AVX512F-NEXT: vmovq %rax, %xmm0 717; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 718; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 719; AVX512F-NEXT: retq 720; 721; AVX512VL-LABEL: fptoui_4f64_to_4i64: 722; AVX512VL: # BB#0: 723; AVX512VL-NEXT: vextractf32x4 $1, %ymm0, %xmm1 724; AVX512VL-NEXT: vcvttsd2usi %xmm1, %rax 725; AVX512VL-NEXT: vmovq %rax, %xmm2 726; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm1 = xmm1[1,0] 727; AVX512VL-NEXT: vcvttsd2usi %xmm1, %rax 728; AVX512VL-NEXT: vmovq %rax, %xmm1 729; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 730; AVX512VL-NEXT: vcvttsd2usi %xmm0, %rax 731; AVX512VL-NEXT: vmovq %rax, %xmm2 732; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 733; AVX512VL-NEXT: vcvttsd2usi %xmm0, %rax 734; AVX512VL-NEXT: vmovq %rax, %xmm0 735; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 736; AVX512VL-NEXT: vinserti32x4 $1, %xmm1, %ymm0, %ymm0 737; AVX512VL-NEXT: retq 738; 739; AVX512DQ-LABEL: fptoui_4f64_to_4i64: 740; AVX512DQ: # BB#0: 741; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 742; AVX512DQ-NEXT: vcvttpd2uqq %zmm0, %zmm0 743; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 744; AVX512DQ-NEXT: retq 745; 746; AVX512VLDQ-LABEL: fptoui_4f64_to_4i64: 747; AVX512VLDQ: # BB#0: 748; AVX512VLDQ-NEXT: vcvttpd2uqq %ymm0, %ymm0 749; AVX512VLDQ-NEXT: retq 750 %cvt = fptoui <4 x double> %a to <4 x i64> 751 ret <4 x i64> %cvt 752} 753 754define <4 x i32> @fptoui_4f64_to_4i32(<4 x double> %a) { 755; SSE-LABEL: fptoui_4f64_to_4i32: 756; SSE: # BB#0: 757; SSE-NEXT: movsd {{.*#+}} xmm2 = mem[0],zero 758; SSE-NEXT: movapd %xmm1, %xmm3 759; SSE-NEXT: subsd %xmm2, %xmm3 760; SSE-NEXT: cvttsd2si %xmm3, %rcx 761; SSE-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000 762; SSE-NEXT: xorq %rax, %rcx 763; SSE-NEXT: cvttsd2si %xmm1, %rdx 764; SSE-NEXT: ucomisd %xmm2, %xmm1 765; SSE-NEXT: cmovaeq %rcx, %rdx 766; SSE-NEXT: movd %rdx, %xmm3 767; SSE-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1] 768; SSE-NEXT: movaps %xmm1, %xmm4 769; SSE-NEXT: subsd %xmm2, %xmm4 770; SSE-NEXT: cvttsd2si %xmm4, %rcx 771; SSE-NEXT: xorq %rax, %rcx 772; SSE-NEXT: cvttsd2si %xmm1, %rdx 773; SSE-NEXT: ucomisd %xmm2, %xmm1 774; SSE-NEXT: cmovaeq %rcx, %rdx 775; SSE-NEXT: movd %rdx, %xmm1 776; SSE-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm1[0] 777; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3] 778; SSE-NEXT: movapd %xmm0, %xmm3 779; SSE-NEXT: subsd %xmm2, %xmm3 780; SSE-NEXT: cvttsd2si %xmm3, %rcx 781; SSE-NEXT: xorq %rax, %rcx 782; SSE-NEXT: cvttsd2si %xmm0, %rdx 783; SSE-NEXT: ucomisd %xmm2, %xmm0 784; SSE-NEXT: cmovaeq %rcx, %rdx 785; SSE-NEXT: movd %rdx, %xmm3 786; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 787; SSE-NEXT: movaps %xmm0, %xmm4 788; SSE-NEXT: subsd %xmm2, %xmm4 789; SSE-NEXT: cvttsd2si %xmm4, %rcx 790; SSE-NEXT: xorq %rax, %rcx 791; SSE-NEXT: cvttsd2si %xmm0, %rax 792; SSE-NEXT: ucomisd %xmm2, %xmm0 793; SSE-NEXT: cmovaeq %rcx, %rax 794; SSE-NEXT: movd %rax, %xmm0 795; SSE-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0] 796; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 797; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 798; SSE-NEXT: retq 799; 800; VEX-LABEL: fptoui_4f64_to_4i32: 801; VEX: # BB#0: 802; VEX-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0] 803; VEX-NEXT: vcvttsd2si %xmm1, %rax 804; VEX-NEXT: vcvttsd2si %xmm0, %rcx 805; VEX-NEXT: vmovd %ecx, %xmm1 806; VEX-NEXT: vpinsrd $1, %eax, %xmm1, %xmm1 807; VEX-NEXT: vextractf128 $1, %ymm0, %xmm0 808; VEX-NEXT: vcvttsd2si %xmm0, %rax 809; VEX-NEXT: vpinsrd $2, %eax, %xmm1, %xmm1 810; VEX-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 811; VEX-NEXT: vcvttsd2si %xmm0, %rax 812; VEX-NEXT: vpinsrd $3, %eax, %xmm1, %xmm0 813; VEX-NEXT: vzeroupper 814; VEX-NEXT: retq 815; 816; AVX512F-LABEL: fptoui_4f64_to_4i32: 817; AVX512F: # BB#0: 818; AVX512F-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 819; AVX512F-NEXT: vcvttpd2udq %zmm0, %ymm0 820; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 821; AVX512F-NEXT: retq 822; 823; AVX512VL-LABEL: fptoui_4f64_to_4i32: 824; AVX512VL: # BB#0: 825; AVX512VL-NEXT: vcvttpd2udq %ymm0, %xmm0 826; AVX512VL-NEXT: retq 827; 828; AVX512DQ-LABEL: fptoui_4f64_to_4i32: 829; AVX512DQ: # BB#0: 830; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 831; AVX512DQ-NEXT: vcvttpd2udq %zmm0, %ymm0 832; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 833; AVX512DQ-NEXT: retq 834; 835; AVX512VLDQ-LABEL: fptoui_4f64_to_4i32: 836; AVX512VLDQ: # BB#0: 837; AVX512VLDQ-NEXT: vcvttpd2udq %ymm0, %xmm0 838; AVX512VLDQ-NEXT: retq 839 %cvt = fptoui <4 x double> %a to <4 x i32> 840 ret <4 x i32> %cvt 841} 842 843; 844; Float to Signed Integer 845; 846 847define <2 x i32> @fptosi_2f32_to_2i32(<2 x float> %a) { 848; SSE-LABEL: fptosi_2f32_to_2i32: 849; SSE: # BB#0: 850; SSE-NEXT: cvttps2dq %xmm0, %xmm0 851; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3] 852; SSE-NEXT: retq 853; 854; AVX-LABEL: fptosi_2f32_to_2i32: 855; AVX: # BB#0: 856; AVX-NEXT: vcvttps2dq %xmm0, %xmm0 857; AVX-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 858; AVX-NEXT: retq 859 %cvt = fptosi <2 x float> %a to <2 x i32> 860 ret <2 x i32> %cvt 861} 862 863define <4 x i32> @fptosi_4f32_to_4i32(<4 x float> %a) { 864; SSE-LABEL: fptosi_4f32_to_4i32: 865; SSE: # BB#0: 866; SSE-NEXT: cvttps2dq %xmm0, %xmm0 867; SSE-NEXT: retq 868; 869; AVX-LABEL: fptosi_4f32_to_4i32: 870; AVX: # BB#0: 871; AVX-NEXT: vcvttps2dq %xmm0, %xmm0 872; AVX-NEXT: retq 873 %cvt = fptosi <4 x float> %a to <4 x i32> 874 ret <4 x i32> %cvt 875} 876 877define <2 x i64> @fptosi_2f32_to_2i64(<4 x float> %a) { 878; SSE-LABEL: fptosi_2f32_to_2i64: 879; SSE: # BB#0: 880; SSE-NEXT: cvttss2si %xmm0, %rax 881; SSE-NEXT: movd %rax, %xmm1 882; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,2,3] 883; SSE-NEXT: cvttss2si %xmm0, %rax 884; SSE-NEXT: movd %rax, %xmm0 885; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 886; SSE-NEXT: movdqa %xmm1, %xmm0 887; SSE-NEXT: retq 888; 889; VEX-LABEL: fptosi_2f32_to_2i64: 890; VEX: # BB#0: 891; VEX-NEXT: vcvttss2si %xmm0, %rax 892; VEX-NEXT: vmovq %rax, %xmm1 893; VEX-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 894; VEX-NEXT: vcvttss2si %xmm0, %rax 895; VEX-NEXT: vmovq %rax, %xmm0 896; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 897; VEX-NEXT: retq 898; 899; AVX512F-LABEL: fptosi_2f32_to_2i64: 900; AVX512F: # BB#0: 901; AVX512F-NEXT: vcvttss2si %xmm0, %rax 902; AVX512F-NEXT: vmovq %rax, %xmm1 903; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 904; AVX512F-NEXT: vcvttss2si %xmm0, %rax 905; AVX512F-NEXT: vmovq %rax, %xmm0 906; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 907; AVX512F-NEXT: retq 908; 909; AVX512VL-LABEL: fptosi_2f32_to_2i64: 910; AVX512VL: # BB#0: 911; AVX512VL-NEXT: vcvttss2si %xmm0, %rax 912; AVX512VL-NEXT: vmovq %rax, %xmm1 913; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 914; AVX512VL-NEXT: vcvttss2si %xmm0, %rax 915; AVX512VL-NEXT: vmovq %rax, %xmm0 916; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 917; AVX512VL-NEXT: retq 918; 919; AVX512DQ-LABEL: fptosi_2f32_to_2i64: 920; AVX512DQ: # BB#0: 921; AVX512DQ-NEXT: vcvttss2si %xmm0, %rax 922; AVX512DQ-NEXT: vmovq %rax, %xmm1 923; AVX512DQ-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 924; AVX512DQ-NEXT: vcvttss2si %xmm0, %rax 925; AVX512DQ-NEXT: vmovq %rax, %xmm0 926; AVX512DQ-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 927; AVX512DQ-NEXT: retq 928; 929; AVX512VLDQ-LABEL: fptosi_2f32_to_2i64: 930; AVX512VLDQ: # BB#0: 931; AVX512VLDQ-NEXT: vcvttps2qq %xmm0, %xmm0 932; AVX512VLDQ-NEXT: retq 933 %shuf = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 1> 934 %cvt = fptosi <2 x float> %shuf to <2 x i64> 935 ret <2 x i64> %cvt 936} 937 938define <2 x i64> @fptosi_4f32_to_2i64(<4 x float> %a) { 939; SSE-LABEL: fptosi_4f32_to_2i64: 940; SSE: # BB#0: 941; SSE-NEXT: cvttss2si %xmm0, %rax 942; SSE-NEXT: movd %rax, %xmm1 943; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,2,3] 944; SSE-NEXT: cvttss2si %xmm0, %rax 945; SSE-NEXT: movd %rax, %xmm0 946; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 947; SSE-NEXT: movdqa %xmm1, %xmm0 948; SSE-NEXT: retq 949; 950; VEX-LABEL: fptosi_4f32_to_2i64: 951; VEX: # BB#0: 952; VEX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 953; VEX-NEXT: vcvttss2si %xmm1, %rax 954; VEX-NEXT: vcvttss2si %xmm0, %rcx 955; VEX-NEXT: vmovq %rcx, %xmm0 956; VEX-NEXT: vmovq %rax, %xmm1 957; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 958; VEX-NEXT: retq 959; 960; AVX512F-LABEL: fptosi_4f32_to_2i64: 961; AVX512F: # BB#0: 962; AVX512F-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 963; AVX512F-NEXT: vcvttss2si %xmm1, %rax 964; AVX512F-NEXT: vcvttss2si %xmm0, %rcx 965; AVX512F-NEXT: vmovq %rcx, %xmm0 966; AVX512F-NEXT: vmovq %rax, %xmm1 967; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 968; AVX512F-NEXT: retq 969; 970; AVX512VL-LABEL: fptosi_4f32_to_2i64: 971; AVX512VL: # BB#0: 972; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 973; AVX512VL-NEXT: vcvttss2si %xmm1, %rax 974; AVX512VL-NEXT: vcvttss2si %xmm0, %rcx 975; AVX512VL-NEXT: vmovq %rcx, %xmm0 976; AVX512VL-NEXT: vmovq %rax, %xmm1 977; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 978; AVX512VL-NEXT: retq 979; 980; AVX512DQ-LABEL: fptosi_4f32_to_2i64: 981; AVX512DQ: # BB#0: 982; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def> 983; AVX512DQ-NEXT: vcvttps2qq %ymm0, %zmm0 984; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 985; AVX512DQ-NEXT: retq 986; 987; AVX512VLDQ-LABEL: fptosi_4f32_to_2i64: 988; AVX512VLDQ: # BB#0: 989; AVX512VLDQ-NEXT: vcvttps2qq %xmm0, %ymm0 990; AVX512VLDQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 991; AVX512VLDQ-NEXT: retq 992 %cvt = fptosi <4 x float> %a to <4 x i64> 993 %shuf = shufflevector <4 x i64> %cvt, <4 x i64> undef, <2 x i32> <i32 0, i32 1> 994 ret <2 x i64> %shuf 995} 996 997define <8 x i32> @fptosi_8f32_to_8i32(<8 x float> %a) { 998; SSE-LABEL: fptosi_8f32_to_8i32: 999; SSE: # BB#0: 1000; SSE-NEXT: cvttps2dq %xmm0, %xmm0 1001; SSE-NEXT: cvttps2dq %xmm1, %xmm1 1002; SSE-NEXT: retq 1003; 1004; AVX-LABEL: fptosi_8f32_to_8i32: 1005; AVX: # BB#0: 1006; AVX-NEXT: vcvttps2dq %ymm0, %ymm0 1007; AVX-NEXT: retq 1008 %cvt = fptosi <8 x float> %a to <8 x i32> 1009 ret <8 x i32> %cvt 1010} 1011 1012define <4 x i64> @fptosi_4f32_to_4i64(<8 x float> %a) { 1013; SSE-LABEL: fptosi_4f32_to_4i64: 1014; SSE: # BB#0: 1015; SSE-NEXT: cvttss2si %xmm0, %rax 1016; SSE-NEXT: movd %rax, %xmm2 1017; SSE-NEXT: movaps %xmm0, %xmm1 1018; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,2,3] 1019; SSE-NEXT: cvttss2si %xmm1, %rax 1020; SSE-NEXT: movd %rax, %xmm1 1021; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 1022; SSE-NEXT: movaps %xmm0, %xmm1 1023; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,1,2,3] 1024; SSE-NEXT: cvttss2si %xmm1, %rax 1025; SSE-NEXT: movd %rax, %xmm3 1026; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 1027; SSE-NEXT: cvttss2si %xmm0, %rax 1028; SSE-NEXT: movd %rax, %xmm1 1029; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 1030; SSE-NEXT: movdqa %xmm2, %xmm0 1031; SSE-NEXT: retq 1032; 1033; AVX1-LABEL: fptosi_4f32_to_4i64: 1034; AVX1: # BB#0: 1035; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1036; AVX1-NEXT: vcvttss2si %xmm1, %rax 1037; AVX1-NEXT: vmovq %rax, %xmm1 1038; AVX1-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1039; AVX1-NEXT: vcvttss2si %xmm2, %rax 1040; AVX1-NEXT: vmovq %rax, %xmm2 1041; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1042; AVX1-NEXT: vcvttss2si %xmm0, %rax 1043; AVX1-NEXT: vmovq %rax, %xmm2 1044; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1045; AVX1-NEXT: vcvttss2si %xmm0, %rax 1046; AVX1-NEXT: vmovq %rax, %xmm0 1047; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1048; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1049; AVX1-NEXT: retq 1050; 1051; AVX2-LABEL: fptosi_4f32_to_4i64: 1052; AVX2: # BB#0: 1053; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1054; AVX2-NEXT: vcvttss2si %xmm1, %rax 1055; AVX2-NEXT: vmovq %rax, %xmm1 1056; AVX2-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1057; AVX2-NEXT: vcvttss2si %xmm2, %rax 1058; AVX2-NEXT: vmovq %rax, %xmm2 1059; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1060; AVX2-NEXT: vcvttss2si %xmm0, %rax 1061; AVX2-NEXT: vmovq %rax, %xmm2 1062; AVX2-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1063; AVX2-NEXT: vcvttss2si %xmm0, %rax 1064; AVX2-NEXT: vmovq %rax, %xmm0 1065; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1066; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1067; AVX2-NEXT: retq 1068; 1069; AVX512F-LABEL: fptosi_4f32_to_4i64: 1070; AVX512F: # BB#0: 1071; AVX512F-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1072; AVX512F-NEXT: vcvttss2si %xmm1, %rax 1073; AVX512F-NEXT: vmovq %rax, %xmm1 1074; AVX512F-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1075; AVX512F-NEXT: vcvttss2si %xmm2, %rax 1076; AVX512F-NEXT: vmovq %rax, %xmm2 1077; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1078; AVX512F-NEXT: vcvttss2si %xmm0, %rax 1079; AVX512F-NEXT: vmovq %rax, %xmm2 1080; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1081; AVX512F-NEXT: vcvttss2si %xmm0, %rax 1082; AVX512F-NEXT: vmovq %rax, %xmm0 1083; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1084; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1085; AVX512F-NEXT: retq 1086; 1087; AVX512VL-LABEL: fptosi_4f32_to_4i64: 1088; AVX512VL: # BB#0: 1089; AVX512VL-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1090; AVX512VL-NEXT: vcvttss2si %xmm1, %rax 1091; AVX512VL-NEXT: vmovq %rax, %xmm1 1092; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1093; AVX512VL-NEXT: vcvttss2si %xmm2, %rax 1094; AVX512VL-NEXT: vmovq %rax, %xmm2 1095; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1096; AVX512VL-NEXT: vcvttss2si %xmm0, %rax 1097; AVX512VL-NEXT: vmovq %rax, %xmm2 1098; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1099; AVX512VL-NEXT: vcvttss2si %xmm0, %rax 1100; AVX512VL-NEXT: vmovq %rax, %xmm0 1101; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1102; AVX512VL-NEXT: vinserti32x4 $1, %xmm1, %ymm0, %ymm0 1103; AVX512VL-NEXT: retq 1104; 1105; AVX512DQ-LABEL: fptosi_4f32_to_4i64: 1106; AVX512DQ: # BB#0: 1107; AVX512DQ-NEXT: vcvttps2qq %ymm0, %zmm0 1108; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 1109; AVX512DQ-NEXT: retq 1110; 1111; AVX512VLDQ-LABEL: fptosi_4f32_to_4i64: 1112; AVX512VLDQ: # BB#0: 1113; AVX512VLDQ-NEXT: vcvttps2qq %xmm0, %ymm0 1114; AVX512VLDQ-NEXT: retq 1115 %shuf = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 1116 %cvt = fptosi <4 x float> %shuf to <4 x i64> 1117 ret <4 x i64> %cvt 1118} 1119 1120define <4 x i64> @fptosi_8f32_to_4i64(<8 x float> %a) { 1121; SSE-LABEL: fptosi_8f32_to_4i64: 1122; SSE: # BB#0: 1123; SSE-NEXT: cvttss2si %xmm0, %rax 1124; SSE-NEXT: movd %rax, %xmm2 1125; SSE-NEXT: movaps %xmm0, %xmm1 1126; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,2,3] 1127; SSE-NEXT: cvttss2si %xmm1, %rax 1128; SSE-NEXT: movd %rax, %xmm1 1129; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 1130; SSE-NEXT: movaps %xmm0, %xmm1 1131; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,1,2,3] 1132; SSE-NEXT: cvttss2si %xmm1, %rax 1133; SSE-NEXT: movd %rax, %xmm3 1134; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 1135; SSE-NEXT: cvttss2si %xmm0, %rax 1136; SSE-NEXT: movd %rax, %xmm1 1137; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 1138; SSE-NEXT: movdqa %xmm2, %xmm0 1139; SSE-NEXT: retq 1140; 1141; AVX1-LABEL: fptosi_8f32_to_4i64: 1142; AVX1: # BB#0: 1143; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1144; AVX1-NEXT: vcvttss2si %xmm1, %rax 1145; AVX1-NEXT: vmovq %rax, %xmm1 1146; AVX1-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1147; AVX1-NEXT: vcvttss2si %xmm2, %rax 1148; AVX1-NEXT: vmovq %rax, %xmm2 1149; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1150; AVX1-NEXT: vcvttss2si %xmm0, %rax 1151; AVX1-NEXT: vmovq %rax, %xmm2 1152; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1153; AVX1-NEXT: vcvttss2si %xmm0, %rax 1154; AVX1-NEXT: vmovq %rax, %xmm0 1155; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1156; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1157; AVX1-NEXT: retq 1158; 1159; AVX2-LABEL: fptosi_8f32_to_4i64: 1160; AVX2: # BB#0: 1161; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1162; AVX2-NEXT: vcvttss2si %xmm1, %rax 1163; AVX2-NEXT: vmovq %rax, %xmm1 1164; AVX2-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1165; AVX2-NEXT: vcvttss2si %xmm2, %rax 1166; AVX2-NEXT: vmovq %rax, %xmm2 1167; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1168; AVX2-NEXT: vcvttss2si %xmm0, %rax 1169; AVX2-NEXT: vmovq %rax, %xmm2 1170; AVX2-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1171; AVX2-NEXT: vcvttss2si %xmm0, %rax 1172; AVX2-NEXT: vmovq %rax, %xmm0 1173; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1174; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1175; AVX2-NEXT: retq 1176; 1177; AVX512F-LABEL: fptosi_8f32_to_4i64: 1178; AVX512F: # BB#0: 1179; AVX512F-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1180; AVX512F-NEXT: vcvttss2si %xmm1, %rax 1181; AVX512F-NEXT: vcvttss2si %xmm0, %rcx 1182; AVX512F-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0] 1183; AVX512F-NEXT: vcvttss2si %xmm1, %rdx 1184; AVX512F-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1185; AVX512F-NEXT: vcvttss2si %xmm0, %rsi 1186; AVX512F-NEXT: vmovq %rsi, %xmm0 1187; AVX512F-NEXT: vmovq %rdx, %xmm1 1188; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1189; AVX512F-NEXT: vmovq %rcx, %xmm1 1190; AVX512F-NEXT: vmovq %rax, %xmm2 1191; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 1192; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 1193; AVX512F-NEXT: retq 1194; 1195; AVX512VL-LABEL: fptosi_8f32_to_4i64: 1196; AVX512VL: # BB#0: 1197; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1198; AVX512VL-NEXT: vcvttss2si %xmm1, %rax 1199; AVX512VL-NEXT: vcvttss2si %xmm0, %rcx 1200; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0] 1201; AVX512VL-NEXT: vcvttss2si %xmm1, %rdx 1202; AVX512VL-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1203; AVX512VL-NEXT: vcvttss2si %xmm0, %rsi 1204; AVX512VL-NEXT: vmovq %rsi, %xmm0 1205; AVX512VL-NEXT: vmovq %rdx, %xmm1 1206; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1207; AVX512VL-NEXT: vmovq %rcx, %xmm1 1208; AVX512VL-NEXT: vmovq %rax, %xmm2 1209; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 1210; AVX512VL-NEXT: vinserti32x4 $1, %xmm0, %ymm1, %ymm0 1211; AVX512VL-NEXT: retq 1212; 1213; AVX512DQ-LABEL: fptosi_8f32_to_4i64: 1214; AVX512DQ: # BB#0: 1215; AVX512DQ-NEXT: vcvttps2qq %ymm0, %zmm0 1216; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 1217; AVX512DQ-NEXT: retq 1218; 1219; AVX512VLDQ-LABEL: fptosi_8f32_to_4i64: 1220; AVX512VLDQ: # BB#0: 1221; AVX512VLDQ-NEXT: vcvttps2qq %ymm0, %zmm0 1222; AVX512VLDQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 1223; AVX512VLDQ-NEXT: retq 1224 %cvt = fptosi <8 x float> %a to <8 x i64> 1225 %shuf = shufflevector <8 x i64> %cvt, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 1226 ret <4 x i64> %shuf 1227} 1228 1229; 1230; Float to Unsigned Integer 1231; 1232 1233define <2 x i32> @fptoui_2f32_to_2i32(<2 x float> %a) { 1234; SSE-LABEL: fptoui_2f32_to_2i32: 1235; SSE: # BB#0: 1236; SSE-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero 1237; SSE-NEXT: movaps %xmm0, %xmm1 1238; SSE-NEXT: subss %xmm2, %xmm1 1239; SSE-NEXT: cvttss2si %xmm1, %rax 1240; SSE-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1241; SSE-NEXT: xorq %rcx, %rax 1242; SSE-NEXT: cvttss2si %xmm0, %rdx 1243; SSE-NEXT: ucomiss %xmm2, %xmm0 1244; SSE-NEXT: cmovaeq %rax, %rdx 1245; SSE-NEXT: movd %rdx, %xmm1 1246; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,2,3] 1247; SSE-NEXT: movaps %xmm0, %xmm3 1248; SSE-NEXT: subss %xmm2, %xmm3 1249; SSE-NEXT: cvttss2si %xmm3, %rax 1250; SSE-NEXT: xorq %rcx, %rax 1251; SSE-NEXT: cvttss2si %xmm0, %rcx 1252; SSE-NEXT: ucomiss %xmm2, %xmm0 1253; SSE-NEXT: cmovaeq %rax, %rcx 1254; SSE-NEXT: movd %rcx, %xmm0 1255; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 1256; SSE-NEXT: movdqa %xmm1, %xmm0 1257; SSE-NEXT: retq 1258; 1259; VEX-LABEL: fptoui_2f32_to_2i32: 1260; VEX: # BB#0: 1261; VEX-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1262; VEX-NEXT: vsubss %xmm1, %xmm0, %xmm2 1263; VEX-NEXT: vcvttss2si %xmm2, %rax 1264; VEX-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1265; VEX-NEXT: xorq %rcx, %rax 1266; VEX-NEXT: vcvttss2si %xmm0, %rdx 1267; VEX-NEXT: vucomiss %xmm1, %xmm0 1268; VEX-NEXT: cmovaeq %rax, %rdx 1269; VEX-NEXT: vmovq %rdx, %xmm2 1270; VEX-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1271; VEX-NEXT: vsubss %xmm1, %xmm0, %xmm3 1272; VEX-NEXT: vcvttss2si %xmm3, %rax 1273; VEX-NEXT: xorq %rcx, %rax 1274; VEX-NEXT: vcvttss2si %xmm0, %rcx 1275; VEX-NEXT: vucomiss %xmm1, %xmm0 1276; VEX-NEXT: cmovaeq %rax, %rcx 1277; VEX-NEXT: vmovq %rcx, %xmm0 1278; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1279; VEX-NEXT: retq 1280; 1281; AVX512F-LABEL: fptoui_2f32_to_2i32: 1282; AVX512F: # BB#0: 1283; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 1284; AVX512F-NEXT: vcvttps2udq %zmm0, %zmm0 1285; AVX512F-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 1286; AVX512F-NEXT: retq 1287; 1288; AVX512VL-LABEL: fptoui_2f32_to_2i32: 1289; AVX512VL: # BB#0: 1290; AVX512VL-NEXT: vcvttps2udq %xmm0, %xmm0 1291; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 1292; AVX512VL-NEXT: retq 1293; 1294; AVX512DQ-LABEL: fptoui_2f32_to_2i32: 1295; AVX512DQ: # BB#0: 1296; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 1297; AVX512DQ-NEXT: vcvttps2udq %zmm0, %zmm0 1298; AVX512DQ-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 1299; AVX512DQ-NEXT: retq 1300; 1301; AVX512VLDQ-LABEL: fptoui_2f32_to_2i32: 1302; AVX512VLDQ: # BB#0: 1303; AVX512VLDQ-NEXT: vcvttps2udq %xmm0, %xmm0 1304; AVX512VLDQ-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 1305; AVX512VLDQ-NEXT: retq 1306 %cvt = fptoui <2 x float> %a to <2 x i32> 1307 ret <2 x i32> %cvt 1308} 1309 1310define <4 x i32> @fptoui_4f32_to_4i32(<4 x float> %a) { 1311; SSE-LABEL: fptoui_4f32_to_4i32: 1312; SSE: # BB#0: 1313; SSE-NEXT: movaps %xmm0, %xmm1 1314; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,1,2,3] 1315; SSE-NEXT: cvttss2si %xmm1, %rax 1316; SSE-NEXT: movd %eax, %xmm1 1317; SSE-NEXT: movaps %xmm0, %xmm2 1318; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1,2,3] 1319; SSE-NEXT: cvttss2si %xmm2, %rax 1320; SSE-NEXT: movd %eax, %xmm2 1321; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 1322; SSE-NEXT: cvttss2si %xmm0, %rax 1323; SSE-NEXT: movd %eax, %xmm1 1324; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 1325; SSE-NEXT: cvttss2si %xmm0, %rax 1326; SSE-NEXT: movd %eax, %xmm0 1327; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 1328; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 1329; SSE-NEXT: movdqa %xmm1, %xmm0 1330; SSE-NEXT: retq 1331; 1332; VEX-LABEL: fptoui_4f32_to_4i32: 1333; VEX: # BB#0: 1334; VEX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1335; VEX-NEXT: vcvttss2si %xmm1, %rax 1336; VEX-NEXT: vcvttss2si %xmm0, %rcx 1337; VEX-NEXT: vmovd %ecx, %xmm1 1338; VEX-NEXT: vpinsrd $1, %eax, %xmm1, %xmm1 1339; VEX-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1340; VEX-NEXT: vcvttss2si %xmm2, %rax 1341; VEX-NEXT: vpinsrd $2, %eax, %xmm1, %xmm1 1342; VEX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1343; VEX-NEXT: vcvttss2si %xmm0, %rax 1344; VEX-NEXT: vpinsrd $3, %eax, %xmm1, %xmm0 1345; VEX-NEXT: retq 1346; 1347; AVX512F-LABEL: fptoui_4f32_to_4i32: 1348; AVX512F: # BB#0: 1349; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 1350; AVX512F-NEXT: vcvttps2udq %zmm0, %zmm0 1351; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 1352; AVX512F-NEXT: retq 1353; 1354; AVX512VL-LABEL: fptoui_4f32_to_4i32: 1355; AVX512VL: # BB#0: 1356; AVX512VL-NEXT: vcvttps2udq %xmm0, %xmm0 1357; AVX512VL-NEXT: retq 1358; 1359; AVX512DQ-LABEL: fptoui_4f32_to_4i32: 1360; AVX512DQ: # BB#0: 1361; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 1362; AVX512DQ-NEXT: vcvttps2udq %zmm0, %zmm0 1363; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 1364; AVX512DQ-NEXT: retq 1365; 1366; AVX512VLDQ-LABEL: fptoui_4f32_to_4i32: 1367; AVX512VLDQ: # BB#0: 1368; AVX512VLDQ-NEXT: vcvttps2udq %xmm0, %xmm0 1369; AVX512VLDQ-NEXT: retq 1370 %cvt = fptoui <4 x float> %a to <4 x i32> 1371 ret <4 x i32> %cvt 1372} 1373 1374define <2 x i64> @fptoui_2f32_to_2i64(<4 x float> %a) { 1375; SSE-LABEL: fptoui_2f32_to_2i64: 1376; SSE: # BB#0: 1377; SSE-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero 1378; SSE-NEXT: movaps %xmm0, %xmm1 1379; SSE-NEXT: subss %xmm2, %xmm1 1380; SSE-NEXT: cvttss2si %xmm1, %rax 1381; SSE-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1382; SSE-NEXT: xorq %rcx, %rax 1383; SSE-NEXT: cvttss2si %xmm0, %rdx 1384; SSE-NEXT: ucomiss %xmm2, %xmm0 1385; SSE-NEXT: cmovaeq %rax, %rdx 1386; SSE-NEXT: movd %rdx, %xmm1 1387; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,2,3] 1388; SSE-NEXT: movaps %xmm0, %xmm3 1389; SSE-NEXT: subss %xmm2, %xmm3 1390; SSE-NEXT: cvttss2si %xmm3, %rax 1391; SSE-NEXT: xorq %rcx, %rax 1392; SSE-NEXT: cvttss2si %xmm0, %rcx 1393; SSE-NEXT: ucomiss %xmm2, %xmm0 1394; SSE-NEXT: cmovaeq %rax, %rcx 1395; SSE-NEXT: movd %rcx, %xmm0 1396; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 1397; SSE-NEXT: movdqa %xmm1, %xmm0 1398; SSE-NEXT: retq 1399; 1400; VEX-LABEL: fptoui_2f32_to_2i64: 1401; VEX: # BB#0: 1402; VEX-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1403; VEX-NEXT: vsubss %xmm1, %xmm0, %xmm2 1404; VEX-NEXT: vcvttss2si %xmm2, %rax 1405; VEX-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1406; VEX-NEXT: xorq %rcx, %rax 1407; VEX-NEXT: vcvttss2si %xmm0, %rdx 1408; VEX-NEXT: vucomiss %xmm1, %xmm0 1409; VEX-NEXT: cmovaeq %rax, %rdx 1410; VEX-NEXT: vmovq %rdx, %xmm2 1411; VEX-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1412; VEX-NEXT: vsubss %xmm1, %xmm0, %xmm3 1413; VEX-NEXT: vcvttss2si %xmm3, %rax 1414; VEX-NEXT: xorq %rcx, %rax 1415; VEX-NEXT: vcvttss2si %xmm0, %rcx 1416; VEX-NEXT: vucomiss %xmm1, %xmm0 1417; VEX-NEXT: cmovaeq %rax, %rcx 1418; VEX-NEXT: vmovq %rcx, %xmm0 1419; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1420; VEX-NEXT: retq 1421; 1422; AVX512F-LABEL: fptoui_2f32_to_2i64: 1423; AVX512F: # BB#0: 1424; AVX512F-NEXT: vcvttss2usi %xmm0, %rax 1425; AVX512F-NEXT: vmovq %rax, %xmm1 1426; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1427; AVX512F-NEXT: vcvttss2usi %xmm0, %rax 1428; AVX512F-NEXT: vmovq %rax, %xmm0 1429; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1430; AVX512F-NEXT: retq 1431; 1432; AVX512VL-LABEL: fptoui_2f32_to_2i64: 1433; AVX512VL: # BB#0: 1434; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax 1435; AVX512VL-NEXT: vmovq %rax, %xmm1 1436; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1437; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax 1438; AVX512VL-NEXT: vmovq %rax, %xmm0 1439; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1440; AVX512VL-NEXT: retq 1441; 1442; AVX512DQ-LABEL: fptoui_2f32_to_2i64: 1443; AVX512DQ: # BB#0: 1444; AVX512DQ-NEXT: vcvttss2usi %xmm0, %rax 1445; AVX512DQ-NEXT: vmovq %rax, %xmm1 1446; AVX512DQ-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1447; AVX512DQ-NEXT: vcvttss2usi %xmm0, %rax 1448; AVX512DQ-NEXT: vmovq %rax, %xmm0 1449; AVX512DQ-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1450; AVX512DQ-NEXT: retq 1451; 1452; AVX512VLDQ-LABEL: fptoui_2f32_to_2i64: 1453; AVX512VLDQ: # BB#0: 1454; AVX512VLDQ-NEXT: vcvttps2uqq %xmm0, %xmm0 1455; AVX512VLDQ-NEXT: retq 1456 %shuf = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 1> 1457 %cvt = fptoui <2 x float> %shuf to <2 x i64> 1458 ret <2 x i64> %cvt 1459} 1460 1461define <2 x i64> @fptoui_4f32_to_2i64(<4 x float> %a) { 1462; SSE-LABEL: fptoui_4f32_to_2i64: 1463; SSE: # BB#0: 1464; SSE-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero 1465; SSE-NEXT: movaps %xmm0, %xmm1 1466; SSE-NEXT: subss %xmm2, %xmm1 1467; SSE-NEXT: cvttss2si %xmm1, %rax 1468; SSE-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1469; SSE-NEXT: xorq %rcx, %rax 1470; SSE-NEXT: cvttss2si %xmm0, %rdx 1471; SSE-NEXT: ucomiss %xmm2, %xmm0 1472; SSE-NEXT: cmovaeq %rax, %rdx 1473; SSE-NEXT: movd %rdx, %xmm1 1474; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,2,3] 1475; SSE-NEXT: movaps %xmm0, %xmm3 1476; SSE-NEXT: subss %xmm2, %xmm3 1477; SSE-NEXT: cvttss2si %xmm3, %rax 1478; SSE-NEXT: xorq %rcx, %rax 1479; SSE-NEXT: cvttss2si %xmm0, %rcx 1480; SSE-NEXT: ucomiss %xmm2, %xmm0 1481; SSE-NEXT: cmovaeq %rax, %rcx 1482; SSE-NEXT: movd %rcx, %xmm0 1483; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 1484; SSE-NEXT: movdqa %xmm1, %xmm0 1485; SSE-NEXT: retq 1486; 1487; VEX-LABEL: fptoui_4f32_to_2i64: 1488; VEX: # BB#0: 1489; VEX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1490; VEX-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero 1491; VEX-NEXT: vsubss %xmm2, %xmm1, %xmm3 1492; VEX-NEXT: vcvttss2si %xmm3, %rax 1493; VEX-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1494; VEX-NEXT: xorq %rcx, %rax 1495; VEX-NEXT: vcvttss2si %xmm1, %rdx 1496; VEX-NEXT: vucomiss %xmm2, %xmm1 1497; VEX-NEXT: cmovaeq %rax, %rdx 1498; VEX-NEXT: vsubss %xmm2, %xmm0, %xmm1 1499; VEX-NEXT: vcvttss2si %xmm1, %rax 1500; VEX-NEXT: xorq %rcx, %rax 1501; VEX-NEXT: vcvttss2si %xmm0, %rcx 1502; VEX-NEXT: vucomiss %xmm2, %xmm0 1503; VEX-NEXT: cmovaeq %rax, %rcx 1504; VEX-NEXT: vmovq %rcx, %xmm0 1505; VEX-NEXT: vmovq %rdx, %xmm1 1506; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1507; VEX-NEXT: retq 1508; 1509; AVX512F-LABEL: fptoui_4f32_to_2i64: 1510; AVX512F: # BB#0: 1511; AVX512F-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1512; AVX512F-NEXT: vcvttss2usi %xmm1, %rax 1513; AVX512F-NEXT: vcvttss2usi %xmm0, %rcx 1514; AVX512F-NEXT: vmovq %rcx, %xmm0 1515; AVX512F-NEXT: vmovq %rax, %xmm1 1516; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1517; AVX512F-NEXT: retq 1518; 1519; AVX512VL-LABEL: fptoui_4f32_to_2i64: 1520; AVX512VL: # BB#0: 1521; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1522; AVX512VL-NEXT: vcvttss2usi %xmm1, %rax 1523; AVX512VL-NEXT: vcvttss2usi %xmm0, %rcx 1524; AVX512VL-NEXT: vmovq %rcx, %xmm0 1525; AVX512VL-NEXT: vmovq %rax, %xmm1 1526; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1527; AVX512VL-NEXT: retq 1528; 1529; AVX512DQ-LABEL: fptoui_4f32_to_2i64: 1530; AVX512DQ: # BB#0: 1531; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def> 1532; AVX512DQ-NEXT: vcvttps2uqq %ymm0, %zmm0 1533; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 1534; AVX512DQ-NEXT: retq 1535; 1536; AVX512VLDQ-LABEL: fptoui_4f32_to_2i64: 1537; AVX512VLDQ: # BB#0: 1538; AVX512VLDQ-NEXT: vcvttps2uqq %xmm0, %ymm0 1539; AVX512VLDQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 1540; AVX512VLDQ-NEXT: retq 1541 %cvt = fptoui <4 x float> %a to <4 x i64> 1542 %shuf = shufflevector <4 x i64> %cvt, <4 x i64> undef, <2 x i32> <i32 0, i32 1> 1543 ret <2 x i64> %shuf 1544} 1545 1546define <8 x i32> @fptoui_8f32_to_8i32(<8 x float> %a) { 1547; SSE-LABEL: fptoui_8f32_to_8i32: 1548; SSE: # BB#0: 1549; SSE-NEXT: movaps %xmm0, %xmm2 1550; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1551; SSE-NEXT: cvttss2si %xmm0, %rax 1552; SSE-NEXT: movd %eax, %xmm0 1553; SSE-NEXT: movaps %xmm2, %xmm3 1554; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1,2,3] 1555; SSE-NEXT: cvttss2si %xmm3, %rax 1556; SSE-NEXT: movd %eax, %xmm3 1557; SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1] 1558; SSE-NEXT: cvttss2si %xmm2, %rax 1559; SSE-NEXT: movd %eax, %xmm0 1560; SSE-NEXT: movhlps {{.*#+}} xmm2 = xmm2[1,1] 1561; SSE-NEXT: cvttss2si %xmm2, %rax 1562; SSE-NEXT: movd %eax, %xmm2 1563; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1564; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1] 1565; SSE-NEXT: movaps %xmm1, %xmm2 1566; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[3,1,2,3] 1567; SSE-NEXT: cvttss2si %xmm2, %rax 1568; SSE-NEXT: movd %eax, %xmm2 1569; SSE-NEXT: movaps %xmm1, %xmm3 1570; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1,2,3] 1571; SSE-NEXT: cvttss2si %xmm3, %rax 1572; SSE-NEXT: movd %eax, %xmm3 1573; SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1] 1574; SSE-NEXT: cvttss2si %xmm1, %rax 1575; SSE-NEXT: movd %eax, %xmm2 1576; SSE-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1] 1577; SSE-NEXT: cvttss2si %xmm1, %rax 1578; SSE-NEXT: movd %eax, %xmm1 1579; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 1580; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1] 1581; SSE-NEXT: movdqa %xmm2, %xmm1 1582; SSE-NEXT: retq 1583; 1584; AVX1-LABEL: fptoui_8f32_to_8i32: 1585; AVX1: # BB#0: 1586; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1587; AVX1-NEXT: vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3] 1588; AVX1-NEXT: vcvttss2si %xmm2, %rax 1589; AVX1-NEXT: vcvttss2si %xmm1, %rcx 1590; AVX1-NEXT: vmovd %ecx, %xmm2 1591; AVX1-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2 1592; AVX1-NEXT: vpermilpd {{.*#+}} xmm3 = xmm1[1,0] 1593; AVX1-NEXT: vcvttss2si %xmm3, %rax 1594; AVX1-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2 1595; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm1[3,1,2,3] 1596; AVX1-NEXT: vcvttss2si %xmm1, %rax 1597; AVX1-NEXT: vpinsrd $3, %eax, %xmm2, %xmm1 1598; AVX1-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3] 1599; AVX1-NEXT: vcvttss2si %xmm2, %rax 1600; AVX1-NEXT: vcvttss2si %xmm0, %rcx 1601; AVX1-NEXT: vmovd %ecx, %xmm2 1602; AVX1-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2 1603; AVX1-NEXT: vpermilpd {{.*#+}} xmm3 = xmm0[1,0] 1604; AVX1-NEXT: vcvttss2si %xmm3, %rax 1605; AVX1-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2 1606; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1607; AVX1-NEXT: vcvttss2si %xmm0, %rax 1608; AVX1-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0 1609; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1610; AVX1-NEXT: retq 1611; 1612; AVX2-LABEL: fptoui_8f32_to_8i32: 1613; AVX2: # BB#0: 1614; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1 1615; AVX2-NEXT: vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3] 1616; AVX2-NEXT: vcvttss2si %xmm2, %rax 1617; AVX2-NEXT: vcvttss2si %xmm1, %rcx 1618; AVX2-NEXT: vmovd %ecx, %xmm2 1619; AVX2-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2 1620; AVX2-NEXT: vpermilpd {{.*#+}} xmm3 = xmm1[1,0] 1621; AVX2-NEXT: vcvttss2si %xmm3, %rax 1622; AVX2-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2 1623; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm1[3,1,2,3] 1624; AVX2-NEXT: vcvttss2si %xmm1, %rax 1625; AVX2-NEXT: vpinsrd $3, %eax, %xmm2, %xmm1 1626; AVX2-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3] 1627; AVX2-NEXT: vcvttss2si %xmm2, %rax 1628; AVX2-NEXT: vcvttss2si %xmm0, %rcx 1629; AVX2-NEXT: vmovd %ecx, %xmm2 1630; AVX2-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2 1631; AVX2-NEXT: vpermilpd {{.*#+}} xmm3 = xmm0[1,0] 1632; AVX2-NEXT: vcvttss2si %xmm3, %rax 1633; AVX2-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2 1634; AVX2-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1635; AVX2-NEXT: vcvttss2si %xmm0, %rax 1636; AVX2-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0 1637; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1638; AVX2-NEXT: retq 1639; 1640; AVX512F-LABEL: fptoui_8f32_to_8i32: 1641; AVX512F: # BB#0: 1642; AVX512F-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 1643; AVX512F-NEXT: vcvttps2udq %zmm0, %zmm0 1644; AVX512F-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 1645; AVX512F-NEXT: retq 1646; 1647; AVX512VL-LABEL: fptoui_8f32_to_8i32: 1648; AVX512VL: # BB#0: 1649; AVX512VL-NEXT: vcvttps2udq %ymm0, %ymm0 1650; AVX512VL-NEXT: retq 1651; 1652; AVX512DQ-LABEL: fptoui_8f32_to_8i32: 1653; AVX512DQ: # BB#0: 1654; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 1655; AVX512DQ-NEXT: vcvttps2udq %zmm0, %zmm0 1656; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 1657; AVX512DQ-NEXT: retq 1658; 1659; AVX512VLDQ-LABEL: fptoui_8f32_to_8i32: 1660; AVX512VLDQ: # BB#0: 1661; AVX512VLDQ-NEXT: vcvttps2udq %ymm0, %ymm0 1662; AVX512VLDQ-NEXT: retq 1663 %cvt = fptoui <8 x float> %a to <8 x i32> 1664 ret <8 x i32> %cvt 1665} 1666 1667define <4 x i64> @fptoui_4f32_to_4i64(<8 x float> %a) { 1668; SSE-LABEL: fptoui_4f32_to_4i64: 1669; SSE: # BB#0: 1670; SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1671; SSE-NEXT: movaps %xmm0, %xmm2 1672; SSE-NEXT: subss %xmm1, %xmm2 1673; SSE-NEXT: cvttss2si %xmm2, %rcx 1674; SSE-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000 1675; SSE-NEXT: xorq %rax, %rcx 1676; SSE-NEXT: cvttss2si %xmm0, %rdx 1677; SSE-NEXT: ucomiss %xmm1, %xmm0 1678; SSE-NEXT: cmovaeq %rcx, %rdx 1679; SSE-NEXT: movd %rdx, %xmm2 1680; SSE-NEXT: movaps %xmm0, %xmm3 1681; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1,2,3] 1682; SSE-NEXT: movaps %xmm3, %xmm4 1683; SSE-NEXT: subss %xmm1, %xmm4 1684; SSE-NEXT: cvttss2si %xmm4, %rcx 1685; SSE-NEXT: xorq %rax, %rcx 1686; SSE-NEXT: cvttss2si %xmm3, %rdx 1687; SSE-NEXT: ucomiss %xmm1, %xmm3 1688; SSE-NEXT: cmovaeq %rcx, %rdx 1689; SSE-NEXT: movd %rdx, %xmm3 1690; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] 1691; SSE-NEXT: movaps %xmm0, %xmm3 1692; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[3,1,2,3] 1693; SSE-NEXT: movaps %xmm3, %xmm4 1694; SSE-NEXT: subss %xmm1, %xmm4 1695; SSE-NEXT: cvttss2si %xmm4, %rcx 1696; SSE-NEXT: xorq %rax, %rcx 1697; SSE-NEXT: cvttss2si %xmm3, %rdx 1698; SSE-NEXT: ucomiss %xmm1, %xmm3 1699; SSE-NEXT: cmovaeq %rcx, %rdx 1700; SSE-NEXT: movd %rdx, %xmm3 1701; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 1702; SSE-NEXT: movaps %xmm0, %xmm4 1703; SSE-NEXT: subss %xmm1, %xmm4 1704; SSE-NEXT: cvttss2si %xmm4, %rcx 1705; SSE-NEXT: xorq %rax, %rcx 1706; SSE-NEXT: cvttss2si %xmm0, %rax 1707; SSE-NEXT: ucomiss %xmm1, %xmm0 1708; SSE-NEXT: cmovaeq %rcx, %rax 1709; SSE-NEXT: movd %rax, %xmm1 1710; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 1711; SSE-NEXT: movdqa %xmm2, %xmm0 1712; SSE-NEXT: retq 1713; 1714; AVX1-LABEL: fptoui_4f32_to_4i64: 1715; AVX1: # BB#0: 1716; AVX1-NEXT: vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3] 1717; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1718; AVX1-NEXT: vsubss %xmm1, %xmm2, %xmm3 1719; AVX1-NEXT: vcvttss2si %xmm3, %rax 1720; AVX1-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1721; AVX1-NEXT: xorq %rcx, %rax 1722; AVX1-NEXT: vcvttss2si %xmm2, %rdx 1723; AVX1-NEXT: vucomiss %xmm1, %xmm2 1724; AVX1-NEXT: cmovaeq %rax, %rdx 1725; AVX1-NEXT: vmovq %rdx, %xmm2 1726; AVX1-NEXT: vpermilpd {{.*#+}} xmm3 = xmm0[1,0] 1727; AVX1-NEXT: vsubss %xmm1, %xmm3, %xmm4 1728; AVX1-NEXT: vcvttss2si %xmm4, %rax 1729; AVX1-NEXT: xorq %rcx, %rax 1730; AVX1-NEXT: vcvttss2si %xmm3, %rdx 1731; AVX1-NEXT: vucomiss %xmm1, %xmm3 1732; AVX1-NEXT: cmovaeq %rax, %rdx 1733; AVX1-NEXT: vmovq %rdx, %xmm3 1734; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0] 1735; AVX1-NEXT: vsubss %xmm1, %xmm0, %xmm3 1736; AVX1-NEXT: vcvttss2si %xmm3, %rax 1737; AVX1-NEXT: xorq %rcx, %rax 1738; AVX1-NEXT: vcvttss2si %xmm0, %rdx 1739; AVX1-NEXT: vucomiss %xmm1, %xmm0 1740; AVX1-NEXT: cmovaeq %rax, %rdx 1741; AVX1-NEXT: vmovq %rdx, %xmm3 1742; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1743; AVX1-NEXT: vsubss %xmm1, %xmm0, %xmm4 1744; AVX1-NEXT: vcvttss2si %xmm4, %rax 1745; AVX1-NEXT: xorq %rcx, %rax 1746; AVX1-NEXT: vcvttss2si %xmm0, %rcx 1747; AVX1-NEXT: vucomiss %xmm1, %xmm0 1748; AVX1-NEXT: cmovaeq %rax, %rcx 1749; AVX1-NEXT: vmovq %rcx, %xmm0 1750; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0] 1751; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1752; AVX1-NEXT: retq 1753; 1754; AVX2-LABEL: fptoui_4f32_to_4i64: 1755; AVX2: # BB#0: 1756; AVX2-NEXT: vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3] 1757; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1758; AVX2-NEXT: vsubss %xmm1, %xmm2, %xmm3 1759; AVX2-NEXT: vcvttss2si %xmm3, %rax 1760; AVX2-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1761; AVX2-NEXT: xorq %rcx, %rax 1762; AVX2-NEXT: vcvttss2si %xmm2, %rdx 1763; AVX2-NEXT: vucomiss %xmm1, %xmm2 1764; AVX2-NEXT: cmovaeq %rax, %rdx 1765; AVX2-NEXT: vmovq %rdx, %xmm2 1766; AVX2-NEXT: vpermilpd {{.*#+}} xmm3 = xmm0[1,0] 1767; AVX2-NEXT: vsubss %xmm1, %xmm3, %xmm4 1768; AVX2-NEXT: vcvttss2si %xmm4, %rax 1769; AVX2-NEXT: xorq %rcx, %rax 1770; AVX2-NEXT: vcvttss2si %xmm3, %rdx 1771; AVX2-NEXT: vucomiss %xmm1, %xmm3 1772; AVX2-NEXT: cmovaeq %rax, %rdx 1773; AVX2-NEXT: vmovq %rdx, %xmm3 1774; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0] 1775; AVX2-NEXT: vsubss %xmm1, %xmm0, %xmm3 1776; AVX2-NEXT: vcvttss2si %xmm3, %rax 1777; AVX2-NEXT: xorq %rcx, %rax 1778; AVX2-NEXT: vcvttss2si %xmm0, %rdx 1779; AVX2-NEXT: vucomiss %xmm1, %xmm0 1780; AVX2-NEXT: cmovaeq %rax, %rdx 1781; AVX2-NEXT: vmovq %rdx, %xmm3 1782; AVX2-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1783; AVX2-NEXT: vsubss %xmm1, %xmm0, %xmm4 1784; AVX2-NEXT: vcvttss2si %xmm4, %rax 1785; AVX2-NEXT: xorq %rcx, %rax 1786; AVX2-NEXT: vcvttss2si %xmm0, %rcx 1787; AVX2-NEXT: vucomiss %xmm1, %xmm0 1788; AVX2-NEXT: cmovaeq %rax, %rcx 1789; AVX2-NEXT: vmovq %rcx, %xmm0 1790; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0] 1791; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 1792; AVX2-NEXT: retq 1793; 1794; AVX512F-LABEL: fptoui_4f32_to_4i64: 1795; AVX512F: # BB#0: 1796; AVX512F-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1797; AVX512F-NEXT: vcvttss2usi %xmm1, %rax 1798; AVX512F-NEXT: vmovq %rax, %xmm1 1799; AVX512F-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1800; AVX512F-NEXT: vcvttss2usi %xmm2, %rax 1801; AVX512F-NEXT: vmovq %rax, %xmm2 1802; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1803; AVX512F-NEXT: vcvttss2usi %xmm0, %rax 1804; AVX512F-NEXT: vmovq %rax, %xmm2 1805; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1806; AVX512F-NEXT: vcvttss2usi %xmm0, %rax 1807; AVX512F-NEXT: vmovq %rax, %xmm0 1808; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1809; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1810; AVX512F-NEXT: retq 1811; 1812; AVX512VL-LABEL: fptoui_4f32_to_4i64: 1813; AVX512VL: # BB#0: 1814; AVX512VL-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1815; AVX512VL-NEXT: vcvttss2usi %xmm1, %rax 1816; AVX512VL-NEXT: vmovq %rax, %xmm1 1817; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1818; AVX512VL-NEXT: vcvttss2usi %xmm2, %rax 1819; AVX512VL-NEXT: vmovq %rax, %xmm2 1820; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1821; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax 1822; AVX512VL-NEXT: vmovq %rax, %xmm2 1823; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1824; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax 1825; AVX512VL-NEXT: vmovq %rax, %xmm0 1826; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1827; AVX512VL-NEXT: vinserti32x4 $1, %xmm1, %ymm0, %ymm0 1828; AVX512VL-NEXT: retq 1829; 1830; AVX512DQ-LABEL: fptoui_4f32_to_4i64: 1831; AVX512DQ: # BB#0: 1832; AVX512DQ-NEXT: vcvttps2uqq %ymm0, %zmm0 1833; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 1834; AVX512DQ-NEXT: retq 1835; 1836; AVX512VLDQ-LABEL: fptoui_4f32_to_4i64: 1837; AVX512VLDQ: # BB#0: 1838; AVX512VLDQ-NEXT: vcvttps2uqq %xmm0, %ymm0 1839; AVX512VLDQ-NEXT: retq 1840 %shuf = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 1841 %cvt = fptoui <4 x float> %shuf to <4 x i64> 1842 ret <4 x i64> %cvt 1843} 1844 1845define <4 x i64> @fptoui_8f32_to_4i64(<8 x float> %a) { 1846; SSE-LABEL: fptoui_8f32_to_4i64: 1847; SSE: # BB#0: 1848; SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1849; SSE-NEXT: movaps %xmm0, %xmm2 1850; SSE-NEXT: subss %xmm1, %xmm2 1851; SSE-NEXT: cvttss2si %xmm2, %rcx 1852; SSE-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000 1853; SSE-NEXT: xorq %rax, %rcx 1854; SSE-NEXT: cvttss2si %xmm0, %rdx 1855; SSE-NEXT: ucomiss %xmm1, %xmm0 1856; SSE-NEXT: cmovaeq %rcx, %rdx 1857; SSE-NEXT: movd %rdx, %xmm2 1858; SSE-NEXT: movaps %xmm0, %xmm3 1859; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1,2,3] 1860; SSE-NEXT: movaps %xmm3, %xmm4 1861; SSE-NEXT: subss %xmm1, %xmm4 1862; SSE-NEXT: cvttss2si %xmm4, %rcx 1863; SSE-NEXT: xorq %rax, %rcx 1864; SSE-NEXT: cvttss2si %xmm3, %rdx 1865; SSE-NEXT: ucomiss %xmm1, %xmm3 1866; SSE-NEXT: cmovaeq %rcx, %rdx 1867; SSE-NEXT: movd %rdx, %xmm3 1868; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] 1869; SSE-NEXT: movaps %xmm0, %xmm3 1870; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[3,1,2,3] 1871; SSE-NEXT: movaps %xmm3, %xmm4 1872; SSE-NEXT: subss %xmm1, %xmm4 1873; SSE-NEXT: cvttss2si %xmm4, %rcx 1874; SSE-NEXT: xorq %rax, %rcx 1875; SSE-NEXT: cvttss2si %xmm3, %rdx 1876; SSE-NEXT: ucomiss %xmm1, %xmm3 1877; SSE-NEXT: cmovaeq %rcx, %rdx 1878; SSE-NEXT: movd %rdx, %xmm3 1879; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 1880; SSE-NEXT: movaps %xmm0, %xmm4 1881; SSE-NEXT: subss %xmm1, %xmm4 1882; SSE-NEXT: cvttss2si %xmm4, %rcx 1883; SSE-NEXT: xorq %rax, %rcx 1884; SSE-NEXT: cvttss2si %xmm0, %rax 1885; SSE-NEXT: ucomiss %xmm1, %xmm0 1886; SSE-NEXT: cmovaeq %rcx, %rax 1887; SSE-NEXT: movd %rax, %xmm1 1888; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 1889; SSE-NEXT: movdqa %xmm2, %xmm0 1890; SSE-NEXT: retq 1891; 1892; AVX1-LABEL: fptoui_8f32_to_4i64: 1893; AVX1: # BB#0: 1894; AVX1-NEXT: vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3] 1895; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1896; AVX1-NEXT: vsubss %xmm1, %xmm2, %xmm3 1897; AVX1-NEXT: vcvttss2si %xmm3, %rax 1898; AVX1-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1899; AVX1-NEXT: xorq %rcx, %rax 1900; AVX1-NEXT: vcvttss2si %xmm2, %rdx 1901; AVX1-NEXT: vucomiss %xmm1, %xmm2 1902; AVX1-NEXT: cmovaeq %rax, %rdx 1903; AVX1-NEXT: vmovq %rdx, %xmm2 1904; AVX1-NEXT: vpermilpd {{.*#+}} xmm3 = xmm0[1,0] 1905; AVX1-NEXT: vsubss %xmm1, %xmm3, %xmm4 1906; AVX1-NEXT: vcvttss2si %xmm4, %rax 1907; AVX1-NEXT: xorq %rcx, %rax 1908; AVX1-NEXT: vcvttss2si %xmm3, %rdx 1909; AVX1-NEXT: vucomiss %xmm1, %xmm3 1910; AVX1-NEXT: cmovaeq %rax, %rdx 1911; AVX1-NEXT: vmovq %rdx, %xmm3 1912; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0] 1913; AVX1-NEXT: vsubss %xmm1, %xmm0, %xmm3 1914; AVX1-NEXT: vcvttss2si %xmm3, %rax 1915; AVX1-NEXT: xorq %rcx, %rax 1916; AVX1-NEXT: vcvttss2si %xmm0, %rdx 1917; AVX1-NEXT: vucomiss %xmm1, %xmm0 1918; AVX1-NEXT: cmovaeq %rax, %rdx 1919; AVX1-NEXT: vmovq %rdx, %xmm3 1920; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1921; AVX1-NEXT: vsubss %xmm1, %xmm0, %xmm4 1922; AVX1-NEXT: vcvttss2si %xmm4, %rax 1923; AVX1-NEXT: xorq %rcx, %rax 1924; AVX1-NEXT: vcvttss2si %xmm0, %rcx 1925; AVX1-NEXT: vucomiss %xmm1, %xmm0 1926; AVX1-NEXT: cmovaeq %rax, %rcx 1927; AVX1-NEXT: vmovq %rcx, %xmm0 1928; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0] 1929; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1930; AVX1-NEXT: retq 1931; 1932; AVX2-LABEL: fptoui_8f32_to_4i64: 1933; AVX2: # BB#0: 1934; AVX2-NEXT: vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3] 1935; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1936; AVX2-NEXT: vsubss %xmm1, %xmm2, %xmm3 1937; AVX2-NEXT: vcvttss2si %xmm3, %rax 1938; AVX2-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1939; AVX2-NEXT: xorq %rcx, %rax 1940; AVX2-NEXT: vcvttss2si %xmm2, %rdx 1941; AVX2-NEXT: vucomiss %xmm1, %xmm2 1942; AVX2-NEXT: cmovaeq %rax, %rdx 1943; AVX2-NEXT: vmovq %rdx, %xmm2 1944; AVX2-NEXT: vpermilpd {{.*#+}} xmm3 = xmm0[1,0] 1945; AVX2-NEXT: vsubss %xmm1, %xmm3, %xmm4 1946; AVX2-NEXT: vcvttss2si %xmm4, %rax 1947; AVX2-NEXT: xorq %rcx, %rax 1948; AVX2-NEXT: vcvttss2si %xmm3, %rdx 1949; AVX2-NEXT: vucomiss %xmm1, %xmm3 1950; AVX2-NEXT: cmovaeq %rax, %rdx 1951; AVX2-NEXT: vmovq %rdx, %xmm3 1952; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0] 1953; AVX2-NEXT: vsubss %xmm1, %xmm0, %xmm3 1954; AVX2-NEXT: vcvttss2si %xmm3, %rax 1955; AVX2-NEXT: xorq %rcx, %rax 1956; AVX2-NEXT: vcvttss2si %xmm0, %rdx 1957; AVX2-NEXT: vucomiss %xmm1, %xmm0 1958; AVX2-NEXT: cmovaeq %rax, %rdx 1959; AVX2-NEXT: vmovq %rdx, %xmm3 1960; AVX2-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1961; AVX2-NEXT: vsubss %xmm1, %xmm0, %xmm4 1962; AVX2-NEXT: vcvttss2si %xmm4, %rax 1963; AVX2-NEXT: xorq %rcx, %rax 1964; AVX2-NEXT: vcvttss2si %xmm0, %rcx 1965; AVX2-NEXT: vucomiss %xmm1, %xmm0 1966; AVX2-NEXT: cmovaeq %rax, %rcx 1967; AVX2-NEXT: vmovq %rcx, %xmm0 1968; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0] 1969; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 1970; AVX2-NEXT: retq 1971; 1972; AVX512F-LABEL: fptoui_8f32_to_4i64: 1973; AVX512F: # BB#0: 1974; AVX512F-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1975; AVX512F-NEXT: vcvttss2usi %xmm1, %rax 1976; AVX512F-NEXT: vcvttss2usi %xmm0, %rcx 1977; AVX512F-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0] 1978; AVX512F-NEXT: vcvttss2usi %xmm1, %rdx 1979; AVX512F-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1980; AVX512F-NEXT: vcvttss2usi %xmm0, %rsi 1981; AVX512F-NEXT: vmovq %rsi, %xmm0 1982; AVX512F-NEXT: vmovq %rdx, %xmm1 1983; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1984; AVX512F-NEXT: vmovq %rcx, %xmm1 1985; AVX512F-NEXT: vmovq %rax, %xmm2 1986; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 1987; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 1988; AVX512F-NEXT: retq 1989; 1990; AVX512VL-LABEL: fptoui_8f32_to_4i64: 1991; AVX512VL: # BB#0: 1992; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1993; AVX512VL-NEXT: vcvttss2usi %xmm1, %rax 1994; AVX512VL-NEXT: vcvttss2usi %xmm0, %rcx 1995; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0] 1996; AVX512VL-NEXT: vcvttss2usi %xmm1, %rdx 1997; AVX512VL-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1998; AVX512VL-NEXT: vcvttss2usi %xmm0, %rsi 1999; AVX512VL-NEXT: vmovq %rsi, %xmm0 2000; AVX512VL-NEXT: vmovq %rdx, %xmm1 2001; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 2002; AVX512VL-NEXT: vmovq %rcx, %xmm1 2003; AVX512VL-NEXT: vmovq %rax, %xmm2 2004; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 2005; AVX512VL-NEXT: vinserti32x4 $1, %xmm0, %ymm1, %ymm0 2006; AVX512VL-NEXT: retq 2007; 2008; AVX512DQ-LABEL: fptoui_8f32_to_4i64: 2009; AVX512DQ: # BB#0: 2010; AVX512DQ-NEXT: vcvttps2uqq %ymm0, %zmm0 2011; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 2012; AVX512DQ-NEXT: retq 2013; 2014; AVX512VLDQ-LABEL: fptoui_8f32_to_4i64: 2015; AVX512VLDQ: # BB#0: 2016; AVX512VLDQ-NEXT: vcvttps2uqq %ymm0, %zmm0 2017; AVX512VLDQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 2018; AVX512VLDQ-NEXT: retq 2019 %cvt = fptoui <8 x float> %a to <8 x i64> 2020 %shuf = shufflevector <8 x i64> %cvt, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 2021 ret <4 x i64> %shuf 2022} 2023 2024; 2025; Constant Folding 2026; 2027 2028define <2 x i64> @fptosi_2f64_to_2i64_const() { 2029; SSE-LABEL: fptosi_2f64_to_2i64_const: 2030; SSE: # BB#0: 2031; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,18446744073709551615] 2032; SSE-NEXT: retq 2033; 2034; AVX-LABEL: fptosi_2f64_to_2i64_const: 2035; AVX: # BB#0: 2036; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [1,18446744073709551615] 2037; AVX-NEXT: retq 2038 %cvt = fptosi <2 x double> <double 1.0, double -1.0> to <2 x i64> 2039 ret <2 x i64> %cvt 2040} 2041 2042define <4 x i32> @fptosi_2f64_to_2i32_const() { 2043; SSE-LABEL: fptosi_2f64_to_2i32_const: 2044; SSE: # BB#0: 2045; SSE-NEXT: movaps {{.*#+}} xmm0 = <4294967295,1,u,u> 2046; SSE-NEXT: retq 2047; 2048; AVX-LABEL: fptosi_2f64_to_2i32_const: 2049; AVX: # BB#0: 2050; AVX-NEXT: vmovaps {{.*#+}} xmm0 = <4294967295,1,u,u> 2051; AVX-NEXT: retq 2052 %cvt = fptosi <2 x double> <double -1.0, double 1.0> to <2 x i32> 2053 %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> 2054 ret <4 x i32> %ext 2055} 2056 2057define <4 x i64> @fptosi_4f64_to_4i64_const() { 2058; SSE-LABEL: fptosi_4f64_to_4i64_const: 2059; SSE: # BB#0: 2060; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,18446744073709551615] 2061; SSE-NEXT: movaps {{.*#+}} xmm1 = [2,18446744073709551613] 2062; SSE-NEXT: retq 2063; 2064; AVX-LABEL: fptosi_4f64_to_4i64_const: 2065; AVX: # BB#0: 2066; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,18446744073709551613] 2067; AVX-NEXT: retq 2068 %cvt = fptosi <4 x double> <double 1.0, double -1.0, double 2.0, double -3.0> to <4 x i64> 2069 ret <4 x i64> %cvt 2070} 2071 2072define <4 x i32> @fptosi_4f64_to_4i32_const() { 2073; SSE-LABEL: fptosi_4f64_to_4i32_const: 2074; SSE: # BB#0: 2075; SSE-NEXT: movaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3] 2076; SSE-NEXT: retq 2077; 2078; AVX-LABEL: fptosi_4f64_to_4i32_const: 2079; AVX: # BB#0: 2080; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3] 2081; AVX-NEXT: retq 2082 %cvt = fptosi <4 x double> <double -1.0, double 1.0, double -2.0, double 3.0> to <4 x i32> 2083 ret <4 x i32> %cvt 2084} 2085 2086define <2 x i64> @fptoui_2f64_to_2i64_const() { 2087; SSE-LABEL: fptoui_2f64_to_2i64_const: 2088; SSE: # BB#0: 2089; SSE-NEXT: movaps {{.*#+}} xmm0 = [2,4] 2090; SSE-NEXT: retq 2091; 2092; AVX-LABEL: fptoui_2f64_to_2i64_const: 2093; AVX: # BB#0: 2094; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [2,4] 2095; AVX-NEXT: retq 2096 %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i64> 2097 ret <2 x i64> %cvt 2098} 2099 2100define <4 x i32> @fptoui_2f64_to_2i32_const(<2 x double> %a) { 2101; SSE-LABEL: fptoui_2f64_to_2i32_const: 2102; SSE: # BB#0: 2103; SSE-NEXT: movaps {{.*#+}} xmm0 = <2,4,u,u> 2104; SSE-NEXT: retq 2105; 2106; AVX-LABEL: fptoui_2f64_to_2i32_const: 2107; AVX: # BB#0: 2108; AVX-NEXT: vmovaps {{.*#+}} xmm0 = <2,4,u,u> 2109; AVX-NEXT: retq 2110 %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i32> 2111 %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> 2112 ret <4 x i32> %ext 2113} 2114 2115define <4 x i64> @fptoui_4f64_to_4i64_const(<4 x double> %a) { 2116; SSE-LABEL: fptoui_4f64_to_4i64_const: 2117; SSE: # BB#0: 2118; SSE-NEXT: movaps {{.*#+}} xmm0 = [2,4] 2119; SSE-NEXT: movaps {{.*#+}} xmm1 = [6,8] 2120; SSE-NEXT: retq 2121; 2122; AVX-LABEL: fptoui_4f64_to_4i64_const: 2123; AVX: # BB#0: 2124; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [2,4,6,8] 2125; AVX-NEXT: retq 2126 %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i64> 2127 ret <4 x i64> %cvt 2128} 2129 2130define <4 x i32> @fptoui_4f64_to_4i32_const(<4 x double> %a) { 2131; SSE-LABEL: fptoui_4f64_to_4i32_const: 2132; SSE: # BB#0: 2133; SSE-NEXT: movaps {{.*#+}} xmm0 = [2,4,6,8] 2134; SSE-NEXT: retq 2135; 2136; AVX-LABEL: fptoui_4f64_to_4i32_const: 2137; AVX: # BB#0: 2138; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [2,4,6,8] 2139; AVX-NEXT: retq 2140 %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i32> 2141 ret <4 x i32> %cvt 2142} 2143 2144define <4 x i32> @fptosi_4f32_to_4i32_const() { 2145; SSE-LABEL: fptosi_4f32_to_4i32_const: 2146; SSE: # BB#0: 2147; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,4294967295,2,3] 2148; SSE-NEXT: retq 2149; 2150; AVX-LABEL: fptosi_4f32_to_4i32_const: 2151; AVX: # BB#0: 2152; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [1,4294967295,2,3] 2153; AVX-NEXT: retq 2154 %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i32> 2155 ret <4 x i32> %cvt 2156} 2157 2158define <4 x i64> @fptosi_4f32_to_4i64_const() { 2159; SSE-LABEL: fptosi_4f32_to_4i64_const: 2160; SSE: # BB#0: 2161; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,18446744073709551615] 2162; SSE-NEXT: movaps {{.*#+}} xmm1 = [2,3] 2163; SSE-NEXT: retq 2164; 2165; AVX-LABEL: fptosi_4f32_to_4i64_const: 2166; AVX: # BB#0: 2167; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,3] 2168; AVX-NEXT: retq 2169 %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i64> 2170 ret <4 x i64> %cvt 2171} 2172 2173define <8 x i32> @fptosi_8f32_to_8i32_const(<8 x float> %a) { 2174; SSE-LABEL: fptosi_8f32_to_8i32_const: 2175; SSE: # BB#0: 2176; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,4294967295,2,3] 2177; SSE-NEXT: movaps {{.*#+}} xmm1 = [6,4294967288,2,4294967295] 2178; SSE-NEXT: retq 2179; 2180; AVX-LABEL: fptosi_8f32_to_8i32_const: 2181; AVX: # BB#0: 2182; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [1,4294967295,2,3,6,4294967288,2,4294967295] 2183; AVX-NEXT: retq 2184 %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> 2185 ret <8 x i32> %cvt 2186} 2187 2188define <4 x i32> @fptoui_4f32_to_4i32_const(<4 x float> %a) { 2189; SSE-LABEL: fptoui_4f32_to_4i32_const: 2190; SSE: # BB#0: 2191; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,2,4,6] 2192; SSE-NEXT: retq 2193; 2194; AVX-LABEL: fptoui_4f32_to_4i32_const: 2195; AVX: # BB#0: 2196; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [1,2,4,6] 2197; AVX-NEXT: retq 2198 %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 6.0> to <4 x i32> 2199 ret <4 x i32> %cvt 2200} 2201 2202define <4 x i64> @fptoui_4f32_to_4i64_const() { 2203; SSE-LABEL: fptoui_4f32_to_4i64_const: 2204; SSE: # BB#0: 2205; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,2] 2206; SSE-NEXT: movaps {{.*#+}} xmm1 = [4,8] 2207; SSE-NEXT: retq 2208; 2209; AVX-LABEL: fptoui_4f32_to_4i64_const: 2210; AVX: # BB#0: 2211; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [1,2,4,8] 2212; AVX-NEXT: retq 2213 %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 8.0> to <4 x i64> 2214 ret <4 x i64> %cvt 2215} 2216 2217define <8 x i32> @fptoui_8f32_to_8i32_const(<8 x float> %a) { 2218; SSE-LABEL: fptoui_8f32_to_8i32_const: 2219; SSE: # BB#0: 2220; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,2,4,6] 2221; SSE-NEXT: movaps {{.*#+}} xmm1 = [8,6,4,1] 2222; SSE-NEXT: retq 2223; 2224; AVX-LABEL: fptoui_8f32_to_8i32_const: 2225; AVX: # BB#0: 2226; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [1,2,4,6,8,6,4,1] 2227; AVX-NEXT: retq 2228 %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> 2229 ret <8 x i32> %cvt 2230} 2231 2232; 2233; Special Cases 2234; 2235 2236define <4 x i32> @fptosi_2f16_to_4i32(<2 x half> %a) nounwind { 2237; SSE-LABEL: fptosi_2f16_to_4i32: 2238; SSE: # BB#0: 2239; SSE-NEXT: pushq %rax 2240; SSE-NEXT: movss %xmm1, {{[0-9]+}}(%rsp) # 4-byte Spill 2241; SSE-NEXT: callq __gnu_f2h_ieee 2242; SSE-NEXT: movzwl %ax, %edi 2243; SSE-NEXT: callq __gnu_h2f_ieee 2244; SSE-NEXT: movss %xmm0, (%rsp) # 4-byte Spill 2245; SSE-NEXT: movss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Reload 2246; SSE-NEXT: # xmm0 = mem[0],zero,zero,zero 2247; SSE-NEXT: callq __gnu_f2h_ieee 2248; SSE-NEXT: movzwl %ax, %edi 2249; SSE-NEXT: callq __gnu_h2f_ieee 2250; SSE-NEXT: cvttss2si %xmm0, %rax 2251; SSE-NEXT: movd %rax, %xmm0 2252; SSE-NEXT: cvttss2si (%rsp), %rax # 4-byte Folded Reload 2253; SSE-NEXT: movd %rax, %xmm1 2254; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 2255; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,1,0,2] 2256; SSE-NEXT: psrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero 2257; SSE-NEXT: popq %rax 2258; SSE-NEXT: retq 2259; 2260; VEX-LABEL: fptosi_2f16_to_4i32: 2261; VEX: # BB#0: 2262; VEX-NEXT: pushq %rax 2263; VEX-NEXT: vmovss %xmm1, {{[0-9]+}}(%rsp) # 4-byte Spill 2264; VEX-NEXT: callq __gnu_f2h_ieee 2265; VEX-NEXT: movzwl %ax, %edi 2266; VEX-NEXT: callq __gnu_h2f_ieee 2267; VEX-NEXT: vmovss %xmm0, (%rsp) # 4-byte Spill 2268; VEX-NEXT: vmovss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Reload 2269; VEX-NEXT: # xmm0 = mem[0],zero,zero,zero 2270; VEX-NEXT: callq __gnu_f2h_ieee 2271; VEX-NEXT: movzwl %ax, %edi 2272; VEX-NEXT: callq __gnu_h2f_ieee 2273; VEX-NEXT: vcvttss2si %xmm0, %rax 2274; VEX-NEXT: vmovq %rax, %xmm0 2275; VEX-NEXT: vcvttss2si (%rsp), %rax # 4-byte Folded Reload 2276; VEX-NEXT: vmovq %rax, %xmm1 2277; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 2278; VEX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2279; VEX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 2280; VEX-NEXT: popq %rax 2281; VEX-NEXT: retq 2282; 2283; AVX512F-LABEL: fptosi_2f16_to_4i32: 2284; AVX512F: # BB#0: 2285; AVX512F-NEXT: # kill: %XMM1<def> %XMM1<kill> %ZMM1<def> 2286; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 2287; AVX512F-NEXT: vcvtps2ph $4, %zmm0, %ymm0 2288; AVX512F-NEXT: vcvtph2ps %ymm0, %zmm0 2289; AVX512F-NEXT: vcvtps2ph $4, %zmm1, %ymm1 2290; AVX512F-NEXT: vcvtph2ps %ymm1, %zmm1 2291; AVX512F-NEXT: vcvttss2si %xmm1, %rax 2292; AVX512F-NEXT: vmovq %rax, %xmm1 2293; AVX512F-NEXT: vcvttss2si %xmm0, %rax 2294; AVX512F-NEXT: vmovq %rax, %xmm0 2295; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2296; AVX512F-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2297; AVX512F-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 2298; AVX512F-NEXT: retq 2299; 2300; AVX512VL-LABEL: fptosi_2f16_to_4i32: 2301; AVX512VL: # BB#0: 2302; AVX512VL-NEXT: vcvtps2ph $4, %xmm0, %xmm0 2303; AVX512VL-NEXT: vcvtph2ps %xmm0, %xmm0 2304; AVX512VL-NEXT: vcvtps2ph $4, %xmm1, %xmm1 2305; AVX512VL-NEXT: vcvtph2ps %xmm1, %xmm1 2306; AVX512VL-NEXT: vcvttss2si %xmm1, %rax 2307; AVX512VL-NEXT: vmovq %rax, %xmm1 2308; AVX512VL-NEXT: vcvttss2si %xmm0, %rax 2309; AVX512VL-NEXT: vmovq %rax, %xmm0 2310; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2311; AVX512VL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2312; AVX512VL-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 2313; AVX512VL-NEXT: retq 2314; 2315; AVX512DQ-LABEL: fptosi_2f16_to_4i32: 2316; AVX512DQ: # BB#0: 2317; AVX512DQ-NEXT: # kill: %XMM1<def> %XMM1<kill> %ZMM1<def> 2318; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 2319; AVX512DQ-NEXT: vcvtps2ph $4, %zmm0, %ymm0 2320; AVX512DQ-NEXT: vcvtph2ps %ymm0, %zmm0 2321; AVX512DQ-NEXT: vcvtps2ph $4, %zmm1, %ymm1 2322; AVX512DQ-NEXT: vcvtph2ps %ymm1, %zmm1 2323; AVX512DQ-NEXT: vcvttss2si %xmm1, %rax 2324; AVX512DQ-NEXT: vmovq %rax, %xmm1 2325; AVX512DQ-NEXT: vcvttss2si %xmm0, %rax 2326; AVX512DQ-NEXT: vmovq %rax, %xmm0 2327; AVX512DQ-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2328; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2329; AVX512DQ-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 2330; AVX512DQ-NEXT: retq 2331; 2332; AVX512VLDQ-LABEL: fptosi_2f16_to_4i32: 2333; AVX512VLDQ: # BB#0: 2334; AVX512VLDQ-NEXT: vcvtps2ph $4, %xmm0, %xmm0 2335; AVX512VLDQ-NEXT: vcvtph2ps %xmm0, %xmm0 2336; AVX512VLDQ-NEXT: vcvtps2ph $4, %xmm1, %xmm1 2337; AVX512VLDQ-NEXT: vcvtph2ps %xmm1, %xmm1 2338; AVX512VLDQ-NEXT: vcvttss2si %xmm1, %rax 2339; AVX512VLDQ-NEXT: vmovq %rax, %xmm1 2340; AVX512VLDQ-NEXT: vcvttss2si %xmm0, %rax 2341; AVX512VLDQ-NEXT: vmovq %rax, %xmm0 2342; AVX512VLDQ-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2343; AVX512VLDQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2344; AVX512VLDQ-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 2345; AVX512VLDQ-NEXT: retq 2346 %cvt = fptosi <2 x half> %a to <2 x i32> 2347 %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 2348 ret <4 x i32> %ext 2349} 2350 2351define <4 x i32> @fptosi_2f80_to_4i32(<2 x x86_fp80> %a) nounwind { 2352; SSE-LABEL: fptosi_2f80_to_4i32: 2353; SSE: # BB#0: 2354; SSE-NEXT: fldt {{[0-9]+}}(%rsp) 2355; SSE-NEXT: fldt {{[0-9]+}}(%rsp) 2356; SSE-NEXT: fnstcw -{{[0-9]+}}(%rsp) 2357; SSE-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax 2358; SSE-NEXT: movw $3199, -{{[0-9]+}}(%rsp) # imm = 0xC7F 2359; SSE-NEXT: fldcw -{{[0-9]+}}(%rsp) 2360; SSE-NEXT: movw %ax, -{{[0-9]+}}(%rsp) 2361; SSE-NEXT: fistpll -{{[0-9]+}}(%rsp) 2362; SSE-NEXT: fldcw -{{[0-9]+}}(%rsp) 2363; SSE-NEXT: fnstcw -{{[0-9]+}}(%rsp) 2364; SSE-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax 2365; SSE-NEXT: movw $3199, -{{[0-9]+}}(%rsp) # imm = 0xC7F 2366; SSE-NEXT: fldcw -{{[0-9]+}}(%rsp) 2367; SSE-NEXT: movw %ax, -{{[0-9]+}}(%rsp) 2368; SSE-NEXT: fistpll -{{[0-9]+}}(%rsp) 2369; SSE-NEXT: fldcw -{{[0-9]+}}(%rsp) 2370; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 2371; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero 2372; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 2373; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,1,0,2] 2374; SSE-NEXT: psrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero 2375; SSE-NEXT: retq 2376; 2377; AVX-LABEL: fptosi_2f80_to_4i32: 2378; AVX: # BB#0: 2379; AVX-NEXT: fldt {{[0-9]+}}(%rsp) 2380; AVX-NEXT: fldt {{[0-9]+}}(%rsp) 2381; AVX-NEXT: fisttpll -{{[0-9]+}}(%rsp) 2382; AVX-NEXT: fisttpll -{{[0-9]+}}(%rsp) 2383; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 2384; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 2385; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 2386; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2387; AVX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 2388; AVX-NEXT: retq 2389 %cvt = fptosi <2 x x86_fp80> %a to <2 x i32> 2390 %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 2391 ret <4 x i32> %ext 2392} 2393 2394define <4 x i32> @fptosi_2f128_to_4i32(<2 x fp128> %a) nounwind { 2395; SSE-LABEL: fptosi_2f128_to_4i32: 2396; SSE: # BB#0: 2397; SSE-NEXT: pushq %r14 2398; SSE-NEXT: pushq %rbx 2399; SSE-NEXT: subq $24, %rsp 2400; SSE-NEXT: movq %rsi, %r14 2401; SSE-NEXT: movq %rdi, %rbx 2402; SSE-NEXT: movq %rdx, %rdi 2403; SSE-NEXT: movq %rcx, %rsi 2404; SSE-NEXT: callq __fixtfdi 2405; SSE-NEXT: movd %rax, %xmm0 2406; SSE-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill 2407; SSE-NEXT: movq %rbx, %rdi 2408; SSE-NEXT: movq %r14, %rsi 2409; SSE-NEXT: callq __fixtfdi 2410; SSE-NEXT: movd %rax, %xmm0 2411; SSE-NEXT: punpcklqdq (%rsp), %xmm0 # 16-byte Folded Reload 2412; SSE-NEXT: # xmm0 = xmm0[0],mem[0] 2413; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,2] 2414; SSE-NEXT: psrldq {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero 2415; SSE-NEXT: addq $24, %rsp 2416; SSE-NEXT: popq %rbx 2417; SSE-NEXT: popq %r14 2418; SSE-NEXT: retq 2419; 2420; VEX-LABEL: fptosi_2f128_to_4i32: 2421; VEX: # BB#0: 2422; VEX-NEXT: pushq %r14 2423; VEX-NEXT: pushq %rbx 2424; VEX-NEXT: subq $24, %rsp 2425; VEX-NEXT: movq %rsi, %r14 2426; VEX-NEXT: movq %rdi, %rbx 2427; VEX-NEXT: movq %rdx, %rdi 2428; VEX-NEXT: movq %rcx, %rsi 2429; VEX-NEXT: callq __fixtfdi 2430; VEX-NEXT: vmovq %rax, %xmm0 2431; VEX-NEXT: vmovdqa %xmm0, (%rsp) # 16-byte Spill 2432; VEX-NEXT: movq %rbx, %rdi 2433; VEX-NEXT: movq %r14, %rsi 2434; VEX-NEXT: callq __fixtfdi 2435; VEX-NEXT: vmovq %rax, %xmm0 2436; VEX-NEXT: vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload 2437; VEX-NEXT: # xmm0 = xmm0[0],mem[0] 2438; VEX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2439; VEX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 2440; VEX-NEXT: addq $24, %rsp 2441; VEX-NEXT: popq %rbx 2442; VEX-NEXT: popq %r14 2443; VEX-NEXT: retq 2444; 2445; AVX512F-LABEL: fptosi_2f128_to_4i32: 2446; AVX512F: # BB#0: 2447; AVX512F-NEXT: pushq %r14 2448; AVX512F-NEXT: pushq %rbx 2449; AVX512F-NEXT: subq $24, %rsp 2450; AVX512F-NEXT: movq %rsi, %r14 2451; AVX512F-NEXT: movq %rdi, %rbx 2452; AVX512F-NEXT: movq %rdx, %rdi 2453; AVX512F-NEXT: movq %rcx, %rsi 2454; AVX512F-NEXT: callq __fixtfdi 2455; AVX512F-NEXT: vmovq %rax, %xmm0 2456; AVX512F-NEXT: vmovdqa %xmm0, (%rsp) # 16-byte Spill 2457; AVX512F-NEXT: movq %rbx, %rdi 2458; AVX512F-NEXT: movq %r14, %rsi 2459; AVX512F-NEXT: callq __fixtfdi 2460; AVX512F-NEXT: vmovq %rax, %xmm0 2461; AVX512F-NEXT: vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload 2462; AVX512F-NEXT: # xmm0 = xmm0[0],mem[0] 2463; AVX512F-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2464; AVX512F-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 2465; AVX512F-NEXT: addq $24, %rsp 2466; AVX512F-NEXT: popq %rbx 2467; AVX512F-NEXT: popq %r14 2468; AVX512F-NEXT: retq 2469; 2470; AVX512VL-LABEL: fptosi_2f128_to_4i32: 2471; AVX512VL: # BB#0: 2472; AVX512VL-NEXT: pushq %r14 2473; AVX512VL-NEXT: pushq %rbx 2474; AVX512VL-NEXT: subq $24, %rsp 2475; AVX512VL-NEXT: movq %rsi, %r14 2476; AVX512VL-NEXT: movq %rdi, %rbx 2477; AVX512VL-NEXT: movq %rdx, %rdi 2478; AVX512VL-NEXT: movq %rcx, %rsi 2479; AVX512VL-NEXT: callq __fixtfdi 2480; AVX512VL-NEXT: vmovq %rax, %xmm0 2481; AVX512VL-NEXT: vmovdqa64 %xmm0, (%rsp) # 16-byte Spill 2482; AVX512VL-NEXT: movq %rbx, %rdi 2483; AVX512VL-NEXT: movq %r14, %rsi 2484; AVX512VL-NEXT: callq __fixtfdi 2485; AVX512VL-NEXT: vmovq %rax, %xmm0 2486; AVX512VL-NEXT: vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload 2487; AVX512VL-NEXT: # xmm0 = xmm0[0],mem[0] 2488; AVX512VL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2489; AVX512VL-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 2490; AVX512VL-NEXT: addq $24, %rsp 2491; AVX512VL-NEXT: popq %rbx 2492; AVX512VL-NEXT: popq %r14 2493; AVX512VL-NEXT: retq 2494; 2495; AVX512DQ-LABEL: fptosi_2f128_to_4i32: 2496; AVX512DQ: # BB#0: 2497; AVX512DQ-NEXT: pushq %r14 2498; AVX512DQ-NEXT: pushq %rbx 2499; AVX512DQ-NEXT: subq $24, %rsp 2500; AVX512DQ-NEXT: movq %rsi, %r14 2501; AVX512DQ-NEXT: movq %rdi, %rbx 2502; AVX512DQ-NEXT: movq %rdx, %rdi 2503; AVX512DQ-NEXT: movq %rcx, %rsi 2504; AVX512DQ-NEXT: callq __fixtfdi 2505; AVX512DQ-NEXT: vmovq %rax, %xmm0 2506; AVX512DQ-NEXT: vmovdqa %xmm0, (%rsp) # 16-byte Spill 2507; AVX512DQ-NEXT: movq %rbx, %rdi 2508; AVX512DQ-NEXT: movq %r14, %rsi 2509; AVX512DQ-NEXT: callq __fixtfdi 2510; AVX512DQ-NEXT: vmovq %rax, %xmm0 2511; AVX512DQ-NEXT: vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload 2512; AVX512DQ-NEXT: # xmm0 = xmm0[0],mem[0] 2513; AVX512DQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2514; AVX512DQ-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 2515; AVX512DQ-NEXT: addq $24, %rsp 2516; AVX512DQ-NEXT: popq %rbx 2517; AVX512DQ-NEXT: popq %r14 2518; AVX512DQ-NEXT: retq 2519; 2520; AVX512VLDQ-LABEL: fptosi_2f128_to_4i32: 2521; AVX512VLDQ: # BB#0: 2522; AVX512VLDQ-NEXT: pushq %r14 2523; AVX512VLDQ-NEXT: pushq %rbx 2524; AVX512VLDQ-NEXT: subq $24, %rsp 2525; AVX512VLDQ-NEXT: movq %rsi, %r14 2526; AVX512VLDQ-NEXT: movq %rdi, %rbx 2527; AVX512VLDQ-NEXT: movq %rdx, %rdi 2528; AVX512VLDQ-NEXT: movq %rcx, %rsi 2529; AVX512VLDQ-NEXT: callq __fixtfdi 2530; AVX512VLDQ-NEXT: vmovq %rax, %xmm0 2531; AVX512VLDQ-NEXT: vmovdqa64 %xmm0, (%rsp) # 16-byte Spill 2532; AVX512VLDQ-NEXT: movq %rbx, %rdi 2533; AVX512VLDQ-NEXT: movq %r14, %rsi 2534; AVX512VLDQ-NEXT: callq __fixtfdi 2535; AVX512VLDQ-NEXT: vmovq %rax, %xmm0 2536; AVX512VLDQ-NEXT: vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload 2537; AVX512VLDQ-NEXT: # xmm0 = xmm0[0],mem[0] 2538; AVX512VLDQ-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 2539; AVX512VLDQ-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 2540; AVX512VLDQ-NEXT: addq $24, %rsp 2541; AVX512VLDQ-NEXT: popq %rbx 2542; AVX512VLDQ-NEXT: popq %r14 2543; AVX512VLDQ-NEXT: retq 2544 %cvt = fptosi <2 x fp128> %a to <2 x i32> 2545 %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 2546 ret <4 x i32> %ext 2547} 2548