952 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+d,+xtheadmemidx \3; RUN: -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV32XTHEADMEMIDX4; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+d,+xtheadmemidx \5; RUN: -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV64XTHEADMEMIDX6 7define ptr @lbia(ptr %base, ptr %addr.2, i8 %a) {8; CHECK-LABEL: lbia:9; CHECK: # %bb.0:10; CHECK-NEXT: th.lbia a3, (a0), -1, 011; CHECK-NEXT: add a2, a3, a212; CHECK-NEXT: sb a2, 0(a1)13; CHECK-NEXT: ret14 %addr = getelementptr i8, ptr %base, iXLen 015 %ld = load i8, ptr %addr16 %addr.1 = getelementptr i8, ptr %base, iXLen -117 %res = add i8 %ld, %a18 store i8 %res, ptr %addr.219 ret ptr %addr.120}21 22define ptr @lbib(ptr %base, i8 %a) {23; CHECK-LABEL: lbib:24; CHECK: # %bb.0:25; CHECK-NEXT: th.lbib a2, (a0), 1, 026; CHECK-NEXT: add a1, a2, a127; CHECK-NEXT: sb a1, 1(a0)28; CHECK-NEXT: ret29 %addr = getelementptr i8, ptr %base, iXLen 130 %ld = load i8, ptr %addr31 %addr.1 = getelementptr i8, ptr %base, iXLen 232 %res = add i8 %ld, %a33 store i8 %res, ptr %addr.134 ret ptr %addr35}36 37define ptr @lbuia(ptr %base, ptr %addr.2, i32 %a) {38; CHECK-LABEL: lbuia:39; CHECK: # %bb.0:40; CHECK-NEXT: th.lbuia a3, (a0), -1, 041; CHECK-NEXT: add a2, a3, a242; CHECK-NEXT: sw a2, 0(a1)43; CHECK-NEXT: ret44 %addr = getelementptr i8, ptr %base, iXLen 045 %ld = load i8, ptr %addr46 %zext = zext i8 %ld to i3247 %addr.1 = getelementptr i8, ptr %base, iXLen -148 %res = add i32 %zext, %a49 store i32 %res, ptr %addr.250 ret ptr %addr.151}52 53define ptr @lbuib(ptr %base, i32 %a, ptr %addr.1) {54; CHECK-LABEL: lbuib:55; CHECK: # %bb.0:56; CHECK-NEXT: th.lbuib a3, (a0), 1, 057; CHECK-NEXT: add a1, a3, a158; CHECK-NEXT: sw a1, 0(a2)59; CHECK-NEXT: ret60 %addr = getelementptr i8, ptr %base, iXLen 161 %ld = load i8, ptr %addr62 %zext = zext i8 %ld to i3263 %res = add i32 %zext, %a64 store i32 %res, ptr %addr.165 ret ptr %addr66}67 68define ptr @lhia(ptr %base, ptr %addr.2, i16 %a) {69; CHECK-LABEL: lhia:70; CHECK: # %bb.0:71; CHECK-NEXT: th.lhia a3, (a0), -16, 172; CHECK-NEXT: add a2, a3, a273; CHECK-NEXT: sh a2, 0(a1)74; CHECK-NEXT: ret75 %addr = getelementptr i16, ptr %base, iXLen 076 %ld = load i16, ptr %addr77 %addr.1 = getelementptr i16, ptr %base, iXLen -1678 %res = add i16 %ld, %a79 store i16 %res, ptr %addr.280 ret ptr %addr.181}82 83define ptr @lhib(ptr %base, i16 %a) {84; CHECK-LABEL: lhib:85; CHECK: # %bb.0:86; CHECK-NEXT: th.lhib a2, (a0), 2, 087; CHECK-NEXT: add a1, a2, a188; CHECK-NEXT: sh a1, 2(a0)89; CHECK-NEXT: ret90 %addr = getelementptr i16, ptr %base, iXLen 191 %ld = load i16, ptr %addr92 %addr.1 = getelementptr i16, ptr %base, iXLen 293 %res = add i16 %ld, %a94 store i16 %res, ptr %addr.195 ret ptr %addr96}97 98define ptr @lhuia(ptr %base, ptr %addr.2, i32 %a) {99; CHECK-LABEL: lhuia:100; CHECK: # %bb.0:101; CHECK-NEXT: th.lhuia a3, (a0), -16, 1102; CHECK-NEXT: add a2, a3, a2103; CHECK-NEXT: sw a2, 0(a1)104; CHECK-NEXT: ret105 %addr = getelementptr i16, ptr %base, iXLen 0106 %ld = load i16, ptr %addr107 %zext = zext i16 %ld to i32108 %addr.1 = getelementptr i16, ptr %base, iXLen -16109 %res = add i32 %zext, %a110 store i32 %res, ptr %addr.2111 ret ptr %addr.1112}113 114define ptr @lhuib(ptr %base, i32 %a, ptr %addr.1) {115; CHECK-LABEL: lhuib:116; CHECK: # %bb.0:117; CHECK-NEXT: th.lhuib a3, (a0), 2, 0118; CHECK-NEXT: add a1, a3, a1119; CHECK-NEXT: sw a1, 0(a2)120; CHECK-NEXT: ret121 %addr = getelementptr i16, ptr %base, iXLen 1122 %ld = load i16, ptr %addr123 %zext = zext i16 %ld to i32124 %res = add i32 %zext, %a125 store i32 %res, ptr %addr.1126 ret ptr %addr127}128 129define ptr @lwia(ptr %base, ptr %addr.2, i32 %a) {130; CHECK-LABEL: lwia:131; CHECK: # %bb.0:132; CHECK-NEXT: th.lwia a3, (a0), -16, 2133; CHECK-NEXT: add a2, a3, a2134; CHECK-NEXT: sw a2, 0(a1)135; CHECK-NEXT: ret136 %addr = getelementptr i32, ptr %base, iXLen 0137 %ld = load i32, ptr %addr138 %addr.1 = getelementptr i32, ptr %base, iXLen -16139 %res = add i32 %ld, %a140 store i32 %res, ptr %addr.2141 ret ptr %addr.1142}143 144define ptr @lwib(ptr %base, i32 %a) {145; CHECK-LABEL: lwib:146; CHECK: # %bb.0:147; CHECK-NEXT: th.lwib a2, (a0), 4, 0148; CHECK-NEXT: add a1, a2, a1149; CHECK-NEXT: sw a1, 4(a0)150; CHECK-NEXT: ret151 %addr = getelementptr i32, ptr %base, iXLen 1152 %ld = load i32, ptr %addr153 %addr.1 = getelementptr i32, ptr %base, iXLen 2154 %res = add i32 %ld, %a155 store i32 %res, ptr %addr.1156 ret ptr %addr157}158 159define ptr @lwuia(ptr %base, ptr %addr.2, i64 %a) {160; RV32XTHEADMEMIDX-LABEL: lwuia:161; RV32XTHEADMEMIDX: # %bb.0:162; RV32XTHEADMEMIDX-NEXT: th.lwia a4, (a0), -16, 2163; RV32XTHEADMEMIDX-NEXT: add a2, a4, a2164; RV32XTHEADMEMIDX-NEXT: sltu a4, a2, a4165; RV32XTHEADMEMIDX-NEXT: add a3, a3, a4166; RV32XTHEADMEMIDX-NEXT: sw a2, 0(a1)167; RV32XTHEADMEMIDX-NEXT: sw a3, 4(a1)168; RV32XTHEADMEMIDX-NEXT: ret169;170; RV64XTHEADMEMIDX-LABEL: lwuia:171; RV64XTHEADMEMIDX: # %bb.0:172; RV64XTHEADMEMIDX-NEXT: th.lwuia a3, (a0), -16, 2173; RV64XTHEADMEMIDX-NEXT: add a2, a3, a2174; RV64XTHEADMEMIDX-NEXT: sd a2, 0(a1)175; RV64XTHEADMEMIDX-NEXT: ret176 %addr = getelementptr i32, ptr %base, iXLen 0177 %ld = load i32, ptr %addr178 %zext = zext i32 %ld to i64179 %addr.1 = getelementptr i32, ptr %base, iXLen -16180 %res = add i64 %zext, %a181 store i64 %res, ptr %addr.2182 ret ptr %addr.1183}184 185define ptr @lwuib(ptr %base, i64 %a, ptr %addr.1) {186; RV32XTHEADMEMIDX-LABEL: lwuib:187; RV32XTHEADMEMIDX: # %bb.0:188; RV32XTHEADMEMIDX-NEXT: th.lwib a4, (a0), 4, 0189; RV32XTHEADMEMIDX-NEXT: add a1, a4, a1190; RV32XTHEADMEMIDX-NEXT: sltu a4, a1, a4191; RV32XTHEADMEMIDX-NEXT: add a2, a2, a4192; RV32XTHEADMEMIDX-NEXT: sw a1, 0(a3)193; RV32XTHEADMEMIDX-NEXT: sw a2, 4(a3)194; RV32XTHEADMEMIDX-NEXT: ret195;196; RV64XTHEADMEMIDX-LABEL: lwuib:197; RV64XTHEADMEMIDX: # %bb.0:198; RV64XTHEADMEMIDX-NEXT: th.lwuib a3, (a0), 4, 0199; RV64XTHEADMEMIDX-NEXT: add a1, a3, a1200; RV64XTHEADMEMIDX-NEXT: sd a1, 0(a2)201; RV64XTHEADMEMIDX-NEXT: ret202 %addr = getelementptr i32, ptr %base, iXLen 1203 %ld = load i32, ptr %addr204 %zext = zext i32 %ld to i64205 %res = add i64 %zext, %a206 store i64 %res, ptr %addr.1207 ret ptr %addr208}209 210define ptr @ldia(ptr %base, ptr %addr.2, i64 %a) {211; RV32XTHEADMEMIDX-LABEL: ldia:212; RV32XTHEADMEMIDX: # %bb.0:213; RV32XTHEADMEMIDX-NEXT: lw a4, 4(a0)214; RV32XTHEADMEMIDX-NEXT: lw a5, 0(a0)215; RV32XTHEADMEMIDX-NEXT: addi a0, a0, -128216; RV32XTHEADMEMIDX-NEXT: add a3, a4, a3217; RV32XTHEADMEMIDX-NEXT: add a2, a5, a2218; RV32XTHEADMEMIDX-NEXT: sltu a4, a2, a5219; RV32XTHEADMEMIDX-NEXT: add a3, a3, a4220; RV32XTHEADMEMIDX-NEXT: sw a2, 0(a1)221; RV32XTHEADMEMIDX-NEXT: sw a3, 4(a1)222; RV32XTHEADMEMIDX-NEXT: ret223;224; RV64XTHEADMEMIDX-LABEL: ldia:225; RV64XTHEADMEMIDX: # %bb.0:226; RV64XTHEADMEMIDX-NEXT: th.ldia a3, (a0), -16, 3227; RV64XTHEADMEMIDX-NEXT: add a2, a3, a2228; RV64XTHEADMEMIDX-NEXT: sd a2, 0(a1)229; RV64XTHEADMEMIDX-NEXT: ret230 %addr = getelementptr i64, ptr %base, iXLen 0231 %ld = load i64, ptr %addr232 %addr.1 = getelementptr i64, ptr %base, iXLen -16233 %res = add i64 %ld, %a234 store i64 %res, ptr %addr.2235 ret ptr %addr.1236}237 238define ptr @ldib(ptr %base, i64 %a) {239; RV32XTHEADMEMIDX-LABEL: ldib:240; RV32XTHEADMEMIDX: # %bb.0:241; RV32XTHEADMEMIDX-NEXT: th.lwib a3, (a0), 8, 0242; RV32XTHEADMEMIDX-NEXT: lw a4, 4(a0)243; RV32XTHEADMEMIDX-NEXT: add a1, a3, a1244; RV32XTHEADMEMIDX-NEXT: sltu a3, a1, a3245; RV32XTHEADMEMIDX-NEXT: add a2, a2, a3246; RV32XTHEADMEMIDX-NEXT: add a2, a4, a2247; RV32XTHEADMEMIDX-NEXT: sw a1, 8(a0)248; RV32XTHEADMEMIDX-NEXT: sw a2, 12(a0)249; RV32XTHEADMEMIDX-NEXT: ret250;251; RV64XTHEADMEMIDX-LABEL: ldib:252; RV64XTHEADMEMIDX: # %bb.0:253; RV64XTHEADMEMIDX-NEXT: th.ldib a2, (a0), 8, 0254; RV64XTHEADMEMIDX-NEXT: add a1, a2, a1255; RV64XTHEADMEMIDX-NEXT: sd a1, 8(a0)256; RV64XTHEADMEMIDX-NEXT: ret257 %addr = getelementptr i64, ptr %base, iXLen 1258 %ld = load i64, ptr %addr259 %addr.1 = getelementptr i64, ptr %base, iXLen 2260 %res = add i64 %ld, %a261 store i64 %res, ptr %addr.1262 ret ptr %addr263}264 265define ptr @sbia(ptr %base, i8 %a, i8 %b) {266; CHECK-LABEL: sbia:267; CHECK: # %bb.0:268; CHECK-NEXT: add a1, a1, a2269; CHECK-NEXT: th.sbia a1, (a0), 1, 0270; CHECK-NEXT: ret271 %addr.1 = getelementptr i8, ptr %base, iXLen 1272 %res = add i8 %a, %b273 store i8 %res, ptr %base274 ret ptr %addr.1275}276 277define ptr @sbib(ptr %base, i8 %a, i8 %b) {278; CHECK-LABEL: sbib:279; CHECK: # %bb.0:280; CHECK-NEXT: add a1, a1, a2281; CHECK-NEXT: th.sbib a1, (a0), 1, 0282; CHECK-NEXT: ret283 %addr.1 = getelementptr i8, ptr %base, iXLen 1284 %res = add i8 %a, %b285 store i8 %res, ptr %addr.1286 ret ptr %addr.1287}288 289define ptr @shia(ptr %base, i16 %a, i16 %b) {290; CHECK-LABEL: shia:291; CHECK: # %bb.0:292; CHECK-NEXT: add a1, a1, a2293; CHECK-NEXT: th.shia a1, (a0), -9, 1294; CHECK-NEXT: ret295 %addr.1 = getelementptr i16, ptr %base, iXLen -9296 %res = add i16 %a, %b297 store i16 %res, ptr %base298 ret ptr %addr.1299}300 301define ptr @shib(ptr %base, i16 %a, i16 %b) {302; CHECK-LABEL: shib:303; CHECK: # %bb.0:304; CHECK-NEXT: add a1, a1, a2305; CHECK-NEXT: th.shib a1, (a0), 2, 0306; CHECK-NEXT: ret307 %addr.1 = getelementptr i16, ptr %base, iXLen 1308 %res = add i16 %a, %b309 store i16 %res, ptr %addr.1310 ret ptr %addr.1311}312 313define ptr @swia(ptr %base, i32 %a, i32 %b) {314; CHECK-LABEL: swia:315; CHECK: # %bb.0:316; CHECK-NEXT: add a1, a1, a2317; CHECK-NEXT: th.swia a1, (a0), 8, 2318; CHECK-NEXT: ret319 %addr.1 = getelementptr i32, ptr %base, iXLen 8320 %res = add i32 %a, %b321 store i32 %res, ptr %base322 ret ptr %addr.1323}324 325define ptr @swib(ptr %base, i32 %a, i32 %b) {326; CHECK-LABEL: swib:327; CHECK: # %bb.0:328; CHECK-NEXT: add a1, a1, a2329; CHECK-NEXT: th.swib a1, (a0), -13, 3330; CHECK-NEXT: ret331 %addr.1 = getelementptr i32, ptr %base, iXLen -26332 %res = add i32 %a, %b333 store i32 %res, ptr %addr.1334 ret ptr %addr.1335}336 337define ptr @sdia(ptr %base, i64 %a, i64 %b) {338; RV32XTHEADMEMIDX-LABEL: sdia:339; RV32XTHEADMEMIDX: # %bb.0:340; RV32XTHEADMEMIDX-NEXT: addi a5, a0, 64341; RV32XTHEADMEMIDX-NEXT: add a2, a2, a4342; RV32XTHEADMEMIDX-NEXT: add a3, a1, a3343; RV32XTHEADMEMIDX-NEXT: sltu a1, a3, a1344; RV32XTHEADMEMIDX-NEXT: add a1, a2, a1345; RV32XTHEADMEMIDX-NEXT: sw a3, 0(a0)346; RV32XTHEADMEMIDX-NEXT: sw a1, 4(a0)347; RV32XTHEADMEMIDX-NEXT: mv a0, a5348; RV32XTHEADMEMIDX-NEXT: ret349;350; RV64XTHEADMEMIDX-LABEL: sdia:351; RV64XTHEADMEMIDX: # %bb.0:352; RV64XTHEADMEMIDX-NEXT: add a1, a1, a2353; RV64XTHEADMEMIDX-NEXT: th.sdia a1, (a0), 8, 3354; RV64XTHEADMEMIDX-NEXT: ret355 %addr.1 = getelementptr i64, ptr %base, iXLen 8356 %res = add i64 %a, %b357 store i64 %res, ptr %base358 ret ptr %addr.1359}360 361define ptr @sdib(ptr %base, i64 %a, i64 %b) {362; RV32XTHEADMEMIDX-LABEL: sdib:363; RV32XTHEADMEMIDX: # %bb.0:364; RV32XTHEADMEMIDX-NEXT: add a2, a2, a4365; RV32XTHEADMEMIDX-NEXT: add a3, a1, a3366; RV32XTHEADMEMIDX-NEXT: sltu a1, a3, a1367; RV32XTHEADMEMIDX-NEXT: add a1, a2, a1368; RV32XTHEADMEMIDX-NEXT: th.swib a3, (a0), 8, 0369; RV32XTHEADMEMIDX-NEXT: sw a1, 4(a0)370; RV32XTHEADMEMIDX-NEXT: ret371;372; RV64XTHEADMEMIDX-LABEL: sdib:373; RV64XTHEADMEMIDX: # %bb.0:374; RV64XTHEADMEMIDX-NEXT: add a1, a1, a2375; RV64XTHEADMEMIDX-NEXT: th.sdib a1, (a0), 8, 0376; RV64XTHEADMEMIDX-NEXT: ret377 %addr.1 = getelementptr i64, ptr %base, iXLen 1378 %res = add i64 %a, %b379 store i64 %res, ptr %addr.1380 ret ptr %addr.1381}382 383define i8 @lrb_anyext(ptr %a, iXLen %b) {384; CHECK-LABEL: lrb_anyext:385; CHECK: # %bb.0:386; CHECK-NEXT: th.lrb a0, a0, a1, 0387; CHECK-NEXT: ret388 %1 = getelementptr i8, ptr %a, iXLen %b389 %2 = load i8, ptr %1, align 1390 ret i8 %2391}392 393define i32 @lrb(ptr %a, iXLen %b) {394; CHECK-LABEL: lrb:395; CHECK: # %bb.0:396; CHECK-NEXT: th.lrb a0, a0, a1, 0397; CHECK-NEXT: add a0, a0, a0398; CHECK-NEXT: ret399 %1 = getelementptr i8, ptr %a, iXLen %b400 %2 = load i8, ptr %1, align 1401 %3 = sext i8 %2 to i32402 %4 = add i32 %3, %3403 ret i32 %4404}405 406define i8 @lurb_anyext(ptr %a, i32 %b) {407; RV32XTHEADMEMIDX-LABEL: lurb_anyext:408; RV32XTHEADMEMIDX: # %bb.0:409; RV32XTHEADMEMIDX-NEXT: th.lrb a0, a0, a1, 0410; RV32XTHEADMEMIDX-NEXT: ret411;412; RV64XTHEADMEMIDX-LABEL: lurb_anyext:413; RV64XTHEADMEMIDX: # %bb.0:414; RV64XTHEADMEMIDX-NEXT: th.lurb a0, a0, a1, 0415; RV64XTHEADMEMIDX-NEXT: ret416 %1 = zext i32 %b to i64417 %2 = getelementptr i8, ptr %a, i64 %1418 %3 = load i8, ptr %2, align 1419 ret i8 %3420}421 422define i32 @lurb(ptr %a, i32 %b) {423; RV32XTHEADMEMIDX-LABEL: lurb:424; RV32XTHEADMEMIDX: # %bb.0:425; RV32XTHEADMEMIDX-NEXT: th.lrb a0, a0, a1, 0426; RV32XTHEADMEMIDX-NEXT: add a0, a0, a0427; RV32XTHEADMEMIDX-NEXT: ret428;429; RV64XTHEADMEMIDX-LABEL: lurb:430; RV64XTHEADMEMIDX: # %bb.0:431; RV64XTHEADMEMIDX-NEXT: th.lurb a0, a0, a1, 0432; RV64XTHEADMEMIDX-NEXT: add a0, a0, a0433; RV64XTHEADMEMIDX-NEXT: ret434 %1 = zext i32 %b to i64435 %2 = getelementptr i8, ptr %a, i64 %1436 %3 = load i8, ptr %2, align 1437 %4 = sext i8 %3 to i32438 %5 = add i32 %4, %4439 ret i32 %5440}441 442define i32 @lrbu(ptr %a, iXLen %b) {443; CHECK-LABEL: lrbu:444; CHECK: # %bb.0:445; CHECK-NEXT: th.lrbu a0, a0, a1, 0446; CHECK-NEXT: add a0, a0, a0447; CHECK-NEXT: ret448 %1 = getelementptr i8, ptr %a, iXLen %b449 %2 = load i8, ptr %1, align 1450 %3 = zext i8 %2 to i32451 %4 = add i32 %3, %3452 ret i32 %4453}454 455define i32 @lurbu(ptr %a, i32 %b) {456; RV32XTHEADMEMIDX-LABEL: lurbu:457; RV32XTHEADMEMIDX: # %bb.0:458; RV32XTHEADMEMIDX-NEXT: th.lrbu a0, a0, a1, 0459; RV32XTHEADMEMIDX-NEXT: add a0, a0, a0460; RV32XTHEADMEMIDX-NEXT: ret461;462; RV64XTHEADMEMIDX-LABEL: lurbu:463; RV64XTHEADMEMIDX: # %bb.0:464; RV64XTHEADMEMIDX-NEXT: th.lurbu a0, a0, a1, 0465; RV64XTHEADMEMIDX-NEXT: add a0, a0, a0466; RV64XTHEADMEMIDX-NEXT: ret467 %1 = zext i32 %b to i64468 %2 = getelementptr i8, ptr %a, i64 %1469 %3 = load i8, ptr %2, align 1470 %4 = zext i8 %3 to i32471 %5 = add i32 %4, %4472 ret i32 %5473}474 475define i16 @lrh_anyext(ptr %a, iXLen %b) {476; CHECK-LABEL: lrh_anyext:477; CHECK: # %bb.0:478; CHECK-NEXT: th.lrh a0, a0, a1, 1479; CHECK-NEXT: ret480 %1 = getelementptr i16, ptr %a, iXLen %b481 %2 = load i16, ptr %1, align 2482 ret i16 %2483}484 485define i32 @lrh(ptr %a, iXLen %b) {486; CHECK-LABEL: lrh:487; CHECK: # %bb.0:488; CHECK-NEXT: th.lrh a0, a0, a1, 1489; CHECK-NEXT: add a0, a0, a0490; CHECK-NEXT: ret491 %1 = getelementptr i16, ptr %a, iXLen %b492 %2 = load i16, ptr %1, align 2493 %3 = sext i16 %2 to i32494 %4 = add i32 %3, %3495 ret i32 %4496}497 498define i16 @lurh_anyext(ptr %a, i32 %b) {499; RV32XTHEADMEMIDX-LABEL: lurh_anyext:500; RV32XTHEADMEMIDX: # %bb.0:501; RV32XTHEADMEMIDX-NEXT: th.lrh a0, a0, a1, 1502; RV32XTHEADMEMIDX-NEXT: ret503;504; RV64XTHEADMEMIDX-LABEL: lurh_anyext:505; RV64XTHEADMEMIDX: # %bb.0:506; RV64XTHEADMEMIDX-NEXT: th.lurh a0, a0, a1, 1507; RV64XTHEADMEMIDX-NEXT: ret508 %1 = zext i32 %b to i64509 %2 = getelementptr i16, ptr %a, i64 %1510 %3 = load i16, ptr %2, align 2511 ret i16 %3512}513 514define i32 @lurh(ptr %a, i32 %b) {515; RV32XTHEADMEMIDX-LABEL: lurh:516; RV32XTHEADMEMIDX: # %bb.0:517; RV32XTHEADMEMIDX-NEXT: th.lrh a0, a0, a1, 1518; RV32XTHEADMEMIDX-NEXT: add a0, a0, a0519; RV32XTHEADMEMIDX-NEXT: ret520;521; RV64XTHEADMEMIDX-LABEL: lurh:522; RV64XTHEADMEMIDX: # %bb.0:523; RV64XTHEADMEMIDX-NEXT: th.lurh a0, a0, a1, 1524; RV64XTHEADMEMIDX-NEXT: add a0, a0, a0525; RV64XTHEADMEMIDX-NEXT: ret526 %1 = zext i32 %b to i64527 %2 = getelementptr i16, ptr %a, i64 %1528 %3 = load i16, ptr %2, align 2529 %4 = sext i16 %3 to i32530 %5 = add i32 %4, %4531 ret i32 %5532}533 534define i32 @lrhu(ptr %a, iXLen %b) {535; CHECK-LABEL: lrhu:536; CHECK: # %bb.0:537; CHECK-NEXT: th.lrhu a0, a0, a1, 1538; CHECK-NEXT: add a0, a0, a0539; CHECK-NEXT: ret540 %1 = getelementptr i16, ptr %a, iXLen %b541 %2 = load i16, ptr %1, align 2542 %3 = zext i16 %2 to i32543 %4 = add i32 %3, %3544 ret i32 %4545}546 547define i32 @lurhu(ptr %a, i32 %b) {548; RV32XTHEADMEMIDX-LABEL: lurhu:549; RV32XTHEADMEMIDX: # %bb.0:550; RV32XTHEADMEMIDX-NEXT: th.lrhu a0, a0, a1, 1551; RV32XTHEADMEMIDX-NEXT: add a0, a0, a0552; RV32XTHEADMEMIDX-NEXT: ret553;554; RV64XTHEADMEMIDX-LABEL: lurhu:555; RV64XTHEADMEMIDX: # %bb.0:556; RV64XTHEADMEMIDX-NEXT: th.lurhu a0, a0, a1, 1557; RV64XTHEADMEMIDX-NEXT: add a0, a0, a0558; RV64XTHEADMEMIDX-NEXT: ret559 %1 = zext i32 %b to i64560 %2 = getelementptr i16, ptr %a, i64 %1561 %3 = load i16, ptr %2, align 2562 %4 = zext i16 %3 to i32563 %5 = add i32 %4, %4564 ret i32 %5565}566 567define i32 @lrw_anyext(ptr %a, iXLen %b) {568; CHECK-LABEL: lrw_anyext:569; CHECK: # %bb.0:570; CHECK-NEXT: th.lrw a0, a0, a1, 2571; CHECK-NEXT: ret572 %1 = getelementptr i32, ptr %a, iXLen %b573 %2 = load i32, ptr %1, align 4574 ret i32 %2575}576 577define i64 @lrw(ptr %a, iXLen %b) {578; RV32XTHEADMEMIDX-LABEL: lrw:579; RV32XTHEADMEMIDX: # %bb.0:580; RV32XTHEADMEMIDX-NEXT: th.lrw a1, a0, a1, 2581; RV32XTHEADMEMIDX-NEXT: srai a2, a1, 31582; RV32XTHEADMEMIDX-NEXT: add a0, a1, a1583; RV32XTHEADMEMIDX-NEXT: sltu a1, a0, a1584; RV32XTHEADMEMIDX-NEXT: add a2, a2, a2585; RV32XTHEADMEMIDX-NEXT: add a1, a2, a1586; RV32XTHEADMEMIDX-NEXT: ret587;588; RV64XTHEADMEMIDX-LABEL: lrw:589; RV64XTHEADMEMIDX: # %bb.0:590; RV64XTHEADMEMIDX-NEXT: th.lrw a0, a0, a1, 2591; RV64XTHEADMEMIDX-NEXT: add a0, a0, a0592; RV64XTHEADMEMIDX-NEXT: ret593 %1 = getelementptr i32, ptr %a, iXLen %b594 %2 = load i32, ptr %1, align 4595 %3 = sext i32 %2 to i64596 %4 = add i64 %3, %3597 ret i64 %4598}599 600define i32 @lurw_anyext(ptr %a, i32 %b) {601; RV32XTHEADMEMIDX-LABEL: lurw_anyext:602; RV32XTHEADMEMIDX: # %bb.0:603; RV32XTHEADMEMIDX-NEXT: th.lrw a0, a0, a1, 2604; RV32XTHEADMEMIDX-NEXT: ret605;606; RV64XTHEADMEMIDX-LABEL: lurw_anyext:607; RV64XTHEADMEMIDX: # %bb.0:608; RV64XTHEADMEMIDX-NEXT: th.lurw a0, a0, a1, 2609; RV64XTHEADMEMIDX-NEXT: ret610 %1 = zext i32 %b to i64611 %2 = getelementptr i32, ptr %a, i64 %1612 %3 = load i32, ptr %2, align 4613 ret i32 %3614}615 616define i64 @lurw(ptr %a, i32 %b) {617; RV32XTHEADMEMIDX-LABEL: lurw:618; RV32XTHEADMEMIDX: # %bb.0:619; RV32XTHEADMEMIDX-NEXT: th.lrw a1, a0, a1, 2620; RV32XTHEADMEMIDX-NEXT: srai a2, a1, 31621; RV32XTHEADMEMIDX-NEXT: add a0, a1, a1622; RV32XTHEADMEMIDX-NEXT: sltu a1, a0, a1623; RV32XTHEADMEMIDX-NEXT: add a2, a2, a2624; RV32XTHEADMEMIDX-NEXT: add a1, a2, a1625; RV32XTHEADMEMIDX-NEXT: ret626;627; RV64XTHEADMEMIDX-LABEL: lurw:628; RV64XTHEADMEMIDX: # %bb.0:629; RV64XTHEADMEMIDX-NEXT: th.lurw a0, a0, a1, 2630; RV64XTHEADMEMIDX-NEXT: add a0, a0, a0631; RV64XTHEADMEMIDX-NEXT: ret632 %1 = zext i32 %b to i64633 %2 = getelementptr i32, ptr %a, i64 %1634 %3 = load i32, ptr %2, align 4635 %4 = sext i32 %3 to i64636 %5 = add i64 %4, %4637 ret i64 %5638}639 640define i64 @lrwu(ptr %a, iXLen %b) {641; RV32XTHEADMEMIDX-LABEL: lrwu:642; RV32XTHEADMEMIDX: # %bb.0:643; RV32XTHEADMEMIDX-NEXT: th.lrw a1, a0, a1, 2644; RV32XTHEADMEMIDX-NEXT: add a0, a1, a1645; RV32XTHEADMEMIDX-NEXT: sltu a1, a0, a1646; RV32XTHEADMEMIDX-NEXT: ret647;648; RV64XTHEADMEMIDX-LABEL: lrwu:649; RV64XTHEADMEMIDX: # %bb.0:650; RV64XTHEADMEMIDX-NEXT: th.lrwu a0, a0, a1, 2651; RV64XTHEADMEMIDX-NEXT: add a0, a0, a0652; RV64XTHEADMEMIDX-NEXT: ret653 %1 = getelementptr i32, ptr %a, iXLen %b654 %2 = load i32, ptr %1, align 4655 %3 = zext i32 %2 to i64656 %4 = add i64 %3, %3657 ret i64 %4658}659 660define i64 @lurwu(ptr %a, i32 %b) {661; RV32XTHEADMEMIDX-LABEL: lurwu:662; RV32XTHEADMEMIDX: # %bb.0:663; RV32XTHEADMEMIDX-NEXT: th.lrw a1, a0, a1, 2664; RV32XTHEADMEMIDX-NEXT: add a0, a1, a1665; RV32XTHEADMEMIDX-NEXT: sltu a1, a0, a1666; RV32XTHEADMEMIDX-NEXT: ret667;668; RV64XTHEADMEMIDX-LABEL: lurwu:669; RV64XTHEADMEMIDX: # %bb.0:670; RV64XTHEADMEMIDX-NEXT: th.lurwu a0, a0, a1, 2671; RV64XTHEADMEMIDX-NEXT: add a0, a0, a0672; RV64XTHEADMEMIDX-NEXT: ret673 %1 = zext i32 %b to i64674 %2 = getelementptr i32, ptr %a, i64 %1675 %3 = load i32, ptr %2, align 4676 %4 = zext i32 %3 to i64677 %5 = add i64 %4, %4678 ret i64 %5679}680 681define i64 @lrd(ptr %a, iXLen %b) {682; RV32XTHEADMEMIDX-LABEL: lrd:683; RV32XTHEADMEMIDX: # %bb.0:684; RV32XTHEADMEMIDX-NEXT: th.lrw a2, a0, a1, 3685; RV32XTHEADMEMIDX-NEXT: addi a0, a0, 4686; RV32XTHEADMEMIDX-NEXT: th.lrw a1, a0, a1, 3687; RV32XTHEADMEMIDX-NEXT: add a0, a2, a2688; RV32XTHEADMEMIDX-NEXT: sltu a2, a0, a2689; RV32XTHEADMEMIDX-NEXT: add a1, a1, a1690; RV32XTHEADMEMIDX-NEXT: add a1, a1, a2691; RV32XTHEADMEMIDX-NEXT: ret692;693; RV64XTHEADMEMIDX-LABEL: lrd:694; RV64XTHEADMEMIDX: # %bb.0:695; RV64XTHEADMEMIDX-NEXT: th.lrd a0, a0, a1, 3696; RV64XTHEADMEMIDX-NEXT: add a0, a0, a0697; RV64XTHEADMEMIDX-NEXT: ret698 %1 = getelementptr i64, ptr %a, iXLen %b699 %2 = load i64, ptr %1, align 8700 %3 = add i64 %2, %2701 ret i64 %3702}703 704define i64 @lrd_2(ptr %a, iXLen %b) {705; RV32XTHEADMEMIDX-LABEL: lrd_2:706; RV32XTHEADMEMIDX: # %bb.0:707; RV32XTHEADMEMIDX-NEXT: slli a1, a1, 3708; RV32XTHEADMEMIDX-NEXT: add a0, a1, a0709; RV32XTHEADMEMIDX-NEXT: lw a1, 96(a0)710; RV32XTHEADMEMIDX-NEXT: lw a2, 100(a0)711; RV32XTHEADMEMIDX-NEXT: add a0, a1, a1712; RV32XTHEADMEMIDX-NEXT: sltu a1, a0, a1713; RV32XTHEADMEMIDX-NEXT: add a2, a2, a2714; RV32XTHEADMEMIDX-NEXT: add a1, a2, a1715; RV32XTHEADMEMIDX-NEXT: ret716;717; RV64XTHEADMEMIDX-LABEL: lrd_2:718; RV64XTHEADMEMIDX: # %bb.0:719; RV64XTHEADMEMIDX-NEXT: addi a0, a0, 96720; RV64XTHEADMEMIDX-NEXT: th.lrd a0, a0, a1, 3721; RV64XTHEADMEMIDX-NEXT: add a0, a0, a0722; RV64XTHEADMEMIDX-NEXT: ret723 %1 = add iXLen %b, 12724 %2 = getelementptr i64, ptr %a, iXLen %1725 %3 = load i64, ptr %2, align 8726 %4 = add i64 %3, %3727 ret i64 %4728}729 730define i64 @lurd(ptr %a, i32 %b) {731; RV32XTHEADMEMIDX-LABEL: lurd:732; RV32XTHEADMEMIDX: # %bb.0:733; RV32XTHEADMEMIDX-NEXT: th.lrw a2, a0, a1, 3734; RV32XTHEADMEMIDX-NEXT: addi a0, a0, 4735; RV32XTHEADMEMIDX-NEXT: th.lrw a1, a0, a1, 3736; RV32XTHEADMEMIDX-NEXT: add a0, a2, a2737; RV32XTHEADMEMIDX-NEXT: sltu a2, a0, a2738; RV32XTHEADMEMIDX-NEXT: add a1, a1, a1739; RV32XTHEADMEMIDX-NEXT: add a1, a1, a2740; RV32XTHEADMEMIDX-NEXT: ret741;742; RV64XTHEADMEMIDX-LABEL: lurd:743; RV64XTHEADMEMIDX: # %bb.0:744; RV64XTHEADMEMIDX-NEXT: th.lurd a0, a0, a1, 3745; RV64XTHEADMEMIDX-NEXT: add a0, a0, a0746; RV64XTHEADMEMIDX-NEXT: ret747 %1 = zext i32 %b to i64748 %2 = getelementptr i64, ptr %a, i64 %1749 %3 = load i64, ptr %2, align 8750 %4 = add i64 %3, %3751 ret i64 %4752}753 754define void @srb(ptr %a, iXLen %b, i8 %c) {755; CHECK-LABEL: srb:756; CHECK: # %bb.0:757; CHECK-NEXT: add a2, a2, a2758; CHECK-NEXT: th.srb a2, a0, a1, 0759; CHECK-NEXT: ret760 %1 = add i8 %c, %c761 %2 = getelementptr i8, ptr %a, iXLen %b762 store i8 %1, ptr %2, align 1763 ret void764}765 766define void @surb(ptr %a, i32 %b, i8 %c) {767; RV32XTHEADMEMIDX-LABEL: surb:768; RV32XTHEADMEMIDX: # %bb.0:769; RV32XTHEADMEMIDX-NEXT: add a2, a2, a2770; RV32XTHEADMEMIDX-NEXT: th.srb a2, a0, a1, 0771; RV32XTHEADMEMIDX-NEXT: ret772;773; RV64XTHEADMEMIDX-LABEL: surb:774; RV64XTHEADMEMIDX: # %bb.0:775; RV64XTHEADMEMIDX-NEXT: add a2, a2, a2776; RV64XTHEADMEMIDX-NEXT: th.surb a2, a0, a1, 0777; RV64XTHEADMEMIDX-NEXT: ret778 %1 = zext i32 %b to i64779 %2 = add i8 %c, %c780 %3 = getelementptr i8, ptr %a, i64 %1781 store i8 %2, ptr %3, align 1782 ret void783}784 785define void @srh(ptr %a, iXLen %b, i16 %c) {786; CHECK-LABEL: srh:787; CHECK: # %bb.0:788; CHECK-NEXT: add a2, a2, a2789; CHECK-NEXT: th.srh a2, a0, a1, 1790; CHECK-NEXT: ret791 %1 = add i16 %c, %c792 %2 = getelementptr i16, ptr %a, iXLen %b793 store i16 %1, ptr %2, align 2794 ret void795}796 797define void @surh(ptr %a, i32 %b, i16 %c) {798; RV32XTHEADMEMIDX-LABEL: surh:799; RV32XTHEADMEMIDX: # %bb.0:800; RV32XTHEADMEMIDX-NEXT: add a2, a2, a2801; RV32XTHEADMEMIDX-NEXT: th.srh a2, a0, a1, 1802; RV32XTHEADMEMIDX-NEXT: ret803;804; RV64XTHEADMEMIDX-LABEL: surh:805; RV64XTHEADMEMIDX: # %bb.0:806; RV64XTHEADMEMIDX-NEXT: add a2, a2, a2807; RV64XTHEADMEMIDX-NEXT: th.surh a2, a0, a1, 1808; RV64XTHEADMEMIDX-NEXT: ret809 %1 = zext i32 %b to i64810 %2 = add i16 %c, %c811 %3 = getelementptr i16, ptr %a, i64 %1812 store i16 %2, ptr %3, align 2813 ret void814}815 816define void @srw(ptr %a, iXLen %b, i32 %c) {817; CHECK-LABEL: srw:818; CHECK: # %bb.0:819; CHECK-NEXT: add a2, a2, a2820; CHECK-NEXT: th.srw a2, a0, a1, 2821; CHECK-NEXT: ret822 %1 = add i32 %c, %c823 %2 = getelementptr i32, ptr %a, iXLen %b824 store i32 %1, ptr %2, align 4825 ret void826}827 828define void @surw(ptr %a, i32 %b, i32 %c) {829; RV32XTHEADMEMIDX-LABEL: surw:830; RV32XTHEADMEMIDX: # %bb.0:831; RV32XTHEADMEMIDX-NEXT: add a2, a2, a2832; RV32XTHEADMEMIDX-NEXT: th.srw a2, a0, a1, 2833; RV32XTHEADMEMIDX-NEXT: ret834;835; RV64XTHEADMEMIDX-LABEL: surw:836; RV64XTHEADMEMIDX: # %bb.0:837; RV64XTHEADMEMIDX-NEXT: add a2, a2, a2838; RV64XTHEADMEMIDX-NEXT: th.surw a2, a0, a1, 2839; RV64XTHEADMEMIDX-NEXT: ret840 %1 = zext i32 %b to i64841 %2 = add i32 %c, %c842 %3 = getelementptr i32, ptr %a, i64 %1843 store i32 %2, ptr %3, align 4844 ret void845}846 847define void @srd(ptr %a, iXLen %b, i64 %c) {848; RV32XTHEADMEMIDX-LABEL: srd:849; RV32XTHEADMEMIDX: # %bb.0:850; RV32XTHEADMEMIDX-NEXT: add a4, a2, a2851; RV32XTHEADMEMIDX-NEXT: add a3, a3, a3852; RV32XTHEADMEMIDX-NEXT: sltu a2, a4, a2853; RV32XTHEADMEMIDX-NEXT: th.srw a4, a0, a1, 3854; RV32XTHEADMEMIDX-NEXT: add a2, a3, a2855; RV32XTHEADMEMIDX-NEXT: addi a0, a0, 4856; RV32XTHEADMEMIDX-NEXT: th.srw a2, a0, a1, 3857; RV32XTHEADMEMIDX-NEXT: ret858;859; RV64XTHEADMEMIDX-LABEL: srd:860; RV64XTHEADMEMIDX: # %bb.0:861; RV64XTHEADMEMIDX-NEXT: add a2, a2, a2862; RV64XTHEADMEMIDX-NEXT: th.srd a2, a0, a1, 3863; RV64XTHEADMEMIDX-NEXT: ret864 %1 = add i64 %c, %c865 %2 = getelementptr i64, ptr %a, iXLen %b866 store i64 %1, ptr %2, align 8867 ret void868}869 870define void @surd(ptr %a, i32 %b, i64 %c) {871; RV32XTHEADMEMIDX-LABEL: surd:872; RV32XTHEADMEMIDX: # %bb.0:873; RV32XTHEADMEMIDX-NEXT: add a4, a2, a2874; RV32XTHEADMEMIDX-NEXT: add a3, a3, a3875; RV32XTHEADMEMIDX-NEXT: sltu a2, a4, a2876; RV32XTHEADMEMIDX-NEXT: th.srw a4, a0, a1, 3877; RV32XTHEADMEMIDX-NEXT: add a2, a3, a2878; RV32XTHEADMEMIDX-NEXT: addi a0, a0, 4879; RV32XTHEADMEMIDX-NEXT: th.srw a2, a0, a1, 3880; RV32XTHEADMEMIDX-NEXT: ret881;882; RV64XTHEADMEMIDX-LABEL: surd:883; RV64XTHEADMEMIDX: # %bb.0:884; RV64XTHEADMEMIDX-NEXT: add a2, a2, a2885; RV64XTHEADMEMIDX-NEXT: th.surd a2, a0, a1, 3886; RV64XTHEADMEMIDX-NEXT: ret887 %1 = zext i32 %b to i64888 %2 = add i64 %c, %c889 %3 = getelementptr i64, ptr %a, i64 %1890 store i64 %2, ptr %3, align 8891 ret void892}893 894define ptr @test_simm5(ptr %base, i32 %a, i32 %b) {895; CHECK-LABEL: test_simm5:896; CHECK: # %bb.0:897; CHECK-NEXT: add a1, a1, a2898; CHECK-NEXT: th.swia a1, (a0), -12, 2899; CHECK-NEXT: ret900 %addr.1 = getelementptr i32, ptr %base, i32 -12901 %res = add i32 %a, %b902 store i32 %res, ptr %base903 ret ptr %addr.1904}905 906define i64 @lrd_large_shift(ptr %a, iXLen %b) {907; RV32XTHEADMEMIDX-LABEL: lrd_large_shift:908; RV32XTHEADMEMIDX: # %bb.0:909; RV32XTHEADMEMIDX-NEXT: slli a1, a1, 5910; RV32XTHEADMEMIDX-NEXT: add a1, a1, a0911; RV32XTHEADMEMIDX-NEXT: lw a0, 384(a1)912; RV32XTHEADMEMIDX-NEXT: lw a1, 388(a1)913; RV32XTHEADMEMIDX-NEXT: ret914;915; RV64XTHEADMEMIDX-LABEL: lrd_large_shift:916; RV64XTHEADMEMIDX: # %bb.0:917; RV64XTHEADMEMIDX-NEXT: slli a1, a1, 5918; RV64XTHEADMEMIDX-NEXT: add a0, a1, a0919; RV64XTHEADMEMIDX-NEXT: ld a0, 384(a0)920; RV64XTHEADMEMIDX-NEXT: ret921 %1 = add iXLen %b, 12922 %2 = shl iXLen %1, 2923 %3 = getelementptr i64, ptr %a, iXLen %2924 %4 = load i64, ptr %3, align 8925 ret i64 %4926}927 928define i64 @lrd_large_offset(ptr %a, iXLen %b) {929; RV32XTHEADMEMIDX-LABEL: lrd_large_offset:930; RV32XTHEADMEMIDX: # %bb.0:931; RV32XTHEADMEMIDX-NEXT: slli a1, a1, 3932; RV32XTHEADMEMIDX-NEXT: add a0, a1, a0933; RV32XTHEADMEMIDX-NEXT: lui a1, 23934; RV32XTHEADMEMIDX-NEXT: add a1, a0, a1935; RV32XTHEADMEMIDX-NEXT: lw a0, 1792(a1)936; RV32XTHEADMEMIDX-NEXT: lw a1, 1796(a1)937; RV32XTHEADMEMIDX-NEXT: ret938;939; RV64XTHEADMEMIDX-LABEL: lrd_large_offset:940; RV64XTHEADMEMIDX: # %bb.0:941; RV64XTHEADMEMIDX-NEXT: slli a1, a1, 3942; RV64XTHEADMEMIDX-NEXT: add a0, a1, a0943; RV64XTHEADMEMIDX-NEXT: lui a1, 23944; RV64XTHEADMEMIDX-NEXT: add a0, a0, a1945; RV64XTHEADMEMIDX-NEXT: ld a0, 1792(a0)946; RV64XTHEADMEMIDX-NEXT: ret947 %1 = add iXLen %b, 12000948 %2 = getelementptr i64, ptr %a, iXLen %1949 %3 = load i64, ptr %2, align 8950 ret i64 %3951}952