diff --git a/llvm/test/CodeGen/X86/fpenv.ll b/llvm/test/CodeGen/X86/fpenv.ll index c79e19f07cda5..77eaaa1ca08db 100644 --- a/llvm/test/CodeGen/X86/fpenv.ll +++ b/llvm/test/CodeGen/X86/fpenv.ll @@ -11,244 +11,6 @@ declare i32 @llvm.get.fpmode.i32() declare void @llvm.set.fpmode.i32(i32 %fpmode) declare void @llvm.reset.fpmode() -define void @func_01() nounwind { -; X86-NOSSE-LABEL: func_01: -; X86-NOSSE: # %bb.0: -; X86-NOSSE-NEXT: pushl %eax -; X86-NOSSE-NEXT: fnstcw (%esp) -; X86-NOSSE-NEXT: orb $12, {{[0-9]+}}(%esp) -; X86-NOSSE-NEXT: fldcw (%esp) -; X86-NOSSE-NEXT: popl %eax -; X86-NOSSE-NEXT: retl -; -; X86-SSE-LABEL: func_01: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: pushl %eax -; X86-SSE-NEXT: fnstcw (%esp) -; X86-SSE-NEXT: orb $12, {{[0-9]+}}(%esp) -; X86-SSE-NEXT: fldcw (%esp) -; X86-SSE-NEXT: stmxcsr (%esp) -; X86-SSE-NEXT: orb $96, {{[0-9]+}}(%esp) -; X86-SSE-NEXT: ldmxcsr (%esp) -; X86-SSE-NEXT: popl %eax -; X86-SSE-NEXT: retl -; -; X64-LABEL: func_01: -; X64: # %bb.0: -; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) -; X64-NEXT: orb $12, -{{[0-9]+}}(%rsp) -; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) -; X64-NEXT: stmxcsr -{{[0-9]+}}(%rsp) -; X64-NEXT: orb $96, -{{[0-9]+}}(%rsp) -; X64-NEXT: ldmxcsr -{{[0-9]+}}(%rsp) -; X64-NEXT: retq - call void @llvm.set.rounding(i32 0) ; TowardZero (CW[11-10] = 11) - ret void -} - -define void @func_02() nounwind { -; X86-NOSSE-LABEL: func_02: -; X86-NOSSE: # %bb.0: -; X86-NOSSE-NEXT: pushl %eax -; X86-NOSSE-NEXT: fnstcw (%esp) -; X86-NOSSE-NEXT: andb $-13, {{[0-9]+}}(%esp) -; X86-NOSSE-NEXT: fldcw (%esp) -; X86-NOSSE-NEXT: popl %eax -; X86-NOSSE-NEXT: retl -; -; X86-SSE-LABEL: func_02: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: pushl %eax -; X86-SSE-NEXT: fnstcw (%esp) -; X86-SSE-NEXT: andb $-13, {{[0-9]+}}(%esp) -; X86-SSE-NEXT: fldcw (%esp) -; X86-SSE-NEXT: stmxcsr (%esp) -; X86-SSE-NEXT: andb $-97, {{[0-9]+}}(%esp) -; X86-SSE-NEXT: ldmxcsr (%esp) -; X86-SSE-NEXT: popl %eax -; X86-SSE-NEXT: retl -; -; X64-LABEL: func_02: -; X64: # %bb.0: -; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) -; X64-NEXT: andb $-13, -{{[0-9]+}}(%rsp) -; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) -; X64-NEXT: stmxcsr -{{[0-9]+}}(%rsp) -; X64-NEXT: andb $-97, -{{[0-9]+}}(%rsp) -; X64-NEXT: ldmxcsr -{{[0-9]+}}(%rsp) -; X64-NEXT: retq - call void @llvm.set.rounding(i32 1) ; ToNearestTiesToEven (CW[11-10] = 00) - ret void -} - -define void @func_03() nounwind { -; X86-NOSSE-LABEL: func_03: -; X86-NOSSE: # %bb.0: -; X86-NOSSE-NEXT: pushl %eax -; X86-NOSSE-NEXT: fnstcw (%esp) -; X86-NOSSE-NEXT: movl $-3073, %eax # imm = 0xF3FF -; X86-NOSSE-NEXT: andl (%esp), %eax -; X86-NOSSE-NEXT: orl $2048, %eax # imm = 0x800 -; X86-NOSSE-NEXT: movw %ax, (%esp) -; X86-NOSSE-NEXT: fldcw (%esp) -; X86-NOSSE-NEXT: popl %eax -; X86-NOSSE-NEXT: retl -; -; X86-SSE-LABEL: func_03: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: pushl %eax -; X86-SSE-NEXT: fnstcw (%esp) -; X86-SSE-NEXT: movl $-3073, %eax # imm = 0xF3FF -; X86-SSE-NEXT: andl (%esp), %eax -; X86-SSE-NEXT: orl $2048, %eax # imm = 0x800 -; X86-SSE-NEXT: movw %ax, (%esp) -; X86-SSE-NEXT: fldcw (%esp) -; X86-SSE-NEXT: stmxcsr (%esp) -; X86-SSE-NEXT: movl $-24577, %eax # imm = 0x9FFF -; X86-SSE-NEXT: andl (%esp), %eax -; X86-SSE-NEXT: orl $16384, %eax # imm = 0x4000 -; X86-SSE-NEXT: movl %eax, (%esp) -; X86-SSE-NEXT: ldmxcsr (%esp) -; X86-SSE-NEXT: popl %eax -; X86-SSE-NEXT: retl -; -; X64-LABEL: func_03: -; X64: # %bb.0: -; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) -; X64-NEXT: movl $-3073, %eax # imm = 0xF3FF -; X64-NEXT: andl -{{[0-9]+}}(%rsp), %eax -; X64-NEXT: orl $2048, %eax # imm = 0x800 -; X64-NEXT: movw %ax, -{{[0-9]+}}(%rsp) -; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) -; X64-NEXT: stmxcsr -{{[0-9]+}}(%rsp) -; X64-NEXT: movl $-24577, %eax # imm = 0x9FFF -; X64-NEXT: andl -{{[0-9]+}}(%rsp), %eax -; X64-NEXT: orl $16384, %eax # imm = 0x4000 -; X64-NEXT: movl %eax, -{{[0-9]+}}(%rsp) -; X64-NEXT: ldmxcsr -{{[0-9]+}}(%rsp) -; X64-NEXT: retq - call void @llvm.set.rounding(i32 2) ; Upward (CW[11-10] = 10) - ret void -} - -define void @func_04() nounwind { -; X86-NOSSE-LABEL: func_04: -; X86-NOSSE: # %bb.0: -; X86-NOSSE-NEXT: pushl %eax -; X86-NOSSE-NEXT: fnstcw (%esp) -; X86-NOSSE-NEXT: movl $-3073, %eax # imm = 0xF3FF -; X86-NOSSE-NEXT: andl (%esp), %eax -; X86-NOSSE-NEXT: orl $1024, %eax # imm = 0x400 -; X86-NOSSE-NEXT: movw %ax, (%esp) -; X86-NOSSE-NEXT: fldcw (%esp) -; X86-NOSSE-NEXT: popl %eax -; X86-NOSSE-NEXT: retl -; -; X86-SSE-LABEL: func_04: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: pushl %eax -; X86-SSE-NEXT: fnstcw (%esp) -; X86-SSE-NEXT: movl $-3073, %eax # imm = 0xF3FF -; X86-SSE-NEXT: andl (%esp), %eax -; X86-SSE-NEXT: orl $1024, %eax # imm = 0x400 -; X86-SSE-NEXT: movw %ax, (%esp) -; X86-SSE-NEXT: fldcw (%esp) -; X86-SSE-NEXT: stmxcsr (%esp) -; X86-SSE-NEXT: movl $-24577, %eax # imm = 0x9FFF -; X86-SSE-NEXT: andl (%esp), %eax -; X86-SSE-NEXT: orl $8192, %eax # imm = 0x2000 -; X86-SSE-NEXT: movl %eax, (%esp) -; X86-SSE-NEXT: ldmxcsr (%esp) -; X86-SSE-NEXT: popl %eax -; X86-SSE-NEXT: retl -; -; X64-LABEL: func_04: -; X64: # %bb.0: -; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) -; X64-NEXT: movl $-3073, %eax # imm = 0xF3FF -; X64-NEXT: andl -{{[0-9]+}}(%rsp), %eax -; X64-NEXT: orl $1024, %eax # imm = 0x400 -; X64-NEXT: movw %ax, -{{[0-9]+}}(%rsp) -; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) -; X64-NEXT: stmxcsr -{{[0-9]+}}(%rsp) -; X64-NEXT: movl $-24577, %eax # imm = 0x9FFF -; X64-NEXT: andl -{{[0-9]+}}(%rsp), %eax -; X64-NEXT: orl $8192, %eax # imm = 0x2000 -; X64-NEXT: movl %eax, -{{[0-9]+}}(%rsp) -; X64-NEXT: ldmxcsr -{{[0-9]+}}(%rsp) -; X64-NEXT: retq - call void @llvm.set.rounding(i32 3) ; Downward (CW[11-10] = 01) - ret void -} - -define void @func_05(i32 %x) nounwind { -; X86-NOSSE-LABEL: func_05: -; X86-NOSSE: # %bb.0: -; X86-NOSSE-NEXT: pushl %eax -; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-NOSSE-NEXT: leal 4(%eax,%eax), %ecx -; X86-NOSSE-NEXT: movl $201, %eax -; X86-NOSSE-NEXT: # kill: def $cl killed $cl killed $ecx -; X86-NOSSE-NEXT: shll %cl, %eax -; X86-NOSSE-NEXT: andl $3072, %eax # imm = 0xC00 -; X86-NOSSE-NEXT: fnstcw (%esp) -; X86-NOSSE-NEXT: movl $-3073, %ecx # imm = 0xF3FF -; X86-NOSSE-NEXT: andl (%esp), %ecx -; X86-NOSSE-NEXT: orl %eax, %ecx -; X86-NOSSE-NEXT: movw %cx, (%esp) -; X86-NOSSE-NEXT: fldcw (%esp) -; X86-NOSSE-NEXT: popl %eax -; X86-NOSSE-NEXT: retl -; -; X86-SSE-LABEL: func_05: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: pushl %eax -; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-SSE-NEXT: leal 4(%eax,%eax), %ecx -; X86-SSE-NEXT: movl $201, %eax -; X86-SSE-NEXT: # kill: def $cl killed $cl killed $ecx -; X86-SSE-NEXT: shll %cl, %eax -; X86-SSE-NEXT: andl $3072, %eax # imm = 0xC00 -; X86-SSE-NEXT: fnstcw (%esp) -; X86-SSE-NEXT: movl $-3073, %ecx # imm = 0xF3FF -; X86-SSE-NEXT: andl (%esp), %ecx -; X86-SSE-NEXT: orl %eax, %ecx -; X86-SSE-NEXT: movw %cx, (%esp) -; X86-SSE-NEXT: fldcw (%esp) -; X86-SSE-NEXT: stmxcsr (%esp) -; X86-SSE-NEXT: movl $-24577, %ecx # imm = 0x9FFF -; X86-SSE-NEXT: andl (%esp), %ecx -; X86-SSE-NEXT: leal (%ecx,%eax,8), %eax -; X86-SSE-NEXT: movl %eax, (%esp) -; X86-SSE-NEXT: ldmxcsr (%esp) -; X86-SSE-NEXT: popl %eax -; X86-SSE-NEXT: retl -; -; X64-LABEL: func_05: -; X64: # %bb.0: -; X64-NEXT: # kill: def $edi killed $edi def $rdi -; X64-NEXT: leal 4(%rdi,%rdi), %ecx -; X64-NEXT: movl $201, %eax -; X64-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-NEXT: shll %cl, %eax -; X64-NEXT: andl $3072, %eax # imm = 0xC00 -; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) -; X64-NEXT: movl $-3073, %ecx # imm = 0xF3FF -; X64-NEXT: andl -{{[0-9]+}}(%rsp), %ecx -; X64-NEXT: orl %eax, %ecx -; X64-NEXT: movw %cx, -{{[0-9]+}}(%rsp) -; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) -; X64-NEXT: stmxcsr -{{[0-9]+}}(%rsp) -; X64-NEXT: movl $-24577, %ecx # imm = 0x9FFF -; X64-NEXT: andl -{{[0-9]+}}(%rsp), %ecx -; X64-NEXT: leal (%rcx,%rax,8), %eax -; X64-NEXT: movl %eax, -{{[0-9]+}}(%rsp) -; X64-NEXT: ldmxcsr -{{[0-9]+}}(%rsp) -; X64-NEXT: retq - call void @llvm.set.rounding(i32 %x) ; Downward - ret void -} - define void @get_fpenv_01(ptr %ptr) #0 { ; X86-NOSSE-LABEL: get_fpenv_01: ; X86-NOSSE: # %bb.0: # %entry diff --git a/llvm/test/CodeGen/X86/isel-llvm.set.rounding.ll b/llvm/test/CodeGen/X86/isel-llvm.set.rounding.ll new file mode 100644 index 0000000000000..688add1e92ab1 --- /dev/null +++ b/llvm/test/CodeGen/X86/isel-llvm.set.rounding.ll @@ -0,0 +1,294 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=i686-- -mattr=-sse | FileCheck %s --check-prefixes=X86-NOSSE,SDAG-X86-NOSSE +; RUN: llc < %s -mtriple=i686-- -fast-isel -fast-isel-abort=1 -mattr=-sse | FileCheck %s --check-prefixes=X86-NOSSE,FASTISEL-X86-NOSSE +; RUN: llc < %s -mtriple=i686-- -global-isel -global-isel-abort=2 -mattr=-sse | FileCheck %s --check-prefixes=X86-NOSSE,GISEL-X86-NOSSE +; RUN: llc < %s -mtriple=x86_64-- -mattr=-sse | FileCheck %s --check-prefixes=X64-NOSSE,SDAG-X64-NOSSE +; RUN: llc < %s -mtriple=x86_64-- -fast-isel -fast-isel-abort=1 -mattr=-sse | FileCheck %s --check-prefixes=X64-NOSSE,FASTISEL-X64-NOSSE +; RUN: llc < %s -mtriple=x86_64-- -global-isel -global-isel-abort=2 -mattr=-sse | FileCheck %s --check-prefixes=X64-NOSSE,GISEL-X64-NOSSE +; RUN: llc < %s -mtriple=i686-- | FileCheck %s --check-prefixes=X86,SDAG-X86 +; RUN: llc < %s -mtriple=i686-- -fast-isel -fast-isel-abort=1 | FileCheck %s --check-prefixes=X86,FASTISEL-X86 +; RUN: llc < %s -mtriple=i686-- -global-isel -global-isel-abort=2 | FileCheck %s --check-prefixes=X86,GISEL-X86 +; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --check-prefixes=X64,SDAG-X64 +; RUN: llc < %s -mtriple=x86_64-- -fast-isel -fast-isel-abort=1 | FileCheck %s --check-prefixes=X64,FASTISEL-X64 +; RUN: llc < %s -mtriple=x86_64-- -global-isel -global-isel-abort=2 | FileCheck %s --check-prefixes=X64,GISEL-X64 + +declare void @llvm.set.rounding(i32 %x) + +define void @func_01() nounwind { +; X86-NOSSE-LABEL: func_01: +; X86-NOSSE: # %bb.0: +; X86-NOSSE-NEXT: pushl %eax +; X86-NOSSE-NEXT: fnstcw (%esp) +; X86-NOSSE-NEXT: orb $12, {{[0-9]+}}(%esp) +; X86-NOSSE-NEXT: fldcw (%esp) +; X86-NOSSE-NEXT: popl %eax +; X86-NOSSE-NEXT: retl +; +; X64-NOSSE-LABEL: func_01: +; X64-NOSSE: # %bb.0: +; X64-NOSSE-NEXT: fnstcw -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: orb $12, -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: fldcw -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: retq +; +; X86-LABEL: func_01: +; X86: # %bb.0: +; X86-NEXT: pushl %eax +; X86-NEXT: fnstcw (%esp) +; X86-NEXT: orb $12, {{[0-9]+}}(%esp) +; X86-NEXT: fldcw (%esp) +; X86-NEXT: popl %eax +; X86-NEXT: retl +; +; X64-LABEL: func_01: +; X64: # %bb.0: +; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) +; X64-NEXT: orb $12, -{{[0-9]+}}(%rsp) +; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) +; X64-NEXT: stmxcsr -{{[0-9]+}}(%rsp) +; X64-NEXT: orb $96, -{{[0-9]+}}(%rsp) +; X64-NEXT: ldmxcsr -{{[0-9]+}}(%rsp) +; X64-NEXT: retq + call void @llvm.set.rounding(i32 0) ; TowardZero (CW[11-10] = 11) + ret void +} + +define void @func_02() nounwind { +; X86-NOSSE-LABEL: func_02: +; X86-NOSSE: # %bb.0: +; X86-NOSSE-NEXT: pushl %eax +; X86-NOSSE-NEXT: fnstcw (%esp) +; X86-NOSSE-NEXT: andb $-13, {{[0-9]+}}(%esp) +; X86-NOSSE-NEXT: fldcw (%esp) +; X86-NOSSE-NEXT: popl %eax +; X86-NOSSE-NEXT: retl +; +; X64-NOSSE-LABEL: func_02: +; X64-NOSSE: # %bb.0: +; X64-NOSSE-NEXT: fnstcw -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: andb $-13, -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: fldcw -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: retq +; +; X86-LABEL: func_02: +; X86: # %bb.0: +; X86-NEXT: pushl %eax +; X86-NEXT: fnstcw (%esp) +; X86-NEXT: andb $-13, {{[0-9]+}}(%esp) +; X86-NEXT: fldcw (%esp) +; X86-NEXT: popl %eax +; X86-NEXT: retl +; +; X64-LABEL: func_02: +; X64: # %bb.0: +; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) +; X64-NEXT: andb $-13, -{{[0-9]+}}(%rsp) +; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) +; X64-NEXT: stmxcsr -{{[0-9]+}}(%rsp) +; X64-NEXT: andb $-97, -{{[0-9]+}}(%rsp) +; X64-NEXT: ldmxcsr -{{[0-9]+}}(%rsp) +; X64-NEXT: retq + call void @llvm.set.rounding(i32 1) ; ToNearestTiesToEven (CW[11-10] = 00) + ret void +} + +define void @func_03() nounwind { +; X86-NOSSE-LABEL: func_03: +; X86-NOSSE: # %bb.0: +; X86-NOSSE-NEXT: pushl %eax +; X86-NOSSE-NEXT: fnstcw (%esp) +; X86-NOSSE-NEXT: movl $-3073, %eax # imm = 0xF3FF +; X86-NOSSE-NEXT: andl (%esp), %eax +; X86-NOSSE-NEXT: orl $2048, %eax # imm = 0x800 +; X86-NOSSE-NEXT: movw %ax, (%esp) +; X86-NOSSE-NEXT: fldcw (%esp) +; X86-NOSSE-NEXT: popl %eax +; X86-NOSSE-NEXT: retl +; +; X64-NOSSE-LABEL: func_03: +; X64-NOSSE: # %bb.0: +; X64-NOSSE-NEXT: fnstcw -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: movl $-3073, %eax # imm = 0xF3FF +; X64-NOSSE-NEXT: andl -{{[0-9]+}}(%rsp), %eax +; X64-NOSSE-NEXT: orl $2048, %eax # imm = 0x800 +; X64-NOSSE-NEXT: movw %ax, -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: fldcw -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: retq +; +; X86-LABEL: func_03: +; X86: # %bb.0: +; X86-NEXT: pushl %eax +; X86-NEXT: fnstcw (%esp) +; X86-NEXT: movl $-3073, %eax # imm = 0xF3FF +; X86-NEXT: andl (%esp), %eax +; X86-NEXT: orl $2048, %eax # imm = 0x800 +; X86-NEXT: movw %ax, (%esp) +; X86-NEXT: fldcw (%esp) +; X86-NEXT: popl %eax +; X86-NEXT: retl +; +; X64-LABEL: func_03: +; X64: # %bb.0: +; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) +; X64-NEXT: movl $-3073, %eax # imm = 0xF3FF +; X64-NEXT: andl -{{[0-9]+}}(%rsp), %eax +; X64-NEXT: orl $2048, %eax # imm = 0x800 +; X64-NEXT: movw %ax, -{{[0-9]+}}(%rsp) +; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) +; X64-NEXT: stmxcsr -{{[0-9]+}}(%rsp) +; X64-NEXT: movl $-24577, %eax # imm = 0x9FFF +; X64-NEXT: andl -{{[0-9]+}}(%rsp), %eax +; X64-NEXT: orl $16384, %eax # imm = 0x4000 +; X64-NEXT: movl %eax, -{{[0-9]+}}(%rsp) +; X64-NEXT: ldmxcsr -{{[0-9]+}}(%rsp) +; X64-NEXT: retq + call void @llvm.set.rounding(i32 2) ; Upward (CW[11-10] = 10) + ret void +} + +define void @func_04() nounwind { +; X86-NOSSE-LABEL: func_04: +; X86-NOSSE: # %bb.0: +; X86-NOSSE-NEXT: pushl %eax +; X86-NOSSE-NEXT: fnstcw (%esp) +; X86-NOSSE-NEXT: movl $-3073, %eax # imm = 0xF3FF +; X86-NOSSE-NEXT: andl (%esp), %eax +; X86-NOSSE-NEXT: orl $1024, %eax # imm = 0x400 +; X86-NOSSE-NEXT: movw %ax, (%esp) +; X86-NOSSE-NEXT: fldcw (%esp) +; X86-NOSSE-NEXT: popl %eax +; X86-NOSSE-NEXT: retl +; +; X64-NOSSE-LABEL: func_04: +; X64-NOSSE: # %bb.0: +; X64-NOSSE-NEXT: fnstcw -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: movl $-3073, %eax # imm = 0xF3FF +; X64-NOSSE-NEXT: andl -{{[0-9]+}}(%rsp), %eax +; X64-NOSSE-NEXT: orl $1024, %eax # imm = 0x400 +; X64-NOSSE-NEXT: movw %ax, -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: fldcw -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: retq +; +; X86-LABEL: func_04: +; X86: # %bb.0: +; X86-NEXT: pushl %eax +; X86-NEXT: fnstcw (%esp) +; X86-NEXT: movl $-3073, %eax # imm = 0xF3FF +; X86-NEXT: andl (%esp), %eax +; X86-NEXT: orl $1024, %eax # imm = 0x400 +; X86-NEXT: movw %ax, (%esp) +; X86-NEXT: fldcw (%esp) +; X86-NEXT: popl %eax +; X86-NEXT: retl +; +; X64-LABEL: func_04: +; X64: # %bb.0: +; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) +; X64-NEXT: movl $-3073, %eax # imm = 0xF3FF +; X64-NEXT: andl -{{[0-9]+}}(%rsp), %eax +; X64-NEXT: orl $1024, %eax # imm = 0x400 +; X64-NEXT: movw %ax, -{{[0-9]+}}(%rsp) +; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) +; X64-NEXT: stmxcsr -{{[0-9]+}}(%rsp) +; X64-NEXT: movl $-24577, %eax # imm = 0x9FFF +; X64-NEXT: andl -{{[0-9]+}}(%rsp), %eax +; X64-NEXT: orl $8192, %eax # imm = 0x2000 +; X64-NEXT: movl %eax, -{{[0-9]+}}(%rsp) +; X64-NEXT: ldmxcsr -{{[0-9]+}}(%rsp) +; X64-NEXT: retq + call void @llvm.set.rounding(i32 3) ; Downward (CW[11-10] = 01) + ret void +} + +define void @func_05(i32 %x) nounwind { +; X86-NOSSE-LABEL: func_05: +; X86-NOSSE: # %bb.0: +; X86-NOSSE-NEXT: pushl %eax +; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-NOSSE-NEXT: leal 4(%eax,%eax), %ecx +; X86-NOSSE-NEXT: movl $201, %eax +; X86-NOSSE-NEXT: # kill: def $cl killed $cl killed $ecx +; X86-NOSSE-NEXT: shll %cl, %eax +; X86-NOSSE-NEXT: andl $3072, %eax # imm = 0xC00 +; X86-NOSSE-NEXT: fnstcw (%esp) +; X86-NOSSE-NEXT: movl $-3073, %ecx # imm = 0xF3FF +; X86-NOSSE-NEXT: andl (%esp), %ecx +; X86-NOSSE-NEXT: orl %eax, %ecx +; X86-NOSSE-NEXT: movw %cx, (%esp) +; X86-NOSSE-NEXT: fldcw (%esp) +; X86-NOSSE-NEXT: popl %eax +; X86-NOSSE-NEXT: retl +; +; X64-NOSSE-LABEL: func_05: +; X64-NOSSE: # %bb.0: +; X64-NOSSE-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NOSSE-NEXT: leal 4(%rdi,%rdi), %ecx +; X64-NOSSE-NEXT: movl $201, %eax +; X64-NOSSE-NEXT: # kill: def $cl killed $cl killed $ecx +; X64-NOSSE-NEXT: shll %cl, %eax +; X64-NOSSE-NEXT: andl $3072, %eax # imm = 0xC00 +; X64-NOSSE-NEXT: fnstcw -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: movl $-3073, %ecx # imm = 0xF3FF +; X64-NOSSE-NEXT: andl -{{[0-9]+}}(%rsp), %ecx +; X64-NOSSE-NEXT: orl %eax, %ecx +; X64-NOSSE-NEXT: movw %cx, -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: fldcw -{{[0-9]+}}(%rsp) +; X64-NOSSE-NEXT: retq +; +; X86-LABEL: func_05: +; X86: # %bb.0: +; X86-NEXT: pushl %eax +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-NEXT: leal 4(%eax,%eax), %ecx +; X86-NEXT: movl $201, %eax +; X86-NEXT: # kill: def $cl killed $cl killed $ecx +; X86-NEXT: shll %cl, %eax +; X86-NEXT: andl $3072, %eax # imm = 0xC00 +; X86-NEXT: fnstcw (%esp) +; X86-NEXT: movl $-3073, %ecx # imm = 0xF3FF +; X86-NEXT: andl (%esp), %ecx +; X86-NEXT: orl %eax, %ecx +; X86-NEXT: movw %cx, (%esp) +; X86-NEXT: fldcw (%esp) +; X86-NEXT: popl %eax +; X86-NEXT: retl +; +; X64-LABEL: func_05: +; X64: # %bb.0: +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: leal 4(%rdi,%rdi), %ecx +; X64-NEXT: movl $201, %eax +; X64-NEXT: # kill: def $cl killed $cl killed $ecx +; X64-NEXT: shll %cl, %eax +; X64-NEXT: andl $3072, %eax # imm = 0xC00 +; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) +; X64-NEXT: movl $-3073, %ecx # imm = 0xF3FF +; X64-NEXT: andl -{{[0-9]+}}(%rsp), %ecx +; X64-NEXT: orl %eax, %ecx +; X64-NEXT: movw %cx, -{{[0-9]+}}(%rsp) +; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) +; X64-NEXT: stmxcsr -{{[0-9]+}}(%rsp) +; X64-NEXT: movl $-24577, %ecx # imm = 0x9FFF +; X64-NEXT: andl -{{[0-9]+}}(%rsp), %ecx +; X64-NEXT: leal (%rcx,%rax,8), %eax +; X64-NEXT: movl %eax, -{{[0-9]+}}(%rsp) +; X64-NEXT: ldmxcsr -{{[0-9]+}}(%rsp) +; X64-NEXT: retq + call void @llvm.set.rounding(i32 %x) ; Downward + ret void +} + +attributes #0 = { nounwind "use-soft-float"="true" } +;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: +; FASTISEL-X64: {{.*}} +; FASTISEL-X64-NOSSE: {{.*}} +; FASTISEL-X86: {{.*}} +; FASTISEL-X86-NOSSE: {{.*}} +; GISEL-X64: {{.*}} +; GISEL-X64-NOSSE: {{.*}} +; GISEL-X86: {{.*}} +; GISEL-X86-NOSSE: {{.*}} +; SDAG-X64: {{.*}} +; SDAG-X64-NOSSE: {{.*}} +; SDAG-X86: {{.*}} +; SDAG-X86-NOSSE: {{.*}}