1 ; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM 2 ; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-linux-gnueabi | FileCheck %s --check-prefix=ARM 3 ; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB 4 5 ; Test sitofp 6 7 define void @sitofp_single_i32(i32 %a, float %b) nounwind ssp { 8 entry: 9 ; ARM: sitofp_single_i32 10 ; ARM: vmov s0, r0 11 ; ARM: vcvt.f32.s32 s0, s0 12 ; THUMB: sitofp_single_i32 13 ; THUMB: vmov s0, r0 14 ; THUMB: vcvt.f32.s32 s0, s0 15 %b.addr = alloca float, align 4 16 %conv = sitofp i32 %a to float 17 store float %conv, float* %b.addr, align 4 18 ret void 19 } 20 21 define void @sitofp_single_i16(i16 %a, float %b) nounwind ssp { 22 entry: 23 ; ARM: sitofp_single_i16 24 ; ARM: sxth r0, r0 25 ; ARM: vmov s0, r0 26 ; ARM: vcvt.f32.s32 s0, s0 27 ; THUMB: sitofp_single_i16 28 ; THUMB: sxth r0, r0 29 ; THUMB: vmov s0, r0 30 ; THUMB: vcvt.f32.s32 s0, s0 31 %b.addr = alloca float, align 4 32 %conv = sitofp i16 %a to float 33 store float %conv, float* %b.addr, align 4 34 ret void 35 } 36 37 define void @sitofp_single_i8(i8 %a) nounwind ssp { 38 entry: 39 ; ARM: sitofp_single_i8 40 ; ARM: sxtb r0, r0 41 ; ARM: vmov s0, r0 42 ; ARM: vcvt.f32.s32 s0, s0 43 ; THUMB: sitofp_single_i8 44 ; THUMB: sxtb r0, r0 45 ; THUMB: vmov s0, r0 46 ; THUMB: vcvt.f32.s32 s0, s0 47 %b.addr = alloca float, align 4 48 %conv = sitofp i8 %a to float 49 store float %conv, float* %b.addr, align 4 50 ret void 51 } 52 53 define void @sitofp_double_i32(i32 %a, double %b) nounwind ssp { 54 entry: 55 ; ARM: sitofp_double_i32 56 ; ARM: vmov s0, r0 57 ; ARM: vcvt.f64.s32 d16, s0 58 ; THUMB: sitofp_double_i32 59 ; THUMB: vmov s0, r0 60 ; THUMB: vcvt.f64.s32 d16, s0 61 %b.addr = alloca double, align 8 62 %conv = sitofp i32 %a to double 63 store double %conv, double* %b.addr, align 8 64 ret void 65 } 66 67 define void @sitofp_double_i16(i16 %a, double %b) nounwind ssp { 68 entry: 69 ; ARM: sitofp_double_i16 70 ; ARM: sxth r0, r0 71 ; ARM: vmov s0, r0 72 ; ARM: vcvt.f64.s32 d16, s0 73 ; THUMB: sitofp_double_i16 74 ; THUMB: sxth r0, r0 75 ; THUMB: vmov s0, r0 76 ; THUMB: vcvt.f64.s32 d16, s0 77 %b.addr = alloca double, align 8 78 %conv = sitofp i16 %a to double 79 store double %conv, double* %b.addr, align 8 80 ret void 81 } 82 83 define void @sitofp_double_i8(i8 %a, double %b) nounwind ssp { 84 entry: 85 ; ARM: sitofp_double_i8 86 ; ARM: sxtb r0, r0 87 ; ARM: vmov s0, r0 88 ; ARM: vcvt.f64.s32 d16, s0 89 ; THUMB: sitofp_double_i8 90 ; THUMB: sxtb r0, r0 91 ; THUMB: vmov s0, r0 92 ; THUMB: vcvt.f64.s32 d16, s0 93 %b.addr = alloca double, align 8 94 %conv = sitofp i8 %a to double 95 store double %conv, double* %b.addr, align 8 96 ret void 97 } 98 99 ; Test uitofp 100 101 define void @uitofp_single_i32(i32 %a, float %b) nounwind ssp { 102 entry: 103 ; ARM: uitofp_single_i32 104 ; ARM: vmov s0, r0 105 ; ARM: vcvt.f32.u32 s0, s0 106 ; THUMB: uitofp_single_i32 107 ; THUMB: vmov s0, r0 108 ; THUMB: vcvt.f32.u32 s0, s0 109 %b.addr = alloca float, align 4 110 %conv = uitofp i32 %a to float 111 store float %conv, float* %b.addr, align 4 112 ret void 113 } 114 115 define void @uitofp_single_i16(i16 %a, float %b) nounwind ssp { 116 entry: 117 ; ARM: uitofp_single_i16 118 ; ARM: uxth r0, r0 119 ; ARM: vmov s0, r0 120 ; ARM: vcvt.f32.u32 s0, s0 121 ; THUMB: uitofp_single_i16 122 ; THUMB: uxth r0, r0 123 ; THUMB: vmov s0, r0 124 ; THUMB: vcvt.f32.u32 s0, s0 125 %b.addr = alloca float, align 4 126 %conv = uitofp i16 %a to float 127 store float %conv, float* %b.addr, align 4 128 ret void 129 } 130 131 define void @uitofp_single_i8(i8 %a) nounwind ssp { 132 entry: 133 ; ARM: uitofp_single_i8 134 ; ARM: and r0, r0, #255 135 ; ARM: vmov s0, r0 136 ; ARM: vcvt.f32.u32 s0, s0 137 ; THUMB: uitofp_single_i8 138 ; THUMB: and r0, r0, #255 139 ; THUMB: vmov s0, r0 140 ; THUMB: vcvt.f32.u32 s0, s0 141 %b.addr = alloca float, align 4 142 %conv = uitofp i8 %a to float 143 store float %conv, float* %b.addr, align 4 144 ret void 145 } 146 147 define void @uitofp_double_i32(i32 %a, double %b) nounwind ssp { 148 entry: 149 ; ARM: uitofp_double_i32 150 ; ARM: vmov s0, r0 151 ; ARM: vcvt.f64.u32 d16, s0 152 ; THUMB: uitofp_double_i32 153 ; THUMB: vmov s0, r0 154 ; THUMB: vcvt.f64.u32 d16, s0 155 %b.addr = alloca double, align 8 156 %conv = uitofp i32 %a to double 157 store double %conv, double* %b.addr, align 8 158 ret void 159 } 160 161 define void @uitofp_double_i16(i16 %a, double %b) nounwind ssp { 162 entry: 163 ; ARM: uitofp_double_i16 164 ; ARM: uxth r0, r0 165 ; ARM: vmov s0, r0 166 ; ARM: vcvt.f64.u32 d16, s0 167 ; THUMB: uitofp_double_i16 168 ; THUMB: uxth r0, r0 169 ; THUMB: vmov s0, r0 170 ; THUMB: vcvt.f64.u32 d16, s0 171 %b.addr = alloca double, align 8 172 %conv = uitofp i16 %a to double 173 store double %conv, double* %b.addr, align 8 174 ret void 175 } 176 177 define void @uitofp_double_i8(i8 %a, double %b) nounwind ssp { 178 entry: 179 ; ARM: uitofp_double_i8 180 ; ARM: and r0, r0, #255 181 ; ARM: vmov s0, r0 182 ; ARM: vcvt.f64.u32 d16, s0 183 ; THUMB: uitofp_double_i8 184 ; THUMB: and r0, r0, #255 185 ; THUMB: vmov s0, r0 186 ; THUMB: vcvt.f64.u32 d16, s0 187 %b.addr = alloca double, align 8 188 %conv = uitofp i8 %a to double 189 store double %conv, double* %b.addr, align 8 190 ret void 191 } 192 193 ; Test fptosi 194 195 define void @fptosi_float(float %a) nounwind ssp { 196 entry: 197 ; ARM: fptosi_float 198 ; ARM: vcvt.s32.f32 s0, s0 199 ; THUMB: fptosi_float 200 ; THUMB: vcvt.s32.f32 s0, s0 201 %b.addr = alloca i32, align 4 202 %conv = fptosi float %a to i32 203 store i32 %conv, i32* %b.addr, align 4 204 ret void 205 } 206 207 define void @fptosi_double(double %a) nounwind ssp { 208 entry: 209 ; ARM: fptosi_double 210 ; ARM: vcvt.s32.f64 s0, d16 211 ; THUMB: fptosi_double 212 ; THUMB: vcvt.s32.f64 s0, d16 213 %b.addr = alloca i32, align 8 214 %conv = fptosi double %a to i32 215 store i32 %conv, i32* %b.addr, align 8 216 ret void 217 } 218 219 ; Test fptoui 220 221 define void @fptoui_float(float %a) nounwind ssp { 222 entry: 223 ; ARM: fptoui_float 224 ; ARM: vcvt.u32.f32 s0, s0 225 ; THUMB: fptoui_float 226 ; THUMB: vcvt.u32.f32 s0, s0 227 %b.addr = alloca i32, align 4 228 %conv = fptoui float %a to i32 229 store i32 %conv, i32* %b.addr, align 4 230 ret void 231 } 232 233 define void @fptoui_double(double %a) nounwind ssp { 234 entry: 235 ; ARM: fptoui_double 236 ; ARM: vcvt.u32.f64 s0, d16 237 ; THUMB: fptoui_double 238 ; THUMB: vcvt.u32.f64 s0, d16 239 %b.addr = alloca i32, align 8 240 %conv = fptoui double %a to i32 241 store i32 %conv, i32* %b.addr, align 8 242 ret void 243 } 244