| ; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux | FileCheck %s |
| |
| @flags_gv = global i64 0 |
| |
| ; First without noredzone. |
| ; CHECK-LABEL: f0: |
| ; CHECK: -4(%rsp) |
| ; CHECK: -4(%rsp) |
| ; CHECK: ret |
| define x86_fp80 @f0(float %f) nounwind { |
| entry: |
| %0 = fpext float %f to x86_fp80 ; <x86_fp80> [#uses=1] |
| ret x86_fp80 %0 |
| } |
| |
| ; Then with noredzone. |
| ; CHECK-LABEL: f1: |
| ; CHECK: subq $4, %rsp |
| ; CHECK: (%rsp) |
| ; CHECK: (%rsp) |
| ; CHECK: addq $4, %rsp |
| ; CHECK: ret |
| define x86_fp80 @f1(float %f) nounwind noredzone { |
| entry: |
| %0 = fpext float %f to x86_fp80 ; <x86_fp80> [#uses=1] |
| ret x86_fp80 %0 |
| } |
| |
| declare i64 @llvm.x86.flags.read.u64() |
| declare void @llvm.x86.flags.write.u64(i64) |
| |
| |
| ; pushfq and popfq prevent redzones. |
| ; CHECK-LABEL: norz_flags_read: |
| ; CHECK: subq ${{[0-9]+}}, %rsp |
| ; CHECK: pushfq |
| ; CHECK: popq |
| ; CHECK: (%rsp) |
| ; CHECK: (%rsp) |
| ; CHECK: ret |
| define x86_fp80 @norz_flags_read(float %f) nounwind { |
| entry: |
| %flags = call i64 @llvm.x86.flags.read.u64() |
| store i64 %flags, ptr @flags_gv |
| %0 = fpext float %f to x86_fp80 |
| ret x86_fp80 %0 |
| } |
| |
| ; CHECK-LABEL: norz_flags_write: |
| ; CHECK: subq ${{[0-9]+}}, %rsp |
| ; CHECK: pushq |
| ; CHECK: popfq |
| ; CHECK: (%rsp) |
| ; CHECK: (%rsp) |
| ; CHECK: ret |
| define x86_fp80 @norz_flags_write(float %f, i64 %flags) nounwind { |
| entry: |
| call void @llvm.x86.flags.write.u64(i64 %flags) |
| %0 = fpext float %f to x86_fp80 |
| ret x86_fp80 %0 |
| } |