1 ; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel-abort -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck %s --check-prefix=ELF64 2 ; RUN: llc < %s -O0 -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=970 | FileCheck %s --check-prefix=PPC970 3 4 ;; Tests for 970 don't use -fast-isel-abort because we intentionally punt 5 ;; to SelectionDAG in some cases. 6 7 ; Test sitofp 8 9 define void @sitofp_single_i64(i64 %a, float %b) nounwind ssp { 10 entry: 11 ; ELF64: sitofp_single_i64 12 ; PPC970: sitofp_single_i64 13 %b.addr = alloca float, align 4 14 %conv = sitofp i64 %a to float 15 ; ELF64: std 16 ; ELF64: lfd 17 ; ELF64: fcfids 18 ; PPC970: std 19 ; PPC970: lfd 20 ; PPC970: fcfid 21 ; PPC970: frsp 22 store float %conv, float* %b.addr, align 4 23 ret void 24 } 25 26 define void @sitofp_single_i32(i32 %a, float %b) nounwind ssp { 27 entry: 28 ; ELF64: sitofp_single_i32 29 ; PPC970: sitofp_single_i32 30 %b.addr = alloca float, align 4 31 %conv = sitofp i32 %a to float 32 ; ELF64: std 33 ; ELF64: lfiwax 34 ; ELF64: fcfids 35 ; PPC970: std 36 ; PPC970: lfd 37 ; PPC970: fcfid 38 ; PPC970: frsp 39 store float %conv, float* %b.addr, align 4 40 ret void 41 } 42 43 define void @sitofp_single_i16(i16 %a, float %b) nounwind ssp { 44 entry: 45 ; ELF64: sitofp_single_i16 46 ; PPC970: sitofp_single_i16 47 %b.addr = alloca float, align 4 48 %conv = sitofp i16 %a to float 49 ; ELF64: extsh 50 ; ELF64: std 51 ; ELF64: lfd 52 ; ELF64: fcfids 53 ; PPC970: extsh 54 ; PPC970: std 55 ; PPC970: lfd 56 ; PPC970: fcfid 57 ; PPC970: frsp 58 store float %conv, float* %b.addr, align 4 59 ret void 60 } 61 62 define void @sitofp_single_i8(i8 %a) nounwind ssp { 63 entry: 64 ; ELF64: sitofp_single_i8 65 ; PPC970: sitofp_single_i8 66 %b.addr = alloca float, align 4 67 %conv = sitofp i8 %a to float 68 ; ELF64: extsb 69 ; ELF64: std 70 ; ELF64: lfd 71 ; ELF64: fcfids 72 ; PPC970: extsb 73 ; PPC970: std 74 ; PPC970: lfd 75 ; PPC970: fcfid 76 ; PPC970: frsp 77 store float %conv, float* %b.addr, align 4 78 ret void 79 } 80 81 define void @sitofp_double_i32(i32 %a, double %b) nounwind ssp { 82 entry: 83 ; ELF64: sitofp_double_i32 84 ; PPC970: sitofp_double_i32 85 %b.addr = alloca double, align 8 86 %conv = sitofp i32 %a to double 87 ; ELF64: std 88 ; ELF64: lfiwax 89 ; ELF64: fcfid 90 ; PPC970: std 91 ; PPC970: lfd 92 ; PPC970: fcfid 93 store double %conv, double* %b.addr, align 8 94 ret void 95 } 96 97 define void @sitofp_double_i64(i64 %a, double %b) nounwind ssp { 98 entry: 99 ; ELF64: sitofp_double_i64 100 ; PPC970: sitofp_double_i64 101 %b.addr = alloca double, align 8 102 %conv = sitofp i64 %a to double 103 ; ELF64: std 104 ; ELF64: lfd 105 ; ELF64: fcfid 106 ; PPC970: std 107 ; PPC970: lfd 108 ; PPC970: fcfid 109 store double %conv, double* %b.addr, align 8 110 ret void 111 } 112 113 define void @sitofp_double_i16(i16 %a, double %b) nounwind ssp { 114 entry: 115 ; ELF64: sitofp_double_i16 116 ; PPC970: sitofp_double_i16 117 %b.addr = alloca double, align 8 118 %conv = sitofp i16 %a to double 119 ; ELF64: extsh 120 ; ELF64: std 121 ; ELF64: lfd 122 ; ELF64: fcfid 123 ; PPC970: extsh 124 ; PPC970: std 125 ; PPC970: lfd 126 ; PPC970: fcfid 127 store double %conv, double* %b.addr, align 8 128 ret void 129 } 130 131 define void @sitofp_double_i8(i8 %a, double %b) nounwind ssp { 132 entry: 133 ; ELF64: sitofp_double_i8 134 ; PPC970: sitofp_double_i8 135 %b.addr = alloca double, align 8 136 %conv = sitofp i8 %a to double 137 ; ELF64: extsb 138 ; ELF64: std 139 ; ELF64: lfd 140 ; ELF64: fcfid 141 ; PPC970: extsb 142 ; PPC970: std 143 ; PPC970: lfd 144 ; PPC970: fcfid 145 store double %conv, double* %b.addr, align 8 146 ret void 147 } 148 149 ; Test uitofp 150 151 define void @uitofp_single_i64(i64 %a, float %b) nounwind ssp { 152 entry: 153 ; ELF64: uitofp_single_i64 154 ; PPC970: uitofp_single_i64 155 %b.addr = alloca float, align 4 156 %conv = uitofp i64 %a to float 157 ; ELF64: std 158 ; ELF64: lfd 159 ; ELF64: fcfidus 160 ; PPC970-NOT: fcfidus 161 store float %conv, float* %b.addr, align 4 162 ret void 163 } 164 165 define void @uitofp_single_i32(i32 %a, float %b) nounwind ssp { 166 entry: 167 ; ELF64: uitofp_single_i32 168 ; PPC970: uitofp_single_i32 169 %b.addr = alloca float, align 4 170 %conv = uitofp i32 %a to float 171 ; ELF64: std 172 ; ELF64: lfiwzx 173 ; ELF64: fcfidus 174 ; PPC970-NOT: lfiwzx 175 ; PPC970-NOT: fcfidus 176 store float %conv, float* %b.addr, align 4 177 ret void 178 } 179 180 define void @uitofp_single_i16(i16 %a, float %b) nounwind ssp { 181 entry: 182 ; ELF64: uitofp_single_i16 183 ; PPC970: uitofp_single_i16 184 %b.addr = alloca float, align 4 185 %conv = uitofp i16 %a to float 186 ; ELF64: rldicl {{[0-9]+}}, {{[0-9]+}}, 0, 48 187 ; ELF64: std 188 ; ELF64: lfd 189 ; ELF64: fcfidus 190 ; PPC970: rlwinm {{[0-9]+}}, {{[0-9]+}}, 0, 16, 31 191 ; PPC970: std 192 ; PPC970: lfd 193 ; PPC970: fcfid 194 ; PPC970: frsp 195 store float %conv, float* %b.addr, align 4 196 ret void 197 } 198 199 define void @uitofp_single_i8(i8 %a) nounwind ssp { 200 entry: 201 ; ELF64: uitofp_single_i8 202 ; PPC970: uitofp_single_i8 203 %b.addr = alloca float, align 4 204 %conv = uitofp i8 %a to float 205 ; ELF64: rldicl {{[0-9]+}}, {{[0-9]+}}, 0, 56 206 ; ELF64: std 207 ; ELF64: lfd 208 ; ELF64: fcfidus 209 ; PPC970: rlwinm {{[0-9]+}}, {{[0-9]+}}, 0, 24, 31 210 ; PPC970: std 211 ; PPC970: lfd 212 ; PPC970: fcfid 213 ; PPC970: frsp 214 store float %conv, float* %b.addr, align 4 215 ret void 216 } 217 218 define void @uitofp_double_i64(i64 %a, double %b) nounwind ssp { 219 entry: 220 ; ELF64: uitofp_double_i64 221 ; PPC970: uitofp_double_i64 222 %b.addr = alloca double, align 8 223 %conv = uitofp i64 %a to double 224 ; ELF64: std 225 ; ELF64: lfd 226 ; ELF64: fcfidu 227 ; PPC970-NOT: fcfidu 228 store double %conv, double* %b.addr, align 8 229 ret void 230 } 231 232 define void @uitofp_double_i32(i32 %a, double %b) nounwind ssp { 233 entry: 234 ; ELF64: uitofp_double_i32 235 ; PPC970: uitofp_double_i32 236 %b.addr = alloca double, align 8 237 %conv = uitofp i32 %a to double 238 ; ELF64: std 239 ; ELF64: lfiwzx 240 ; ELF64: fcfidu 241 ; PPC970-NOT: lfiwzx 242 ; PPC970-NOT: fcfidu 243 store double %conv, double* %b.addr, align 8 244 ret void 245 } 246 247 define void @uitofp_double_i16(i16 %a, double %b) nounwind ssp { 248 entry: 249 ; ELF64: uitofp_double_i16 250 ; PPC970: uitofp_double_i16 251 %b.addr = alloca double, align 8 252 %conv = uitofp i16 %a to double 253 ; ELF64: rldicl {{[0-9]+}}, {{[0-9]+}}, 0, 48 254 ; ELF64: std 255 ; ELF64: lfd 256 ; ELF64: fcfidu 257 ; PPC970: rlwinm {{[0-9]+}}, {{[0-9]+}}, 0, 16, 31 258 ; PPC970: std 259 ; PPC970: lfd 260 ; PPC970: fcfid 261 store double %conv, double* %b.addr, align 8 262 ret void 263 } 264 265 define void @uitofp_double_i8(i8 %a, double %b) nounwind ssp { 266 entry: 267 ; ELF64: uitofp_double_i8 268 ; PPC970: uitofp_double_i8 269 %b.addr = alloca double, align 8 270 %conv = uitofp i8 %a to double 271 ; ELF64: rldicl {{[0-9]+}}, {{[0-9]+}}, 0, 56 272 ; ELF64: std 273 ; ELF64: lfd 274 ; ELF64: fcfidu 275 ; PPC970: rlwinm {{[0-9]+}}, {{[0-9]+}}, 0, 24, 31 276 ; PPC970: std 277 ; PPC970: lfd 278 ; PPC970: fcfid 279 store double %conv, double* %b.addr, align 8 280 ret void 281 } 282 283 ; Test fptosi 284 285 define void @fptosi_float_i32(float %a) nounwind ssp { 286 entry: 287 ; ELF64: fptosi_float_i32 288 ; PPC970: fptosi_float_i32 289 %b.addr = alloca i32, align 4 290 %conv = fptosi float %a to i32 291 ; ELF64: fctiwz 292 ; ELF64: stfd 293 ; ELF64: lwa 294 ; PPC970: fctiwz 295 ; PPC970: stfd 296 ; PPC970: lwa 297 store i32 %conv, i32* %b.addr, align 4 298 ret void 299 } 300 301 define void @fptosi_float_i64(float %a) nounwind ssp { 302 entry: 303 ; ELF64: fptosi_float_i64 304 ; PPC970: fptosi_float_i64 305 %b.addr = alloca i64, align 4 306 %conv = fptosi float %a to i64 307 ; ELF64: fctidz 308 ; ELF64: stfd 309 ; ELF64: ld 310 ; PPC970: fctidz 311 ; PPC970: stfd 312 ; PPC970: ld 313 store i64 %conv, i64* %b.addr, align 4 314 ret void 315 } 316 317 define void @fptosi_double_i32(double %a) nounwind ssp { 318 entry: 319 ; ELF64: fptosi_double_i32 320 ; PPC970: fptosi_double_i32 321 %b.addr = alloca i32, align 8 322 %conv = fptosi double %a to i32 323 ; ELF64: fctiwz 324 ; ELF64: stfd 325 ; ELF64: lwa 326 ; PPC970: fctiwz 327 ; PPC970: stfd 328 ; PPC970: lwa 329 store i32 %conv, i32* %b.addr, align 8 330 ret void 331 } 332 333 define void @fptosi_double_i64(double %a) nounwind ssp { 334 entry: 335 ; ELF64: fptosi_double_i64 336 ; PPC970: fptosi_double_i64 337 %b.addr = alloca i64, align 8 338 %conv = fptosi double %a to i64 339 ; ELF64: fctidz 340 ; ELF64: stfd 341 ; ELF64: ld 342 ; PPC970: fctidz 343 ; PPC970: stfd 344 ; PPC970: ld 345 store i64 %conv, i64* %b.addr, align 8 346 ret void 347 } 348 349 ; Test fptoui 350 351 define void @fptoui_float_i32(float %a) nounwind ssp { 352 entry: 353 ; ELF64: fptoui_float_i32 354 ; PPC970: fptoui_float_i32 355 %b.addr = alloca i32, align 4 356 %conv = fptoui float %a to i32 357 ; ELF64: fctiwuz 358 ; ELF64: stfd 359 ; ELF64: lwz 360 ; PPC970: fctidz 361 ; PPC970: stfd 362 ; PPC970: lwz 363 store i32 %conv, i32* %b.addr, align 4 364 ret void 365 } 366 367 define void @fptoui_float_i64(float %a) nounwind ssp { 368 entry: 369 ; ELF64: fptoui_float_i64 370 ; PPC970: fptoui_float_i64 371 %b.addr = alloca i64, align 4 372 %conv = fptoui float %a to i64 373 ; ELF64: fctiduz 374 ; ELF64: stfd 375 ; ELF64: ld 376 ; PPC970-NOT: fctiduz 377 store i64 %conv, i64* %b.addr, align 4 378 ret void 379 } 380 381 define void @fptoui_double_i32(double %a) nounwind ssp { 382 entry: 383 ; ELF64: fptoui_double_i32 384 ; PPC970: fptoui_double_i32 385 %b.addr = alloca i32, align 8 386 %conv = fptoui double %a to i32 387 ; ELF64: fctiwuz 388 ; ELF64: stfd 389 ; ELF64: lwz 390 ; PPC970: fctidz 391 ; PPC970: stfd 392 ; PPC970: lwz 393 store i32 %conv, i32* %b.addr, align 8 394 ret void 395 } 396 397 define void @fptoui_double_i64(double %a) nounwind ssp { 398 entry: 399 ; ELF64: fptoui_double_i64 400 ; PPC970: fptoui_double_i64 401 %b.addr = alloca i64, align 8 402 %conv = fptoui double %a to i64 403 ; ELF64: fctiduz 404 ; ELF64: stfd 405 ; ELF64: ld 406 ; PPC970-NOT: fctiduz 407 store i64 %conv, i64* %b.addr, align 8 408 ret void 409 } 410