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: vextractf128 $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: vinserti128 $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 {{.*#+}} xmm2 = mem[0],zero 351; SSE-NEXT: movapd %xmm0, %xmm1 352; SSE-NEXT: subsd %xmm2, %xmm1 353; SSE-NEXT: cvttsd2si %xmm1, %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 %xmm2, %xmm0 358; SSE-NEXT: cmovaeq %rax, %rdx 359; SSE-NEXT: movd %rdx, %xmm1 360; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 361; SSE-NEXT: movaps %xmm0, %xmm3 362; SSE-NEXT: subsd %xmm2, %xmm3 363; SSE-NEXT: cvttsd2si %xmm3, %rax 364; SSE-NEXT: xorq %rcx, %rax 365; SSE-NEXT: cvttsd2si %xmm0, %rcx 366; SSE-NEXT: ucomisd %xmm2, %xmm0 367; SSE-NEXT: cmovaeq %rax, %rcx 368; SSE-NEXT: movd %rcx, %xmm0 369; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 370; SSE-NEXT: pxor %xmm0, %xmm0 371; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3] 372; SSE-NEXT: movaps %xmm1, %xmm0 373; SSE-NEXT: retq 374; 375; VEX-LABEL: fptoui_2f64_to_4i32: 376; VEX: # BB#0: 377; VEX-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero 378; VEX-NEXT: vsubsd %xmm1, %xmm0, %xmm2 379; VEX-NEXT: vcvttsd2si %xmm2, %rax 380; VEX-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 381; VEX-NEXT: xorq %rcx, %rax 382; VEX-NEXT: vcvttsd2si %xmm0, %rdx 383; VEX-NEXT: vucomisd %xmm1, %xmm0 384; VEX-NEXT: cmovaeq %rax, %rdx 385; VEX-NEXT: vmovq %rdx, %xmm2 386; VEX-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 387; VEX-NEXT: vsubsd %xmm1, %xmm0, %xmm3 388; VEX-NEXT: vcvttsd2si %xmm3, %rax 389; VEX-NEXT: xorq %rcx, %rax 390; VEX-NEXT: vcvttsd2si %xmm0, %rcx 391; VEX-NEXT: vucomisd %xmm1, %xmm0 392; VEX-NEXT: cmovaeq %rax, %rcx 393; VEX-NEXT: vmovq %rcx, %xmm0 394; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 395; VEX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,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 {{.*#+}} xmm2 = mem[0],zero 507; SSE-NEXT: movapd %xmm0, %xmm1 508; SSE-NEXT: subsd %xmm2, %xmm1 509; SSE-NEXT: cvttsd2si %xmm1, %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 %xmm2, %xmm0 514; SSE-NEXT: cmovaeq %rax, %rdx 515; SSE-NEXT: movd %rdx, %xmm1 516; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 517; SSE-NEXT: movaps %xmm0, %xmm3 518; SSE-NEXT: subsd %xmm2, %xmm3 519; SSE-NEXT: cvttsd2si %xmm3, %rax 520; SSE-NEXT: xorq %rcx, %rax 521; SSE-NEXT: cvttsd2si %xmm0, %rdx 522; SSE-NEXT: ucomisd %xmm2, %xmm0 523; SSE-NEXT: cmovaeq %rax, %rdx 524; SSE-NEXT: movd %rdx, %xmm0 525; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 526; SSE-NEXT: cvttsd2si %xmm0, %rax 527; SSE-NEXT: xorq %rax, %rcx 528; SSE-NEXT: ucomisd %xmm2, %xmm0 529; SSE-NEXT: cmovbq %rax, %rcx 530; SSE-NEXT: movd %rcx, %xmm0 531; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 532; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[0,2] 533; SSE-NEXT: movaps %xmm1, %xmm0 534; SSE-NEXT: retq 535; 536; VEX-LABEL: fptoui_4f64_to_2i32: 537; VEX: # BB#0: 538; VEX-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0] 539; VEX-NEXT: vcvttsd2si %xmm1, %rax 540; VEX-NEXT: vcvttsd2si %xmm0, %rcx 541; VEX-NEXT: vmovd %ecx, %xmm0 542; VEX-NEXT: vpinsrd $1, %eax, %xmm0, %xmm0 543; VEX-NEXT: vcvttsd2si %xmm0, %rax 544; VEX-NEXT: vpinsrd $2, %eax, %xmm0, %xmm0 545; VEX-NEXT: vpinsrd $3, %eax, %xmm0, %xmm0 546; VEX-NEXT: retq 547; 548; AVX512F-LABEL: fptoui_4f64_to_2i32: 549; AVX512F: # BB#0: 550; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 551; AVX512F-NEXT: vcvttpd2udq %zmm0, %ymm0 552; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 553; AVX512F-NEXT: retq 554; 555; AVX512VL-LABEL: fptoui_4f64_to_2i32: 556; AVX512VL: # BB#0: 557; AVX512VL-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def> 558; AVX512VL-NEXT: vcvttpd2udq %ymm0, %xmm0 559; AVX512VL-NEXT: retq 560; 561; AVX512DQ-LABEL: fptoui_4f64_to_2i32: 562; AVX512DQ: # BB#0: 563; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 564; AVX512DQ-NEXT: vcvttpd2udq %zmm0, %ymm0 565; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 566; AVX512DQ-NEXT: retq 567; 568; AVX512VLDQ-LABEL: fptoui_4f64_to_2i32: 569; AVX512VLDQ: # BB#0: 570; AVX512VLDQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def> 571; AVX512VLDQ-NEXT: vcvttpd2udq %ymm0, %xmm0 572; AVX512VLDQ-NEXT: retq 573 %ext = shufflevector <2 x double> %a, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> 574 %cvt = fptoui <4 x double> %ext to <4 x i32> 575 ret <4 x i32> %cvt 576} 577 578define <4 x i64> @fptoui_4f64_to_4i64(<4 x double> %a) { 579; SSE-LABEL: fptoui_4f64_to_4i64: 580; SSE: # BB#0: 581; SSE-NEXT: movapd %xmm0, %xmm2 582; SSE-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero 583; SSE-NEXT: subsd %xmm3, %xmm0 584; SSE-NEXT: cvttsd2si %xmm0, %rcx 585; SSE-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000 586; SSE-NEXT: xorq %rax, %rcx 587; SSE-NEXT: cvttsd2si %xmm2, %rdx 588; SSE-NEXT: ucomisd %xmm3, %xmm2 589; SSE-NEXT: cmovaeq %rcx, %rdx 590; SSE-NEXT: movd %rdx, %xmm0 591; SSE-NEXT: movhlps {{.*#+}} xmm2 = xmm2[1,1] 592; SSE-NEXT: movaps %xmm2, %xmm4 593; SSE-NEXT: subsd %xmm3, %xmm4 594; SSE-NEXT: cvttsd2si %xmm4, %rcx 595; SSE-NEXT: xorq %rax, %rcx 596; SSE-NEXT: cvttsd2si %xmm2, %rdx 597; SSE-NEXT: ucomisd %xmm3, %xmm2 598; SSE-NEXT: cmovaeq %rcx, %rdx 599; SSE-NEXT: movd %rdx, %xmm2 600; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 601; SSE-NEXT: movapd %xmm1, %xmm2 602; SSE-NEXT: subsd %xmm3, %xmm2 603; SSE-NEXT: cvttsd2si %xmm2, %rcx 604; SSE-NEXT: xorq %rax, %rcx 605; SSE-NEXT: cvttsd2si %xmm1, %rdx 606; SSE-NEXT: ucomisd %xmm3, %xmm1 607; SSE-NEXT: cmovaeq %rcx, %rdx 608; SSE-NEXT: movd %rdx, %xmm2 609; SSE-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1] 610; SSE-NEXT: movaps %xmm1, %xmm4 611; SSE-NEXT: subsd %xmm3, %xmm4 612; SSE-NEXT: cvttsd2si %xmm4, %rcx 613; SSE-NEXT: xorq %rax, %rcx 614; SSE-NEXT: cvttsd2si %xmm1, %rax 615; SSE-NEXT: ucomisd %xmm3, %xmm1 616; SSE-NEXT: cmovaeq %rcx, %rax 617; SSE-NEXT: movd %rax, %xmm1 618; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 619; SSE-NEXT: movdqa %xmm2, %xmm1 620; SSE-NEXT: retq 621; 622; AVX1-LABEL: fptoui_4f64_to_4i64: 623; AVX1: # BB#0: 624; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 625; AVX1-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero 626; AVX1-NEXT: vsubsd %xmm1, %xmm2, %xmm3 627; AVX1-NEXT: vcvttsd2si %xmm3, %rax 628; AVX1-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 629; AVX1-NEXT: xorq %rcx, %rax 630; AVX1-NEXT: vcvttsd2si %xmm2, %rdx 631; AVX1-NEXT: vucomisd %xmm1, %xmm2 632; AVX1-NEXT: cmovaeq %rax, %rdx 633; AVX1-NEXT: vmovq %rdx, %xmm3 634; AVX1-NEXT: vpermilpd {{.*#+}} xmm2 = xmm2[1,0] 635; AVX1-NEXT: vsubsd %xmm1, %xmm2, %xmm4 636; AVX1-NEXT: vcvttsd2si %xmm4, %rax 637; AVX1-NEXT: xorq %rcx, %rax 638; AVX1-NEXT: vcvttsd2si %xmm2, %rdx 639; AVX1-NEXT: vucomisd %xmm1, %xmm2 640; AVX1-NEXT: cmovaeq %rax, %rdx 641; AVX1-NEXT: vmovq %rdx, %xmm2 642; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0] 643; AVX1-NEXT: vsubsd %xmm1, %xmm0, %xmm3 644; AVX1-NEXT: vcvttsd2si %xmm3, %rax 645; AVX1-NEXT: xorq %rcx, %rax 646; AVX1-NEXT: vcvttsd2si %xmm0, %rdx 647; AVX1-NEXT: vucomisd %xmm1, %xmm0 648; AVX1-NEXT: cmovaeq %rax, %rdx 649; AVX1-NEXT: vmovq %rdx, %xmm3 650; AVX1-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 651; AVX1-NEXT: vsubsd %xmm1, %xmm0, %xmm4 652; AVX1-NEXT: vcvttsd2si %xmm4, %rax 653; AVX1-NEXT: xorq %rcx, %rax 654; AVX1-NEXT: vcvttsd2si %xmm0, %rcx 655; AVX1-NEXT: vucomisd %xmm1, %xmm0 656; AVX1-NEXT: cmovaeq %rax, %rcx 657; AVX1-NEXT: vmovq %rcx, %xmm0 658; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0] 659; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 660; AVX1-NEXT: retq 661; 662; AVX2-LABEL: fptoui_4f64_to_4i64: 663; AVX2: # BB#0: 664; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm2 665; AVX2-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero 666; AVX2-NEXT: vsubsd %xmm1, %xmm2, %xmm3 667; AVX2-NEXT: vcvttsd2si %xmm3, %rax 668; AVX2-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 669; AVX2-NEXT: xorq %rcx, %rax 670; AVX2-NEXT: vcvttsd2si %xmm2, %rdx 671; AVX2-NEXT: vucomisd %xmm1, %xmm2 672; AVX2-NEXT: cmovaeq %rax, %rdx 673; AVX2-NEXT: vmovq %rdx, %xmm3 674; AVX2-NEXT: vpermilpd {{.*#+}} xmm2 = xmm2[1,0] 675; AVX2-NEXT: vsubsd %xmm1, %xmm2, %xmm4 676; AVX2-NEXT: vcvttsd2si %xmm4, %rax 677; AVX2-NEXT: xorq %rcx, %rax 678; AVX2-NEXT: vcvttsd2si %xmm2, %rdx 679; AVX2-NEXT: vucomisd %xmm1, %xmm2 680; AVX2-NEXT: cmovaeq %rax, %rdx 681; AVX2-NEXT: vmovq %rdx, %xmm2 682; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0] 683; AVX2-NEXT: vsubsd %xmm1, %xmm0, %xmm3 684; AVX2-NEXT: vcvttsd2si %xmm3, %rax 685; AVX2-NEXT: xorq %rcx, %rax 686; AVX2-NEXT: vcvttsd2si %xmm0, %rdx 687; AVX2-NEXT: vucomisd %xmm1, %xmm0 688; AVX2-NEXT: cmovaeq %rax, %rdx 689; AVX2-NEXT: vmovq %rdx, %xmm3 690; AVX2-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 691; AVX2-NEXT: vsubsd %xmm1, %xmm0, %xmm4 692; AVX2-NEXT: vcvttsd2si %xmm4, %rax 693; AVX2-NEXT: xorq %rcx, %rax 694; AVX2-NEXT: vcvttsd2si %xmm0, %rcx 695; AVX2-NEXT: vucomisd %xmm1, %xmm0 696; AVX2-NEXT: cmovaeq %rax, %rcx 697; AVX2-NEXT: vmovq %rcx, %xmm0 698; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0] 699; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 700; AVX2-NEXT: retq 701; 702; AVX512F-LABEL: fptoui_4f64_to_4i64: 703; AVX512F: # BB#0: 704; AVX512F-NEXT: vextractf128 $1, %ymm0, %xmm1 705; AVX512F-NEXT: vcvttsd2usi %xmm1, %rax 706; AVX512F-NEXT: vmovq %rax, %xmm2 707; AVX512F-NEXT: vpermilpd {{.*#+}} xmm1 = xmm1[1,0] 708; AVX512F-NEXT: vcvttsd2usi %xmm1, %rax 709; AVX512F-NEXT: vmovq %rax, %xmm1 710; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 711; AVX512F-NEXT: vcvttsd2usi %xmm0, %rax 712; AVX512F-NEXT: vmovq %rax, %xmm2 713; AVX512F-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 714; AVX512F-NEXT: vcvttsd2usi %xmm0, %rax 715; AVX512F-NEXT: vmovq %rax, %xmm0 716; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 717; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 718; AVX512F-NEXT: retq 719; 720; AVX512VL-LABEL: fptoui_4f64_to_4i64: 721; AVX512VL: # BB#0: 722; AVX512VL-NEXT: vextractf128 $1, %ymm0, %xmm1 723; AVX512VL-NEXT: vcvttsd2usi %xmm1, %rax 724; AVX512VL-NEXT: vmovq %rax, %xmm2 725; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm1 = xmm1[1,0] 726; AVX512VL-NEXT: vcvttsd2usi %xmm1, %rax 727; AVX512VL-NEXT: vmovq %rax, %xmm1 728; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 729; AVX512VL-NEXT: vcvttsd2usi %xmm0, %rax 730; AVX512VL-NEXT: vmovq %rax, %xmm2 731; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 732; AVX512VL-NEXT: vcvttsd2usi %xmm0, %rax 733; AVX512VL-NEXT: vmovq %rax, %xmm0 734; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 735; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 736; AVX512VL-NEXT: retq 737; 738; AVX512DQ-LABEL: fptoui_4f64_to_4i64: 739; AVX512DQ: # BB#0: 740; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 741; AVX512DQ-NEXT: vcvttpd2uqq %zmm0, %zmm0 742; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 743; AVX512DQ-NEXT: retq 744; 745; AVX512VLDQ-LABEL: fptoui_4f64_to_4i64: 746; AVX512VLDQ: # BB#0: 747; AVX512VLDQ-NEXT: vcvttpd2uqq %ymm0, %ymm0 748; AVX512VLDQ-NEXT: retq 749 %cvt = fptoui <4 x double> %a to <4 x i64> 750 ret <4 x i64> %cvt 751} 752 753define <4 x i32> @fptoui_4f64_to_4i32(<4 x double> %a) { 754; SSE-LABEL: fptoui_4f64_to_4i32: 755; SSE: # BB#0: 756; SSE-NEXT: movsd {{.*#+}} xmm2 = mem[0],zero 757; SSE-NEXT: movapd %xmm1, %xmm3 758; SSE-NEXT: subsd %xmm2, %xmm3 759; SSE-NEXT: cvttsd2si %xmm3, %rcx 760; SSE-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000 761; SSE-NEXT: xorq %rax, %rcx 762; SSE-NEXT: cvttsd2si %xmm1, %rdx 763; SSE-NEXT: ucomisd %xmm2, %xmm1 764; SSE-NEXT: cmovaeq %rcx, %rdx 765; SSE-NEXT: movd %rdx, %xmm3 766; SSE-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1] 767; SSE-NEXT: movaps %xmm1, %xmm4 768; SSE-NEXT: subsd %xmm2, %xmm4 769; SSE-NEXT: cvttsd2si %xmm4, %rcx 770; SSE-NEXT: xorq %rax, %rcx 771; SSE-NEXT: cvttsd2si %xmm1, %rdx 772; SSE-NEXT: ucomisd %xmm2, %xmm1 773; SSE-NEXT: cmovaeq %rcx, %rdx 774; SSE-NEXT: movd %rdx, %xmm1 775; SSE-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm1[0] 776; SSE-NEXT: movapd %xmm0, %xmm1 777; SSE-NEXT: subsd %xmm2, %xmm1 778; SSE-NEXT: cvttsd2si %xmm1, %rcx 779; SSE-NEXT: xorq %rax, %rcx 780; SSE-NEXT: cvttsd2si %xmm0, %rdx 781; SSE-NEXT: ucomisd %xmm2, %xmm0 782; SSE-NEXT: cmovaeq %rcx, %rdx 783; SSE-NEXT: movd %rdx, %xmm1 784; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 785; SSE-NEXT: movaps %xmm0, %xmm4 786; SSE-NEXT: subsd %xmm2, %xmm4 787; SSE-NEXT: cvttsd2si %xmm4, %rcx 788; SSE-NEXT: xorq %rax, %rcx 789; SSE-NEXT: cvttsd2si %xmm0, %rax 790; SSE-NEXT: ucomisd %xmm2, %xmm0 791; SSE-NEXT: cmovaeq %rcx, %rax 792; SSE-NEXT: movd %rax, %xmm0 793; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 794; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2] 795; SSE-NEXT: movaps %xmm1, %xmm0 796; SSE-NEXT: retq 797; 798; VEX-LABEL: fptoui_4f64_to_4i32: 799; VEX: # BB#0: 800; VEX-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0] 801; VEX-NEXT: vcvttsd2si %xmm1, %rax 802; VEX-NEXT: vcvttsd2si %xmm0, %rcx 803; VEX-NEXT: vmovd %ecx, %xmm1 804; VEX-NEXT: vpinsrd $1, %eax, %xmm1, %xmm1 805; VEX-NEXT: vextractf128 $1, %ymm0, %xmm0 806; VEX-NEXT: vcvttsd2si %xmm0, %rax 807; VEX-NEXT: vpinsrd $2, %eax, %xmm1, %xmm1 808; VEX-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,0] 809; VEX-NEXT: vcvttsd2si %xmm0, %rax 810; VEX-NEXT: vpinsrd $3, %eax, %xmm1, %xmm0 811; VEX-NEXT: vzeroupper 812; VEX-NEXT: retq 813; 814; AVX512F-LABEL: fptoui_4f64_to_4i32: 815; AVX512F: # BB#0: 816; AVX512F-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 817; AVX512F-NEXT: vcvttpd2udq %zmm0, %ymm0 818; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 819; AVX512F-NEXT: retq 820; 821; AVX512VL-LABEL: fptoui_4f64_to_4i32: 822; AVX512VL: # BB#0: 823; AVX512VL-NEXT: vcvttpd2udq %ymm0, %xmm0 824; AVX512VL-NEXT: retq 825; 826; AVX512DQ-LABEL: fptoui_4f64_to_4i32: 827; AVX512DQ: # BB#0: 828; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 829; AVX512DQ-NEXT: vcvttpd2udq %zmm0, %ymm0 830; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 831; AVX512DQ-NEXT: retq 832; 833; AVX512VLDQ-LABEL: fptoui_4f64_to_4i32: 834; AVX512VLDQ: # BB#0: 835; AVX512VLDQ-NEXT: vcvttpd2udq %ymm0, %xmm0 836; AVX512VLDQ-NEXT: retq 837 %cvt = fptoui <4 x double> %a to <4 x i32> 838 ret <4 x i32> %cvt 839} 840 841; 842; Float to Signed Integer 843; 844 845define <2 x i32> @fptosi_2f32_to_2i32(<2 x float> %a) { 846; SSE-LABEL: fptosi_2f32_to_2i32: 847; SSE: # BB#0: 848; SSE-NEXT: cvttps2dq %xmm0, %xmm0 849; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3] 850; SSE-NEXT: retq 851; 852; AVX-LABEL: fptosi_2f32_to_2i32: 853; AVX: # BB#0: 854; AVX-NEXT: vcvttps2dq %xmm0, %xmm0 855; AVX-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 856; AVX-NEXT: retq 857 %cvt = fptosi <2 x float> %a to <2 x i32> 858 ret <2 x i32> %cvt 859} 860 861define <4 x i32> @fptosi_4f32_to_4i32(<4 x float> %a) { 862; SSE-LABEL: fptosi_4f32_to_4i32: 863; SSE: # BB#0: 864; SSE-NEXT: cvttps2dq %xmm0, %xmm0 865; SSE-NEXT: retq 866; 867; AVX-LABEL: fptosi_4f32_to_4i32: 868; AVX: # BB#0: 869; AVX-NEXT: vcvttps2dq %xmm0, %xmm0 870; AVX-NEXT: retq 871 %cvt = fptosi <4 x float> %a to <4 x i32> 872 ret <4 x i32> %cvt 873} 874 875define <2 x i64> @fptosi_2f32_to_2i64(<4 x float> %a) { 876; SSE-LABEL: fptosi_2f32_to_2i64: 877; SSE: # BB#0: 878; SSE-NEXT: cvttss2si %xmm0, %rax 879; SSE-NEXT: movd %rax, %xmm1 880; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,2,3] 881; SSE-NEXT: cvttss2si %xmm0, %rax 882; SSE-NEXT: movd %rax, %xmm0 883; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 884; SSE-NEXT: movdqa %xmm1, %xmm0 885; SSE-NEXT: retq 886; 887; VEX-LABEL: fptosi_2f32_to_2i64: 888; VEX: # BB#0: 889; VEX-NEXT: vcvttss2si %xmm0, %rax 890; VEX-NEXT: vmovq %rax, %xmm1 891; VEX-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 892; VEX-NEXT: vcvttss2si %xmm0, %rax 893; VEX-NEXT: vmovq %rax, %xmm0 894; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 895; VEX-NEXT: retq 896; 897; AVX512F-LABEL: fptosi_2f32_to_2i64: 898; AVX512F: # BB#0: 899; AVX512F-NEXT: vcvttss2si %xmm0, %rax 900; AVX512F-NEXT: vmovq %rax, %xmm1 901; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 902; AVX512F-NEXT: vcvttss2si %xmm0, %rax 903; AVX512F-NEXT: vmovq %rax, %xmm0 904; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 905; AVX512F-NEXT: retq 906; 907; AVX512VL-LABEL: fptosi_2f32_to_2i64: 908; AVX512VL: # BB#0: 909; AVX512VL-NEXT: vcvttss2si %xmm0, %rax 910; AVX512VL-NEXT: vmovq %rax, %xmm1 911; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 912; AVX512VL-NEXT: vcvttss2si %xmm0, %rax 913; AVX512VL-NEXT: vmovq %rax, %xmm0 914; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 915; AVX512VL-NEXT: retq 916; 917; AVX512DQ-LABEL: fptosi_2f32_to_2i64: 918; AVX512DQ: # BB#0: 919; AVX512DQ-NEXT: vcvttss2si %xmm0, %rax 920; AVX512DQ-NEXT: vmovq %rax, %xmm1 921; AVX512DQ-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 922; AVX512DQ-NEXT: vcvttss2si %xmm0, %rax 923; AVX512DQ-NEXT: vmovq %rax, %xmm0 924; AVX512DQ-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 925; AVX512DQ-NEXT: retq 926; 927; AVX512VLDQ-LABEL: fptosi_2f32_to_2i64: 928; AVX512VLDQ: # BB#0: 929; AVX512VLDQ-NEXT: vcvttps2qq %xmm0, %xmm0 930; AVX512VLDQ-NEXT: retq 931 %shuf = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 1> 932 %cvt = fptosi <2 x float> %shuf to <2 x i64> 933 ret <2 x i64> %cvt 934} 935 936define <2 x i64> @fptosi_4f32_to_2i64(<4 x float> %a) { 937; SSE-LABEL: fptosi_4f32_to_2i64: 938; SSE: # BB#0: 939; SSE-NEXT: cvttss2si %xmm0, %rax 940; SSE-NEXT: movd %rax, %xmm1 941; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,2,3] 942; SSE-NEXT: cvttss2si %xmm0, %rax 943; SSE-NEXT: movd %rax, %xmm0 944; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 945; SSE-NEXT: movdqa %xmm1, %xmm0 946; SSE-NEXT: retq 947; 948; VEX-LABEL: fptosi_4f32_to_2i64: 949; VEX: # BB#0: 950; VEX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 951; VEX-NEXT: vcvttss2si %xmm1, %rax 952; VEX-NEXT: vcvttss2si %xmm0, %rcx 953; VEX-NEXT: vmovq %rcx, %xmm0 954; VEX-NEXT: vmovq %rax, %xmm1 955; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 956; VEX-NEXT: retq 957; 958; AVX512F-LABEL: fptosi_4f32_to_2i64: 959; AVX512F: # BB#0: 960; AVX512F-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 961; AVX512F-NEXT: vcvttss2si %xmm1, %rax 962; AVX512F-NEXT: vcvttss2si %xmm0, %rcx 963; AVX512F-NEXT: vmovq %rcx, %xmm0 964; AVX512F-NEXT: vmovq %rax, %xmm1 965; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 966; AVX512F-NEXT: retq 967; 968; AVX512VL-LABEL: fptosi_4f32_to_2i64: 969; AVX512VL: # BB#0: 970; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 971; AVX512VL-NEXT: vcvttss2si %xmm1, %rax 972; AVX512VL-NEXT: vcvttss2si %xmm0, %rcx 973; AVX512VL-NEXT: vmovq %rcx, %xmm0 974; AVX512VL-NEXT: vmovq %rax, %xmm1 975; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 976; AVX512VL-NEXT: retq 977; 978; AVX512DQ-LABEL: fptosi_4f32_to_2i64: 979; AVX512DQ: # BB#0: 980; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def> 981; AVX512DQ-NEXT: vcvttps2qq %ymm0, %zmm0 982; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 983; AVX512DQ-NEXT: retq 984; 985; AVX512VLDQ-LABEL: fptosi_4f32_to_2i64: 986; AVX512VLDQ: # BB#0: 987; AVX512VLDQ-NEXT: vcvttps2qq %xmm0, %ymm0 988; AVX512VLDQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 989; AVX512VLDQ-NEXT: retq 990 %cvt = fptosi <4 x float> %a to <4 x i64> 991 %shuf = shufflevector <4 x i64> %cvt, <4 x i64> undef, <2 x i32> <i32 0, i32 1> 992 ret <2 x i64> %shuf 993} 994 995define <8 x i32> @fptosi_8f32_to_8i32(<8 x float> %a) { 996; SSE-LABEL: fptosi_8f32_to_8i32: 997; SSE: # BB#0: 998; SSE-NEXT: cvttps2dq %xmm0, %xmm0 999; SSE-NEXT: cvttps2dq %xmm1, %xmm1 1000; SSE-NEXT: retq 1001; 1002; AVX-LABEL: fptosi_8f32_to_8i32: 1003; AVX: # BB#0: 1004; AVX-NEXT: vcvttps2dq %ymm0, %ymm0 1005; AVX-NEXT: retq 1006 %cvt = fptosi <8 x float> %a to <8 x i32> 1007 ret <8 x i32> %cvt 1008} 1009 1010define <4 x i64> @fptosi_4f32_to_4i64(<8 x float> %a) { 1011; SSE-LABEL: fptosi_4f32_to_4i64: 1012; SSE: # BB#0: 1013; SSE-NEXT: cvttss2si %xmm0, %rax 1014; SSE-NEXT: movd %rax, %xmm2 1015; SSE-NEXT: movaps %xmm0, %xmm1 1016; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,2,3] 1017; SSE-NEXT: cvttss2si %xmm1, %rax 1018; SSE-NEXT: movd %rax, %xmm1 1019; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 1020; SSE-NEXT: movaps %xmm0, %xmm1 1021; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,1,2,3] 1022; SSE-NEXT: cvttss2si %xmm1, %rax 1023; SSE-NEXT: movd %rax, %xmm3 1024; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 1025; SSE-NEXT: cvttss2si %xmm0, %rax 1026; SSE-NEXT: movd %rax, %xmm1 1027; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 1028; SSE-NEXT: movdqa %xmm2, %xmm0 1029; SSE-NEXT: retq 1030; 1031; AVX1-LABEL: fptosi_4f32_to_4i64: 1032; AVX1: # BB#0: 1033; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1034; AVX1-NEXT: vcvttss2si %xmm1, %rax 1035; AVX1-NEXT: vmovq %rax, %xmm1 1036; AVX1-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1037; AVX1-NEXT: vcvttss2si %xmm2, %rax 1038; AVX1-NEXT: vmovq %rax, %xmm2 1039; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1040; AVX1-NEXT: vcvttss2si %xmm0, %rax 1041; AVX1-NEXT: vmovq %rax, %xmm2 1042; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1043; AVX1-NEXT: vcvttss2si %xmm0, %rax 1044; AVX1-NEXT: vmovq %rax, %xmm0 1045; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1046; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1047; AVX1-NEXT: retq 1048; 1049; AVX2-LABEL: fptosi_4f32_to_4i64: 1050; AVX2: # BB#0: 1051; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1052; AVX2-NEXT: vcvttss2si %xmm1, %rax 1053; AVX2-NEXT: vmovq %rax, %xmm1 1054; AVX2-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1055; AVX2-NEXT: vcvttss2si %xmm2, %rax 1056; AVX2-NEXT: vmovq %rax, %xmm2 1057; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1058; AVX2-NEXT: vcvttss2si %xmm0, %rax 1059; AVX2-NEXT: vmovq %rax, %xmm2 1060; AVX2-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1061; AVX2-NEXT: vcvttss2si %xmm0, %rax 1062; AVX2-NEXT: vmovq %rax, %xmm0 1063; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1064; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1065; AVX2-NEXT: retq 1066; 1067; AVX512F-LABEL: fptosi_4f32_to_4i64: 1068; AVX512F: # BB#0: 1069; AVX512F-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1070; AVX512F-NEXT: vcvttss2si %xmm1, %rax 1071; AVX512F-NEXT: vmovq %rax, %xmm1 1072; AVX512F-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1073; AVX512F-NEXT: vcvttss2si %xmm2, %rax 1074; AVX512F-NEXT: vmovq %rax, %xmm2 1075; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1076; AVX512F-NEXT: vcvttss2si %xmm0, %rax 1077; AVX512F-NEXT: vmovq %rax, %xmm2 1078; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1079; AVX512F-NEXT: vcvttss2si %xmm0, %rax 1080; AVX512F-NEXT: vmovq %rax, %xmm0 1081; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1082; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1083; AVX512F-NEXT: retq 1084; 1085; AVX512VL-LABEL: fptosi_4f32_to_4i64: 1086; AVX512VL: # BB#0: 1087; AVX512VL-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1088; AVX512VL-NEXT: vcvttss2si %xmm1, %rax 1089; AVX512VL-NEXT: vmovq %rax, %xmm1 1090; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1091; AVX512VL-NEXT: vcvttss2si %xmm2, %rax 1092; AVX512VL-NEXT: vmovq %rax, %xmm2 1093; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1094; AVX512VL-NEXT: vcvttss2si %xmm0, %rax 1095; AVX512VL-NEXT: vmovq %rax, %xmm2 1096; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1097; AVX512VL-NEXT: vcvttss2si %xmm0, %rax 1098; AVX512VL-NEXT: vmovq %rax, %xmm0 1099; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1100; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1101; AVX512VL-NEXT: retq 1102; 1103; AVX512DQ-LABEL: fptosi_4f32_to_4i64: 1104; AVX512DQ: # BB#0: 1105; AVX512DQ-NEXT: vcvttps2qq %ymm0, %zmm0 1106; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 1107; AVX512DQ-NEXT: retq 1108; 1109; AVX512VLDQ-LABEL: fptosi_4f32_to_4i64: 1110; AVX512VLDQ: # BB#0: 1111; AVX512VLDQ-NEXT: vcvttps2qq %xmm0, %ymm0 1112; AVX512VLDQ-NEXT: retq 1113 %shuf = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 1114 %cvt = fptosi <4 x float> %shuf to <4 x i64> 1115 ret <4 x i64> %cvt 1116} 1117 1118define <4 x i64> @fptosi_8f32_to_4i64(<8 x float> %a) { 1119; SSE-LABEL: fptosi_8f32_to_4i64: 1120; SSE: # BB#0: 1121; SSE-NEXT: cvttss2si %xmm0, %rax 1122; SSE-NEXT: movd %rax, %xmm2 1123; SSE-NEXT: movaps %xmm0, %xmm1 1124; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,2,3] 1125; SSE-NEXT: cvttss2si %xmm1, %rax 1126; SSE-NEXT: movd %rax, %xmm1 1127; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 1128; SSE-NEXT: movaps %xmm0, %xmm1 1129; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,1,2,3] 1130; SSE-NEXT: cvttss2si %xmm1, %rax 1131; SSE-NEXT: movd %rax, %xmm3 1132; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 1133; SSE-NEXT: cvttss2si %xmm0, %rax 1134; SSE-NEXT: movd %rax, %xmm1 1135; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 1136; SSE-NEXT: movdqa %xmm2, %xmm0 1137; SSE-NEXT: retq 1138; 1139; AVX1-LABEL: fptosi_8f32_to_4i64: 1140; AVX1: # BB#0: 1141; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1142; AVX1-NEXT: vcvttss2si %xmm1, %rax 1143; AVX1-NEXT: vmovq %rax, %xmm1 1144; AVX1-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1145; AVX1-NEXT: vcvttss2si %xmm2, %rax 1146; AVX1-NEXT: vmovq %rax, %xmm2 1147; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1148; AVX1-NEXT: vcvttss2si %xmm0, %rax 1149; AVX1-NEXT: vmovq %rax, %xmm2 1150; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1151; AVX1-NEXT: vcvttss2si %xmm0, %rax 1152; AVX1-NEXT: vmovq %rax, %xmm0 1153; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1154; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1155; AVX1-NEXT: retq 1156; 1157; AVX2-LABEL: fptosi_8f32_to_4i64: 1158; AVX2: # BB#0: 1159; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1160; AVX2-NEXT: vcvttss2si %xmm1, %rax 1161; AVX2-NEXT: vmovq %rax, %xmm1 1162; AVX2-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1163; AVX2-NEXT: vcvttss2si %xmm2, %rax 1164; AVX2-NEXT: vmovq %rax, %xmm2 1165; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1166; AVX2-NEXT: vcvttss2si %xmm0, %rax 1167; AVX2-NEXT: vmovq %rax, %xmm2 1168; AVX2-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1169; AVX2-NEXT: vcvttss2si %xmm0, %rax 1170; AVX2-NEXT: vmovq %rax, %xmm0 1171; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1172; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1173; AVX2-NEXT: retq 1174; 1175; AVX512F-LABEL: fptosi_8f32_to_4i64: 1176; AVX512F: # BB#0: 1177; AVX512F-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1178; AVX512F-NEXT: vcvttss2si %xmm1, %rax 1179; AVX512F-NEXT: vcvttss2si %xmm0, %rcx 1180; AVX512F-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0] 1181; AVX512F-NEXT: vcvttss2si %xmm1, %rdx 1182; AVX512F-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1183; AVX512F-NEXT: vcvttss2si %xmm0, %rsi 1184; AVX512F-NEXT: vmovq %rsi, %xmm0 1185; AVX512F-NEXT: vmovq %rdx, %xmm1 1186; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1187; AVX512F-NEXT: vmovq %rcx, %xmm1 1188; AVX512F-NEXT: vmovq %rax, %xmm2 1189; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 1190; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 1191; AVX512F-NEXT: retq 1192; 1193; AVX512VL-LABEL: fptosi_8f32_to_4i64: 1194; AVX512VL: # BB#0: 1195; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1196; AVX512VL-NEXT: vcvttss2si %xmm1, %rax 1197; AVX512VL-NEXT: vcvttss2si %xmm0, %rcx 1198; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0] 1199; AVX512VL-NEXT: vcvttss2si %xmm1, %rdx 1200; AVX512VL-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1201; AVX512VL-NEXT: vcvttss2si %xmm0, %rsi 1202; AVX512VL-NEXT: vmovq %rsi, %xmm0 1203; AVX512VL-NEXT: vmovq %rdx, %xmm1 1204; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1205; AVX512VL-NEXT: vmovq %rcx, %xmm1 1206; AVX512VL-NEXT: vmovq %rax, %xmm2 1207; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 1208; AVX512VL-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 1209; AVX512VL-NEXT: retq 1210; 1211; AVX512DQ-LABEL: fptosi_8f32_to_4i64: 1212; AVX512DQ: # BB#0: 1213; AVX512DQ-NEXT: vcvttps2qq %ymm0, %zmm0 1214; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 1215; AVX512DQ-NEXT: retq 1216; 1217; AVX512VLDQ-LABEL: fptosi_8f32_to_4i64: 1218; AVX512VLDQ: # BB#0: 1219; AVX512VLDQ-NEXT: vcvttps2qq %ymm0, %zmm0 1220; AVX512VLDQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 1221; AVX512VLDQ-NEXT: retq 1222 %cvt = fptosi <8 x float> %a to <8 x i64> 1223 %shuf = shufflevector <8 x i64> %cvt, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 1224 ret <4 x i64> %shuf 1225} 1226 1227; 1228; Float to Unsigned Integer 1229; 1230 1231define <2 x i32> @fptoui_2f32_to_2i32(<2 x float> %a) { 1232; SSE-LABEL: fptoui_2f32_to_2i32: 1233; SSE: # BB#0: 1234; SSE-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero 1235; SSE-NEXT: movaps %xmm0, %xmm1 1236; SSE-NEXT: subss %xmm2, %xmm1 1237; SSE-NEXT: cvttss2si %xmm1, %rax 1238; SSE-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1239; SSE-NEXT: xorq %rcx, %rax 1240; SSE-NEXT: cvttss2si %xmm0, %rdx 1241; SSE-NEXT: ucomiss %xmm2, %xmm0 1242; SSE-NEXT: cmovaeq %rax, %rdx 1243; SSE-NEXT: movd %rdx, %xmm1 1244; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,2,3] 1245; SSE-NEXT: movaps %xmm0, %xmm3 1246; SSE-NEXT: subss %xmm2, %xmm3 1247; SSE-NEXT: cvttss2si %xmm3, %rax 1248; SSE-NEXT: xorq %rcx, %rax 1249; SSE-NEXT: cvttss2si %xmm0, %rcx 1250; SSE-NEXT: ucomiss %xmm2, %xmm0 1251; SSE-NEXT: cmovaeq %rax, %rcx 1252; SSE-NEXT: movd %rcx, %xmm0 1253; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 1254; SSE-NEXT: movdqa %xmm1, %xmm0 1255; SSE-NEXT: retq 1256; 1257; VEX-LABEL: fptoui_2f32_to_2i32: 1258; VEX: # BB#0: 1259; VEX-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1260; VEX-NEXT: vsubss %xmm1, %xmm0, %xmm2 1261; VEX-NEXT: vcvttss2si %xmm2, %rax 1262; VEX-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1263; VEX-NEXT: xorq %rcx, %rax 1264; VEX-NEXT: vcvttss2si %xmm0, %rdx 1265; VEX-NEXT: vucomiss %xmm1, %xmm0 1266; VEX-NEXT: cmovaeq %rax, %rdx 1267; VEX-NEXT: vmovq %rdx, %xmm2 1268; VEX-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1269; VEX-NEXT: vsubss %xmm1, %xmm0, %xmm3 1270; VEX-NEXT: vcvttss2si %xmm3, %rax 1271; VEX-NEXT: xorq %rcx, %rax 1272; VEX-NEXT: vcvttss2si %xmm0, %rcx 1273; VEX-NEXT: vucomiss %xmm1, %xmm0 1274; VEX-NEXT: cmovaeq %rax, %rcx 1275; VEX-NEXT: vmovq %rcx, %xmm0 1276; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1277; VEX-NEXT: retq 1278; 1279; AVX512F-LABEL: fptoui_2f32_to_2i32: 1280; AVX512F: # BB#0: 1281; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 1282; AVX512F-NEXT: vcvttps2udq %zmm0, %zmm0 1283; AVX512F-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 1284; AVX512F-NEXT: retq 1285; 1286; AVX512VL-LABEL: fptoui_2f32_to_2i32: 1287; AVX512VL: # BB#0: 1288; AVX512VL-NEXT: vcvttps2udq %xmm0, %xmm0 1289; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 1290; AVX512VL-NEXT: retq 1291; 1292; AVX512DQ-LABEL: fptoui_2f32_to_2i32: 1293; AVX512DQ: # BB#0: 1294; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 1295; AVX512DQ-NEXT: vcvttps2udq %zmm0, %zmm0 1296; AVX512DQ-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 1297; AVX512DQ-NEXT: retq 1298; 1299; AVX512VLDQ-LABEL: fptoui_2f32_to_2i32: 1300; AVX512VLDQ: # BB#0: 1301; AVX512VLDQ-NEXT: vcvttps2udq %xmm0, %xmm0 1302; AVX512VLDQ-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 1303; AVX512VLDQ-NEXT: retq 1304 %cvt = fptoui <2 x float> %a to <2 x i32> 1305 ret <2 x i32> %cvt 1306} 1307 1308define <4 x i32> @fptoui_4f32_to_4i32(<4 x float> %a) { 1309; SSE-LABEL: fptoui_4f32_to_4i32: 1310; SSE: # BB#0: 1311; SSE-NEXT: movaps %xmm0, %xmm1 1312; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,1,2,3] 1313; SSE-NEXT: cvttss2si %xmm1, %rax 1314; SSE-NEXT: movd %eax, %xmm1 1315; SSE-NEXT: movaps %xmm0, %xmm2 1316; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1,2,3] 1317; SSE-NEXT: cvttss2si %xmm2, %rax 1318; SSE-NEXT: movd %eax, %xmm2 1319; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 1320; SSE-NEXT: cvttss2si %xmm0, %rax 1321; SSE-NEXT: movd %eax, %xmm1 1322; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 1323; SSE-NEXT: cvttss2si %xmm0, %rax 1324; SSE-NEXT: movd %eax, %xmm0 1325; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 1326; SSE-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 1327; SSE-NEXT: movdqa %xmm1, %xmm0 1328; SSE-NEXT: retq 1329; 1330; VEX-LABEL: fptoui_4f32_to_4i32: 1331; VEX: # BB#0: 1332; VEX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1333; VEX-NEXT: vcvttss2si %xmm1, %rax 1334; VEX-NEXT: vcvttss2si %xmm0, %rcx 1335; VEX-NEXT: vmovd %ecx, %xmm1 1336; VEX-NEXT: vpinsrd $1, %eax, %xmm1, %xmm1 1337; VEX-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1338; VEX-NEXT: vcvttss2si %xmm2, %rax 1339; VEX-NEXT: vpinsrd $2, %eax, %xmm1, %xmm1 1340; VEX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1341; VEX-NEXT: vcvttss2si %xmm0, %rax 1342; VEX-NEXT: vpinsrd $3, %eax, %xmm1, %xmm0 1343; VEX-NEXT: retq 1344; 1345; AVX512F-LABEL: fptoui_4f32_to_4i32: 1346; AVX512F: # BB#0: 1347; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 1348; AVX512F-NEXT: vcvttps2udq %zmm0, %zmm0 1349; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 1350; AVX512F-NEXT: retq 1351; 1352; AVX512VL-LABEL: fptoui_4f32_to_4i32: 1353; AVX512VL: # BB#0: 1354; AVX512VL-NEXT: vcvttps2udq %xmm0, %xmm0 1355; AVX512VL-NEXT: retq 1356; 1357; AVX512DQ-LABEL: fptoui_4f32_to_4i32: 1358; AVX512DQ: # BB#0: 1359; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 1360; AVX512DQ-NEXT: vcvttps2udq %zmm0, %zmm0 1361; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 1362; AVX512DQ-NEXT: retq 1363; 1364; AVX512VLDQ-LABEL: fptoui_4f32_to_4i32: 1365; AVX512VLDQ: # BB#0: 1366; AVX512VLDQ-NEXT: vcvttps2udq %xmm0, %xmm0 1367; AVX512VLDQ-NEXT: retq 1368 %cvt = fptoui <4 x float> %a to <4 x i32> 1369 ret <4 x i32> %cvt 1370} 1371 1372define <2 x i64> @fptoui_2f32_to_2i64(<4 x float> %a) { 1373; SSE-LABEL: fptoui_2f32_to_2i64: 1374; SSE: # BB#0: 1375; SSE-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero 1376; SSE-NEXT: movaps %xmm0, %xmm1 1377; SSE-NEXT: subss %xmm2, %xmm1 1378; SSE-NEXT: cvttss2si %xmm1, %rax 1379; SSE-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1380; SSE-NEXT: xorq %rcx, %rax 1381; SSE-NEXT: cvttss2si %xmm0, %rdx 1382; SSE-NEXT: ucomiss %xmm2, %xmm0 1383; SSE-NEXT: cmovaeq %rax, %rdx 1384; SSE-NEXT: movd %rdx, %xmm1 1385; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,2,3] 1386; SSE-NEXT: movaps %xmm0, %xmm3 1387; SSE-NEXT: subss %xmm2, %xmm3 1388; SSE-NEXT: cvttss2si %xmm3, %rax 1389; SSE-NEXT: xorq %rcx, %rax 1390; SSE-NEXT: cvttss2si %xmm0, %rcx 1391; SSE-NEXT: ucomiss %xmm2, %xmm0 1392; SSE-NEXT: cmovaeq %rax, %rcx 1393; SSE-NEXT: movd %rcx, %xmm0 1394; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 1395; SSE-NEXT: movdqa %xmm1, %xmm0 1396; SSE-NEXT: retq 1397; 1398; VEX-LABEL: fptoui_2f32_to_2i64: 1399; VEX: # BB#0: 1400; VEX-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1401; VEX-NEXT: vsubss %xmm1, %xmm0, %xmm2 1402; VEX-NEXT: vcvttss2si %xmm2, %rax 1403; VEX-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1404; VEX-NEXT: xorq %rcx, %rax 1405; VEX-NEXT: vcvttss2si %xmm0, %rdx 1406; VEX-NEXT: vucomiss %xmm1, %xmm0 1407; VEX-NEXT: cmovaeq %rax, %rdx 1408; VEX-NEXT: vmovq %rdx, %xmm2 1409; VEX-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1410; VEX-NEXT: vsubss %xmm1, %xmm0, %xmm3 1411; VEX-NEXT: vcvttss2si %xmm3, %rax 1412; VEX-NEXT: xorq %rcx, %rax 1413; VEX-NEXT: vcvttss2si %xmm0, %rcx 1414; VEX-NEXT: vucomiss %xmm1, %xmm0 1415; VEX-NEXT: cmovaeq %rax, %rcx 1416; VEX-NEXT: vmovq %rcx, %xmm0 1417; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1418; VEX-NEXT: retq 1419; 1420; AVX512F-LABEL: fptoui_2f32_to_2i64: 1421; AVX512F: # BB#0: 1422; AVX512F-NEXT: vcvttss2usi %xmm0, %rax 1423; AVX512F-NEXT: vmovq %rax, %xmm1 1424; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1425; AVX512F-NEXT: vcvttss2usi %xmm0, %rax 1426; AVX512F-NEXT: vmovq %rax, %xmm0 1427; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1428; AVX512F-NEXT: retq 1429; 1430; AVX512VL-LABEL: fptoui_2f32_to_2i64: 1431; AVX512VL: # BB#0: 1432; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax 1433; AVX512VL-NEXT: vmovq %rax, %xmm1 1434; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1435; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax 1436; AVX512VL-NEXT: vmovq %rax, %xmm0 1437; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1438; AVX512VL-NEXT: retq 1439; 1440; AVX512DQ-LABEL: fptoui_2f32_to_2i64: 1441; AVX512DQ: # BB#0: 1442; AVX512DQ-NEXT: vcvttss2usi %xmm0, %rax 1443; AVX512DQ-NEXT: vmovq %rax, %xmm1 1444; AVX512DQ-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1445; AVX512DQ-NEXT: vcvttss2usi %xmm0, %rax 1446; AVX512DQ-NEXT: vmovq %rax, %xmm0 1447; AVX512DQ-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1448; AVX512DQ-NEXT: retq 1449; 1450; AVX512VLDQ-LABEL: fptoui_2f32_to_2i64: 1451; AVX512VLDQ: # BB#0: 1452; AVX512VLDQ-NEXT: vcvttps2uqq %xmm0, %xmm0 1453; AVX512VLDQ-NEXT: retq 1454 %shuf = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 1> 1455 %cvt = fptoui <2 x float> %shuf to <2 x i64> 1456 ret <2 x i64> %cvt 1457} 1458 1459define <2 x i64> @fptoui_4f32_to_2i64(<4 x float> %a) { 1460; SSE-LABEL: fptoui_4f32_to_2i64: 1461; SSE: # BB#0: 1462; SSE-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero 1463; SSE-NEXT: movaps %xmm0, %xmm1 1464; SSE-NEXT: subss %xmm2, %xmm1 1465; SSE-NEXT: cvttss2si %xmm1, %rax 1466; SSE-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1467; SSE-NEXT: xorq %rcx, %rax 1468; SSE-NEXT: cvttss2si %xmm0, %rdx 1469; SSE-NEXT: ucomiss %xmm2, %xmm0 1470; SSE-NEXT: cmovaeq %rax, %rdx 1471; SSE-NEXT: movd %rdx, %xmm1 1472; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,2,3] 1473; SSE-NEXT: movaps %xmm0, %xmm3 1474; SSE-NEXT: subss %xmm2, %xmm3 1475; SSE-NEXT: cvttss2si %xmm3, %rax 1476; SSE-NEXT: xorq %rcx, %rax 1477; SSE-NEXT: cvttss2si %xmm0, %rcx 1478; SSE-NEXT: ucomiss %xmm2, %xmm0 1479; SSE-NEXT: cmovaeq %rax, %rcx 1480; SSE-NEXT: movd %rcx, %xmm0 1481; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 1482; SSE-NEXT: movdqa %xmm1, %xmm0 1483; SSE-NEXT: retq 1484; 1485; VEX-LABEL: fptoui_4f32_to_2i64: 1486; VEX: # BB#0: 1487; VEX-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1488; VEX-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero 1489; VEX-NEXT: vsubss %xmm2, %xmm1, %xmm3 1490; VEX-NEXT: vcvttss2si %xmm3, %rax 1491; VEX-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1492; VEX-NEXT: xorq %rcx, %rax 1493; VEX-NEXT: vcvttss2si %xmm1, %rdx 1494; VEX-NEXT: vucomiss %xmm2, %xmm1 1495; VEX-NEXT: cmovaeq %rax, %rdx 1496; VEX-NEXT: vsubss %xmm2, %xmm0, %xmm1 1497; VEX-NEXT: vcvttss2si %xmm1, %rax 1498; VEX-NEXT: xorq %rcx, %rax 1499; VEX-NEXT: vcvttss2si %xmm0, %rcx 1500; VEX-NEXT: vucomiss %xmm2, %xmm0 1501; VEX-NEXT: cmovaeq %rax, %rcx 1502; VEX-NEXT: vmovq %rcx, %xmm0 1503; VEX-NEXT: vmovq %rdx, %xmm1 1504; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1505; VEX-NEXT: retq 1506; 1507; AVX512F-LABEL: fptoui_4f32_to_2i64: 1508; AVX512F: # BB#0: 1509; AVX512F-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1510; AVX512F-NEXT: vcvttss2usi %xmm1, %rax 1511; AVX512F-NEXT: vcvttss2usi %xmm0, %rcx 1512; AVX512F-NEXT: vmovq %rcx, %xmm0 1513; AVX512F-NEXT: vmovq %rax, %xmm1 1514; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1515; AVX512F-NEXT: retq 1516; 1517; AVX512VL-LABEL: fptoui_4f32_to_2i64: 1518; AVX512VL: # BB#0: 1519; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1520; AVX512VL-NEXT: vcvttss2usi %xmm1, %rax 1521; AVX512VL-NEXT: vcvttss2usi %xmm0, %rcx 1522; AVX512VL-NEXT: vmovq %rcx, %xmm0 1523; AVX512VL-NEXT: vmovq %rax, %xmm1 1524; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1525; AVX512VL-NEXT: retq 1526; 1527; AVX512DQ-LABEL: fptoui_4f32_to_2i64: 1528; AVX512DQ: # BB#0: 1529; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<def> 1530; AVX512DQ-NEXT: vcvttps2uqq %ymm0, %zmm0 1531; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<kill> 1532; AVX512DQ-NEXT: retq 1533; 1534; AVX512VLDQ-LABEL: fptoui_4f32_to_2i64: 1535; AVX512VLDQ: # BB#0: 1536; AVX512VLDQ-NEXT: vcvttps2uqq %xmm0, %ymm0 1537; AVX512VLDQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %YMM0<kill> 1538; AVX512VLDQ-NEXT: retq 1539 %cvt = fptoui <4 x float> %a to <4 x i64> 1540 %shuf = shufflevector <4 x i64> %cvt, <4 x i64> undef, <2 x i32> <i32 0, i32 1> 1541 ret <2 x i64> %shuf 1542} 1543 1544define <8 x i32> @fptoui_8f32_to_8i32(<8 x float> %a) { 1545; SSE-LABEL: fptoui_8f32_to_8i32: 1546; SSE: # BB#0: 1547; SSE-NEXT: movaps %xmm0, %xmm2 1548; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1549; SSE-NEXT: cvttss2si %xmm0, %rax 1550; SSE-NEXT: movd %eax, %xmm0 1551; SSE-NEXT: movaps %xmm2, %xmm3 1552; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1,2,3] 1553; SSE-NEXT: cvttss2si %xmm3, %rax 1554; SSE-NEXT: movd %eax, %xmm3 1555; SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1] 1556; SSE-NEXT: cvttss2si %xmm2, %rax 1557; SSE-NEXT: movd %eax, %xmm0 1558; SSE-NEXT: movhlps {{.*#+}} xmm2 = xmm2[1,1] 1559; SSE-NEXT: cvttss2si %xmm2, %rax 1560; SSE-NEXT: movd %eax, %xmm2 1561; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 1562; SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1] 1563; SSE-NEXT: movaps %xmm1, %xmm2 1564; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[3,1,2,3] 1565; SSE-NEXT: cvttss2si %xmm2, %rax 1566; SSE-NEXT: movd %eax, %xmm2 1567; SSE-NEXT: movaps %xmm1, %xmm3 1568; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1,2,3] 1569; SSE-NEXT: cvttss2si %xmm3, %rax 1570; SSE-NEXT: movd %eax, %xmm3 1571; SSE-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1] 1572; SSE-NEXT: cvttss2si %xmm1, %rax 1573; SSE-NEXT: movd %eax, %xmm2 1574; SSE-NEXT: movhlps {{.*#+}} xmm1 = xmm1[1,1] 1575; SSE-NEXT: cvttss2si %xmm1, %rax 1576; SSE-NEXT: movd %eax, %xmm1 1577; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] 1578; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1] 1579; SSE-NEXT: movdqa %xmm2, %xmm1 1580; SSE-NEXT: retq 1581; 1582; AVX1-LABEL: fptoui_8f32_to_8i32: 1583; AVX1: # BB#0: 1584; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1585; AVX1-NEXT: vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3] 1586; AVX1-NEXT: vcvttss2si %xmm2, %rax 1587; AVX1-NEXT: vcvttss2si %xmm1, %rcx 1588; AVX1-NEXT: vmovd %ecx, %xmm2 1589; AVX1-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2 1590; AVX1-NEXT: vpermilpd {{.*#+}} xmm3 = xmm1[1,0] 1591; AVX1-NEXT: vcvttss2si %xmm3, %rax 1592; AVX1-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2 1593; AVX1-NEXT: vpermilps {{.*#+}} xmm1 = xmm1[3,1,2,3] 1594; AVX1-NEXT: vcvttss2si %xmm1, %rax 1595; AVX1-NEXT: vpinsrd $3, %eax, %xmm2, %xmm1 1596; AVX1-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3] 1597; AVX1-NEXT: vcvttss2si %xmm2, %rax 1598; AVX1-NEXT: vcvttss2si %xmm0, %rcx 1599; AVX1-NEXT: vmovd %ecx, %xmm2 1600; AVX1-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2 1601; AVX1-NEXT: vpermilpd {{.*#+}} xmm3 = xmm0[1,0] 1602; AVX1-NEXT: vcvttss2si %xmm3, %rax 1603; AVX1-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2 1604; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1605; AVX1-NEXT: vcvttss2si %xmm0, %rax 1606; AVX1-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0 1607; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 1608; AVX1-NEXT: retq 1609; 1610; AVX2-LABEL: fptoui_8f32_to_8i32: 1611; AVX2: # BB#0: 1612; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1 1613; AVX2-NEXT: vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3] 1614; AVX2-NEXT: vcvttss2si %xmm2, %rax 1615; AVX2-NEXT: vcvttss2si %xmm1, %rcx 1616; AVX2-NEXT: vmovd %ecx, %xmm2 1617; AVX2-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2 1618; AVX2-NEXT: vpermilpd {{.*#+}} xmm3 = xmm1[1,0] 1619; AVX2-NEXT: vcvttss2si %xmm3, %rax 1620; AVX2-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2 1621; AVX2-NEXT: vpermilps {{.*#+}} xmm1 = xmm1[3,1,2,3] 1622; AVX2-NEXT: vcvttss2si %xmm1, %rax 1623; AVX2-NEXT: vpinsrd $3, %eax, %xmm2, %xmm1 1624; AVX2-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3] 1625; AVX2-NEXT: vcvttss2si %xmm2, %rax 1626; AVX2-NEXT: vcvttss2si %xmm0, %rcx 1627; AVX2-NEXT: vmovd %ecx, %xmm2 1628; AVX2-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2 1629; AVX2-NEXT: vpermilpd {{.*#+}} xmm3 = xmm0[1,0] 1630; AVX2-NEXT: vcvttss2si %xmm3, %rax 1631; AVX2-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2 1632; AVX2-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1633; AVX2-NEXT: vcvttss2si %xmm0, %rax 1634; AVX2-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0 1635; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1636; AVX2-NEXT: retq 1637; 1638; AVX512F-LABEL: fptoui_8f32_to_8i32: 1639; AVX512F: # BB#0: 1640; AVX512F-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 1641; AVX512F-NEXT: vcvttps2udq %zmm0, %zmm0 1642; AVX512F-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 1643; AVX512F-NEXT: retq 1644; 1645; AVX512VL-LABEL: fptoui_8f32_to_8i32: 1646; AVX512VL: # BB#0: 1647; AVX512VL-NEXT: vcvttps2udq %ymm0, %ymm0 1648; AVX512VL-NEXT: retq 1649; 1650; AVX512DQ-LABEL: fptoui_8f32_to_8i32: 1651; AVX512DQ: # BB#0: 1652; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<def> 1653; AVX512DQ-NEXT: vcvttps2udq %zmm0, %zmm0 1654; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 1655; AVX512DQ-NEXT: retq 1656; 1657; AVX512VLDQ-LABEL: fptoui_8f32_to_8i32: 1658; AVX512VLDQ: # BB#0: 1659; AVX512VLDQ-NEXT: vcvttps2udq %ymm0, %ymm0 1660; AVX512VLDQ-NEXT: retq 1661 %cvt = fptoui <8 x float> %a to <8 x i32> 1662 ret <8 x i32> %cvt 1663} 1664 1665define <4 x i64> @fptoui_4f32_to_4i64(<8 x float> %a) { 1666; SSE-LABEL: fptoui_4f32_to_4i64: 1667; SSE: # BB#0: 1668; SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1669; SSE-NEXT: movaps %xmm0, %xmm2 1670; SSE-NEXT: subss %xmm1, %xmm2 1671; SSE-NEXT: cvttss2si %xmm2, %rcx 1672; SSE-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000 1673; SSE-NEXT: xorq %rax, %rcx 1674; SSE-NEXT: cvttss2si %xmm0, %rdx 1675; SSE-NEXT: ucomiss %xmm1, %xmm0 1676; SSE-NEXT: cmovaeq %rcx, %rdx 1677; SSE-NEXT: movd %rdx, %xmm2 1678; SSE-NEXT: movaps %xmm0, %xmm3 1679; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1,2,3] 1680; SSE-NEXT: movaps %xmm3, %xmm4 1681; SSE-NEXT: subss %xmm1, %xmm4 1682; SSE-NEXT: cvttss2si %xmm4, %rcx 1683; SSE-NEXT: xorq %rax, %rcx 1684; SSE-NEXT: cvttss2si %xmm3, %rdx 1685; SSE-NEXT: ucomiss %xmm1, %xmm3 1686; SSE-NEXT: cmovaeq %rcx, %rdx 1687; SSE-NEXT: movd %rdx, %xmm3 1688; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] 1689; SSE-NEXT: movaps %xmm0, %xmm3 1690; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[3,1,2,3] 1691; SSE-NEXT: movaps %xmm3, %xmm4 1692; SSE-NEXT: subss %xmm1, %xmm4 1693; SSE-NEXT: cvttss2si %xmm4, %rcx 1694; SSE-NEXT: xorq %rax, %rcx 1695; SSE-NEXT: cvttss2si %xmm3, %rdx 1696; SSE-NEXT: ucomiss %xmm1, %xmm3 1697; SSE-NEXT: cmovaeq %rcx, %rdx 1698; SSE-NEXT: movd %rdx, %xmm3 1699; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 1700; SSE-NEXT: movaps %xmm0, %xmm4 1701; SSE-NEXT: subss %xmm1, %xmm4 1702; SSE-NEXT: cvttss2si %xmm4, %rcx 1703; SSE-NEXT: xorq %rax, %rcx 1704; SSE-NEXT: cvttss2si %xmm0, %rax 1705; SSE-NEXT: ucomiss %xmm1, %xmm0 1706; SSE-NEXT: cmovaeq %rcx, %rax 1707; SSE-NEXT: movd %rax, %xmm1 1708; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 1709; SSE-NEXT: movdqa %xmm2, %xmm0 1710; SSE-NEXT: retq 1711; 1712; AVX1-LABEL: fptoui_4f32_to_4i64: 1713; AVX1: # BB#0: 1714; AVX1-NEXT: vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3] 1715; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1716; AVX1-NEXT: vsubss %xmm1, %xmm2, %xmm3 1717; AVX1-NEXT: vcvttss2si %xmm3, %rax 1718; AVX1-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1719; AVX1-NEXT: xorq %rcx, %rax 1720; AVX1-NEXT: vcvttss2si %xmm2, %rdx 1721; AVX1-NEXT: vucomiss %xmm1, %xmm2 1722; AVX1-NEXT: cmovaeq %rax, %rdx 1723; AVX1-NEXT: vmovq %rdx, %xmm2 1724; AVX1-NEXT: vpermilpd {{.*#+}} xmm3 = xmm0[1,0] 1725; AVX1-NEXT: vsubss %xmm1, %xmm3, %xmm4 1726; AVX1-NEXT: vcvttss2si %xmm4, %rax 1727; AVX1-NEXT: xorq %rcx, %rax 1728; AVX1-NEXT: vcvttss2si %xmm3, %rdx 1729; AVX1-NEXT: vucomiss %xmm1, %xmm3 1730; AVX1-NEXT: cmovaeq %rax, %rdx 1731; AVX1-NEXT: vmovq %rdx, %xmm3 1732; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0] 1733; AVX1-NEXT: vsubss %xmm1, %xmm0, %xmm3 1734; AVX1-NEXT: vcvttss2si %xmm3, %rax 1735; AVX1-NEXT: xorq %rcx, %rax 1736; AVX1-NEXT: vcvttss2si %xmm0, %rdx 1737; AVX1-NEXT: vucomiss %xmm1, %xmm0 1738; AVX1-NEXT: cmovaeq %rax, %rdx 1739; AVX1-NEXT: vmovq %rdx, %xmm3 1740; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1741; AVX1-NEXT: vsubss %xmm1, %xmm0, %xmm4 1742; AVX1-NEXT: vcvttss2si %xmm4, %rax 1743; AVX1-NEXT: xorq %rcx, %rax 1744; AVX1-NEXT: vcvttss2si %xmm0, %rcx 1745; AVX1-NEXT: vucomiss %xmm1, %xmm0 1746; AVX1-NEXT: cmovaeq %rax, %rcx 1747; AVX1-NEXT: vmovq %rcx, %xmm0 1748; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0] 1749; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1750; AVX1-NEXT: retq 1751; 1752; AVX2-LABEL: fptoui_4f32_to_4i64: 1753; AVX2: # BB#0: 1754; AVX2-NEXT: vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3] 1755; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1756; AVX2-NEXT: vsubss %xmm1, %xmm2, %xmm3 1757; AVX2-NEXT: vcvttss2si %xmm3, %rax 1758; AVX2-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1759; AVX2-NEXT: xorq %rcx, %rax 1760; AVX2-NEXT: vcvttss2si %xmm2, %rdx 1761; AVX2-NEXT: vucomiss %xmm1, %xmm2 1762; AVX2-NEXT: cmovaeq %rax, %rdx 1763; AVX2-NEXT: vmovq %rdx, %xmm2 1764; AVX2-NEXT: vpermilpd {{.*#+}} xmm3 = xmm0[1,0] 1765; AVX2-NEXT: vsubss %xmm1, %xmm3, %xmm4 1766; AVX2-NEXT: vcvttss2si %xmm4, %rax 1767; AVX2-NEXT: xorq %rcx, %rax 1768; AVX2-NEXT: vcvttss2si %xmm3, %rdx 1769; AVX2-NEXT: vucomiss %xmm1, %xmm3 1770; AVX2-NEXT: cmovaeq %rax, %rdx 1771; AVX2-NEXT: vmovq %rdx, %xmm3 1772; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0] 1773; AVX2-NEXT: vsubss %xmm1, %xmm0, %xmm3 1774; AVX2-NEXT: vcvttss2si %xmm3, %rax 1775; AVX2-NEXT: xorq %rcx, %rax 1776; AVX2-NEXT: vcvttss2si %xmm0, %rdx 1777; AVX2-NEXT: vucomiss %xmm1, %xmm0 1778; AVX2-NEXT: cmovaeq %rax, %rdx 1779; AVX2-NEXT: vmovq %rdx, %xmm3 1780; AVX2-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1781; AVX2-NEXT: vsubss %xmm1, %xmm0, %xmm4 1782; AVX2-NEXT: vcvttss2si %xmm4, %rax 1783; AVX2-NEXT: xorq %rcx, %rax 1784; AVX2-NEXT: vcvttss2si %xmm0, %rcx 1785; AVX2-NEXT: vucomiss %xmm1, %xmm0 1786; AVX2-NEXT: cmovaeq %rax, %rcx 1787; AVX2-NEXT: vmovq %rcx, %xmm0 1788; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0] 1789; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 1790; AVX2-NEXT: retq 1791; 1792; AVX512F-LABEL: fptoui_4f32_to_4i64: 1793; AVX512F: # BB#0: 1794; AVX512F-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1795; AVX512F-NEXT: vcvttss2usi %xmm1, %rax 1796; AVX512F-NEXT: vmovq %rax, %xmm1 1797; AVX512F-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1798; AVX512F-NEXT: vcvttss2usi %xmm2, %rax 1799; AVX512F-NEXT: vmovq %rax, %xmm2 1800; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1801; AVX512F-NEXT: vcvttss2usi %xmm0, %rax 1802; AVX512F-NEXT: vmovq %rax, %xmm2 1803; AVX512F-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1804; AVX512F-NEXT: vcvttss2usi %xmm0, %rax 1805; AVX512F-NEXT: vmovq %rax, %xmm0 1806; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1807; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1808; AVX512F-NEXT: retq 1809; 1810; AVX512VL-LABEL: fptoui_4f32_to_4i64: 1811; AVX512VL: # BB#0: 1812; AVX512VL-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[3,1,2,3] 1813; AVX512VL-NEXT: vcvttss2usi %xmm1, %rax 1814; AVX512VL-NEXT: vmovq %rax, %xmm1 1815; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm2 = xmm0[1,0] 1816; AVX512VL-NEXT: vcvttss2usi %xmm2, %rax 1817; AVX512VL-NEXT: vmovq %rax, %xmm2 1818; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 1819; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax 1820; AVX512VL-NEXT: vmovq %rax, %xmm2 1821; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1822; AVX512VL-NEXT: vcvttss2usi %xmm0, %rax 1823; AVX512VL-NEXT: vmovq %rax, %xmm0 1824; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0] 1825; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 1826; AVX512VL-NEXT: retq 1827; 1828; AVX512DQ-LABEL: fptoui_4f32_to_4i64: 1829; AVX512DQ: # BB#0: 1830; AVX512DQ-NEXT: vcvttps2uqq %ymm0, %zmm0 1831; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 1832; AVX512DQ-NEXT: retq 1833; 1834; AVX512VLDQ-LABEL: fptoui_4f32_to_4i64: 1835; AVX512VLDQ: # BB#0: 1836; AVX512VLDQ-NEXT: vcvttps2uqq %xmm0, %ymm0 1837; AVX512VLDQ-NEXT: retq 1838 %shuf = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 1839 %cvt = fptoui <4 x float> %shuf to <4 x i64> 1840 ret <4 x i64> %cvt 1841} 1842 1843define <4 x i64> @fptoui_8f32_to_4i64(<8 x float> %a) { 1844; SSE-LABEL: fptoui_8f32_to_4i64: 1845; SSE: # BB#0: 1846; SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1847; SSE-NEXT: movaps %xmm0, %xmm2 1848; SSE-NEXT: subss %xmm1, %xmm2 1849; SSE-NEXT: cvttss2si %xmm2, %rcx 1850; SSE-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000 1851; SSE-NEXT: xorq %rax, %rcx 1852; SSE-NEXT: cvttss2si %xmm0, %rdx 1853; SSE-NEXT: ucomiss %xmm1, %xmm0 1854; SSE-NEXT: cmovaeq %rcx, %rdx 1855; SSE-NEXT: movd %rdx, %xmm2 1856; SSE-NEXT: movaps %xmm0, %xmm3 1857; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1,2,3] 1858; SSE-NEXT: movaps %xmm3, %xmm4 1859; SSE-NEXT: subss %xmm1, %xmm4 1860; SSE-NEXT: cvttss2si %xmm4, %rcx 1861; SSE-NEXT: xorq %rax, %rcx 1862; SSE-NEXT: cvttss2si %xmm3, %rdx 1863; SSE-NEXT: ucomiss %xmm1, %xmm3 1864; SSE-NEXT: cmovaeq %rcx, %rdx 1865; SSE-NEXT: movd %rdx, %xmm3 1866; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] 1867; SSE-NEXT: movaps %xmm0, %xmm3 1868; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[3,1,2,3] 1869; SSE-NEXT: movaps %xmm3, %xmm4 1870; SSE-NEXT: subss %xmm1, %xmm4 1871; SSE-NEXT: cvttss2si %xmm4, %rcx 1872; SSE-NEXT: xorq %rax, %rcx 1873; SSE-NEXT: cvttss2si %xmm3, %rdx 1874; SSE-NEXT: ucomiss %xmm1, %xmm3 1875; SSE-NEXT: cmovaeq %rcx, %rdx 1876; SSE-NEXT: movd %rdx, %xmm3 1877; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 1878; SSE-NEXT: movaps %xmm0, %xmm4 1879; SSE-NEXT: subss %xmm1, %xmm4 1880; SSE-NEXT: cvttss2si %xmm4, %rcx 1881; SSE-NEXT: xorq %rax, %rcx 1882; SSE-NEXT: cvttss2si %xmm0, %rax 1883; SSE-NEXT: ucomiss %xmm1, %xmm0 1884; SSE-NEXT: cmovaeq %rcx, %rax 1885; SSE-NEXT: movd %rax, %xmm1 1886; SSE-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] 1887; SSE-NEXT: movdqa %xmm2, %xmm0 1888; SSE-NEXT: retq 1889; 1890; AVX1-LABEL: fptoui_8f32_to_4i64: 1891; AVX1: # BB#0: 1892; AVX1-NEXT: vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3] 1893; AVX1-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1894; AVX1-NEXT: vsubss %xmm1, %xmm2, %xmm3 1895; AVX1-NEXT: vcvttss2si %xmm3, %rax 1896; AVX1-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1897; AVX1-NEXT: xorq %rcx, %rax 1898; AVX1-NEXT: vcvttss2si %xmm2, %rdx 1899; AVX1-NEXT: vucomiss %xmm1, %xmm2 1900; AVX1-NEXT: cmovaeq %rax, %rdx 1901; AVX1-NEXT: vmovq %rdx, %xmm2 1902; AVX1-NEXT: vpermilpd {{.*#+}} xmm3 = xmm0[1,0] 1903; AVX1-NEXT: vsubss %xmm1, %xmm3, %xmm4 1904; AVX1-NEXT: vcvttss2si %xmm4, %rax 1905; AVX1-NEXT: xorq %rcx, %rax 1906; AVX1-NEXT: vcvttss2si %xmm3, %rdx 1907; AVX1-NEXT: vucomiss %xmm1, %xmm3 1908; AVX1-NEXT: cmovaeq %rax, %rdx 1909; AVX1-NEXT: vmovq %rdx, %xmm3 1910; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0] 1911; AVX1-NEXT: vsubss %xmm1, %xmm0, %xmm3 1912; AVX1-NEXT: vcvttss2si %xmm3, %rax 1913; AVX1-NEXT: xorq %rcx, %rax 1914; AVX1-NEXT: vcvttss2si %xmm0, %rdx 1915; AVX1-NEXT: vucomiss %xmm1, %xmm0 1916; AVX1-NEXT: cmovaeq %rax, %rdx 1917; AVX1-NEXT: vmovq %rdx, %xmm3 1918; AVX1-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1919; AVX1-NEXT: vsubss %xmm1, %xmm0, %xmm4 1920; AVX1-NEXT: vcvttss2si %xmm4, %rax 1921; AVX1-NEXT: xorq %rcx, %rax 1922; AVX1-NEXT: vcvttss2si %xmm0, %rcx 1923; AVX1-NEXT: vucomiss %xmm1, %xmm0 1924; AVX1-NEXT: cmovaeq %rax, %rcx 1925; AVX1-NEXT: vmovq %rcx, %xmm0 1926; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0] 1927; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 1928; AVX1-NEXT: retq 1929; 1930; AVX2-LABEL: fptoui_8f32_to_4i64: 1931; AVX2: # BB#0: 1932; AVX2-NEXT: vpermilps {{.*#+}} xmm2 = xmm0[3,1,2,3] 1933; AVX2-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1934; AVX2-NEXT: vsubss %xmm1, %xmm2, %xmm3 1935; AVX2-NEXT: vcvttss2si %xmm3, %rax 1936; AVX2-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 1937; AVX2-NEXT: xorq %rcx, %rax 1938; AVX2-NEXT: vcvttss2si %xmm2, %rdx 1939; AVX2-NEXT: vucomiss %xmm1, %xmm2 1940; AVX2-NEXT: cmovaeq %rax, %rdx 1941; AVX2-NEXT: vmovq %rdx, %xmm2 1942; AVX2-NEXT: vpermilpd {{.*#+}} xmm3 = xmm0[1,0] 1943; AVX2-NEXT: vsubss %xmm1, %xmm3, %xmm4 1944; AVX2-NEXT: vcvttss2si %xmm4, %rax 1945; AVX2-NEXT: xorq %rcx, %rax 1946; AVX2-NEXT: vcvttss2si %xmm3, %rdx 1947; AVX2-NEXT: vucomiss %xmm1, %xmm3 1948; AVX2-NEXT: cmovaeq %rax, %rdx 1949; AVX2-NEXT: vmovq %rdx, %xmm3 1950; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm3[0],xmm2[0] 1951; AVX2-NEXT: vsubss %xmm1, %xmm0, %xmm3 1952; AVX2-NEXT: vcvttss2si %xmm3, %rax 1953; AVX2-NEXT: xorq %rcx, %rax 1954; AVX2-NEXT: vcvttss2si %xmm0, %rdx 1955; AVX2-NEXT: vucomiss %xmm1, %xmm0 1956; AVX2-NEXT: cmovaeq %rax, %rdx 1957; AVX2-NEXT: vmovq %rdx, %xmm3 1958; AVX2-NEXT: vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3] 1959; AVX2-NEXT: vsubss %xmm1, %xmm0, %xmm4 1960; AVX2-NEXT: vcvttss2si %xmm4, %rax 1961; AVX2-NEXT: xorq %rcx, %rax 1962; AVX2-NEXT: vcvttss2si %xmm0, %rcx 1963; AVX2-NEXT: vucomiss %xmm1, %xmm0 1964; AVX2-NEXT: cmovaeq %rax, %rcx 1965; AVX2-NEXT: vmovq %rcx, %xmm0 1966; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm3[0],xmm0[0] 1967; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0 1968; AVX2-NEXT: retq 1969; 1970; AVX512F-LABEL: fptoui_8f32_to_4i64: 1971; AVX512F: # BB#0: 1972; AVX512F-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1973; AVX512F-NEXT: vcvttss2usi %xmm1, %rax 1974; AVX512F-NEXT: vcvttss2usi %xmm0, %rcx 1975; AVX512F-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0] 1976; AVX512F-NEXT: vcvttss2usi %xmm1, %rdx 1977; AVX512F-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1978; AVX512F-NEXT: vcvttss2usi %xmm0, %rsi 1979; AVX512F-NEXT: vmovq %rsi, %xmm0 1980; AVX512F-NEXT: vmovq %rdx, %xmm1 1981; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 1982; AVX512F-NEXT: vmovq %rcx, %xmm1 1983; AVX512F-NEXT: vmovq %rax, %xmm2 1984; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 1985; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 1986; AVX512F-NEXT: retq 1987; 1988; AVX512VL-LABEL: fptoui_8f32_to_4i64: 1989; AVX512VL: # BB#0: 1990; AVX512VL-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3] 1991; AVX512VL-NEXT: vcvttss2usi %xmm1, %rax 1992; AVX512VL-NEXT: vcvttss2usi %xmm0, %rcx 1993; AVX512VL-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0] 1994; AVX512VL-NEXT: vcvttss2usi %xmm1, %rdx 1995; AVX512VL-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3] 1996; AVX512VL-NEXT: vcvttss2usi %xmm0, %rsi 1997; AVX512VL-NEXT: vmovq %rsi, %xmm0 1998; AVX512VL-NEXT: vmovq %rdx, %xmm1 1999; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 2000; AVX512VL-NEXT: vmovq %rcx, %xmm1 2001; AVX512VL-NEXT: vmovq %rax, %xmm2 2002; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 2003; AVX512VL-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 2004; AVX512VL-NEXT: retq 2005; 2006; AVX512DQ-LABEL: fptoui_8f32_to_4i64: 2007; AVX512DQ: # BB#0: 2008; AVX512DQ-NEXT: vcvttps2uqq %ymm0, %zmm0 2009; AVX512DQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 2010; AVX512DQ-NEXT: retq 2011; 2012; AVX512VLDQ-LABEL: fptoui_8f32_to_4i64: 2013; AVX512VLDQ: # BB#0: 2014; AVX512VLDQ-NEXT: vcvttps2uqq %ymm0, %zmm0 2015; AVX512VLDQ-NEXT: # kill: %YMM0<def> %YMM0<kill> %ZMM0<kill> 2016; AVX512VLDQ-NEXT: retq 2017 %cvt = fptoui <8 x float> %a to <8 x i64> 2018 %shuf = shufflevector <8 x i64> %cvt, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 2019 ret <4 x i64> %shuf 2020} 2021 2022; 2023; Constant Folding 2024; 2025 2026define <2 x i64> @fptosi_2f64_to_2i64_const() { 2027; SSE-LABEL: fptosi_2f64_to_2i64_const: 2028; SSE: # BB#0: 2029; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,18446744073709551615] 2030; SSE-NEXT: retq 2031; 2032; AVX-LABEL: fptosi_2f64_to_2i64_const: 2033; AVX: # BB#0: 2034; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [1,18446744073709551615] 2035; AVX-NEXT: retq 2036 %cvt = fptosi <2 x double> <double 1.0, double -1.0> to <2 x i64> 2037 ret <2 x i64> %cvt 2038} 2039 2040define <4 x i32> @fptosi_2f64_to_2i32_const() { 2041; SSE-LABEL: fptosi_2f64_to_2i32_const: 2042; SSE: # BB#0: 2043; SSE-NEXT: movaps {{.*#+}} xmm0 = <4294967295,1,u,u> 2044; SSE-NEXT: retq 2045; 2046; AVX-LABEL: fptosi_2f64_to_2i32_const: 2047; AVX: # BB#0: 2048; AVX-NEXT: vmovaps {{.*#+}} xmm0 = <4294967295,1,u,u> 2049; AVX-NEXT: retq 2050 %cvt = fptosi <2 x double> <double -1.0, double 1.0> to <2 x i32> 2051 %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> 2052 ret <4 x i32> %ext 2053} 2054 2055define <4 x i64> @fptosi_4f64_to_4i64_const() { 2056; SSE-LABEL: fptosi_4f64_to_4i64_const: 2057; SSE: # BB#0: 2058; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,18446744073709551615] 2059; SSE-NEXT: movaps {{.*#+}} xmm1 = [2,18446744073709551613] 2060; SSE-NEXT: retq 2061; 2062; AVX-LABEL: fptosi_4f64_to_4i64_const: 2063; AVX: # BB#0: 2064; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,18446744073709551613] 2065; AVX-NEXT: retq 2066 %cvt = fptosi <4 x double> <double 1.0, double -1.0, double 2.0, double -3.0> to <4 x i64> 2067 ret <4 x i64> %cvt 2068} 2069 2070define <4 x i32> @fptosi_4f64_to_4i32_const() { 2071; SSE-LABEL: fptosi_4f64_to_4i32_const: 2072; SSE: # BB#0: 2073; SSE-NEXT: movaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3] 2074; SSE-NEXT: retq 2075; 2076; AVX-LABEL: fptosi_4f64_to_4i32_const: 2077; AVX: # BB#0: 2078; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [4294967295,1,4294967294,3] 2079; AVX-NEXT: retq 2080 %cvt = fptosi <4 x double> <double -1.0, double 1.0, double -2.0, double 3.0> to <4 x i32> 2081 ret <4 x i32> %cvt 2082} 2083 2084define <2 x i64> @fptoui_2f64_to_2i64_const() { 2085; SSE-LABEL: fptoui_2f64_to_2i64_const: 2086; SSE: # BB#0: 2087; SSE-NEXT: movaps {{.*#+}} xmm0 = [2,4] 2088; SSE-NEXT: retq 2089; 2090; AVX-LABEL: fptoui_2f64_to_2i64_const: 2091; AVX: # BB#0: 2092; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [2,4] 2093; AVX-NEXT: retq 2094 %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i64> 2095 ret <2 x i64> %cvt 2096} 2097 2098define <4 x i32> @fptoui_2f64_to_2i32_const(<2 x double> %a) { 2099; SSE-LABEL: fptoui_2f64_to_2i32_const: 2100; SSE: # BB#0: 2101; SSE-NEXT: movaps {{.*#+}} xmm0 = <2,4,u,u> 2102; SSE-NEXT: retq 2103; 2104; AVX-LABEL: fptoui_2f64_to_2i32_const: 2105; AVX: # BB#0: 2106; AVX-NEXT: vmovaps {{.*#+}} xmm0 = <2,4,u,u> 2107; AVX-NEXT: retq 2108 %cvt = fptoui <2 x double> <double 2.0, double 4.0> to <2 x i32> 2109 %ext = shufflevector <2 x i32> %cvt, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> 2110 ret <4 x i32> %ext 2111} 2112 2113define <4 x i64> @fptoui_4f64_to_4i64_const(<4 x double> %a) { 2114; SSE-LABEL: fptoui_4f64_to_4i64_const: 2115; SSE: # BB#0: 2116; SSE-NEXT: movaps {{.*#+}} xmm0 = [2,4] 2117; SSE-NEXT: movaps {{.*#+}} xmm1 = [6,8] 2118; SSE-NEXT: retq 2119; 2120; AVX-LABEL: fptoui_4f64_to_4i64_const: 2121; AVX: # BB#0: 2122; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [2,4,6,8] 2123; AVX-NEXT: retq 2124 %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i64> 2125 ret <4 x i64> %cvt 2126} 2127 2128define <4 x i32> @fptoui_4f64_to_4i32_const(<4 x double> %a) { 2129; SSE-LABEL: fptoui_4f64_to_4i32_const: 2130; SSE: # BB#0: 2131; SSE-NEXT: movaps {{.*#+}} xmm0 = [2,4,6,8] 2132; SSE-NEXT: retq 2133; 2134; AVX-LABEL: fptoui_4f64_to_4i32_const: 2135; AVX: # BB#0: 2136; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [2,4,6,8] 2137; AVX-NEXT: retq 2138 %cvt = fptoui <4 x double> <double 2.0, double 4.0, double 6.0, double 8.0> to <4 x i32> 2139 ret <4 x i32> %cvt 2140} 2141 2142define <4 x i32> @fptosi_4f32_to_4i32_const() { 2143; SSE-LABEL: fptosi_4f32_to_4i32_const: 2144; SSE: # BB#0: 2145; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,4294967295,2,3] 2146; SSE-NEXT: retq 2147; 2148; AVX-LABEL: fptosi_4f32_to_4i32_const: 2149; AVX: # BB#0: 2150; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [1,4294967295,2,3] 2151; AVX-NEXT: retq 2152 %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i32> 2153 ret <4 x i32> %cvt 2154} 2155 2156define <4 x i64> @fptosi_4f32_to_4i64_const() { 2157; SSE-LABEL: fptosi_4f32_to_4i64_const: 2158; SSE: # BB#0: 2159; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,18446744073709551615] 2160; SSE-NEXT: movaps {{.*#+}} xmm1 = [2,3] 2161; SSE-NEXT: retq 2162; 2163; AVX-LABEL: fptosi_4f32_to_4i64_const: 2164; AVX: # BB#0: 2165; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [1,18446744073709551615,2,3] 2166; AVX-NEXT: retq 2167 %cvt = fptosi <4 x float> <float 1.0, float -1.0, float 2.0, float 3.0> to <4 x i64> 2168 ret <4 x i64> %cvt 2169} 2170 2171define <8 x i32> @fptosi_8f32_to_8i32_const(<8 x float> %a) { 2172; SSE-LABEL: fptosi_8f32_to_8i32_const: 2173; SSE: # BB#0: 2174; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,4294967295,2,3] 2175; SSE-NEXT: movaps {{.*#+}} xmm1 = [6,4294967288,2,4294967295] 2176; SSE-NEXT: retq 2177; 2178; AVX-LABEL: fptosi_8f32_to_8i32_const: 2179; AVX: # BB#0: 2180; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [1,4294967295,2,3,6,4294967288,2,4294967295] 2181; AVX-NEXT: retq 2182 %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> 2183 ret <8 x i32> %cvt 2184} 2185 2186define <4 x i32> @fptoui_4f32_to_4i32_const(<4 x float> %a) { 2187; SSE-LABEL: fptoui_4f32_to_4i32_const: 2188; SSE: # BB#0: 2189; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,2,4,6] 2190; SSE-NEXT: retq 2191; 2192; AVX-LABEL: fptoui_4f32_to_4i32_const: 2193; AVX: # BB#0: 2194; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [1,2,4,6] 2195; AVX-NEXT: retq 2196 %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 6.0> to <4 x i32> 2197 ret <4 x i32> %cvt 2198} 2199 2200define <4 x i64> @fptoui_4f32_to_4i64_const() { 2201; SSE-LABEL: fptoui_4f32_to_4i64_const: 2202; SSE: # BB#0: 2203; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,2] 2204; SSE-NEXT: movaps {{.*#+}} xmm1 = [4,8] 2205; SSE-NEXT: retq 2206; 2207; AVX-LABEL: fptoui_4f32_to_4i64_const: 2208; AVX: # BB#0: 2209; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [1,2,4,8] 2210; AVX-NEXT: retq 2211 %cvt = fptoui <4 x float> <float 1.0, float 2.0, float 4.0, float 8.0> to <4 x i64> 2212 ret <4 x i64> %cvt 2213} 2214 2215define <8 x i32> @fptoui_8f32_to_8i32_const(<8 x float> %a) { 2216; SSE-LABEL: fptoui_8f32_to_8i32_const: 2217; SSE: # BB#0: 2218; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,2,4,6] 2219; SSE-NEXT: movaps {{.*#+}} xmm1 = [8,6,4,1] 2220; SSE-NEXT: retq 2221; 2222; AVX-LABEL: fptoui_8f32_to_8i32_const: 2223; AVX: # BB#0: 2224; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [1,2,4,6,8,6,4,1] 2225; AVX-NEXT: retq 2226 %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> 2227 ret <8 x i32> %cvt 2228} 2229 2230; 2231; Special Cases 2232; 2233 2234define <4 x i32> @fptosi_2f16_to_4i32(<2 x half> %a) nounwind { 2235; SSE-LABEL: fptosi_2f16_to_4i32: 2236; SSE: # BB#0: 2237; SSE-NEXT: pushq %rax 2238; SSE-NEXT: movss %xmm1, {{[0-9]+}}(%rsp) # 4-byte Spill 2239; SSE-NEXT: callq __gnu_f2h_ieee 2240; SSE-NEXT: movzwl %ax, %edi 2241; SSE-NEXT: callq __gnu_h2f_ieee 2242; SSE-NEXT: movss %xmm0, (%rsp) # 4-byte Spill 2243; SSE-NEXT: movss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Reload 2244; SSE-NEXT: # xmm0 = mem[0],zero,zero,zero 2245; SSE-NEXT: callq __gnu_f2h_ieee 2246; SSE-NEXT: movzwl %ax, %edi 2247; SSE-NEXT: callq __gnu_h2f_ieee 2248; SSE-NEXT: cvttss2si %xmm0, %rax 2249; SSE-NEXT: movd %rax, %xmm1 2250; SSE-NEXT: cvttss2si (%rsp), %rax # 4-byte Folded Reload 2251; SSE-NEXT: movd %rax, %xmm0 2252; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2253; SSE-NEXT: pxor %xmm1, %xmm1 2254; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3] 2255; SSE-NEXT: popq %rax 2256; SSE-NEXT: retq 2257; 2258; VEX-LABEL: fptosi_2f16_to_4i32: 2259; VEX: # BB#0: 2260; VEX-NEXT: pushq %rax 2261; VEX-NEXT: vmovss %xmm1, {{[0-9]+}}(%rsp) # 4-byte Spill 2262; VEX-NEXT: callq __gnu_f2h_ieee 2263; VEX-NEXT: movzwl %ax, %edi 2264; VEX-NEXT: callq __gnu_h2f_ieee 2265; VEX-NEXT: vmovss %xmm0, (%rsp) # 4-byte Spill 2266; VEX-NEXT: vmovss {{[0-9]+}}(%rsp), %xmm0 # 4-byte Reload 2267; VEX-NEXT: # xmm0 = mem[0],zero,zero,zero 2268; VEX-NEXT: callq __gnu_f2h_ieee 2269; VEX-NEXT: movzwl %ax, %edi 2270; VEX-NEXT: callq __gnu_h2f_ieee 2271; VEX-NEXT: vcvttss2si %xmm0, %rax 2272; VEX-NEXT: vmovq %rax, %xmm0 2273; VEX-NEXT: vcvttss2si (%rsp), %rax # 4-byte Folded Reload 2274; VEX-NEXT: vmovq %rax, %xmm1 2275; VEX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 2276; VEX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero 2277; VEX-NEXT: popq %rax 2278; VEX-NEXT: retq 2279; 2280; AVX512F-LABEL: fptosi_2f16_to_4i32: 2281; AVX512F: # BB#0: 2282; AVX512F-NEXT: # kill: %XMM1<def> %XMM1<kill> %ZMM1<def> 2283; AVX512F-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 2284; AVX512F-NEXT: vcvtps2ph $4, %zmm0, %ymm0 2285; AVX512F-NEXT: vcvtph2ps %ymm0, %zmm0 2286; AVX512F-NEXT: vcvtps2ph $4, %zmm1, %ymm1 2287; AVX512F-NEXT: vcvtph2ps %ymm1, %zmm1 2288; AVX512F-NEXT: vcvttss2si %xmm1, %rax 2289; AVX512F-NEXT: vmovq %rax, %xmm1 2290; AVX512F-NEXT: vcvttss2si %xmm0, %rax 2291; AVX512F-NEXT: vmovq %rax, %xmm0 2292; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2293; AVX512F-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero 2294; AVX512F-NEXT: retq 2295; 2296; AVX512VL-LABEL: fptosi_2f16_to_4i32: 2297; AVX512VL: # BB#0: 2298; AVX512VL-NEXT: vcvtps2ph $4, %xmm0, %xmm0 2299; AVX512VL-NEXT: vcvtph2ps %xmm0, %xmm0 2300; AVX512VL-NEXT: vcvtps2ph $4, %xmm1, %xmm1 2301; AVX512VL-NEXT: vcvtph2ps %xmm1, %xmm1 2302; AVX512VL-NEXT: vcvttss2si %xmm1, %rax 2303; AVX512VL-NEXT: vmovq %rax, %xmm1 2304; AVX512VL-NEXT: vcvttss2si %xmm0, %rax 2305; AVX512VL-NEXT: vmovq %rax, %xmm0 2306; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2307; AVX512VL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero 2308; AVX512VL-NEXT: retq 2309; 2310; AVX512DQ-LABEL: fptosi_2f16_to_4i32: 2311; AVX512DQ: # BB#0: 2312; AVX512DQ-NEXT: # kill: %XMM1<def> %XMM1<kill> %ZMM1<def> 2313; AVX512DQ-NEXT: # kill: %XMM0<def> %XMM0<kill> %ZMM0<def> 2314; AVX512DQ-NEXT: vcvtps2ph $4, %zmm0, %ymm0 2315; AVX512DQ-NEXT: vcvtph2ps %ymm0, %zmm0 2316; AVX512DQ-NEXT: vcvtps2ph $4, %zmm1, %ymm1 2317; AVX512DQ-NEXT: vcvtph2ps %ymm1, %zmm1 2318; AVX512DQ-NEXT: vcvttss2si %xmm1, %rax 2319; AVX512DQ-NEXT: vmovq %rax, %xmm1 2320; AVX512DQ-NEXT: vcvttss2si %xmm0, %rax 2321; AVX512DQ-NEXT: vmovq %rax, %xmm0 2322; AVX512DQ-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2323; AVX512DQ-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero 2324; AVX512DQ-NEXT: retq 2325; 2326; AVX512VLDQ-LABEL: fptosi_2f16_to_4i32: 2327; AVX512VLDQ: # BB#0: 2328; AVX512VLDQ-NEXT: vcvtps2ph $4, %xmm0, %xmm0 2329; AVX512VLDQ-NEXT: vcvtph2ps %xmm0, %xmm0 2330; AVX512VLDQ-NEXT: vcvtps2ph $4, %xmm1, %xmm1 2331; AVX512VLDQ-NEXT: vcvtph2ps %xmm1, %xmm1 2332; AVX512VLDQ-NEXT: vcvttss2si %xmm1, %rax 2333; AVX512VLDQ-NEXT: vmovq %rax, %xmm1 2334; AVX512VLDQ-NEXT: vcvttss2si %xmm0, %rax 2335; AVX512VLDQ-NEXT: vmovq %rax, %xmm0 2336; AVX512VLDQ-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2337; AVX512VLDQ-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero 2338; AVX512VLDQ-NEXT: retq 2339 %cvt = fptosi <2 x half> %a to <2 x i32> 2340 %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 2341 ret <4 x i32> %ext 2342} 2343 2344define <4 x i32> @fptosi_2f80_to_4i32(<2 x x86_fp80> %a) nounwind { 2345; SSE-LABEL: fptosi_2f80_to_4i32: 2346; SSE: # BB#0: 2347; SSE-NEXT: fldt {{[0-9]+}}(%rsp) 2348; SSE-NEXT: fldt {{[0-9]+}}(%rsp) 2349; SSE-NEXT: fnstcw -{{[0-9]+}}(%rsp) 2350; SSE-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax 2351; SSE-NEXT: movw $3199, -{{[0-9]+}}(%rsp) # imm = 0xC7F 2352; SSE-NEXT: fldcw -{{[0-9]+}}(%rsp) 2353; SSE-NEXT: movw %ax, -{{[0-9]+}}(%rsp) 2354; SSE-NEXT: fistpll -{{[0-9]+}}(%rsp) 2355; SSE-NEXT: fldcw -{{[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: movq {{.*#+}} xmm1 = mem[0],zero 2364; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 2365; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2366; SSE-NEXT: pxor %xmm1, %xmm1 2367; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3] 2368; SSE-NEXT: retq 2369; 2370; AVX-LABEL: fptosi_2f80_to_4i32: 2371; AVX: # BB#0: 2372; AVX-NEXT: fldt {{[0-9]+}}(%rsp) 2373; AVX-NEXT: fldt {{[0-9]+}}(%rsp) 2374; AVX-NEXT: fisttpll -{{[0-9]+}}(%rsp) 2375; AVX-NEXT: fisttpll -{{[0-9]+}}(%rsp) 2376; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 2377; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero 2378; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 2379; AVX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero 2380; AVX-NEXT: retq 2381 %cvt = fptosi <2 x x86_fp80> %a to <2 x i32> 2382 %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 2383 ret <4 x i32> %ext 2384} 2385 2386define <4 x i32> @fptosi_2f128_to_4i32(<2 x fp128> %a) nounwind { 2387; SSE-LABEL: fptosi_2f128_to_4i32: 2388; SSE: # BB#0: 2389; SSE-NEXT: pushq %r14 2390; SSE-NEXT: pushq %rbx 2391; SSE-NEXT: subq $24, %rsp 2392; SSE-NEXT: movq %rsi, %r14 2393; SSE-NEXT: movq %rdi, %rbx 2394; SSE-NEXT: movq %rdx, %rdi 2395; SSE-NEXT: movq %rcx, %rsi 2396; SSE-NEXT: callq __fixtfdi 2397; SSE-NEXT: movd %rax, %xmm0 2398; SSE-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill 2399; SSE-NEXT: movq %rbx, %rdi 2400; SSE-NEXT: movq %r14, %rsi 2401; SSE-NEXT: callq __fixtfdi 2402; SSE-NEXT: movd %rax, %xmm0 2403; SSE-NEXT: punpcklqdq (%rsp), %xmm0 # 16-byte Folded Reload 2404; SSE-NEXT: # xmm0 = xmm0[0],mem[0] 2405; SSE-NEXT: xorps %xmm1, %xmm1 2406; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3] 2407; SSE-NEXT: addq $24, %rsp 2408; SSE-NEXT: popq %rbx 2409; SSE-NEXT: popq %r14 2410; SSE-NEXT: retq 2411; 2412; AVX-LABEL: fptosi_2f128_to_4i32: 2413; AVX: # BB#0: 2414; AVX-NEXT: pushq %r14 2415; AVX-NEXT: pushq %rbx 2416; AVX-NEXT: subq $24, %rsp 2417; AVX-NEXT: movq %rsi, %r14 2418; AVX-NEXT: movq %rdi, %rbx 2419; AVX-NEXT: movq %rdx, %rdi 2420; AVX-NEXT: movq %rcx, %rsi 2421; AVX-NEXT: callq __fixtfdi 2422; AVX-NEXT: vmovq %rax, %xmm0 2423; AVX-NEXT: vmovdqa %xmm0, (%rsp) # 16-byte Spill 2424; AVX-NEXT: movq %rbx, %rdi 2425; AVX-NEXT: movq %r14, %rsi 2426; AVX-NEXT: callq __fixtfdi 2427; AVX-NEXT: vmovq %rax, %xmm0 2428; AVX-NEXT: vpunpcklqdq (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload 2429; AVX-NEXT: # xmm0 = xmm0[0],mem[0] 2430; AVX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero 2431; AVX-NEXT: addq $24, %rsp 2432; AVX-NEXT: popq %rbx 2433; AVX-NEXT: popq %r14 2434; AVX-NEXT: retq 2435 %cvt = fptosi <2 x fp128> %a to <2 x i32> 2436 %ext = shufflevector <2 x i32> %cvt, <2 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 2437 ret <4 x i32> %ext 2438} 2439