brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.8 KiB · 9f0f8d9 Raw
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