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