1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X86-AVX512,X86-AVX512-WIN 3; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X86-AVX512,X86-AVX512-LIN 4; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-WIN 5; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-LIN 6; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X86-AVX512,X86-AVX512-WIN 7; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X86-AVX512,X86-AVX512-LIN 8; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-WIN 9; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-LIN 10; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+avx512f | FileCheck %s --check-prefixes=X86-AVX512,X86-AVX512-WIN 11; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefixes=X86-AVX512,X86-AVX512-LIN 12; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+avx512f | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-WIN 13; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-LIN 14; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+sse3 | FileCheck %s --check-prefixes=X86-SSE,X86-SSE3,X86-SSE-WIN,X86-SSE3-WIN 15; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+sse3 | FileCheck %s --check-prefixes=X86-SSE,X86-SSE3,X86-SSE-LIN,X86-SSE3-LIN 16; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+sse3 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-WIN,X64-SSE3-WIN 17; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse3 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-LIN,X64-SSE3-LIN 18; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE,X86-SSE2,X86-SSE-WIN,X86-SSE2-WIN 19; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE,X86-SSE2,X86-SSE-LIN,X86-SSE2-LIN 20; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+sse2 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-WIN,X64-SSE2-WIN 21; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-LIN,X64-SSE2-LIN 22; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+sse | FileCheck %s --check-prefixes=X86-SSE,X86-SSE1,X86-SSE-WIN,X86-SSE1-WIN 23; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+sse | FileCheck %s --check-prefixes=X86-SSE,X86-SSE1,X86-SSE-LIN,X86-SSE1-LIN 24; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=-sse | FileCheck %s --check-prefixes=X87,X87-WIN 25; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=-sse | FileCheck %s --check-prefixes=X87,X87-LIN 26 27; Check that scalar FP conversions to signed and unsigned int32 are using 28; reasonable sequences, across platforms and target switches. 29 30define i32 @f_to_u32(float %a) nounwind { 31; X86-AVX512-LABEL: f_to_u32: 32; X86-AVX512: # %bb.0: 33; X86-AVX512-NEXT: vcvttss2usi {{[0-9]+}}(%esp), %eax 34; X86-AVX512-NEXT: retl 35; 36; X64-AVX512-LABEL: f_to_u32: 37; X64-AVX512: # %bb.0: 38; X64-AVX512-NEXT: vcvttss2usi %xmm0, %eax 39; X64-AVX512-NEXT: retq 40; 41; X86-SSE-WIN-LABEL: f_to_u32: 42; X86-SSE-WIN: # %bb.0: 43; X86-SSE-WIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 44; X86-SSE-WIN-NEXT: cvttss2si %xmm0, %ecx 45; X86-SSE-WIN-NEXT: movl %ecx, %edx 46; X86-SSE-WIN-NEXT: sarl $31, %edx 47; X86-SSE-WIN-NEXT: subss __real@4f000000, %xmm0 48; X86-SSE-WIN-NEXT: cvttss2si %xmm0, %eax 49; X86-SSE-WIN-NEXT: andl %edx, %eax 50; X86-SSE-WIN-NEXT: orl %ecx, %eax 51; X86-SSE-WIN-NEXT: retl 52; 53; X86-SSE-LIN-LABEL: f_to_u32: 54; X86-SSE-LIN: # %bb.0: 55; X86-SSE-LIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 56; X86-SSE-LIN-NEXT: cvttss2si %xmm0, %ecx 57; X86-SSE-LIN-NEXT: movl %ecx, %edx 58; X86-SSE-LIN-NEXT: sarl $31, %edx 59; X86-SSE-LIN-NEXT: subss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 60; X86-SSE-LIN-NEXT: cvttss2si %xmm0, %eax 61; X86-SSE-LIN-NEXT: andl %edx, %eax 62; X86-SSE-LIN-NEXT: orl %ecx, %eax 63; X86-SSE-LIN-NEXT: retl 64; 65; X64-SSE-LABEL: f_to_u32: 66; X64-SSE: # %bb.0: 67; X64-SSE-NEXT: cvttss2si %xmm0, %rax 68; X64-SSE-NEXT: # kill: def $eax killed $eax killed $rax 69; X64-SSE-NEXT: retq 70; 71; X87-WIN-LABEL: f_to_u32: 72; X87-WIN: # %bb.0: 73; X87-WIN-NEXT: pushl %ebp 74; X87-WIN-NEXT: movl %esp, %ebp 75; X87-WIN-NEXT: andl $-8, %esp 76; X87-WIN-NEXT: subl $16, %esp 77; X87-WIN-NEXT: flds 8(%ebp) 78; X87-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 79; X87-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 80; X87-WIN-NEXT: orl $3072, %eax # imm = 0xC00 81; X87-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 82; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 83; X87-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 84; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 85; X87-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 86; X87-WIN-NEXT: movl %ebp, %esp 87; X87-WIN-NEXT: popl %ebp 88; X87-WIN-NEXT: retl 89; 90; X87-LIN-LABEL: f_to_u32: 91; X87-LIN: # %bb.0: 92; X87-LIN-NEXT: subl $20, %esp 93; X87-LIN-NEXT: flds {{[0-9]+}}(%esp) 94; X87-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 95; X87-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 96; X87-LIN-NEXT: orl $3072, %eax # imm = 0xC00 97; X87-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 98; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 99; X87-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 100; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 101; X87-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 102; X87-LIN-NEXT: addl $20, %esp 103; X87-LIN-NEXT: retl 104 %r = fptoui float %a to i32 105 ret i32 %r 106} 107 108define i32 @f_to_s32(float %a) nounwind { 109; X86-AVX512-LABEL: f_to_s32: 110; X86-AVX512: # %bb.0: 111; X86-AVX512-NEXT: vcvttss2si {{[0-9]+}}(%esp), %eax 112; X86-AVX512-NEXT: retl 113; 114; X64-AVX512-LABEL: f_to_s32: 115; X64-AVX512: # %bb.0: 116; X64-AVX512-NEXT: vcvttss2si %xmm0, %eax 117; X64-AVX512-NEXT: retq 118; 119; X86-SSE-LABEL: f_to_s32: 120; X86-SSE: # %bb.0: 121; X86-SSE-NEXT: cvttss2si {{[0-9]+}}(%esp), %eax 122; X86-SSE-NEXT: retl 123; 124; X64-SSE-LABEL: f_to_s32: 125; X64-SSE: # %bb.0: 126; X64-SSE-NEXT: cvttss2si %xmm0, %eax 127; X64-SSE-NEXT: retq 128; 129; X87-LABEL: f_to_s32: 130; X87: # %bb.0: 131; X87-NEXT: subl $8, %esp 132; X87-NEXT: flds {{[0-9]+}}(%esp) 133; X87-NEXT: fnstcw (%esp) 134; X87-NEXT: movzwl (%esp), %eax 135; X87-NEXT: orl $3072, %eax # imm = 0xC00 136; X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 137; X87-NEXT: fldcw {{[0-9]+}}(%esp) 138; X87-NEXT: fistpl {{[0-9]+}}(%esp) 139; X87-NEXT: fldcw (%esp) 140; X87-NEXT: movl {{[0-9]+}}(%esp), %eax 141; X87-NEXT: addl $8, %esp 142; X87-NEXT: retl 143 %r = fptosi float %a to i32 144 ret i32 %r 145} 146 147define i32 @d_to_u32(double %a) nounwind { 148; X86-AVX512-LABEL: d_to_u32: 149; X86-AVX512: # %bb.0: 150; X86-AVX512-NEXT: vcvttsd2usi {{[0-9]+}}(%esp), %eax 151; X86-AVX512-NEXT: retl 152; 153; X64-AVX512-LABEL: d_to_u32: 154; X64-AVX512: # %bb.0: 155; X64-AVX512-NEXT: vcvttsd2usi %xmm0, %eax 156; X64-AVX512-NEXT: retq 157; 158; X86-SSE3-WIN-LABEL: d_to_u32: 159; X86-SSE3-WIN: # %bb.0: 160; X86-SSE3-WIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 161; X86-SSE3-WIN-NEXT: cvttsd2si %xmm0, %ecx 162; X86-SSE3-WIN-NEXT: movl %ecx, %edx 163; X86-SSE3-WIN-NEXT: sarl $31, %edx 164; X86-SSE3-WIN-NEXT: subsd __real@41e0000000000000, %xmm0 165; X86-SSE3-WIN-NEXT: cvttsd2si %xmm0, %eax 166; X86-SSE3-WIN-NEXT: andl %edx, %eax 167; X86-SSE3-WIN-NEXT: orl %ecx, %eax 168; X86-SSE3-WIN-NEXT: retl 169; 170; X86-SSE3-LIN-LABEL: d_to_u32: 171; X86-SSE3-LIN: # %bb.0: 172; X86-SSE3-LIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 173; X86-SSE3-LIN-NEXT: cvttsd2si %xmm0, %ecx 174; X86-SSE3-LIN-NEXT: movl %ecx, %edx 175; X86-SSE3-LIN-NEXT: sarl $31, %edx 176; X86-SSE3-LIN-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 177; X86-SSE3-LIN-NEXT: cvttsd2si %xmm0, %eax 178; X86-SSE3-LIN-NEXT: andl %edx, %eax 179; X86-SSE3-LIN-NEXT: orl %ecx, %eax 180; X86-SSE3-LIN-NEXT: retl 181; 182; X64-SSE-LABEL: d_to_u32: 183; X64-SSE: # %bb.0: 184; X64-SSE-NEXT: cvttsd2si %xmm0, %rax 185; X64-SSE-NEXT: # kill: def $eax killed $eax killed $rax 186; X64-SSE-NEXT: retq 187; 188; X86-SSE2-WIN-LABEL: d_to_u32: 189; X86-SSE2-WIN: # %bb.0: 190; X86-SSE2-WIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 191; X86-SSE2-WIN-NEXT: cvttsd2si %xmm0, %ecx 192; X86-SSE2-WIN-NEXT: movl %ecx, %edx 193; X86-SSE2-WIN-NEXT: sarl $31, %edx 194; X86-SSE2-WIN-NEXT: subsd __real@41e0000000000000, %xmm0 195; X86-SSE2-WIN-NEXT: cvttsd2si %xmm0, %eax 196; X86-SSE2-WIN-NEXT: andl %edx, %eax 197; X86-SSE2-WIN-NEXT: orl %ecx, %eax 198; X86-SSE2-WIN-NEXT: retl 199; 200; X86-SSE2-LIN-LABEL: d_to_u32: 201; X86-SSE2-LIN: # %bb.0: 202; X86-SSE2-LIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 203; X86-SSE2-LIN-NEXT: cvttsd2si %xmm0, %ecx 204; X86-SSE2-LIN-NEXT: movl %ecx, %edx 205; X86-SSE2-LIN-NEXT: sarl $31, %edx 206; X86-SSE2-LIN-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 207; X86-SSE2-LIN-NEXT: cvttsd2si %xmm0, %eax 208; X86-SSE2-LIN-NEXT: andl %edx, %eax 209; X86-SSE2-LIN-NEXT: orl %ecx, %eax 210; X86-SSE2-LIN-NEXT: retl 211; 212; X86-SSE1-WIN-LABEL: d_to_u32: 213; X86-SSE1-WIN: # %bb.0: 214; X86-SSE1-WIN-NEXT: pushl %ebp 215; X86-SSE1-WIN-NEXT: movl %esp, %ebp 216; X86-SSE1-WIN-NEXT: andl $-8, %esp 217; X86-SSE1-WIN-NEXT: subl $16, %esp 218; X86-SSE1-WIN-NEXT: fldl 8(%ebp) 219; X86-SSE1-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 220; X86-SSE1-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 221; X86-SSE1-WIN-NEXT: orl $3072, %eax # imm = 0xC00 222; X86-SSE1-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 223; X86-SSE1-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 224; X86-SSE1-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 225; X86-SSE1-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 226; X86-SSE1-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 227; X86-SSE1-WIN-NEXT: movl %ebp, %esp 228; X86-SSE1-WIN-NEXT: popl %ebp 229; X86-SSE1-WIN-NEXT: retl 230; 231; X86-SSE1-LIN-LABEL: d_to_u32: 232; X86-SSE1-LIN: # %bb.0: 233; X86-SSE1-LIN-NEXT: subl $20, %esp 234; X86-SSE1-LIN-NEXT: fldl {{[0-9]+}}(%esp) 235; X86-SSE1-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 236; X86-SSE1-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 237; X86-SSE1-LIN-NEXT: orl $3072, %eax # imm = 0xC00 238; X86-SSE1-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 239; X86-SSE1-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 240; X86-SSE1-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 241; X86-SSE1-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 242; X86-SSE1-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 243; X86-SSE1-LIN-NEXT: addl $20, %esp 244; X86-SSE1-LIN-NEXT: retl 245; 246; X87-WIN-LABEL: d_to_u32: 247; X87-WIN: # %bb.0: 248; X87-WIN-NEXT: pushl %ebp 249; X87-WIN-NEXT: movl %esp, %ebp 250; X87-WIN-NEXT: andl $-8, %esp 251; X87-WIN-NEXT: subl $16, %esp 252; X87-WIN-NEXT: fldl 8(%ebp) 253; X87-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 254; X87-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 255; X87-WIN-NEXT: orl $3072, %eax # imm = 0xC00 256; X87-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 257; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 258; X87-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 259; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 260; X87-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 261; X87-WIN-NEXT: movl %ebp, %esp 262; X87-WIN-NEXT: popl %ebp 263; X87-WIN-NEXT: retl 264; 265; X87-LIN-LABEL: d_to_u32: 266; X87-LIN: # %bb.0: 267; X87-LIN-NEXT: subl $20, %esp 268; X87-LIN-NEXT: fldl {{[0-9]+}}(%esp) 269; X87-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 270; X87-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 271; X87-LIN-NEXT: orl $3072, %eax # imm = 0xC00 272; X87-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 273; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 274; X87-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 275; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 276; X87-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 277; X87-LIN-NEXT: addl $20, %esp 278; X87-LIN-NEXT: retl 279 %r = fptoui double %a to i32 280 ret i32 %r 281} 282 283define i32 @d_to_s32(double %a) nounwind { 284; X86-AVX512-LABEL: d_to_s32: 285; X86-AVX512: # %bb.0: 286; X86-AVX512-NEXT: vcvttsd2si {{[0-9]+}}(%esp), %eax 287; X86-AVX512-NEXT: retl 288; 289; X64-AVX512-LABEL: d_to_s32: 290; X64-AVX512: # %bb.0: 291; X64-AVX512-NEXT: vcvttsd2si %xmm0, %eax 292; X64-AVX512-NEXT: retq 293; 294; X86-SSE3-LABEL: d_to_s32: 295; X86-SSE3: # %bb.0: 296; X86-SSE3-NEXT: cvttsd2si {{[0-9]+}}(%esp), %eax 297; X86-SSE3-NEXT: retl 298; 299; X64-SSE-LABEL: d_to_s32: 300; X64-SSE: # %bb.0: 301; X64-SSE-NEXT: cvttsd2si %xmm0, %eax 302; X64-SSE-NEXT: retq 303; 304; X86-SSE2-LABEL: d_to_s32: 305; X86-SSE2: # %bb.0: 306; X86-SSE2-NEXT: cvttsd2si {{[0-9]+}}(%esp), %eax 307; X86-SSE2-NEXT: retl 308; 309; X86-SSE1-LABEL: d_to_s32: 310; X86-SSE1: # %bb.0: 311; X86-SSE1-NEXT: subl $8, %esp 312; X86-SSE1-NEXT: fldl {{[0-9]+}}(%esp) 313; X86-SSE1-NEXT: fnstcw (%esp) 314; X86-SSE1-NEXT: movzwl (%esp), %eax 315; X86-SSE1-NEXT: orl $3072, %eax # imm = 0xC00 316; X86-SSE1-NEXT: movw %ax, {{[0-9]+}}(%esp) 317; X86-SSE1-NEXT: fldcw {{[0-9]+}}(%esp) 318; X86-SSE1-NEXT: fistpl {{[0-9]+}}(%esp) 319; X86-SSE1-NEXT: fldcw (%esp) 320; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %eax 321; X86-SSE1-NEXT: addl $8, %esp 322; X86-SSE1-NEXT: retl 323; 324; X87-LABEL: d_to_s32: 325; X87: # %bb.0: 326; X87-NEXT: subl $8, %esp 327; X87-NEXT: fldl {{[0-9]+}}(%esp) 328; X87-NEXT: fnstcw (%esp) 329; X87-NEXT: movzwl (%esp), %eax 330; X87-NEXT: orl $3072, %eax # imm = 0xC00 331; X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 332; X87-NEXT: fldcw {{[0-9]+}}(%esp) 333; X87-NEXT: fistpl {{[0-9]+}}(%esp) 334; X87-NEXT: fldcw (%esp) 335; X87-NEXT: movl {{[0-9]+}}(%esp), %eax 336; X87-NEXT: addl $8, %esp 337; X87-NEXT: retl 338 %r = fptosi double %a to i32 339 ret i32 %r 340} 341 342define i32 @x_to_u32(x86_fp80 %a) nounwind { 343; X86-AVX512-WIN-LABEL: x_to_u32: 344; X86-AVX512-WIN: # %bb.0: 345; X86-AVX512-WIN-NEXT: pushl %ebp 346; X86-AVX512-WIN-NEXT: movl %esp, %ebp 347; X86-AVX512-WIN-NEXT: andl $-16, %esp 348; X86-AVX512-WIN-NEXT: subl $16, %esp 349; X86-AVX512-WIN-NEXT: fldt 8(%ebp) 350; X86-AVX512-WIN-NEXT: fisttpll (%esp) 351; X86-AVX512-WIN-NEXT: movl (%esp), %eax 352; X86-AVX512-WIN-NEXT: movl %ebp, %esp 353; X86-AVX512-WIN-NEXT: popl %ebp 354; X86-AVX512-WIN-NEXT: retl 355; 356; X86-AVX512-LIN-LABEL: x_to_u32: 357; X86-AVX512-LIN: # %bb.0: 358; X86-AVX512-LIN-NEXT: subl $12, %esp 359; X86-AVX512-LIN-NEXT: fldt {{[0-9]+}}(%esp) 360; X86-AVX512-LIN-NEXT: fisttpll (%esp) 361; X86-AVX512-LIN-NEXT: movl (%esp), %eax 362; X86-AVX512-LIN-NEXT: addl $12, %esp 363; X86-AVX512-LIN-NEXT: retl 364; 365; X64-AVX512-WIN-LABEL: x_to_u32: 366; X64-AVX512-WIN: # %bb.0: 367; X64-AVX512-WIN-NEXT: pushq %rax 368; X64-AVX512-WIN-NEXT: fldt (%rcx) 369; X64-AVX512-WIN-NEXT: fisttpll (%rsp) 370; X64-AVX512-WIN-NEXT: movl (%rsp), %eax 371; X64-AVX512-WIN-NEXT: popq %rcx 372; X64-AVX512-WIN-NEXT: retq 373; 374; X64-AVX512-LIN-LABEL: x_to_u32: 375; X64-AVX512-LIN: # %bb.0: 376; X64-AVX512-LIN-NEXT: fldt {{[0-9]+}}(%rsp) 377; X64-AVX512-LIN-NEXT: fisttpll -{{[0-9]+}}(%rsp) 378; X64-AVX512-LIN-NEXT: movl -{{[0-9]+}}(%rsp), %eax 379; X64-AVX512-LIN-NEXT: retq 380; 381; X86-SSE3-WIN-LABEL: x_to_u32: 382; X86-SSE3-WIN: # %bb.0: 383; X86-SSE3-WIN-NEXT: pushl %ebp 384; X86-SSE3-WIN-NEXT: movl %esp, %ebp 385; X86-SSE3-WIN-NEXT: andl $-16, %esp 386; X86-SSE3-WIN-NEXT: subl $16, %esp 387; X86-SSE3-WIN-NEXT: fldt 8(%ebp) 388; X86-SSE3-WIN-NEXT: fisttpll (%esp) 389; X86-SSE3-WIN-NEXT: movl (%esp), %eax 390; X86-SSE3-WIN-NEXT: movl %ebp, %esp 391; X86-SSE3-WIN-NEXT: popl %ebp 392; X86-SSE3-WIN-NEXT: retl 393; 394; X86-SSE3-LIN-LABEL: x_to_u32: 395; X86-SSE3-LIN: # %bb.0: 396; X86-SSE3-LIN-NEXT: subl $12, %esp 397; X86-SSE3-LIN-NEXT: fldt {{[0-9]+}}(%esp) 398; X86-SSE3-LIN-NEXT: fisttpll (%esp) 399; X86-SSE3-LIN-NEXT: movl (%esp), %eax 400; X86-SSE3-LIN-NEXT: addl $12, %esp 401; X86-SSE3-LIN-NEXT: retl 402; 403; X64-SSE3-WIN-LABEL: x_to_u32: 404; X64-SSE3-WIN: # %bb.0: 405; X64-SSE3-WIN-NEXT: pushq %rax 406; X64-SSE3-WIN-NEXT: fldt (%rcx) 407; X64-SSE3-WIN-NEXT: fisttpll (%rsp) 408; X64-SSE3-WIN-NEXT: movl (%rsp), %eax 409; X64-SSE3-WIN-NEXT: popq %rcx 410; X64-SSE3-WIN-NEXT: retq 411; 412; X64-SSE3-LIN-LABEL: x_to_u32: 413; X64-SSE3-LIN: # %bb.0: 414; X64-SSE3-LIN-NEXT: fldt {{[0-9]+}}(%rsp) 415; X64-SSE3-LIN-NEXT: fisttpll -{{[0-9]+}}(%rsp) 416; X64-SSE3-LIN-NEXT: movl -{{[0-9]+}}(%rsp), %eax 417; X64-SSE3-LIN-NEXT: retq 418; 419; X86-SSE2-WIN-LABEL: x_to_u32: 420; X86-SSE2-WIN: # %bb.0: 421; X86-SSE2-WIN-NEXT: pushl %ebp 422; X86-SSE2-WIN-NEXT: movl %esp, %ebp 423; X86-SSE2-WIN-NEXT: andl $-16, %esp 424; X86-SSE2-WIN-NEXT: subl $32, %esp 425; X86-SSE2-WIN-NEXT: fldt 8(%ebp) 426; X86-SSE2-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 427; X86-SSE2-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 428; X86-SSE2-WIN-NEXT: orl $3072, %eax # imm = 0xC00 429; X86-SSE2-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 430; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 431; X86-SSE2-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 432; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 433; X86-SSE2-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 434; X86-SSE2-WIN-NEXT: movl %ebp, %esp 435; X86-SSE2-WIN-NEXT: popl %ebp 436; X86-SSE2-WIN-NEXT: retl 437; 438; X86-SSE2-LIN-LABEL: x_to_u32: 439; X86-SSE2-LIN: # %bb.0: 440; X86-SSE2-LIN-NEXT: subl $20, %esp 441; X86-SSE2-LIN-NEXT: fldt {{[0-9]+}}(%esp) 442; X86-SSE2-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 443; X86-SSE2-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 444; X86-SSE2-LIN-NEXT: orl $3072, %eax # imm = 0xC00 445; X86-SSE2-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 446; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 447; X86-SSE2-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 448; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 449; X86-SSE2-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 450; X86-SSE2-LIN-NEXT: addl $20, %esp 451; X86-SSE2-LIN-NEXT: retl 452; 453; X64-SSE2-WIN-LABEL: x_to_u32: 454; X64-SSE2-WIN: # %bb.0: 455; X64-SSE2-WIN-NEXT: subq $16, %rsp 456; X64-SSE2-WIN-NEXT: fldt (%rcx) 457; X64-SSE2-WIN-NEXT: fnstcw {{[0-9]+}}(%rsp) 458; X64-SSE2-WIN-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 459; X64-SSE2-WIN-NEXT: orl $3072, %eax # imm = 0xC00 460; X64-SSE2-WIN-NEXT: movw %ax, {{[0-9]+}}(%rsp) 461; X64-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%rsp) 462; X64-SSE2-WIN-NEXT: fistpll {{[0-9]+}}(%rsp) 463; X64-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%rsp) 464; X64-SSE2-WIN-NEXT: movl {{[0-9]+}}(%rsp), %eax 465; X64-SSE2-WIN-NEXT: addq $16, %rsp 466; X64-SSE2-WIN-NEXT: retq 467; 468; X64-SSE2-LIN-LABEL: x_to_u32: 469; X64-SSE2-LIN: # %bb.0: 470; X64-SSE2-LIN-NEXT: fldt {{[0-9]+}}(%rsp) 471; X64-SSE2-LIN-NEXT: fnstcw -{{[0-9]+}}(%rsp) 472; X64-SSE2-LIN-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax 473; X64-SSE2-LIN-NEXT: orl $3072, %eax # imm = 0xC00 474; X64-SSE2-LIN-NEXT: movw %ax, -{{[0-9]+}}(%rsp) 475; X64-SSE2-LIN-NEXT: fldcw -{{[0-9]+}}(%rsp) 476; X64-SSE2-LIN-NEXT: fistpll -{{[0-9]+}}(%rsp) 477; X64-SSE2-LIN-NEXT: fldcw -{{[0-9]+}}(%rsp) 478; X64-SSE2-LIN-NEXT: movl -{{[0-9]+}}(%rsp), %eax 479; X64-SSE2-LIN-NEXT: retq 480; 481; X86-SSE1-WIN-LABEL: x_to_u32: 482; X86-SSE1-WIN: # %bb.0: 483; X86-SSE1-WIN-NEXT: pushl %ebp 484; X86-SSE1-WIN-NEXT: movl %esp, %ebp 485; X86-SSE1-WIN-NEXT: andl $-16, %esp 486; X86-SSE1-WIN-NEXT: subl $32, %esp 487; X86-SSE1-WIN-NEXT: fldt 8(%ebp) 488; X86-SSE1-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 489; X86-SSE1-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 490; X86-SSE1-WIN-NEXT: orl $3072, %eax # imm = 0xC00 491; X86-SSE1-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 492; X86-SSE1-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 493; X86-SSE1-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 494; X86-SSE1-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 495; X86-SSE1-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 496; X86-SSE1-WIN-NEXT: movl %ebp, %esp 497; X86-SSE1-WIN-NEXT: popl %ebp 498; X86-SSE1-WIN-NEXT: retl 499; 500; X86-SSE1-LIN-LABEL: x_to_u32: 501; X86-SSE1-LIN: # %bb.0: 502; X86-SSE1-LIN-NEXT: subl $20, %esp 503; X86-SSE1-LIN-NEXT: fldt {{[0-9]+}}(%esp) 504; X86-SSE1-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 505; X86-SSE1-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 506; X86-SSE1-LIN-NEXT: orl $3072, %eax # imm = 0xC00 507; X86-SSE1-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 508; X86-SSE1-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 509; X86-SSE1-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 510; X86-SSE1-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 511; X86-SSE1-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 512; X86-SSE1-LIN-NEXT: addl $20, %esp 513; X86-SSE1-LIN-NEXT: retl 514; 515; X87-WIN-LABEL: x_to_u32: 516; X87-WIN: # %bb.0: 517; X87-WIN-NEXT: pushl %ebp 518; X87-WIN-NEXT: movl %esp, %ebp 519; X87-WIN-NEXT: andl $-16, %esp 520; X87-WIN-NEXT: subl $32, %esp 521; X87-WIN-NEXT: fldt 8(%ebp) 522; X87-WIN-NEXT: fnstcw {{[0-9]+}}(%esp) 523; X87-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 524; X87-WIN-NEXT: orl $3072, %eax # imm = 0xC00 525; X87-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 526; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 527; X87-WIN-NEXT: fistpll {{[0-9]+}}(%esp) 528; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 529; X87-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 530; X87-WIN-NEXT: movl %ebp, %esp 531; X87-WIN-NEXT: popl %ebp 532; X87-WIN-NEXT: retl 533; 534; X87-LIN-LABEL: x_to_u32: 535; X87-LIN: # %bb.0: 536; X87-LIN-NEXT: subl $20, %esp 537; X87-LIN-NEXT: fldt {{[0-9]+}}(%esp) 538; X87-LIN-NEXT: fnstcw {{[0-9]+}}(%esp) 539; X87-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax 540; X87-LIN-NEXT: orl $3072, %eax # imm = 0xC00 541; X87-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 542; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 543; X87-LIN-NEXT: fistpll {{[0-9]+}}(%esp) 544; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 545; X87-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 546; X87-LIN-NEXT: addl $20, %esp 547; X87-LIN-NEXT: retl 548 %r = fptoui x86_fp80 %a to i32 549 ret i32 %r 550} 551 552define i32 @x_to_s32(x86_fp80 %a) nounwind { 553; X86-AVX512-WIN-LABEL: x_to_s32: 554; X86-AVX512-WIN: # %bb.0: 555; X86-AVX512-WIN-NEXT: pushl %ebp 556; X86-AVX512-WIN-NEXT: movl %esp, %ebp 557; X86-AVX512-WIN-NEXT: andl $-16, %esp 558; X86-AVX512-WIN-NEXT: subl $16, %esp 559; X86-AVX512-WIN-NEXT: fldt 8(%ebp) 560; X86-AVX512-WIN-NEXT: fisttpl {{[0-9]+}}(%esp) 561; X86-AVX512-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 562; X86-AVX512-WIN-NEXT: movl %ebp, %esp 563; X86-AVX512-WIN-NEXT: popl %ebp 564; X86-AVX512-WIN-NEXT: retl 565; 566; X86-AVX512-LIN-LABEL: x_to_s32: 567; X86-AVX512-LIN: # %bb.0: 568; X86-AVX512-LIN-NEXT: pushl %eax 569; X86-AVX512-LIN-NEXT: fldt {{[0-9]+}}(%esp) 570; X86-AVX512-LIN-NEXT: fisttpl (%esp) 571; X86-AVX512-LIN-NEXT: movl (%esp), %eax 572; X86-AVX512-LIN-NEXT: popl %ecx 573; X86-AVX512-LIN-NEXT: retl 574; 575; X64-AVX512-WIN-LABEL: x_to_s32: 576; X64-AVX512-WIN: # %bb.0: 577; X64-AVX512-WIN-NEXT: pushq %rax 578; X64-AVX512-WIN-NEXT: fldt (%rcx) 579; X64-AVX512-WIN-NEXT: fisttpl {{[0-9]+}}(%rsp) 580; X64-AVX512-WIN-NEXT: movl {{[0-9]+}}(%rsp), %eax 581; X64-AVX512-WIN-NEXT: popq %rcx 582; X64-AVX512-WIN-NEXT: retq 583; 584; X64-AVX512-LIN-LABEL: x_to_s32: 585; X64-AVX512-LIN: # %bb.0: 586; X64-AVX512-LIN-NEXT: fldt {{[0-9]+}}(%rsp) 587; X64-AVX512-LIN-NEXT: fisttpl -{{[0-9]+}}(%rsp) 588; X64-AVX512-LIN-NEXT: movl -{{[0-9]+}}(%rsp), %eax 589; X64-AVX512-LIN-NEXT: retq 590; 591; X86-SSE3-WIN-LABEL: x_to_s32: 592; X86-SSE3-WIN: # %bb.0: 593; X86-SSE3-WIN-NEXT: pushl %ebp 594; X86-SSE3-WIN-NEXT: movl %esp, %ebp 595; X86-SSE3-WIN-NEXT: andl $-16, %esp 596; X86-SSE3-WIN-NEXT: subl $16, %esp 597; X86-SSE3-WIN-NEXT: fldt 8(%ebp) 598; X86-SSE3-WIN-NEXT: fisttpl {{[0-9]+}}(%esp) 599; X86-SSE3-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 600; X86-SSE3-WIN-NEXT: movl %ebp, %esp 601; X86-SSE3-WIN-NEXT: popl %ebp 602; X86-SSE3-WIN-NEXT: retl 603; 604; X86-SSE3-LIN-LABEL: x_to_s32: 605; X86-SSE3-LIN: # %bb.0: 606; X86-SSE3-LIN-NEXT: pushl %eax 607; X86-SSE3-LIN-NEXT: fldt {{[0-9]+}}(%esp) 608; X86-SSE3-LIN-NEXT: fisttpl (%esp) 609; X86-SSE3-LIN-NEXT: movl (%esp), %eax 610; X86-SSE3-LIN-NEXT: popl %ecx 611; X86-SSE3-LIN-NEXT: retl 612; 613; X64-SSE3-WIN-LABEL: x_to_s32: 614; X64-SSE3-WIN: # %bb.0: 615; X64-SSE3-WIN-NEXT: pushq %rax 616; X64-SSE3-WIN-NEXT: fldt (%rcx) 617; X64-SSE3-WIN-NEXT: fisttpl {{[0-9]+}}(%rsp) 618; X64-SSE3-WIN-NEXT: movl {{[0-9]+}}(%rsp), %eax 619; X64-SSE3-WIN-NEXT: popq %rcx 620; X64-SSE3-WIN-NEXT: retq 621; 622; X64-SSE3-LIN-LABEL: x_to_s32: 623; X64-SSE3-LIN: # %bb.0: 624; X64-SSE3-LIN-NEXT: fldt {{[0-9]+}}(%rsp) 625; X64-SSE3-LIN-NEXT: fisttpl -{{[0-9]+}}(%rsp) 626; X64-SSE3-LIN-NEXT: movl -{{[0-9]+}}(%rsp), %eax 627; X64-SSE3-LIN-NEXT: retq 628; 629; X86-SSE2-WIN-LABEL: x_to_s32: 630; X86-SSE2-WIN: # %bb.0: 631; X86-SSE2-WIN-NEXT: pushl %ebp 632; X86-SSE2-WIN-NEXT: movl %esp, %ebp 633; X86-SSE2-WIN-NEXT: andl $-16, %esp 634; X86-SSE2-WIN-NEXT: subl $16, %esp 635; X86-SSE2-WIN-NEXT: fldt 8(%ebp) 636; X86-SSE2-WIN-NEXT: fnstcw (%esp) 637; X86-SSE2-WIN-NEXT: movzwl (%esp), %eax 638; X86-SSE2-WIN-NEXT: orl $3072, %eax # imm = 0xC00 639; X86-SSE2-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 640; X86-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 641; X86-SSE2-WIN-NEXT: fistpl {{[0-9]+}}(%esp) 642; X86-SSE2-WIN-NEXT: fldcw (%esp) 643; X86-SSE2-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 644; X86-SSE2-WIN-NEXT: movl %ebp, %esp 645; X86-SSE2-WIN-NEXT: popl %ebp 646; X86-SSE2-WIN-NEXT: retl 647; 648; X86-SSE2-LIN-LABEL: x_to_s32: 649; X86-SSE2-LIN: # %bb.0: 650; X86-SSE2-LIN-NEXT: subl $8, %esp 651; X86-SSE2-LIN-NEXT: fldt {{[0-9]+}}(%esp) 652; X86-SSE2-LIN-NEXT: fnstcw (%esp) 653; X86-SSE2-LIN-NEXT: movzwl (%esp), %eax 654; X86-SSE2-LIN-NEXT: orl $3072, %eax # imm = 0xC00 655; X86-SSE2-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 656; X86-SSE2-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 657; X86-SSE2-LIN-NEXT: fistpl {{[0-9]+}}(%esp) 658; X86-SSE2-LIN-NEXT: fldcw (%esp) 659; X86-SSE2-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 660; X86-SSE2-LIN-NEXT: addl $8, %esp 661; X86-SSE2-LIN-NEXT: retl 662; 663; X64-SSE2-WIN-LABEL: x_to_s32: 664; X64-SSE2-WIN: # %bb.0: 665; X64-SSE2-WIN-NEXT: pushq %rax 666; X64-SSE2-WIN-NEXT: fldt (%rcx) 667; X64-SSE2-WIN-NEXT: fnstcw (%rsp) 668; X64-SSE2-WIN-NEXT: movzwl (%rsp), %eax 669; X64-SSE2-WIN-NEXT: orl $3072, %eax # imm = 0xC00 670; X64-SSE2-WIN-NEXT: movw %ax, {{[0-9]+}}(%rsp) 671; X64-SSE2-WIN-NEXT: fldcw {{[0-9]+}}(%rsp) 672; X64-SSE2-WIN-NEXT: fistpl {{[0-9]+}}(%rsp) 673; X64-SSE2-WIN-NEXT: fldcw (%rsp) 674; X64-SSE2-WIN-NEXT: movl {{[0-9]+}}(%rsp), %eax 675; X64-SSE2-WIN-NEXT: popq %rcx 676; X64-SSE2-WIN-NEXT: retq 677; 678; X64-SSE2-LIN-LABEL: x_to_s32: 679; X64-SSE2-LIN: # %bb.0: 680; X64-SSE2-LIN-NEXT: fldt {{[0-9]+}}(%rsp) 681; X64-SSE2-LIN-NEXT: fnstcw -{{[0-9]+}}(%rsp) 682; X64-SSE2-LIN-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax 683; X64-SSE2-LIN-NEXT: orl $3072, %eax # imm = 0xC00 684; X64-SSE2-LIN-NEXT: movw %ax, -{{[0-9]+}}(%rsp) 685; X64-SSE2-LIN-NEXT: fldcw -{{[0-9]+}}(%rsp) 686; X64-SSE2-LIN-NEXT: fistpl -{{[0-9]+}}(%rsp) 687; X64-SSE2-LIN-NEXT: fldcw -{{[0-9]+}}(%rsp) 688; X64-SSE2-LIN-NEXT: movl -{{[0-9]+}}(%rsp), %eax 689; X64-SSE2-LIN-NEXT: retq 690; 691; X86-SSE1-WIN-LABEL: x_to_s32: 692; X86-SSE1-WIN: # %bb.0: 693; X86-SSE1-WIN-NEXT: pushl %ebp 694; X86-SSE1-WIN-NEXT: movl %esp, %ebp 695; X86-SSE1-WIN-NEXT: andl $-16, %esp 696; X86-SSE1-WIN-NEXT: subl $16, %esp 697; X86-SSE1-WIN-NEXT: fldt 8(%ebp) 698; X86-SSE1-WIN-NEXT: fnstcw (%esp) 699; X86-SSE1-WIN-NEXT: movzwl (%esp), %eax 700; X86-SSE1-WIN-NEXT: orl $3072, %eax # imm = 0xC00 701; X86-SSE1-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 702; X86-SSE1-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 703; X86-SSE1-WIN-NEXT: fistpl {{[0-9]+}}(%esp) 704; X86-SSE1-WIN-NEXT: fldcw (%esp) 705; X86-SSE1-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 706; X86-SSE1-WIN-NEXT: movl %ebp, %esp 707; X86-SSE1-WIN-NEXT: popl %ebp 708; X86-SSE1-WIN-NEXT: retl 709; 710; X86-SSE1-LIN-LABEL: x_to_s32: 711; X86-SSE1-LIN: # %bb.0: 712; X86-SSE1-LIN-NEXT: subl $8, %esp 713; X86-SSE1-LIN-NEXT: fldt {{[0-9]+}}(%esp) 714; X86-SSE1-LIN-NEXT: fnstcw (%esp) 715; X86-SSE1-LIN-NEXT: movzwl (%esp), %eax 716; X86-SSE1-LIN-NEXT: orl $3072, %eax # imm = 0xC00 717; X86-SSE1-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 718; X86-SSE1-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 719; X86-SSE1-LIN-NEXT: fistpl {{[0-9]+}}(%esp) 720; X86-SSE1-LIN-NEXT: fldcw (%esp) 721; X86-SSE1-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 722; X86-SSE1-LIN-NEXT: addl $8, %esp 723; X86-SSE1-LIN-NEXT: retl 724; 725; X87-WIN-LABEL: x_to_s32: 726; X87-WIN: # %bb.0: 727; X87-WIN-NEXT: pushl %ebp 728; X87-WIN-NEXT: movl %esp, %ebp 729; X87-WIN-NEXT: andl $-16, %esp 730; X87-WIN-NEXT: subl $16, %esp 731; X87-WIN-NEXT: fldt 8(%ebp) 732; X87-WIN-NEXT: fnstcw (%esp) 733; X87-WIN-NEXT: movzwl (%esp), %eax 734; X87-WIN-NEXT: orl $3072, %eax # imm = 0xC00 735; X87-WIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 736; X87-WIN-NEXT: fldcw {{[0-9]+}}(%esp) 737; X87-WIN-NEXT: fistpl {{[0-9]+}}(%esp) 738; X87-WIN-NEXT: fldcw (%esp) 739; X87-WIN-NEXT: movl {{[0-9]+}}(%esp), %eax 740; X87-WIN-NEXT: movl %ebp, %esp 741; X87-WIN-NEXT: popl %ebp 742; X87-WIN-NEXT: retl 743; 744; X87-LIN-LABEL: x_to_s32: 745; X87-LIN: # %bb.0: 746; X87-LIN-NEXT: subl $8, %esp 747; X87-LIN-NEXT: fldt {{[0-9]+}}(%esp) 748; X87-LIN-NEXT: fnstcw (%esp) 749; X87-LIN-NEXT: movzwl (%esp), %eax 750; X87-LIN-NEXT: orl $3072, %eax # imm = 0xC00 751; X87-LIN-NEXT: movw %ax, {{[0-9]+}}(%esp) 752; X87-LIN-NEXT: fldcw {{[0-9]+}}(%esp) 753; X87-LIN-NEXT: fistpl {{[0-9]+}}(%esp) 754; X87-LIN-NEXT: fldcw (%esp) 755; X87-LIN-NEXT: movl {{[0-9]+}}(%esp), %eax 756; X87-LIN-NEXT: addl $8, %esp 757; X87-LIN-NEXT: retl 758 %r = fptosi x86_fp80 %a to i32 759 ret i32 %r 760} 761 762define i32 @t_to_u32(fp128 %a) nounwind { 763; X86-AVX512-WIN-LABEL: t_to_u32: 764; X86-AVX512-WIN: # %bb.0: 765; X86-AVX512-WIN-NEXT: subl $16, %esp 766; X86-AVX512-WIN-NEXT: vmovups {{[0-9]+}}(%esp), %xmm0 767; X86-AVX512-WIN-NEXT: vmovups %xmm0, (%esp) 768; X86-AVX512-WIN-NEXT: calll ___fixunstfsi 769; X86-AVX512-WIN-NEXT: addl $16, %esp 770; X86-AVX512-WIN-NEXT: retl 771; 772; X86-AVX512-LIN-LABEL: t_to_u32: 773; X86-AVX512-LIN: # %bb.0: 774; X86-AVX512-LIN-NEXT: subl $28, %esp 775; X86-AVX512-LIN-NEXT: vmovaps {{[0-9]+}}(%esp), %xmm0 776; X86-AVX512-LIN-NEXT: vmovups %xmm0, (%esp) 777; X86-AVX512-LIN-NEXT: calll __fixunstfsi 778; X86-AVX512-LIN-NEXT: addl $28, %esp 779; X86-AVX512-LIN-NEXT: retl 780; 781; X64-AVX512-WIN-LABEL: t_to_u32: 782; X64-AVX512-WIN: # %bb.0: 783; X64-AVX512-WIN-NEXT: subq $40, %rsp 784; X64-AVX512-WIN-NEXT: callq __fixunstfsi 785; X64-AVX512-WIN-NEXT: addq $40, %rsp 786; X64-AVX512-WIN-NEXT: retq 787; 788; X64-AVX512-LIN-LABEL: t_to_u32: 789; X64-AVX512-LIN: # %bb.0: 790; X64-AVX512-LIN-NEXT: pushq %rax 791; X64-AVX512-LIN-NEXT: callq __fixunstfsi@PLT 792; X64-AVX512-LIN-NEXT: popq %rcx 793; X64-AVX512-LIN-NEXT: retq 794; 795; X86-SSE-WIN-LABEL: t_to_u32: 796; X86-SSE-WIN: # %bb.0: 797; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 798; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 799; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 800; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 801; X86-SSE-WIN-NEXT: calll ___fixunstfsi 802; X86-SSE-WIN-NEXT: addl $16, %esp 803; X86-SSE-WIN-NEXT: retl 804; 805; X86-SSE-LIN-LABEL: t_to_u32: 806; X86-SSE-LIN: # %bb.0: 807; X86-SSE-LIN-NEXT: subl $12, %esp 808; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 809; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 810; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 811; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 812; X86-SSE-LIN-NEXT: calll __fixunstfsi 813; X86-SSE-LIN-NEXT: addl $28, %esp 814; X86-SSE-LIN-NEXT: retl 815; 816; X64-SSE-WIN-LABEL: t_to_u32: 817; X64-SSE-WIN: # %bb.0: 818; X64-SSE-WIN-NEXT: subq $40, %rsp 819; X64-SSE-WIN-NEXT: callq __fixunstfsi 820; X64-SSE-WIN-NEXT: addq $40, %rsp 821; X64-SSE-WIN-NEXT: retq 822; 823; X64-SSE-LIN-LABEL: t_to_u32: 824; X64-SSE-LIN: # %bb.0: 825; X64-SSE-LIN-NEXT: pushq %rax 826; X64-SSE-LIN-NEXT: callq __fixunstfsi@PLT 827; X64-SSE-LIN-NEXT: popq %rcx 828; X64-SSE-LIN-NEXT: retq 829; 830; X87-WIN-LABEL: t_to_u32: 831; X87-WIN: # %bb.0: 832; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 833; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 834; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 835; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 836; X87-WIN-NEXT: calll ___fixunstfsi 837; X87-WIN-NEXT: addl $16, %esp 838; X87-WIN-NEXT: retl 839; 840; X87-LIN-LABEL: t_to_u32: 841; X87-LIN: # %bb.0: 842; X87-LIN-NEXT: subl $12, %esp 843; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 844; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 845; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 846; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 847; X87-LIN-NEXT: calll __fixunstfsi 848; X87-LIN-NEXT: addl $28, %esp 849; X87-LIN-NEXT: retl 850 %r = fptoui fp128 %a to i32 851 ret i32 %r 852} 853 854define i32 @t_to_s32(fp128 %a) nounwind { 855; X86-AVX512-WIN-LABEL: t_to_s32: 856; X86-AVX512-WIN: # %bb.0: 857; X86-AVX512-WIN-NEXT: subl $16, %esp 858; X86-AVX512-WIN-NEXT: vmovups {{[0-9]+}}(%esp), %xmm0 859; X86-AVX512-WIN-NEXT: vmovups %xmm0, (%esp) 860; X86-AVX512-WIN-NEXT: calll ___fixtfsi 861; X86-AVX512-WIN-NEXT: addl $16, %esp 862; X86-AVX512-WIN-NEXT: retl 863; 864; X86-AVX512-LIN-LABEL: t_to_s32: 865; X86-AVX512-LIN: # %bb.0: 866; X86-AVX512-LIN-NEXT: subl $28, %esp 867; X86-AVX512-LIN-NEXT: vmovaps {{[0-9]+}}(%esp), %xmm0 868; X86-AVX512-LIN-NEXT: vmovups %xmm0, (%esp) 869; X86-AVX512-LIN-NEXT: calll __fixtfsi 870; X86-AVX512-LIN-NEXT: addl $28, %esp 871; X86-AVX512-LIN-NEXT: retl 872; 873; X64-AVX512-WIN-LABEL: t_to_s32: 874; X64-AVX512-WIN: # %bb.0: 875; X64-AVX512-WIN-NEXT: subq $40, %rsp 876; X64-AVX512-WIN-NEXT: callq __fixtfsi 877; X64-AVX512-WIN-NEXT: addq $40, %rsp 878; X64-AVX512-WIN-NEXT: retq 879; 880; X64-AVX512-LIN-LABEL: t_to_s32: 881; X64-AVX512-LIN: # %bb.0: 882; X64-AVX512-LIN-NEXT: pushq %rax 883; X64-AVX512-LIN-NEXT: callq __fixtfsi@PLT 884; X64-AVX512-LIN-NEXT: popq %rcx 885; X64-AVX512-LIN-NEXT: retq 886; 887; X86-SSE-WIN-LABEL: t_to_s32: 888; X86-SSE-WIN: # %bb.0: 889; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 890; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 891; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 892; X86-SSE-WIN-NEXT: pushl {{[0-9]+}}(%esp) 893; X86-SSE-WIN-NEXT: calll ___fixtfsi 894; X86-SSE-WIN-NEXT: addl $16, %esp 895; X86-SSE-WIN-NEXT: retl 896; 897; X86-SSE-LIN-LABEL: t_to_s32: 898; X86-SSE-LIN: # %bb.0: 899; X86-SSE-LIN-NEXT: subl $12, %esp 900; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 901; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 902; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 903; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp) 904; X86-SSE-LIN-NEXT: calll __fixtfsi 905; X86-SSE-LIN-NEXT: addl $28, %esp 906; X86-SSE-LIN-NEXT: retl 907; 908; X64-SSE-WIN-LABEL: t_to_s32: 909; X64-SSE-WIN: # %bb.0: 910; X64-SSE-WIN-NEXT: subq $40, %rsp 911; X64-SSE-WIN-NEXT: callq __fixtfsi 912; X64-SSE-WIN-NEXT: addq $40, %rsp 913; X64-SSE-WIN-NEXT: retq 914; 915; X64-SSE-LIN-LABEL: t_to_s32: 916; X64-SSE-LIN: # %bb.0: 917; X64-SSE-LIN-NEXT: pushq %rax 918; X64-SSE-LIN-NEXT: callq __fixtfsi@PLT 919; X64-SSE-LIN-NEXT: popq %rcx 920; X64-SSE-LIN-NEXT: retq 921; 922; X87-WIN-LABEL: t_to_s32: 923; X87-WIN: # %bb.0: 924; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 925; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 926; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 927; X87-WIN-NEXT: pushl {{[0-9]+}}(%esp) 928; X87-WIN-NEXT: calll ___fixtfsi 929; X87-WIN-NEXT: addl $16, %esp 930; X87-WIN-NEXT: retl 931; 932; X87-LIN-LABEL: t_to_s32: 933; X87-LIN: # %bb.0: 934; X87-LIN-NEXT: subl $12, %esp 935; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 936; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 937; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 938; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp) 939; X87-LIN-NEXT: calll __fixtfsi 940; X87-LIN-NEXT: addl $28, %esp 941; X87-LIN-NEXT: retl 942 %r = fptosi fp128 %a to i32 943 ret i32 %r 944} 945