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