989 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X86-AVX512,X86-AVX512-WIN3; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X86-AVX512,X86-AVX512-LIN4; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-WIN5; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-LIN6; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X86-AVX512,X86-AVX512-WIN7; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X86-AVX512,X86-AVX512-LIN8; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-WIN9; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512dq | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-LIN10; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+avx512f | FileCheck %s --check-prefixes=X86-AVX512,X86-AVX512-WIN11; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefixes=X86-AVX512,X86-AVX512-LIN12; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+avx512f | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-WIN13; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefixes=X64-AVX512,X64-AVX512-LIN14; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+sse3 | FileCheck %s --check-prefixes=X86-SSE,X86-SSE3,X86-SSE-WIN,X86-SSE3-WIN15; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+sse3 | FileCheck %s --check-prefixes=X86-SSE,X86-SSE3,X86-SSE-LIN,X86-SSE3-LIN16; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+sse3 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-WIN,X64-SSE3-WIN17; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse3 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-LIN,X64-SSE3-LIN18; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE,X86-SSE2,X86-SSE-WIN,X86-SSE2-WIN19; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE,X86-SSE2,X86-SSE-LIN,X86-SSE2-LIN20; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc -mattr=+sse2 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-WIN,X64-SSE2-WIN21; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefixes=X64-SSE,X64-SSE-LIN,X64-SSE2-LIN22; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=+sse | FileCheck %s --check-prefixes=X86-SSE,X86-SSE1,X86-SSE-WIN,X86-SSE1-WIN23; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=+sse | FileCheck %s --check-prefixes=X86-SSE,X86-SSE1,X86-SSE-LIN,X86-SSE1-LIN24; RUN: llc < %s -mtriple=i386-pc-windows-msvc -mattr=-sse | FileCheck %s --check-prefixes=X87,X87-WIN25; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -mattr=-sse | FileCheck %s --check-prefixes=X87,X87-LIN26 27; Check that scalar FP conversions to signed and unsigned int32 are using28; 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), %eax34; X86-AVX512-NEXT: retl35;36; X64-AVX512-LABEL: f_to_u32:37; X64-AVX512: # %bb.0:38; X64-AVX512-NEXT: vcvttss2usi %xmm0, %eax39; X64-AVX512-NEXT: retq40;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,zero44; X86-SSE-WIN-NEXT: cvttss2si %xmm0, %ecx45; X86-SSE-WIN-NEXT: movl %ecx, %edx46; X86-SSE-WIN-NEXT: sarl $31, %edx47; X86-SSE-WIN-NEXT: subss __real@4f000000, %xmm048; X86-SSE-WIN-NEXT: cvttss2si %xmm0, %eax49; X86-SSE-WIN-NEXT: andl %edx, %eax50; X86-SSE-WIN-NEXT: orl %ecx, %eax51; X86-SSE-WIN-NEXT: retl52;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,zero56; X86-SSE-LIN-NEXT: cvttss2si %xmm0, %ecx57; X86-SSE-LIN-NEXT: movl %ecx, %edx58; X86-SSE-LIN-NEXT: sarl $31, %edx59; X86-SSE-LIN-NEXT: subss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm060; X86-SSE-LIN-NEXT: cvttss2si %xmm0, %eax61; X86-SSE-LIN-NEXT: andl %edx, %eax62; X86-SSE-LIN-NEXT: orl %ecx, %eax63; X86-SSE-LIN-NEXT: retl64;65; X64-SSE-LABEL: f_to_u32:66; X64-SSE: # %bb.0:67; X64-SSE-NEXT: cvttss2si %xmm0, %rax68; X64-SSE-NEXT: # kill: def $eax killed $eax killed $rax69; X64-SSE-NEXT: retq70;71; X87-WIN-LABEL: f_to_u32:72; X87-WIN: # %bb.0:73; X87-WIN-NEXT: pushl %ebp74; X87-WIN-NEXT: movl %esp, %ebp75; X87-WIN-NEXT: andl $-8, %esp76; X87-WIN-NEXT: subl $16, %esp77; X87-WIN-NEXT: flds 8(%ebp)78; X87-WIN-NEXT: fnstcw {{[0-9]+}}(%esp)79; X87-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax80; X87-WIN-NEXT: orl $3072, %eax # imm = 0xC0081; 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), %eax86; X87-WIN-NEXT: movl %ebp, %esp87; X87-WIN-NEXT: popl %ebp88; X87-WIN-NEXT: retl89;90; X87-LIN-LABEL: f_to_u32:91; X87-LIN: # %bb.0:92; X87-LIN-NEXT: subl $20, %esp93; X87-LIN-NEXT: flds {{[0-9]+}}(%esp)94; X87-LIN-NEXT: fnstcw {{[0-9]+}}(%esp)95; X87-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax96; X87-LIN-NEXT: orl $3072, %eax # imm = 0xC0097; 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), %eax102; X87-LIN-NEXT: addl $20, %esp103; X87-LIN-NEXT: retl104 %r = fptoui float %a to i32105 ret i32 %r106}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), %eax112; X86-AVX512-NEXT: retl113;114; X64-AVX512-LABEL: f_to_s32:115; X64-AVX512: # %bb.0:116; X64-AVX512-NEXT: vcvttss2si %xmm0, %eax117; X64-AVX512-NEXT: retq118;119; X86-SSE-LABEL: f_to_s32:120; X86-SSE: # %bb.0:121; X86-SSE-NEXT: cvttss2si {{[0-9]+}}(%esp), %eax122; X86-SSE-NEXT: retl123;124; X64-SSE-LABEL: f_to_s32:125; X64-SSE: # %bb.0:126; X64-SSE-NEXT: cvttss2si %xmm0, %eax127; X64-SSE-NEXT: retq128;129; X87-LABEL: f_to_s32:130; X87: # %bb.0:131; X87-NEXT: subl $8, %esp132; X87-NEXT: flds {{[0-9]+}}(%esp)133; X87-NEXT: fnstcw (%esp)134; X87-NEXT: movzwl (%esp), %eax135; X87-NEXT: orl $3072, %eax # imm = 0xC00136; 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), %eax141; X87-NEXT: addl $8, %esp142; X87-NEXT: retl143 %r = fptosi float %a to i32144 ret i32 %r145}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), %eax151; X86-AVX512-NEXT: retl152;153; X64-AVX512-LABEL: d_to_u32:154; X64-AVX512: # %bb.0:155; X64-AVX512-NEXT: vcvttsd2usi %xmm0, %eax156; X64-AVX512-NEXT: retq157;158; X86-SSE3-WIN-LABEL: d_to_u32:159; X86-SSE3-WIN: # %bb.0:160; X86-SSE3-WIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero161; X86-SSE3-WIN-NEXT: cvttsd2si %xmm0, %ecx162; X86-SSE3-WIN-NEXT: movl %ecx, %edx163; X86-SSE3-WIN-NEXT: sarl $31, %edx164; X86-SSE3-WIN-NEXT: subsd __real@41e0000000000000, %xmm0165; X86-SSE3-WIN-NEXT: cvttsd2si %xmm0, %eax166; X86-SSE3-WIN-NEXT: andl %edx, %eax167; X86-SSE3-WIN-NEXT: orl %ecx, %eax168; X86-SSE3-WIN-NEXT: retl169;170; X86-SSE3-LIN-LABEL: d_to_u32:171; X86-SSE3-LIN: # %bb.0:172; X86-SSE3-LIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero173; X86-SSE3-LIN-NEXT: cvttsd2si %xmm0, %ecx174; X86-SSE3-LIN-NEXT: movl %ecx, %edx175; X86-SSE3-LIN-NEXT: sarl $31, %edx176; X86-SSE3-LIN-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0177; X86-SSE3-LIN-NEXT: cvttsd2si %xmm0, %eax178; X86-SSE3-LIN-NEXT: andl %edx, %eax179; X86-SSE3-LIN-NEXT: orl %ecx, %eax180; X86-SSE3-LIN-NEXT: retl181;182; X64-SSE-LABEL: d_to_u32:183; X64-SSE: # %bb.0:184; X64-SSE-NEXT: cvttsd2si %xmm0, %rax185; X64-SSE-NEXT: # kill: def $eax killed $eax killed $rax186; X64-SSE-NEXT: retq187;188; X86-SSE2-WIN-LABEL: d_to_u32:189; X86-SSE2-WIN: # %bb.0:190; X86-SSE2-WIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero191; X86-SSE2-WIN-NEXT: cvttsd2si %xmm0, %ecx192; X86-SSE2-WIN-NEXT: movl %ecx, %edx193; X86-SSE2-WIN-NEXT: sarl $31, %edx194; X86-SSE2-WIN-NEXT: subsd __real@41e0000000000000, %xmm0195; X86-SSE2-WIN-NEXT: cvttsd2si %xmm0, %eax196; X86-SSE2-WIN-NEXT: andl %edx, %eax197; X86-SSE2-WIN-NEXT: orl %ecx, %eax198; X86-SSE2-WIN-NEXT: retl199;200; X86-SSE2-LIN-LABEL: d_to_u32:201; X86-SSE2-LIN: # %bb.0:202; X86-SSE2-LIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero203; X86-SSE2-LIN-NEXT: cvttsd2si %xmm0, %ecx204; X86-SSE2-LIN-NEXT: movl %ecx, %edx205; X86-SSE2-LIN-NEXT: sarl $31, %edx206; X86-SSE2-LIN-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0207; X86-SSE2-LIN-NEXT: cvttsd2si %xmm0, %eax208; X86-SSE2-LIN-NEXT: andl %edx, %eax209; X86-SSE2-LIN-NEXT: orl %ecx, %eax210; X86-SSE2-LIN-NEXT: retl211;212; X86-SSE1-WIN-LABEL: d_to_u32:213; X86-SSE1-WIN: # %bb.0:214; X86-SSE1-WIN-NEXT: pushl %ebp215; X86-SSE1-WIN-NEXT: movl %esp, %ebp216; X86-SSE1-WIN-NEXT: andl $-8, %esp217; X86-SSE1-WIN-NEXT: subl $16, %esp218; 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), %eax221; X86-SSE1-WIN-NEXT: orl $3072, %eax # imm = 0xC00222; 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), %eax227; X86-SSE1-WIN-NEXT: movl %ebp, %esp228; X86-SSE1-WIN-NEXT: popl %ebp229; X86-SSE1-WIN-NEXT: retl230;231; X86-SSE1-LIN-LABEL: d_to_u32:232; X86-SSE1-LIN: # %bb.0:233; X86-SSE1-LIN-NEXT: subl $20, %esp234; 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), %eax237; X86-SSE1-LIN-NEXT: orl $3072, %eax # imm = 0xC00238; 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), %eax243; X86-SSE1-LIN-NEXT: addl $20, %esp244; X86-SSE1-LIN-NEXT: retl245;246; X87-WIN-LABEL: d_to_u32:247; X87-WIN: # %bb.0:248; X87-WIN-NEXT: pushl %ebp249; X87-WIN-NEXT: movl %esp, %ebp250; X87-WIN-NEXT: andl $-8, %esp251; X87-WIN-NEXT: subl $16, %esp252; X87-WIN-NEXT: fldl 8(%ebp)253; X87-WIN-NEXT: fnstcw {{[0-9]+}}(%esp)254; X87-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax255; X87-WIN-NEXT: orl $3072, %eax # imm = 0xC00256; 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), %eax261; X87-WIN-NEXT: movl %ebp, %esp262; X87-WIN-NEXT: popl %ebp263; X87-WIN-NEXT: retl264;265; X87-LIN-LABEL: d_to_u32:266; X87-LIN: # %bb.0:267; X87-LIN-NEXT: subl $20, %esp268; X87-LIN-NEXT: fldl {{[0-9]+}}(%esp)269; X87-LIN-NEXT: fnstcw {{[0-9]+}}(%esp)270; X87-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax271; X87-LIN-NEXT: orl $3072, %eax # imm = 0xC00272; 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), %eax277; X87-LIN-NEXT: addl $20, %esp278; X87-LIN-NEXT: retl279 %r = fptoui double %a to i32280 ret i32 %r281}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), %eax287; X86-AVX512-NEXT: retl288;289; X64-AVX512-LABEL: d_to_s32:290; X64-AVX512: # %bb.0:291; X64-AVX512-NEXT: vcvttsd2si %xmm0, %eax292; X64-AVX512-NEXT: retq293;294; X86-SSE3-LABEL: d_to_s32:295; X86-SSE3: # %bb.0:296; X86-SSE3-NEXT: cvttsd2si {{[0-9]+}}(%esp), %eax297; X86-SSE3-NEXT: retl298;299; X64-SSE-LABEL: d_to_s32:300; X64-SSE: # %bb.0:301; X64-SSE-NEXT: cvttsd2si %xmm0, %eax302; X64-SSE-NEXT: retq303;304; X86-SSE2-LABEL: d_to_s32:305; X86-SSE2: # %bb.0:306; X86-SSE2-NEXT: cvttsd2si {{[0-9]+}}(%esp), %eax307; X86-SSE2-NEXT: retl308;309; X86-SSE1-LABEL: d_to_s32:310; X86-SSE1: # %bb.0:311; X86-SSE1-NEXT: subl $8, %esp312; X86-SSE1-NEXT: fldl {{[0-9]+}}(%esp)313; X86-SSE1-NEXT: fnstcw (%esp)314; X86-SSE1-NEXT: movzwl (%esp), %eax315; X86-SSE1-NEXT: orl $3072, %eax # imm = 0xC00316; 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), %eax321; X86-SSE1-NEXT: addl $8, %esp322; X86-SSE1-NEXT: retl323;324; X87-LABEL: d_to_s32:325; X87: # %bb.0:326; X87-NEXT: subl $8, %esp327; X87-NEXT: fldl {{[0-9]+}}(%esp)328; X87-NEXT: fnstcw (%esp)329; X87-NEXT: movzwl (%esp), %eax330; X87-NEXT: orl $3072, %eax # imm = 0xC00331; 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), %eax336; X87-NEXT: addl $8, %esp337; X87-NEXT: retl338 %r = fptosi double %a to i32339 ret i32 %r340}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 %ebp346; X86-AVX512-WIN-NEXT: movl %esp, %ebp347; X86-AVX512-WIN-NEXT: andl $-16, %esp348; X86-AVX512-WIN-NEXT: subl $16, %esp349; X86-AVX512-WIN-NEXT: fldt 8(%ebp)350; X86-AVX512-WIN-NEXT: fisttpll (%esp)351; X86-AVX512-WIN-NEXT: movl (%esp), %eax352; X86-AVX512-WIN-NEXT: movl %ebp, %esp353; X86-AVX512-WIN-NEXT: popl %ebp354; X86-AVX512-WIN-NEXT: retl355;356; X86-AVX512-LIN-LABEL: x_to_u32:357; X86-AVX512-LIN: # %bb.0:358; X86-AVX512-LIN-NEXT: subl $12, %esp359; X86-AVX512-LIN-NEXT: fldt {{[0-9]+}}(%esp)360; X86-AVX512-LIN-NEXT: fisttpll (%esp)361; X86-AVX512-LIN-NEXT: movl (%esp), %eax362; X86-AVX512-LIN-NEXT: addl $12, %esp363; X86-AVX512-LIN-NEXT: retl364;365; X64-AVX512-WIN-LABEL: x_to_u32:366; X64-AVX512-WIN: # %bb.0:367; X64-AVX512-WIN-NEXT: pushq %rax368; X64-AVX512-WIN-NEXT: fldt (%rcx)369; X64-AVX512-WIN-NEXT: fisttpll (%rsp)370; X64-AVX512-WIN-NEXT: movl (%rsp), %eax371; X64-AVX512-WIN-NEXT: popq %rcx372; X64-AVX512-WIN-NEXT: retq373;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), %eax379; X64-AVX512-LIN-NEXT: retq380;381; X86-SSE3-WIN-LABEL: x_to_u32:382; X86-SSE3-WIN: # %bb.0:383; X86-SSE3-WIN-NEXT: pushl %ebp384; X86-SSE3-WIN-NEXT: movl %esp, %ebp385; X86-SSE3-WIN-NEXT: andl $-16, %esp386; X86-SSE3-WIN-NEXT: subl $16, %esp387; X86-SSE3-WIN-NEXT: fldt 8(%ebp)388; X86-SSE3-WIN-NEXT: fisttpll (%esp)389; X86-SSE3-WIN-NEXT: movl (%esp), %eax390; X86-SSE3-WIN-NEXT: movl %ebp, %esp391; X86-SSE3-WIN-NEXT: popl %ebp392; X86-SSE3-WIN-NEXT: retl393;394; X86-SSE3-LIN-LABEL: x_to_u32:395; X86-SSE3-LIN: # %bb.0:396; X86-SSE3-LIN-NEXT: subl $12, %esp397; X86-SSE3-LIN-NEXT: fldt {{[0-9]+}}(%esp)398; X86-SSE3-LIN-NEXT: fisttpll (%esp)399; X86-SSE3-LIN-NEXT: movl (%esp), %eax400; X86-SSE3-LIN-NEXT: addl $12, %esp401; X86-SSE3-LIN-NEXT: retl402;403; X64-SSE3-WIN-LABEL: x_to_u32:404; X64-SSE3-WIN: # %bb.0:405; X64-SSE3-WIN-NEXT: pushq %rax406; X64-SSE3-WIN-NEXT: fldt (%rcx)407; X64-SSE3-WIN-NEXT: fisttpll (%rsp)408; X64-SSE3-WIN-NEXT: movl (%rsp), %eax409; X64-SSE3-WIN-NEXT: popq %rcx410; X64-SSE3-WIN-NEXT: retq411;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), %eax417; X64-SSE3-LIN-NEXT: retq418;419; X86-SSE2-WIN-LABEL: x_to_u32:420; X86-SSE2-WIN: # %bb.0:421; X86-SSE2-WIN-NEXT: pushl %ebp422; X86-SSE2-WIN-NEXT: movl %esp, %ebp423; X86-SSE2-WIN-NEXT: andl $-16, %esp424; X86-SSE2-WIN-NEXT: subl $32, %esp425; 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), %eax428; X86-SSE2-WIN-NEXT: orl $3072, %eax # imm = 0xC00429; 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), %eax434; X86-SSE2-WIN-NEXT: movl %ebp, %esp435; X86-SSE2-WIN-NEXT: popl %ebp436; X86-SSE2-WIN-NEXT: retl437;438; X86-SSE2-LIN-LABEL: x_to_u32:439; X86-SSE2-LIN: # %bb.0:440; X86-SSE2-LIN-NEXT: subl $20, %esp441; 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), %eax444; X86-SSE2-LIN-NEXT: orl $3072, %eax # imm = 0xC00445; 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), %eax450; X86-SSE2-LIN-NEXT: addl $20, %esp451; X86-SSE2-LIN-NEXT: retl452;453; X64-SSE2-WIN-LABEL: x_to_u32:454; X64-SSE2-WIN: # %bb.0:455; X64-SSE2-WIN-NEXT: subq $16, %rsp456; X64-SSE2-WIN-NEXT: fldt (%rcx)457; X64-SSE2-WIN-NEXT: fnstcw {{[0-9]+}}(%rsp)458; X64-SSE2-WIN-NEXT: movzwl {{[0-9]+}}(%rsp), %eax459; X64-SSE2-WIN-NEXT: orl $3072, %eax # imm = 0xC00460; 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), %eax465; X64-SSE2-WIN-NEXT: addq $16, %rsp466; X64-SSE2-WIN-NEXT: retq467;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), %eax473; X64-SSE2-LIN-NEXT: orl $3072, %eax # imm = 0xC00474; 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), %eax479; X64-SSE2-LIN-NEXT: retq480;481; X86-SSE1-WIN-LABEL: x_to_u32:482; X86-SSE1-WIN: # %bb.0:483; X86-SSE1-WIN-NEXT: pushl %ebp484; X86-SSE1-WIN-NEXT: movl %esp, %ebp485; X86-SSE1-WIN-NEXT: andl $-16, %esp486; X86-SSE1-WIN-NEXT: subl $32, %esp487; 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), %eax490; X86-SSE1-WIN-NEXT: orl $3072, %eax # imm = 0xC00491; 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), %eax496; X86-SSE1-WIN-NEXT: movl %ebp, %esp497; X86-SSE1-WIN-NEXT: popl %ebp498; X86-SSE1-WIN-NEXT: retl499;500; X86-SSE1-LIN-LABEL: x_to_u32:501; X86-SSE1-LIN: # %bb.0:502; X86-SSE1-LIN-NEXT: subl $20, %esp503; 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), %eax506; X86-SSE1-LIN-NEXT: orl $3072, %eax # imm = 0xC00507; 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), %eax512; X86-SSE1-LIN-NEXT: addl $20, %esp513; X86-SSE1-LIN-NEXT: retl514;515; X87-WIN-LABEL: x_to_u32:516; X87-WIN: # %bb.0:517; X87-WIN-NEXT: pushl %ebp518; X87-WIN-NEXT: movl %esp, %ebp519; X87-WIN-NEXT: andl $-16, %esp520; X87-WIN-NEXT: subl $32, %esp521; X87-WIN-NEXT: fldt 8(%ebp)522; X87-WIN-NEXT: fnstcw {{[0-9]+}}(%esp)523; X87-WIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax524; X87-WIN-NEXT: orl $3072, %eax # imm = 0xC00525; 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), %eax530; X87-WIN-NEXT: movl %ebp, %esp531; X87-WIN-NEXT: popl %ebp532; X87-WIN-NEXT: retl533;534; X87-LIN-LABEL: x_to_u32:535; X87-LIN: # %bb.0:536; X87-LIN-NEXT: subl $20, %esp537; X87-LIN-NEXT: fldt {{[0-9]+}}(%esp)538; X87-LIN-NEXT: fnstcw {{[0-9]+}}(%esp)539; X87-LIN-NEXT: movzwl {{[0-9]+}}(%esp), %eax540; X87-LIN-NEXT: orl $3072, %eax # imm = 0xC00541; 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), %eax546; X87-LIN-NEXT: addl $20, %esp547; X87-LIN-NEXT: retl548 %r = fptoui x86_fp80 %a to i32549 ret i32 %r550}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 %ebp556; X86-AVX512-WIN-NEXT: movl %esp, %ebp557; X86-AVX512-WIN-NEXT: andl $-16, %esp558; X86-AVX512-WIN-NEXT: subl $16, %esp559; 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), %eax562; X86-AVX512-WIN-NEXT: movl %ebp, %esp563; X86-AVX512-WIN-NEXT: popl %ebp564; X86-AVX512-WIN-NEXT: retl565;566; X86-AVX512-LIN-LABEL: x_to_s32:567; X86-AVX512-LIN: # %bb.0:568; X86-AVX512-LIN-NEXT: pushl %eax569; X86-AVX512-LIN-NEXT: fldt {{[0-9]+}}(%esp)570; X86-AVX512-LIN-NEXT: fisttpl (%esp)571; X86-AVX512-LIN-NEXT: movl (%esp), %eax572; X86-AVX512-LIN-NEXT: popl %ecx573; X86-AVX512-LIN-NEXT: retl574;575; X64-AVX512-WIN-LABEL: x_to_s32:576; X64-AVX512-WIN: # %bb.0:577; X64-AVX512-WIN-NEXT: pushq %rax578; X64-AVX512-WIN-NEXT: fldt (%rcx)579; X64-AVX512-WIN-NEXT: fisttpl {{[0-9]+}}(%rsp)580; X64-AVX512-WIN-NEXT: movl {{[0-9]+}}(%rsp), %eax581; X64-AVX512-WIN-NEXT: popq %rcx582; X64-AVX512-WIN-NEXT: retq583;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), %eax589; X64-AVX512-LIN-NEXT: retq590;591; X86-SSE3-WIN-LABEL: x_to_s32:592; X86-SSE3-WIN: # %bb.0:593; X86-SSE3-WIN-NEXT: pushl %ebp594; X86-SSE3-WIN-NEXT: movl %esp, %ebp595; X86-SSE3-WIN-NEXT: andl $-16, %esp596; X86-SSE3-WIN-NEXT: subl $16, %esp597; 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), %eax600; X86-SSE3-WIN-NEXT: movl %ebp, %esp601; X86-SSE3-WIN-NEXT: popl %ebp602; X86-SSE3-WIN-NEXT: retl603;604; X86-SSE3-LIN-LABEL: x_to_s32:605; X86-SSE3-LIN: # %bb.0:606; X86-SSE3-LIN-NEXT: pushl %eax607; X86-SSE3-LIN-NEXT: fldt {{[0-9]+}}(%esp)608; X86-SSE3-LIN-NEXT: fisttpl (%esp)609; X86-SSE3-LIN-NEXT: movl (%esp), %eax610; X86-SSE3-LIN-NEXT: popl %ecx611; X86-SSE3-LIN-NEXT: retl612;613; X64-SSE3-WIN-LABEL: x_to_s32:614; X64-SSE3-WIN: # %bb.0:615; X64-SSE3-WIN-NEXT: pushq %rax616; X64-SSE3-WIN-NEXT: fldt (%rcx)617; X64-SSE3-WIN-NEXT: fisttpl {{[0-9]+}}(%rsp)618; X64-SSE3-WIN-NEXT: movl {{[0-9]+}}(%rsp), %eax619; X64-SSE3-WIN-NEXT: popq %rcx620; X64-SSE3-WIN-NEXT: retq621;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), %eax627; X64-SSE3-LIN-NEXT: retq628;629; X86-SSE2-WIN-LABEL: x_to_s32:630; X86-SSE2-WIN: # %bb.0:631; X86-SSE2-WIN-NEXT: pushl %ebp632; X86-SSE2-WIN-NEXT: movl %esp, %ebp633; X86-SSE2-WIN-NEXT: andl $-16, %esp634; X86-SSE2-WIN-NEXT: subl $16, %esp635; X86-SSE2-WIN-NEXT: fldt 8(%ebp)636; X86-SSE2-WIN-NEXT: fnstcw (%esp)637; X86-SSE2-WIN-NEXT: movzwl (%esp), %eax638; X86-SSE2-WIN-NEXT: orl $3072, %eax # imm = 0xC00639; 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), %eax644; X86-SSE2-WIN-NEXT: movl %ebp, %esp645; X86-SSE2-WIN-NEXT: popl %ebp646; X86-SSE2-WIN-NEXT: retl647;648; X86-SSE2-LIN-LABEL: x_to_s32:649; X86-SSE2-LIN: # %bb.0:650; X86-SSE2-LIN-NEXT: subl $8, %esp651; X86-SSE2-LIN-NEXT: fldt {{[0-9]+}}(%esp)652; X86-SSE2-LIN-NEXT: fnstcw (%esp)653; X86-SSE2-LIN-NEXT: movzwl (%esp), %eax654; X86-SSE2-LIN-NEXT: orl $3072, %eax # imm = 0xC00655; 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), %eax660; X86-SSE2-LIN-NEXT: addl $8, %esp661; X86-SSE2-LIN-NEXT: retl662;663; X64-SSE2-WIN-LABEL: x_to_s32:664; X64-SSE2-WIN: # %bb.0:665; X64-SSE2-WIN-NEXT: pushq %rax666; X64-SSE2-WIN-NEXT: fldt (%rcx)667; X64-SSE2-WIN-NEXT: fnstcw (%rsp)668; X64-SSE2-WIN-NEXT: movzwl (%rsp), %eax669; X64-SSE2-WIN-NEXT: orl $3072, %eax # imm = 0xC00670; 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), %eax675; X64-SSE2-WIN-NEXT: popq %rcx676; X64-SSE2-WIN-NEXT: retq677;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), %eax683; X64-SSE2-LIN-NEXT: orl $3072, %eax # imm = 0xC00684; 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), %eax689; X64-SSE2-LIN-NEXT: retq690;691; X86-SSE1-WIN-LABEL: x_to_s32:692; X86-SSE1-WIN: # %bb.0:693; X86-SSE1-WIN-NEXT: pushl %ebp694; X86-SSE1-WIN-NEXT: movl %esp, %ebp695; X86-SSE1-WIN-NEXT: andl $-16, %esp696; X86-SSE1-WIN-NEXT: subl $16, %esp697; X86-SSE1-WIN-NEXT: fldt 8(%ebp)698; X86-SSE1-WIN-NEXT: fnstcw (%esp)699; X86-SSE1-WIN-NEXT: movzwl (%esp), %eax700; X86-SSE1-WIN-NEXT: orl $3072, %eax # imm = 0xC00701; 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), %eax706; X86-SSE1-WIN-NEXT: movl %ebp, %esp707; X86-SSE1-WIN-NEXT: popl %ebp708; X86-SSE1-WIN-NEXT: retl709;710; X86-SSE1-LIN-LABEL: x_to_s32:711; X86-SSE1-LIN: # %bb.0:712; X86-SSE1-LIN-NEXT: subl $8, %esp713; X86-SSE1-LIN-NEXT: fldt {{[0-9]+}}(%esp)714; X86-SSE1-LIN-NEXT: fnstcw (%esp)715; X86-SSE1-LIN-NEXT: movzwl (%esp), %eax716; X86-SSE1-LIN-NEXT: orl $3072, %eax # imm = 0xC00717; 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), %eax722; X86-SSE1-LIN-NEXT: addl $8, %esp723; X86-SSE1-LIN-NEXT: retl724;725; X87-WIN-LABEL: x_to_s32:726; X87-WIN: # %bb.0:727; X87-WIN-NEXT: pushl %ebp728; X87-WIN-NEXT: movl %esp, %ebp729; X87-WIN-NEXT: andl $-16, %esp730; X87-WIN-NEXT: subl $16, %esp731; X87-WIN-NEXT: fldt 8(%ebp)732; X87-WIN-NEXT: fnstcw (%esp)733; X87-WIN-NEXT: movzwl (%esp), %eax734; X87-WIN-NEXT: orl $3072, %eax # imm = 0xC00735; 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), %eax740; X87-WIN-NEXT: movl %ebp, %esp741; X87-WIN-NEXT: popl %ebp742; X87-WIN-NEXT: retl743;744; X87-LIN-LABEL: x_to_s32:745; X87-LIN: # %bb.0:746; X87-LIN-NEXT: subl $8, %esp747; X87-LIN-NEXT: fldt {{[0-9]+}}(%esp)748; X87-LIN-NEXT: fnstcw (%esp)749; X87-LIN-NEXT: movzwl (%esp), %eax750; X87-LIN-NEXT: orl $3072, %eax # imm = 0xC00751; 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), %eax756; X87-LIN-NEXT: addl $8, %esp757; X87-LIN-NEXT: retl758 %r = fptosi x86_fp80 %a to i32759 ret i32 %r760}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: pushl %ebp766; X86-AVX512-WIN-NEXT: movl %esp, %ebp767; X86-AVX512-WIN-NEXT: andl $-16, %esp768; X86-AVX512-WIN-NEXT: subl $32, %esp769; X86-AVX512-WIN-NEXT: vmovups 8(%ebp), %xmm0770; X86-AVX512-WIN-NEXT: vmovups %xmm0, (%esp)771; X86-AVX512-WIN-NEXT: calll ___fixunstfsi772; X86-AVX512-WIN-NEXT: movl %ebp, %esp773; X86-AVX512-WIN-NEXT: popl %ebp774; X86-AVX512-WIN-NEXT: retl775;776; X86-AVX512-LIN-LABEL: t_to_u32:777; X86-AVX512-LIN: # %bb.0:778; X86-AVX512-LIN-NEXT: subl $28, %esp779; X86-AVX512-LIN-NEXT: vmovaps {{[0-9]+}}(%esp), %xmm0780; X86-AVX512-LIN-NEXT: vmovups %xmm0, (%esp)781; X86-AVX512-LIN-NEXT: calll __fixunstfsi782; X86-AVX512-LIN-NEXT: addl $28, %esp783; X86-AVX512-LIN-NEXT: retl784;785; X64-AVX512-WIN-LABEL: t_to_u32:786; X64-AVX512-WIN: # %bb.0:787; X64-AVX512-WIN-NEXT: subq $56, %rsp788; X64-AVX512-WIN-NEXT: vmovaps (%rcx), %xmm0789; X64-AVX512-WIN-NEXT: vmovaps %xmm0, {{[0-9]+}}(%rsp)790; X64-AVX512-WIN-NEXT: leaq {{[0-9]+}}(%rsp), %rcx791; X64-AVX512-WIN-NEXT: callq __fixunstfsi792; X64-AVX512-WIN-NEXT: addq $56, %rsp793; X64-AVX512-WIN-NEXT: retq794;795; X64-AVX512-LIN-LABEL: t_to_u32:796; X64-AVX512-LIN: # %bb.0:797; X64-AVX512-LIN-NEXT: pushq %rax798; X64-AVX512-LIN-NEXT: callq __fixunstfsi@PLT799; X64-AVX512-LIN-NEXT: popq %rcx800; X64-AVX512-LIN-NEXT: retq801;802; X86-SSE-WIN-LABEL: t_to_u32:803; X86-SSE-WIN: # %bb.0:804; X86-SSE-WIN-NEXT: pushl %ebp805; X86-SSE-WIN-NEXT: movl %esp, %ebp806; X86-SSE-WIN-NEXT: andl $-16, %esp807; X86-SSE-WIN-NEXT: subl $16, %esp808; X86-SSE-WIN-NEXT: pushl 20(%ebp)809; X86-SSE-WIN-NEXT: pushl 16(%ebp)810; X86-SSE-WIN-NEXT: pushl 12(%ebp)811; X86-SSE-WIN-NEXT: pushl 8(%ebp)812; X86-SSE-WIN-NEXT: calll ___fixunstfsi813; X86-SSE-WIN-NEXT: addl $16, %esp814; X86-SSE-WIN-NEXT: movl %ebp, %esp815; X86-SSE-WIN-NEXT: popl %ebp816; X86-SSE-WIN-NEXT: retl817;818; X86-SSE-LIN-LABEL: t_to_u32:819; X86-SSE-LIN: # %bb.0:820; X86-SSE-LIN-NEXT: subl $12, %esp821; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp)822; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp)823; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp)824; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp)825; X86-SSE-LIN-NEXT: calll __fixunstfsi826; X86-SSE-LIN-NEXT: addl $28, %esp827; X86-SSE-LIN-NEXT: retl828;829; X64-SSE-WIN-LABEL: t_to_u32:830; X64-SSE-WIN: # %bb.0:831; X64-SSE-WIN-NEXT: subq $56, %rsp832; X64-SSE-WIN-NEXT: movaps (%rcx), %xmm0833; X64-SSE-WIN-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)834; X64-SSE-WIN-NEXT: leaq {{[0-9]+}}(%rsp), %rcx835; X64-SSE-WIN-NEXT: callq __fixunstfsi836; X64-SSE-WIN-NEXT: addq $56, %rsp837; X64-SSE-WIN-NEXT: retq838;839; X64-SSE-LIN-LABEL: t_to_u32:840; X64-SSE-LIN: # %bb.0:841; X64-SSE-LIN-NEXT: pushq %rax842; X64-SSE-LIN-NEXT: callq __fixunstfsi@PLT843; X64-SSE-LIN-NEXT: popq %rcx844; X64-SSE-LIN-NEXT: retq845;846; X87-WIN-LABEL: t_to_u32:847; X87-WIN: # %bb.0:848; X87-WIN-NEXT: pushl %ebp849; X87-WIN-NEXT: movl %esp, %ebp850; X87-WIN-NEXT: andl $-16, %esp851; X87-WIN-NEXT: subl $16, %esp852; X87-WIN-NEXT: pushl 20(%ebp)853; X87-WIN-NEXT: pushl 16(%ebp)854; X87-WIN-NEXT: pushl 12(%ebp)855; X87-WIN-NEXT: pushl 8(%ebp)856; X87-WIN-NEXT: calll ___fixunstfsi857; X87-WIN-NEXT: addl $16, %esp858; X87-WIN-NEXT: movl %ebp, %esp859; X87-WIN-NEXT: popl %ebp860; X87-WIN-NEXT: retl861;862; X87-LIN-LABEL: t_to_u32:863; X87-LIN: # %bb.0:864; X87-LIN-NEXT: subl $12, %esp865; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp)866; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp)867; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp)868; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp)869; X87-LIN-NEXT: calll __fixunstfsi870; X87-LIN-NEXT: addl $28, %esp871; X87-LIN-NEXT: retl872 %r = fptoui fp128 %a to i32873 ret i32 %r874}875 876define i32 @t_to_s32(fp128 %a) nounwind {877; X86-AVX512-WIN-LABEL: t_to_s32:878; X86-AVX512-WIN: # %bb.0:879; X86-AVX512-WIN-NEXT: pushl %ebp880; X86-AVX512-WIN-NEXT: movl %esp, %ebp881; X86-AVX512-WIN-NEXT: andl $-16, %esp882; X86-AVX512-WIN-NEXT: subl $32, %esp883; X86-AVX512-WIN-NEXT: vmovups 8(%ebp), %xmm0884; X86-AVX512-WIN-NEXT: vmovups %xmm0, (%esp)885; X86-AVX512-WIN-NEXT: calll ___fixtfsi886; X86-AVX512-WIN-NEXT: movl %ebp, %esp887; X86-AVX512-WIN-NEXT: popl %ebp888; X86-AVX512-WIN-NEXT: retl889;890; X86-AVX512-LIN-LABEL: t_to_s32:891; X86-AVX512-LIN: # %bb.0:892; X86-AVX512-LIN-NEXT: subl $28, %esp893; X86-AVX512-LIN-NEXT: vmovaps {{[0-9]+}}(%esp), %xmm0894; X86-AVX512-LIN-NEXT: vmovups %xmm0, (%esp)895; X86-AVX512-LIN-NEXT: calll __fixtfsi896; X86-AVX512-LIN-NEXT: addl $28, %esp897; X86-AVX512-LIN-NEXT: retl898;899; X64-AVX512-WIN-LABEL: t_to_s32:900; X64-AVX512-WIN: # %bb.0:901; X64-AVX512-WIN-NEXT: subq $56, %rsp902; X64-AVX512-WIN-NEXT: vmovaps (%rcx), %xmm0903; X64-AVX512-WIN-NEXT: vmovaps %xmm0, {{[0-9]+}}(%rsp)904; X64-AVX512-WIN-NEXT: leaq {{[0-9]+}}(%rsp), %rcx905; X64-AVX512-WIN-NEXT: callq __fixtfsi906; X64-AVX512-WIN-NEXT: addq $56, %rsp907; X64-AVX512-WIN-NEXT: retq908;909; X64-AVX512-LIN-LABEL: t_to_s32:910; X64-AVX512-LIN: # %bb.0:911; X64-AVX512-LIN-NEXT: pushq %rax912; X64-AVX512-LIN-NEXT: callq __fixtfsi@PLT913; X64-AVX512-LIN-NEXT: popq %rcx914; X64-AVX512-LIN-NEXT: retq915;916; X86-SSE-WIN-LABEL: t_to_s32:917; X86-SSE-WIN: # %bb.0:918; X86-SSE-WIN-NEXT: pushl %ebp919; X86-SSE-WIN-NEXT: movl %esp, %ebp920; X86-SSE-WIN-NEXT: andl $-16, %esp921; X86-SSE-WIN-NEXT: subl $16, %esp922; X86-SSE-WIN-NEXT: pushl 20(%ebp)923; X86-SSE-WIN-NEXT: pushl 16(%ebp)924; X86-SSE-WIN-NEXT: pushl 12(%ebp)925; X86-SSE-WIN-NEXT: pushl 8(%ebp)926; X86-SSE-WIN-NEXT: calll ___fixtfsi927; X86-SSE-WIN-NEXT: addl $16, %esp928; X86-SSE-WIN-NEXT: movl %ebp, %esp929; X86-SSE-WIN-NEXT: popl %ebp930; X86-SSE-WIN-NEXT: retl931;932; X86-SSE-LIN-LABEL: t_to_s32:933; X86-SSE-LIN: # %bb.0:934; X86-SSE-LIN-NEXT: subl $12, %esp935; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp)936; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp)937; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp)938; X86-SSE-LIN-NEXT: pushl {{[0-9]+}}(%esp)939; X86-SSE-LIN-NEXT: calll __fixtfsi940; X86-SSE-LIN-NEXT: addl $28, %esp941; X86-SSE-LIN-NEXT: retl942;943; X64-SSE-WIN-LABEL: t_to_s32:944; X64-SSE-WIN: # %bb.0:945; X64-SSE-WIN-NEXT: subq $56, %rsp946; X64-SSE-WIN-NEXT: movaps (%rcx), %xmm0947; X64-SSE-WIN-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)948; X64-SSE-WIN-NEXT: leaq {{[0-9]+}}(%rsp), %rcx949; X64-SSE-WIN-NEXT: callq __fixtfsi950; X64-SSE-WIN-NEXT: addq $56, %rsp951; X64-SSE-WIN-NEXT: retq952;953; X64-SSE-LIN-LABEL: t_to_s32:954; X64-SSE-LIN: # %bb.0:955; X64-SSE-LIN-NEXT: pushq %rax956; X64-SSE-LIN-NEXT: callq __fixtfsi@PLT957; X64-SSE-LIN-NEXT: popq %rcx958; X64-SSE-LIN-NEXT: retq959;960; X87-WIN-LABEL: t_to_s32:961; X87-WIN: # %bb.0:962; X87-WIN-NEXT: pushl %ebp963; X87-WIN-NEXT: movl %esp, %ebp964; X87-WIN-NEXT: andl $-16, %esp965; X87-WIN-NEXT: subl $16, %esp966; X87-WIN-NEXT: pushl 20(%ebp)967; X87-WIN-NEXT: pushl 16(%ebp)968; X87-WIN-NEXT: pushl 12(%ebp)969; X87-WIN-NEXT: pushl 8(%ebp)970; X87-WIN-NEXT: calll ___fixtfsi971; X87-WIN-NEXT: addl $16, %esp972; X87-WIN-NEXT: movl %ebp, %esp973; X87-WIN-NEXT: popl %ebp974; X87-WIN-NEXT: retl975;976; X87-LIN-LABEL: t_to_s32:977; X87-LIN: # %bb.0:978; X87-LIN-NEXT: subl $12, %esp979; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp)980; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp)981; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp)982; X87-LIN-NEXT: pushl {{[0-9]+}}(%esp)983; X87-LIN-NEXT: calll __fixtfsi984; X87-LIN-NEXT: addl $28, %esp985; X87-LIN-NEXT: retl986 %r = fptosi fp128 %a to i32987 ret i32 %r988}989