|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 |
| 2 | +; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s |
| 3 | + |
| 4 | +; C source used for generating this test: |
| 5 | + |
| 6 | +; unsigned test(float f) |
| 7 | +; { |
| 8 | +; unsigned i; |
| 9 | +; asm volatile ("" : "=r" (i) : "0" (f)); |
| 10 | +; return i; |
| 11 | +; } |
| 12 | + |
| 13 | + |
| 14 | +define i32 @test_int_float(float %f) { |
| 15 | +; CHECK-LABEL: test_int_float: |
| 16 | +; CHECK: # %bb.0: # %entry |
| 17 | +; CHECK-NEXT: movss %xmm0, -{{[0-9]+}}(%rsp) |
| 18 | +; CHECK-NEXT: movl -{{[0-9]+}}(%rsp), %eax |
| 19 | +; CHECK-NEXT: #APP |
| 20 | +; CHECK-NEXT: #NO_APP |
| 21 | +; CHECK-NEXT: movl %eax, -{{[0-9]+}}(%rsp) |
| 22 | +; CHECK-NEXT: retq |
| 23 | +entry: |
| 24 | + %f.addr = alloca float, align 4 |
| 25 | + %i = alloca i32, align 4 |
| 26 | + store float %f, ptr %f.addr, align 4 |
| 27 | + %load_f = load float, ptr %f.addr, align 4 |
| 28 | + %asm_call = call i32 asm sideeffect "", "=r,0,~{dirflag},~{fpsr},~{flags}"(float %load_f) |
| 29 | + store i32 %asm_call, ptr %i, align 4 |
| 30 | + %load_i = load i32, ptr %i, align 4 |
| 31 | + ret i32 %load_i |
| 32 | +} |
| 33 | + |
| 34 | +define i32 @test_int_ptr(float* %f) { |
| 35 | +; CHECK-LABEL: test_int_ptr: |
| 36 | +; CHECK: # %bb.0: # %entry |
| 37 | +; CHECK-NEXT: movq %rdi, %rax |
| 38 | +; CHECK-NEXT: movq %rdi, -{{[0-9]+}}(%rsp) |
| 39 | +; CHECK-NEXT: #APP |
| 40 | +; CHECK-NEXT: #NO_APP |
| 41 | +; CHECK-NEXT: movl %eax, -{{[0-9]+}}(%rsp) |
| 42 | +; CHECK-NEXT: # kill: def $eax killed $eax killed $rax |
| 43 | +; CHECK-NEXT: retq |
| 44 | +entry: |
| 45 | + %f.addr = alloca float*, align 4 |
| 46 | + %i = alloca i32, align 4 |
| 47 | + store float* %f, ptr %f.addr, align 4 |
| 48 | + %load_f = load float*, ptr %f.addr, align 4 |
| 49 | + %asm_call = call i32 asm sideeffect "", "=r,0,~{dirflag},~{fpsr},~{flags}"(float* %load_f) |
| 50 | + store i32 %asm_call, ptr %i, align 4 |
| 51 | + %load_i = load i32, ptr %i, align 4 |
| 52 | + ret i32 %load_i |
| 53 | +} |
| 54 | + |
| 55 | +define <4 x i32> @test_int_vec(<4 x float> %f) { |
| 56 | +; CHECK-LABEL: test_int_vec: |
| 57 | +; CHECK: # %bb.0: # %entry |
| 58 | +; CHECK-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) |
| 59 | +; CHECK-NEXT: #APP |
| 60 | +; CHECK-NEXT: #NO_APP |
| 61 | +; CHECK-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) |
| 62 | +; CHECK-NEXT: retq |
| 63 | +entry: |
| 64 | + %f.addr = alloca <4 x float>, align 16 |
| 65 | + %i = alloca <4 x i32>, align 16 |
| 66 | + store <4 x float> %f, <4 x float>* %f.addr, align 16 |
| 67 | + %load_f = load <4 x float>, <4 x float>* %f.addr, align 16 |
| 68 | + %asm_call = call <4 x i32> asm sideeffect "", "=v,0,~{dirflag},~{fpsr},~{flags}"(<4 x float> %load_f) |
| 69 | + store <4 x i32> %asm_call, <4 x i32>* %i, align 16 |
| 70 | + %load_i = load <4 x i32>, <4 x i32>* %i, align 16 |
| 71 | + ret <4 x i32> %load_i |
| 72 | +} |
0 commit comments