289 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=-sse -verify-machineinstrs < %s | FileCheck %s -check-prefix=X86-NOSSE3; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+sse -verify-machineinstrs < %s | FileCheck %s -check-prefix=X86-SSE4; RUN: llc -mtriple=x86_64-unknown-linux-gnu -verify-machineinstrs < %s | FileCheck %s -check-prefix=X645 6declare void @llvm.set.rounding(i32 %x)7declare i256 @llvm.get.fpenv.i256()8declare void @llvm.set.fpenv.i256(i256 %fpenv)9declare void @llvm.reset.fpenv()10declare i32 @llvm.get.fpmode.i32()11declare void @llvm.set.fpmode.i32(i32 %fpmode)12declare void @llvm.reset.fpmode()13 14define void @get_fpenv_01(ptr %ptr) #0 {15; X86-NOSSE-LABEL: get_fpenv_01:16; X86-NOSSE: # %bb.0: # %entry17; X86-NOSSE-NEXT: subl $60, %esp18; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax19; X86-NOSSE-NEXT: movl %eax, (%esp)20; X86-NOSSE-NEXT: calll fegetenv21; X86-NOSSE-NEXT: addl $60, %esp22; X86-NOSSE-NEXT: retl23;24; X86-SSE-LABEL: get_fpenv_01:25; X86-SSE: # %bb.0: # %entry26; X86-SSE-NEXT: subl $60, %esp27; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax28; X86-SSE-NEXT: movl %eax, (%esp)29; X86-SSE-NEXT: calll fegetenv30; X86-SSE-NEXT: addl $60, %esp31; X86-SSE-NEXT: retl32;33; X64-LABEL: get_fpenv_01:34; X64: # %bb.0: # %entry35; X64-NEXT: subq $40, %rsp36; X64-NEXT: callq fegetenv@PLT37; X64-NEXT: addq $40, %rsp38; X64-NEXT: retq39entry:40 %env = call i256 @llvm.get.fpenv.i256()41 store i256 %env, ptr %ptr42 ret void43}44 45define void @get_fpenv_01_native(ptr %ptr) nounwind {46; X86-NOSSE-LABEL: get_fpenv_01_native:47; X86-NOSSE: # %bb.0: # %entry48; X86-NOSSE-NEXT: subl $44, %esp49; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax50; X86-NOSSE-NEXT: fnstenv (%eax)51; X86-NOSSE-NEXT: fldenv (%eax)52; X86-NOSSE-NEXT: addl $44, %esp53; X86-NOSSE-NEXT: retl54;55; X86-SSE-LABEL: get_fpenv_01_native:56; X86-SSE: # %bb.0: # %entry57; X86-SSE-NEXT: subl $44, %esp58; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax59; X86-SSE-NEXT: fnstenv (%eax)60; X86-SSE-NEXT: fldenv (%eax)61; X86-SSE-NEXT: stmxcsr 28(%eax)62; X86-SSE-NEXT: addl $44, %esp63; X86-SSE-NEXT: retl64;65; X64-LABEL: get_fpenv_01_native:66; X64: # %bb.0: # %entry67; X64-NEXT: fnstenv (%rdi)68; X64-NEXT: fldenv (%rdi)69; X64-NEXT: stmxcsr 28(%rdi)70; X64-NEXT: retq71entry:72 %env = call i256 @llvm.get.fpenv.i256()73 store i256 %env, ptr %ptr74 ret void75}76 77define void @set_fpenv_01(ptr %ptr) #0 {78; X86-NOSSE-LABEL: set_fpenv_01:79; X86-NOSSE: # %bb.0: # %entry80; X86-NOSSE-NEXT: subl $60, %esp81; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax82; X86-NOSSE-NEXT: movl %eax, (%esp)83; X86-NOSSE-NEXT: calll fesetenv84; X86-NOSSE-NEXT: addl $60, %esp85; X86-NOSSE-NEXT: retl86;87; X86-SSE-LABEL: set_fpenv_01:88; X86-SSE: # %bb.0: # %entry89; X86-SSE-NEXT: subl $60, %esp90; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax91; X86-SSE-NEXT: movl %eax, (%esp)92; X86-SSE-NEXT: calll fesetenv93; X86-SSE-NEXT: addl $60, %esp94; X86-SSE-NEXT: retl95;96; X64-LABEL: set_fpenv_01:97; X64: # %bb.0: # %entry98; X64-NEXT: subq $40, %rsp99; X64-NEXT: callq fesetenv@PLT100; X64-NEXT: addq $40, %rsp101; X64-NEXT: retq102entry:103 %env = load i256, ptr %ptr104 call void @llvm.set.fpenv.i256(i256 %env)105 ret void106}107 108define void @set_fpenv_01_native(ptr %ptr) nounwind {109; X86-NOSSE-LABEL: set_fpenv_01_native:110; X86-NOSSE: # %bb.0: # %entry111; X86-NOSSE-NEXT: subl $44, %esp112; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax113; X86-NOSSE-NEXT: fldenv (%eax)114; X86-NOSSE-NEXT: addl $44, %esp115; X86-NOSSE-NEXT: retl116;117; X86-SSE-LABEL: set_fpenv_01_native:118; X86-SSE: # %bb.0: # %entry119; X86-SSE-NEXT: subl $44, %esp120; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax121; X86-SSE-NEXT: fldenv (%eax)122; X86-SSE-NEXT: ldmxcsr 28(%eax)123; X86-SSE-NEXT: addl $44, %esp124; X86-SSE-NEXT: retl125;126; X64-LABEL: set_fpenv_01_native:127; X64: # %bb.0: # %entry128; X64-NEXT: fldenv (%rdi)129; X64-NEXT: ldmxcsr 28(%rdi)130; X64-NEXT: retq131entry:132 %env = load i256, ptr %ptr133 call void @llvm.set.fpenv.i256(i256 %env)134 ret void135}136 137define void @reset_fpenv_01() #0 {138; X86-NOSSE-LABEL: reset_fpenv_01:139; X86-NOSSE: # %bb.0: # %entry140; X86-NOSSE-NEXT: subl $12, %esp141; X86-NOSSE-NEXT: movl $-1, (%esp)142; X86-NOSSE-NEXT: calll fesetenv143; X86-NOSSE-NEXT: addl $12, %esp144; X86-NOSSE-NEXT: retl145;146; X86-SSE-LABEL: reset_fpenv_01:147; X86-SSE: # %bb.0: # %entry148; X86-SSE-NEXT: subl $12, %esp149; X86-SSE-NEXT: movl $-1, (%esp)150; X86-SSE-NEXT: calll fesetenv151; X86-SSE-NEXT: addl $12, %esp152; X86-SSE-NEXT: retl153;154; X64-LABEL: reset_fpenv_01:155; X64: # %bb.0: # %entry156; X64-NEXT: pushq %rax157; X64-NEXT: movq $-1, %rdi158; X64-NEXT: callq fesetenv@PLT159; X64-NEXT: popq %rax160; X64-NEXT: retq161entry:162 call void @llvm.reset.fpenv()163 ret void164}165 166define void @reset_fpenv_01_native() nounwind {167; X86-NOSSE-LABEL: reset_fpenv_01_native:168; X86-NOSSE: # %bb.0: # %entry169; X86-NOSSE-NEXT: fldenv {{\.?LCPI[0-9]+_[0-9]+}}170; X86-NOSSE-NEXT: retl171;172; X86-SSE-LABEL: reset_fpenv_01_native:173; X86-SSE: # %bb.0: # %entry174; X86-SSE-NEXT: fldenv {{\.?LCPI[0-9]+_[0-9]+}}175; X86-SSE-NEXT: ldmxcsr {{\.?LCPI[0-9]+_[0-9]+}}+28176; X86-SSE-NEXT: retl177;178; X64-LABEL: reset_fpenv_01_native:179; X64: # %bb.0: # %entry180; X64-NEXT: fldenv {{\.?LCPI[0-9]+_[0-9]+}}(%rip)181; X64-NEXT: ldmxcsr {{\.?LCPI[0-9]+_[0-9]+}}+28(%rip)182; X64-NEXT: retq183entry:184 call void @llvm.reset.fpenv()185 ret void186}187 188define i32 @func_get_fpmode() #0 {189; X86-NOSSE-LABEL: func_get_fpmode:190; X86-NOSSE: # %bb.0: # %entry191; X86-NOSSE-NEXT: subl $12, %esp192; X86-NOSSE-NEXT: leal {{[0-9]+}}(%esp), %eax193; X86-NOSSE-NEXT: movl %eax, (%esp)194; X86-NOSSE-NEXT: calll fegetmode195; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax196; X86-NOSSE-NEXT: addl $12, %esp197; X86-NOSSE-NEXT: retl198;199; X86-SSE-LABEL: func_get_fpmode:200; X86-SSE: # %bb.0: # %entry201; X86-SSE-NEXT: subl $12, %esp202; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax203; X86-SSE-NEXT: movl %eax, (%esp)204; X86-SSE-NEXT: calll fegetmode205; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax206; X86-SSE-NEXT: addl $12, %esp207; X86-SSE-NEXT: retl208;209; X64-LABEL: func_get_fpmode:210; X64: # %bb.0: # %entry211; X64-NEXT: pushq %rax212; X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi213; X64-NEXT: callq fegetmode@PLT214; X64-NEXT: movl {{[0-9]+}}(%rsp), %eax215; X64-NEXT: popq %rcx216; X64-NEXT: retq217entry:218 %fpmode = call i32 @llvm.get.fpmode.i32()219 ret i32 %fpmode220}221 222define void @func_set_fpmode(i32 %fpmode) #0 {223; X86-NOSSE-LABEL: func_set_fpmode:224; X86-NOSSE: # %bb.0: # %entry225; X86-NOSSE-NEXT: subl $12, %esp226; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax227; X86-NOSSE-NEXT: movl %eax, {{[0-9]+}}(%esp)228; X86-NOSSE-NEXT: leal {{[0-9]+}}(%esp), %eax229; X86-NOSSE-NEXT: movl %eax, (%esp)230; X86-NOSSE-NEXT: calll fesetmode231; X86-NOSSE-NEXT: addl $12, %esp232; X86-NOSSE-NEXT: retl233;234; X86-SSE-LABEL: func_set_fpmode:235; X86-SSE: # %bb.0: # %entry236; X86-SSE-NEXT: subl $12, %esp237; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax238; X86-SSE-NEXT: movl %eax, {{[0-9]+}}(%esp)239; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax240; X86-SSE-NEXT: movl %eax, (%esp)241; X86-SSE-NEXT: calll fesetmode242; X86-SSE-NEXT: addl $12, %esp243; X86-SSE-NEXT: retl244;245; X64-LABEL: func_set_fpmode:246; X64: # %bb.0: # %entry247; X64-NEXT: pushq %rax248; X64-NEXT: movl %edi, {{[0-9]+}}(%rsp)249; X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi250; X64-NEXT: callq fesetmode@PLT251; X64-NEXT: popq %rax252; X64-NEXT: retq253entry:254 call void @llvm.set.fpmode.i32(i32 %fpmode)255 ret void256}257 258 259define void @func_reset() #0 {260; X86-NOSSE-LABEL: func_reset:261; X86-NOSSE: # %bb.0: # %entry262; X86-NOSSE-NEXT: subl $12, %esp263; X86-NOSSE-NEXT: movl $-1, (%esp)264; X86-NOSSE-NEXT: calll fesetmode265; X86-NOSSE-NEXT: addl $12, %esp266; X86-NOSSE-NEXT: retl267;268; X86-SSE-LABEL: func_reset:269; X86-SSE: # %bb.0: # %entry270; X86-SSE-NEXT: subl $12, %esp271; X86-SSE-NEXT: movl $-1, (%esp)272; X86-SSE-NEXT: calll fesetmode273; X86-SSE-NEXT: addl $12, %esp274; X86-SSE-NEXT: retl275;276; X64-LABEL: func_reset:277; X64: # %bb.0: # %entry278; X64-NEXT: pushq %rax279; X64-NEXT: movq $-1, %rdi280; X64-NEXT: callq fesetmode@PLT281; X64-NEXT: popq %rax282; X64-NEXT: retq283entry:284 call void @llvm.reset.fpmode()285 ret void286}287 288attributes #0 = { nounwind "use-soft-float"="true" }289