572 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=aarch64-linux-gnu -o - %s | FileCheck %s3 4; load zero-extended i32, bitcast to f645define double @load_u64_from_u32(ptr %n){6; CHECK-LABEL: load_u64_from_u32:7; CHECK: // %bb.0: // %entry8; CHECK-NEXT: ldr s0, [x0]9; CHECK-NEXT: ret10entry:11 %0 = load i32, ptr %n, align 412 %conv = zext i32 %0 to i6413 %1 = bitcast i64 %conv to double14 ret double %115}16 17; load zero-extended i16, bitcast to f6418define double @load_u64_from_u16(ptr %n){19; CHECK-LABEL: load_u64_from_u16:20; CHECK: // %bb.0: // %entry21; CHECK-NEXT: ldr h0, [x0]22; CHECK-NEXT: ret23entry:24 %0 = load i16, ptr %n, align 225 %conv = zext i16 %0 to i6426 %1 = bitcast i64 %conv to double27 ret double %128}29 30; load zero-extended i8, bitcast to f6431define double @load_u64_from_u8(ptr %n){32; CHECK-LABEL: load_u64_from_u8:33; CHECK: // %bb.0: // %entry34; CHECK-NEXT: ldr b0, [x0]35; CHECK-NEXT: ret36entry:37 %0 = load i8, ptr %n, align 138 %conv = zext i8 %0 to i6439 %1 = bitcast i64 %conv to double40 ret double %141}42 43; load zero-extended i16, bitcast to f3244define float @load_u32_from_u16(ptr %n){45; CHECK-LABEL: load_u32_from_u16:46; CHECK: // %bb.0: // %entry47; CHECK-NEXT: ldr h0, [x0]48; CHECK-NEXT: ret49entry:50 %0 = load i16, ptr %n, align 251 %conv = zext i16 %0 to i3252 %1 = bitcast i32 %conv to float53 ret float %154}55 56; load zero-extended i8, bitcast to f3257define float @load_u32_from_u8(ptr %n){58; CHECK-LABEL: load_u32_from_u8:59; CHECK: // %bb.0: // %entry60; CHECK-NEXT: ldr b0, [x0]61; CHECK-NEXT: ret62entry:63 %0 = load i8, ptr %n, align 164 %conv = zext i8 %0 to i3265 %1 = bitcast i32 %conv to float66 ret float %167}68 69; load zero-extended i8, bitcast to f1670define half @load_u16_from_u8(ptr %n){71; CHECK-LABEL: load_u16_from_u8:72; CHECK: // %bb.0: // %entry73; CHECK-NEXT: ldr b0, [x0]74; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s075; CHECK-NEXT: ret76entry:77 %0 = load i8, ptr %n, align 178 %conv = zext i8 %0 to i1679 %1 = bitcast i16 %conv to half80 ret half %181}82 83 84define double @load_u64_from_u32_off1(ptr %n){85; CHECK-LABEL: load_u64_from_u32_off1:86; CHECK: // %bb.0: // %entry87; CHECK-NEXT: ldur s0, [x0, #1]88; CHECK-NEXT: ret89entry:90 %p = getelementptr i8, ptr %n, i64 191 %0 = load i32, ptr %p, align 492 %conv = zext i32 %0 to i6493 %1 = bitcast i64 %conv to double94 ret double %195}96 97define double @load_u64_from_u16_off1(ptr %n){98; CHECK-LABEL: load_u64_from_u16_off1:99; CHECK: // %bb.0: // %entry100; CHECK-NEXT: ldur h0, [x0, #1]101; CHECK-NEXT: ret102entry:103 %p = getelementptr i8, ptr %n, i64 1104 %0 = load i16, ptr %p, align 2105 %conv = zext i16 %0 to i64106 %1 = bitcast i64 %conv to double107 ret double %1108}109 110define double @load_u64_from_u8_off1(ptr %n){111; CHECK-LABEL: load_u64_from_u8_off1:112; CHECK: // %bb.0: // %entry113; CHECK-NEXT: ldr b0, [x0, #1]114; CHECK-NEXT: ret115entry:116 %p = getelementptr i8, ptr %n, i64 1117 %0 = load i8, ptr %p, align 1118 %conv = zext i8 %0 to i64119 %1 = bitcast i64 %conv to double120 ret double %1121}122 123define float @load_u32_from_u16_off1(ptr %n){124; CHECK-LABEL: load_u32_from_u16_off1:125; CHECK: // %bb.0: // %entry126; CHECK-NEXT: ldur h0, [x0, #1]127; CHECK-NEXT: ret128entry:129 %p = getelementptr i8, ptr %n, i64 1130 %0 = load i16, ptr %p, align 2131 %conv = zext i16 %0 to i32132 %1 = bitcast i32 %conv to float133 ret float %1134}135 136define float @load_u32_from_u8_off1(ptr %n){137; CHECK-LABEL: load_u32_from_u8_off1:138; CHECK: // %bb.0: // %entry139; CHECK-NEXT: ldr b0, [x0, #1]140; CHECK-NEXT: ret141entry:142 %p = getelementptr i8, ptr %n, i64 1143 %0 = load i8, ptr %p, align 1144 %conv = zext i8 %0 to i32145 %1 = bitcast i32 %conv to float146 ret float %1147}148 149define half @load_u16_from_u8_off1(ptr %n){150; CHECK-LABEL: load_u16_from_u8_off1:151; CHECK: // %bb.0: // %entry152; CHECK-NEXT: ldr b0, [x0, #1]153; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0154; CHECK-NEXT: ret155entry:156 %p = getelementptr i8, ptr %n, i64 1157 %0 = load i8, ptr %p, align 1158 %conv = zext i8 %0 to i16159 %1 = bitcast i16 %conv to half160 ret half %1161}162 163 164 165define double @load_u64_from_u32_off2(ptr %n){166; CHECK-LABEL: load_u64_from_u32_off2:167; CHECK: // %bb.0: // %entry168; CHECK-NEXT: ldur s0, [x0, #2]169; CHECK-NEXT: ret170entry:171 %p = getelementptr i8, ptr %n, i64 2172 %0 = load i32, ptr %p, align 4173 %conv = zext i32 %0 to i64174 %1 = bitcast i64 %conv to double175 ret double %1176}177 178define double @load_u64_from_u16_off2(ptr %n){179; CHECK-LABEL: load_u64_from_u16_off2:180; CHECK: // %bb.0: // %entry181; CHECK-NEXT: ldr h0, [x0, #2]182; CHECK-NEXT: ret183entry:184 %p = getelementptr i8, ptr %n, i64 2185 %0 = load i16, ptr %p, align 2186 %conv = zext i16 %0 to i64187 %1 = bitcast i64 %conv to double188 ret double %1189}190 191define double @load_u64_from_u8_off2(ptr %n){192; CHECK-LABEL: load_u64_from_u8_off2:193; CHECK: // %bb.0: // %entry194; CHECK-NEXT: ldr b0, [x0, #2]195; CHECK-NEXT: ret196entry:197 %p = getelementptr i8, ptr %n, i64 2198 %0 = load i8, ptr %p, align 1199 %conv = zext i8 %0 to i64200 %1 = bitcast i64 %conv to double201 ret double %1202}203 204define float @load_u32_from_u16_off2(ptr %n){205; CHECK-LABEL: load_u32_from_u16_off2:206; CHECK: // %bb.0: // %entry207; CHECK-NEXT: ldr h0, [x0, #2]208; CHECK-NEXT: ret209entry:210 %p = getelementptr i8, ptr %n, i64 2211 %0 = load i16, ptr %p, align 2212 %conv = zext i16 %0 to i32213 %1 = bitcast i32 %conv to float214 ret float %1215}216 217define float @load_u32_from_u8_off2(ptr %n){218; CHECK-LABEL: load_u32_from_u8_off2:219; CHECK: // %bb.0: // %entry220; CHECK-NEXT: ldr b0, [x0, #2]221; CHECK-NEXT: ret222entry:223 %p = getelementptr i8, ptr %n, i64 2224 %0 = load i8, ptr %p, align 1225 %conv = zext i8 %0 to i32226 %1 = bitcast i32 %conv to float227 ret float %1228}229 230define half @load_u16_from_u8_off2(ptr %n){231; CHECK-LABEL: load_u16_from_u8_off2:232; CHECK: // %bb.0: // %entry233; CHECK-NEXT: ldr b0, [x0, #2]234; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0235; CHECK-NEXT: ret236entry:237 %p = getelementptr i8, ptr %n, i64 2238 %0 = load i8, ptr %p, align 1239 %conv = zext i8 %0 to i16240 %1 = bitcast i16 %conv to half241 ret half %1242}243 244 245 246define double @load_u64_from_u32_off255(ptr %n){247; CHECK-LABEL: load_u64_from_u32_off255:248; CHECK: // %bb.0: // %entry249; CHECK-NEXT: ldur s0, [x0, #255]250; CHECK-NEXT: ret251entry:252 %p = getelementptr i8, ptr %n, i64 255253 %0 = load i32, ptr %p, align 4254 %conv = zext i32 %0 to i64255 %1 = bitcast i64 %conv to double256 ret double %1257}258 259define double @load_u64_from_u16_off255(ptr %n){260; CHECK-LABEL: load_u64_from_u16_off255:261; CHECK: // %bb.0: // %entry262; CHECK-NEXT: ldur h0, [x0, #255]263; CHECK-NEXT: ret264entry:265 %p = getelementptr i8, ptr %n, i64 255266 %0 = load i16, ptr %p, align 2267 %conv = zext i16 %0 to i64268 %1 = bitcast i64 %conv to double269 ret double %1270}271 272define double @load_u64_from_u8_off255(ptr %n){273; CHECK-LABEL: load_u64_from_u8_off255:274; CHECK: // %bb.0: // %entry275; CHECK-NEXT: ldr b0, [x0, #255]276; CHECK-NEXT: ret277entry:278 %p = getelementptr i8, ptr %n, i64 255279 %0 = load i8, ptr %p, align 1280 %conv = zext i8 %0 to i64281 %1 = bitcast i64 %conv to double282 ret double %1283}284 285define float @load_u32_from_u16_off255(ptr %n){286; CHECK-LABEL: load_u32_from_u16_off255:287; CHECK: // %bb.0: // %entry288; CHECK-NEXT: ldur h0, [x0, #255]289; CHECK-NEXT: ret290entry:291 %p = getelementptr i8, ptr %n, i64 255292 %0 = load i16, ptr %p, align 2293 %conv = zext i16 %0 to i32294 %1 = bitcast i32 %conv to float295 ret float %1296}297 298define float @load_u32_from_u8_off255(ptr %n){299; CHECK-LABEL: load_u32_from_u8_off255:300; CHECK: // %bb.0: // %entry301; CHECK-NEXT: ldr b0, [x0, #255]302; CHECK-NEXT: ret303entry:304 %p = getelementptr i8, ptr %n, i64 255305 %0 = load i8, ptr %p, align 1306 %conv = zext i8 %0 to i32307 %1 = bitcast i32 %conv to float308 ret float %1309}310 311define half @load_u16_from_u8_off255(ptr %n){312; CHECK-LABEL: load_u16_from_u8_off255:313; CHECK: // %bb.0: // %entry314; CHECK-NEXT: ldr b0, [x0, #255]315; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0316; CHECK-NEXT: ret317entry:318 %p = getelementptr i8, ptr %n, i64 255319 %0 = load i8, ptr %p, align 1320 %conv = zext i8 %0 to i16321 %1 = bitcast i16 %conv to half322 ret half %1323}324 325 326define double @load_u64_from_u32_off256(ptr %n){327; CHECK-LABEL: load_u64_from_u32_off256:328; CHECK: // %bb.0: // %entry329; CHECK-NEXT: ldr s0, [x0, #256]330; CHECK-NEXT: ret331entry:332 %p = getelementptr i8, ptr %n, i64 256333 %0 = load i32, ptr %p, align 4334 %conv = zext i32 %0 to i64335 %1 = bitcast i64 %conv to double336 ret double %1337}338 339define double @load_u64_from_u16_off256(ptr %n){340; CHECK-LABEL: load_u64_from_u16_off256:341; CHECK: // %bb.0: // %entry342; CHECK-NEXT: ldr h0, [x0, #256]343; CHECK-NEXT: ret344entry:345 %p = getelementptr i8, ptr %n, i64 256346 %0 = load i16, ptr %p, align 2347 %conv = zext i16 %0 to i64348 %1 = bitcast i64 %conv to double349 ret double %1350}351 352define double @load_u64_from_u8_off256(ptr %n){353; CHECK-LABEL: load_u64_from_u8_off256:354; CHECK: // %bb.0: // %entry355; CHECK-NEXT: ldr b0, [x0, #256]356; CHECK-NEXT: ret357entry:358 %p = getelementptr i8, ptr %n, i64 256359 %0 = load i8, ptr %p, align 1360 %conv = zext i8 %0 to i64361 %1 = bitcast i64 %conv to double362 ret double %1363}364 365define float @load_u32_from_u16_off256(ptr %n){366; CHECK-LABEL: load_u32_from_u16_off256:367; CHECK: // %bb.0: // %entry368; CHECK-NEXT: ldr h0, [x0, #256]369; CHECK-NEXT: ret370entry:371 %p = getelementptr i8, ptr %n, i64 256372 %0 = load i16, ptr %p, align 2373 %conv = zext i16 %0 to i32374 %1 = bitcast i32 %conv to float375 ret float %1376}377 378define float @load_u32_from_u8_off256(ptr %n){379; CHECK-LABEL: load_u32_from_u8_off256:380; CHECK: // %bb.0: // %entry381; CHECK-NEXT: ldr b0, [x0, #256]382; CHECK-NEXT: ret383entry:384 %p = getelementptr i8, ptr %n, i64 256385 %0 = load i8, ptr %p, align 1386 %conv = zext i8 %0 to i32387 %1 = bitcast i32 %conv to float388 ret float %1389}390 391define half @load_u16_from_u8_off256(ptr %n){392; CHECK-LABEL: load_u16_from_u8_off256:393; CHECK: // %bb.0: // %entry394; CHECK-NEXT: ldr b0, [x0, #256]395; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0396; CHECK-NEXT: ret397entry:398 %p = getelementptr i8, ptr %n, i64 256399 %0 = load i8, ptr %p, align 1400 %conv = zext i8 %0 to i16401 %1 = bitcast i16 %conv to half402 ret half %1403}404 405 406 407define double @load_u64_from_u32_offn(ptr %n){408; CHECK-LABEL: load_u64_from_u32_offn:409; CHECK: // %bb.0: // %entry410; CHECK-NEXT: ldr s0, [x0, #16380]411; CHECK-NEXT: ret412entry:413 %p = getelementptr i8, ptr %n, i64 16380414 %0 = load i32, ptr %p, align 4415 %conv = zext i32 %0 to i64416 %1 = bitcast i64 %conv to double417 ret double %1418}419 420define double @load_u64_from_u16_offn(ptr %n){421; CHECK-LABEL: load_u64_from_u16_offn:422; CHECK: // %bb.0: // %entry423; CHECK-NEXT: ldr h0, [x0, #8190]424; CHECK-NEXT: ret425entry:426 %p = getelementptr i8, ptr %n, i64 8190427 %0 = load i16, ptr %p, align 2428 %conv = zext i16 %0 to i64429 %1 = bitcast i64 %conv to double430 ret double %1431}432 433define double @load_u64_from_u8_offn(ptr %n){434; CHECK-LABEL: load_u64_from_u8_offn:435; CHECK: // %bb.0: // %entry436; CHECK-NEXT: ldr b0, [x0, #4095]437; CHECK-NEXT: ret438entry:439 %p = getelementptr i8, ptr %n, i64 4095440 %0 = load i8, ptr %p, align 1441 %conv = zext i8 %0 to i64442 %1 = bitcast i64 %conv to double443 ret double %1444}445 446define float @load_u32_from_u16_offn(ptr %n){447; CHECK-LABEL: load_u32_from_u16_offn:448; CHECK: // %bb.0: // %entry449; CHECK-NEXT: ldr h0, [x0, #8190]450; CHECK-NEXT: ret451entry:452 %p = getelementptr i8, ptr %n, i64 8190453 %0 = load i16, ptr %p, align 2454 %conv = zext i16 %0 to i32455 %1 = bitcast i32 %conv to float456 ret float %1457}458 459define float @load_u32_from_u8_offn(ptr %n){460; CHECK-LABEL: load_u32_from_u8_offn:461; CHECK: // %bb.0: // %entry462; CHECK-NEXT: ldr b0, [x0, #4095]463; CHECK-NEXT: ret464entry:465 %p = getelementptr i8, ptr %n, i64 4095466 %0 = load i8, ptr %p, align 1467 %conv = zext i8 %0 to i32468 %1 = bitcast i32 %conv to float469 ret float %1470}471 472define half @load_u16_from_u8_offn(ptr %n){473; CHECK-LABEL: load_u16_from_u8_offn:474; CHECK: // %bb.0: // %entry475; CHECK-NEXT: ldr b0, [x0, #4095]476; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0477; CHECK-NEXT: ret478entry:479 %p = getelementptr i8, ptr %n, i64 4095480 %0 = load i8, ptr %p, align 1481 %conv = zext i8 %0 to i16482 %1 = bitcast i16 %conv to half483 ret half %1484}485 486 487define double @load_u64_from_u32_offnp1(ptr %n){488; CHECK-LABEL: load_u64_from_u32_offnp1:489; CHECK: // %bb.0: // %entry490; CHECK-NEXT: mov w8, #16384 // =0x4000491; CHECK-NEXT: ldr s0, [x0, x8]492; CHECK-NEXT: ret493entry:494 %p = getelementptr i8, ptr %n, i64 16384495 %0 = load i32, ptr %p, align 4496 %conv = zext i32 %0 to i64497 %1 = bitcast i64 %conv to double498 ret double %1499}500 501define double @load_u64_from_u16_offnp1(ptr %n){502; CHECK-LABEL: load_u64_from_u16_offnp1:503; CHECK: // %bb.0: // %entry504; CHECK-NEXT: mov w8, #8192 // =0x2000505; CHECK-NEXT: ldr h0, [x0, x8]506; CHECK-NEXT: ret507entry:508 %p = getelementptr i8, ptr %n, i64 8192509 %0 = load i16, ptr %p, align 2510 %conv = zext i16 %0 to i64511 %1 = bitcast i64 %conv to double512 ret double %1513}514 515define double @load_u64_from_u8_offnp1(ptr %n){516; CHECK-LABEL: load_u64_from_u8_offnp1:517; CHECK: // %bb.0: // %entry518; CHECK-NEXT: mov w8, #4096 // =0x1000519; CHECK-NEXT: ldr b0, [x0, x8]520; CHECK-NEXT: ret521entry:522 %p = getelementptr i8, ptr %n, i64 4096523 %0 = load i8, ptr %p, align 1524 %conv = zext i8 %0 to i64525 %1 = bitcast i64 %conv to double526 ret double %1527}528 529define float @load_u32_from_u16_offnp1(ptr %n){530; CHECK-LABEL: load_u32_from_u16_offnp1:531; CHECK: // %bb.0: // %entry532; CHECK-NEXT: mov w8, #8192 // =0x2000533; CHECK-NEXT: ldr h0, [x0, x8]534; CHECK-NEXT: ret535entry:536 %p = getelementptr i8, ptr %n, i64 8192537 %0 = load i16, ptr %p, align 2538 %conv = zext i16 %0 to i32539 %1 = bitcast i32 %conv to float540 ret float %1541}542 543define float @load_u32_from_u8_offnp1(ptr %n){544; CHECK-LABEL: load_u32_from_u8_offnp1:545; CHECK: // %bb.0: // %entry546; CHECK-NEXT: mov w8, #4096 // =0x1000547; CHECK-NEXT: ldr b0, [x0, x8]548; CHECK-NEXT: ret549entry:550 %p = getelementptr i8, ptr %n, i64 4096551 %0 = load i8, ptr %p, align 1552 %conv = zext i8 %0 to i32553 %1 = bitcast i32 %conv to float554 ret float %1555}556 557define half @load_u16_from_u8_offnp1(ptr %n){558; CHECK-LABEL: load_u16_from_u8_offnp1:559; CHECK: // %bb.0: // %entry560; CHECK-NEXT: mov w8, #4096 // =0x1000561; CHECK-NEXT: ldr b0, [x0, x8]562; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0563; CHECK-NEXT: ret564entry:565 %p = getelementptr i8, ptr %n, i64 4096566 %0 = load i8, ptr %p, align 1567 %conv = zext i8 %0 to i16568 %1 = bitcast i16 %conv to half569 ret half %1570}571 572