1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
; RUN: llc -mtriple=thumbv7-linux-gnueabihf %s -o - | FileCheck %s
define float @test_load_s32_float(ptr %addr) {
; CHECK-LABEL: test_load_s32_float:
; CHECK: ldr [[TMP:r[0-9]+]], [r0]
; CHECK: vmov [[RES_INT:s[0-9]+]], [[TMP]]
; CHECK: vcvt.f32.s32 s0, [[RES_INT]]
%val = load i32, ptr %addr, align 1
%res = sitofp i32 %val to float
ret float %res
}
define double @test_load_s32_double(ptr %addr) {
; CHECK-LABEL: test_load_s32_double:
; CHECK: ldr [[TMP:r[0-9]+]], [r0]
; CHECK: vmov [[RES_INT:s[0-9]+]], [[TMP]]
; CHECK: vcvt.f64.s32 d0, [[RES_INT]]
%val = load i32, ptr %addr, align 1
%res = sitofp i32 %val to double
ret double %res
}
define float @test_load_u32_float(ptr %addr) {
; CHECK-LABEL: test_load_u32_float:
; CHECK: ldr [[TMP:r[0-9]+]], [r0]
; CHECK: vmov [[RES_INT:s[0-9]+]], [[TMP]]
; CHECK: vcvt.f32.u32 s0, [[RES_INT]]
%val = load i32, ptr %addr, align 1
%res = uitofp i32 %val to float
ret float %res
}
define double @test_load_u32_double(ptr %addr) {
; CHECK-LABEL: test_load_u32_double:
; CHECK: ldr [[TMP:r[0-9]+]], [r0]
; CHECK: vmov [[RES_INT:s[0-9]+]], [[TMP]]
; CHECK: vcvt.f64.u32 d0, [[RES_INT]]
%val = load i32, ptr %addr, align 1
%res = uitofp i32 %val to double
ret double %res
}
define void @test_store_f32(float %in, ptr %addr) {
; CHECK-LABEL: test_store_f32:
; CHECK: vmov [[TMP:r[0-9]+]], s0
; CHECK: str [[TMP]], [r0]
store float %in, ptr %addr, align 1
ret void
}
define void @test_store_float_s32(float %in, ptr %addr) {
; CHECK-LABEL: test_store_float_s32:
; CHECK: vcvt.s32.f32 [[TMP:s[0-9]+]], s0
; CHECK: vmov [[TMP_INT:r[0-9]+]], [[TMP]]
; CHECK: str [[TMP_INT]], [r0]
%val = fptosi float %in to i32
store i32 %val, ptr %addr, align 1
ret void
}
define void @test_store_double_s32(double %in, ptr %addr) {
; CHECK-LABEL: test_store_double_s32:
; CHECK: vcvt.s32.f64 [[TMP:s[0-9]+]], d0
; CHECK: vmov [[TMP_INT:r[0-9]+]], [[TMP]]
; CHECK: str [[TMP_INT]], [r0]
%val = fptosi double %in to i32
store i32 %val, ptr %addr, align 1
ret void
}
define void @test_store_float_u32(float %in, ptr %addr) {
; CHECK-LABEL: test_store_float_u32:
; CHECK: vcvt.u32.f32 [[TMP:s[0-9]+]], s0
; CHECK: vmov [[TMP_INT:r[0-9]+]], [[TMP]]
; CHECK: str [[TMP_INT]], [r0]
%val = fptoui float %in to i32
store i32 %val, ptr %addr, align 1
ret void
}
define void @test_store_double_u32(double %in, ptr %addr) {
; CHECK-LABEL: test_store_double_u32:
; CHECK: vcvt.u32.f64 [[TMP:s[0-9]+]], d0
; CHECK: vmov [[TMP_INT:r[0-9]+]], [[TMP]]
; CHECK: str [[TMP_INT]], [r0]
%val = fptoui double %in to i32
store i32 %val, ptr %addr, align 1
ret void
}
|