brintos

brintos / llvm-project-archived public Read only

0
0
Text · 32.3 KiB · ea9d117 Raw
1303 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \3; RUN:   | FileCheck %s -check-prefixes=CHECK,RV32I4; RUN: llc -mtriple=riscv32 -mattr=+m,+zba -verify-machineinstrs < %s \5; RUN:   | FileCheck %s -check-prefixes=CHECK,RV32ZBA6; RUN: llc -mtriple=riscv32 -mattr=+m,+xandesperf -verify-machineinstrs < %s \7; RUN:   | FileCheck %s -check-prefixes=CHECK,RV32XANDESPERF8 9define signext i16 @sh1add(i64 %0, ptr %1) {10; RV32I-LABEL: sh1add:11; RV32I:       # %bb.0:12; RV32I-NEXT:    slli a0, a0, 113; RV32I-NEXT:    add a0, a2, a014; RV32I-NEXT:    lh a0, 0(a0)15; RV32I-NEXT:    ret16;17; RV32ZBA-LABEL: sh1add:18; RV32ZBA:       # %bb.0:19; RV32ZBA-NEXT:    sh1add a0, a0, a220; RV32ZBA-NEXT:    lh a0, 0(a0)21; RV32ZBA-NEXT:    ret22;23; RV32XANDESPERF-LABEL: sh1add:24; RV32XANDESPERF:       # %bb.0:25; RV32XANDESPERF-NEXT:    nds.lea.h a0, a2, a026; RV32XANDESPERF-NEXT:    lh a0, 0(a0)27; RV32XANDESPERF-NEXT:    ret28  %3 = getelementptr inbounds i16, ptr %1, i64 %029  %4 = load i16, ptr %330  ret i16 %431}32 33define i32 @sh2add(i64 %0, ptr %1) {34; RV32I-LABEL: sh2add:35; RV32I:       # %bb.0:36; RV32I-NEXT:    slli a0, a0, 237; RV32I-NEXT:    add a0, a2, a038; RV32I-NEXT:    lw a0, 0(a0)39; RV32I-NEXT:    ret40;41; RV32ZBA-LABEL: sh2add:42; RV32ZBA:       # %bb.0:43; RV32ZBA-NEXT:    sh2add a0, a0, a244; RV32ZBA-NEXT:    lw a0, 0(a0)45; RV32ZBA-NEXT:    ret46;47; RV32XANDESPERF-LABEL: sh2add:48; RV32XANDESPERF:       # %bb.0:49; RV32XANDESPERF-NEXT:    nds.lea.w a0, a2, a050; RV32XANDESPERF-NEXT:    lw a0, 0(a0)51; RV32XANDESPERF-NEXT:    ret52  %3 = getelementptr inbounds i32, ptr %1, i64 %053  %4 = load i32, ptr %354  ret i32 %455}56 57define i64 @sh3add(i64 %0, ptr %1) {58; RV32I-LABEL: sh3add:59; RV32I:       # %bb.0:60; RV32I-NEXT:    slli a0, a0, 361; RV32I-NEXT:    add a2, a2, a062; RV32I-NEXT:    lw a0, 0(a2)63; RV32I-NEXT:    lw a1, 4(a2)64; RV32I-NEXT:    ret65;66; RV32ZBA-LABEL: sh3add:67; RV32ZBA:       # %bb.0:68; RV32ZBA-NEXT:    sh3add a1, a0, a269; RV32ZBA-NEXT:    lw a0, 0(a1)70; RV32ZBA-NEXT:    lw a1, 4(a1)71; RV32ZBA-NEXT:    ret72;73; RV32XANDESPERF-LABEL: sh3add:74; RV32XANDESPERF:       # %bb.0:75; RV32XANDESPERF-NEXT:    nds.lea.d a1, a2, a076; RV32XANDESPERF-NEXT:    lw a0, 0(a1)77; RV32XANDESPERF-NEXT:    lw a1, 4(a1)78; RV32XANDESPERF-NEXT:    ret79  %3 = getelementptr inbounds i64, ptr %1, i64 %080  %4 = load i64, ptr %381  ret i64 %482}83 84define i32 @addmul6(i32 %a, i32 %b) {85; RV32I-LABEL: addmul6:86; RV32I:       # %bb.0:87; RV32I-NEXT:    slli a2, a0, 188; RV32I-NEXT:    slli a0, a0, 289; RV32I-NEXT:    add a0, a0, a290; RV32I-NEXT:    add a0, a0, a191; RV32I-NEXT:    ret92;93; RV32ZBA-LABEL: addmul6:94; RV32ZBA:       # %bb.0:95; RV32ZBA-NEXT:    sh1add a0, a0, a096; RV32ZBA-NEXT:    sh1add a0, a0, a197; RV32ZBA-NEXT:    ret98;99; RV32XANDESPERF-LABEL: addmul6:100; RV32XANDESPERF:       # %bb.0:101; RV32XANDESPERF-NEXT:    nds.lea.h a0, a0, a0102; RV32XANDESPERF-NEXT:    nds.lea.h a0, a1, a0103; RV32XANDESPERF-NEXT:    ret104  %c = mul i32 %a, 6105  %d = add i32 %c, %b106  ret i32 %d107}108 109define i32 @addmul10(i32 %a, i32 %b) {110; RV32I-LABEL: addmul10:111; RV32I:       # %bb.0:112; RV32I-NEXT:    slli a2, a0, 1113; RV32I-NEXT:    slli a0, a0, 3114; RV32I-NEXT:    add a0, a0, a2115; RV32I-NEXT:    add a0, a0, a1116; RV32I-NEXT:    ret117;118; RV32ZBA-LABEL: addmul10:119; RV32ZBA:       # %bb.0:120; RV32ZBA-NEXT:    sh2add a0, a0, a0121; RV32ZBA-NEXT:    sh1add a0, a0, a1122; RV32ZBA-NEXT:    ret123;124; RV32XANDESPERF-LABEL: addmul10:125; RV32XANDESPERF:       # %bb.0:126; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a0127; RV32XANDESPERF-NEXT:    nds.lea.h a0, a1, a0128; RV32XANDESPERF-NEXT:    ret129  %c = mul i32 %a, 10130  %d = add i32 %c, %b131  ret i32 %d132}133 134define i32 @addmul12(i32 %a, i32 %b) {135; RV32I-LABEL: addmul12:136; RV32I:       # %bb.0:137; RV32I-NEXT:    slli a2, a0, 2138; RV32I-NEXT:    slli a0, a0, 3139; RV32I-NEXT:    add a0, a0, a2140; RV32I-NEXT:    add a0, a0, a1141; RV32I-NEXT:    ret142;143; RV32ZBA-LABEL: addmul12:144; RV32ZBA:       # %bb.0:145; RV32ZBA-NEXT:    sh1add a0, a0, a0146; RV32ZBA-NEXT:    sh2add a0, a0, a1147; RV32ZBA-NEXT:    ret148;149; RV32XANDESPERF-LABEL: addmul12:150; RV32XANDESPERF:       # %bb.0:151; RV32XANDESPERF-NEXT:    nds.lea.h a0, a0, a0152; RV32XANDESPERF-NEXT:    nds.lea.w a0, a1, a0153; RV32XANDESPERF-NEXT:    ret154  %c = mul i32 %a, 12155  %d = add i32 %c, %b156  ret i32 %d157}158 159define i32 @addmul18(i32 %a, i32 %b) {160; RV32I-LABEL: addmul18:161; RV32I:       # %bb.0:162; RV32I-NEXT:    slli a2, a0, 1163; RV32I-NEXT:    slli a0, a0, 4164; RV32I-NEXT:    add a0, a0, a2165; RV32I-NEXT:    add a0, a0, a1166; RV32I-NEXT:    ret167;168; RV32ZBA-LABEL: addmul18:169; RV32ZBA:       # %bb.0:170; RV32ZBA-NEXT:    sh3add a0, a0, a0171; RV32ZBA-NEXT:    sh1add a0, a0, a1172; RV32ZBA-NEXT:    ret173;174; RV32XANDESPERF-LABEL: addmul18:175; RV32XANDESPERF:       # %bb.0:176; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a0177; RV32XANDESPERF-NEXT:    nds.lea.h a0, a1, a0178; RV32XANDESPERF-NEXT:    ret179  %c = mul i32 %a, 18180  %d = add i32 %c, %b181  ret i32 %d182}183 184define i32 @addmul20(i32 %a, i32 %b) {185; RV32I-LABEL: addmul20:186; RV32I:       # %bb.0:187; RV32I-NEXT:    slli a2, a0, 2188; RV32I-NEXT:    slli a0, a0, 4189; RV32I-NEXT:    add a0, a0, a2190; RV32I-NEXT:    add a0, a0, a1191; RV32I-NEXT:    ret192;193; RV32ZBA-LABEL: addmul20:194; RV32ZBA:       # %bb.0:195; RV32ZBA-NEXT:    sh2add a0, a0, a0196; RV32ZBA-NEXT:    sh2add a0, a0, a1197; RV32ZBA-NEXT:    ret198;199; RV32XANDESPERF-LABEL: addmul20:200; RV32XANDESPERF:       # %bb.0:201; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a0202; RV32XANDESPERF-NEXT:    nds.lea.w a0, a1, a0203; RV32XANDESPERF-NEXT:    ret204  %c = mul i32 %a, 20205  %d = add i32 %c, %b206  ret i32 %d207}208 209define i32 @addmul24(i32 %a, i32 %b) {210; RV32I-LABEL: addmul24:211; RV32I:       # %bb.0:212; RV32I-NEXT:    slli a2, a0, 3213; RV32I-NEXT:    slli a0, a0, 4214; RV32I-NEXT:    add a0, a0, a2215; RV32I-NEXT:    add a0, a0, a1216; RV32I-NEXT:    ret217;218; RV32ZBA-LABEL: addmul24:219; RV32ZBA:       # %bb.0:220; RV32ZBA-NEXT:    sh1add a0, a0, a0221; RV32ZBA-NEXT:    sh3add a0, a0, a1222; RV32ZBA-NEXT:    ret223;224; RV32XANDESPERF-LABEL: addmul24:225; RV32XANDESPERF:       # %bb.0:226; RV32XANDESPERF-NEXT:    nds.lea.h a0, a0, a0227; RV32XANDESPERF-NEXT:    nds.lea.d a0, a1, a0228; RV32XANDESPERF-NEXT:    ret229  %c = mul i32 %a, 24230  %d = add i32 %c, %b231  ret i32 %d232}233 234define i32 @addmul36(i32 %a, i32 %b) {235; RV32I-LABEL: addmul36:236; RV32I:       # %bb.0:237; RV32I-NEXT:    slli a2, a0, 2238; RV32I-NEXT:    slli a0, a0, 5239; RV32I-NEXT:    add a0, a0, a2240; RV32I-NEXT:    add a0, a0, a1241; RV32I-NEXT:    ret242;243; RV32ZBA-LABEL: addmul36:244; RV32ZBA:       # %bb.0:245; RV32ZBA-NEXT:    sh3add a0, a0, a0246; RV32ZBA-NEXT:    sh2add a0, a0, a1247; RV32ZBA-NEXT:    ret248;249; RV32XANDESPERF-LABEL: addmul36:250; RV32XANDESPERF:       # %bb.0:251; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a0252; RV32XANDESPERF-NEXT:    nds.lea.w a0, a1, a0253; RV32XANDESPERF-NEXT:    ret254  %c = mul i32 %a, 36255  %d = add i32 %c, %b256  ret i32 %d257}258 259define i32 @addmul40(i32 %a, i32 %b) {260; RV32I-LABEL: addmul40:261; RV32I:       # %bb.0:262; RV32I-NEXT:    slli a2, a0, 3263; RV32I-NEXT:    slli a0, a0, 5264; RV32I-NEXT:    add a0, a0, a2265; RV32I-NEXT:    add a0, a0, a1266; RV32I-NEXT:    ret267;268; RV32ZBA-LABEL: addmul40:269; RV32ZBA:       # %bb.0:270; RV32ZBA-NEXT:    sh2add a0, a0, a0271; RV32ZBA-NEXT:    sh3add a0, a0, a1272; RV32ZBA-NEXT:    ret273;274; RV32XANDESPERF-LABEL: addmul40:275; RV32XANDESPERF:       # %bb.0:276; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a0277; RV32XANDESPERF-NEXT:    nds.lea.d a0, a1, a0278; RV32XANDESPERF-NEXT:    ret279  %c = mul i32 %a, 40280  %d = add i32 %c, %b281  ret i32 %d282}283 284define i32 @addmul72(i32 %a, i32 %b) {285; RV32I-LABEL: addmul72:286; RV32I:       # %bb.0:287; RV32I-NEXT:    slli a2, a0, 3288; RV32I-NEXT:    slli a0, a0, 6289; RV32I-NEXT:    add a0, a0, a2290; RV32I-NEXT:    add a0, a0, a1291; RV32I-NEXT:    ret292;293; RV32ZBA-LABEL: addmul72:294; RV32ZBA:       # %bb.0:295; RV32ZBA-NEXT:    sh3add a0, a0, a0296; RV32ZBA-NEXT:    sh3add a0, a0, a1297; RV32ZBA-NEXT:    ret298;299; RV32XANDESPERF-LABEL: addmul72:300; RV32XANDESPERF:       # %bb.0:301; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a0302; RV32XANDESPERF-NEXT:    nds.lea.d a0, a1, a0303; RV32XANDESPERF-NEXT:    ret304  %c = mul i32 %a, 72305  %d = add i32 %c, %b306  ret i32 %d307}308 309define i32 @mul96(i32 %a) {310; RV32I-LABEL: mul96:311; RV32I:       # %bb.0:312; RV32I-NEXT:    slli a1, a0, 5313; RV32I-NEXT:    slli a0, a0, 6314; RV32I-NEXT:    add a0, a0, a1315; RV32I-NEXT:    ret316;317; RV32ZBA-LABEL: mul96:318; RV32ZBA:       # %bb.0:319; RV32ZBA-NEXT:    sh1add a0, a0, a0320; RV32ZBA-NEXT:    slli a0, a0, 5321; RV32ZBA-NEXT:    ret322;323; RV32XANDESPERF-LABEL: mul96:324; RV32XANDESPERF:       # %bb.0:325; RV32XANDESPERF-NEXT:    nds.lea.h a0, a0, a0326; RV32XANDESPERF-NEXT:    slli a0, a0, 5327; RV32XANDESPERF-NEXT:    ret328  %c = mul i32 %a, 96329  ret i32 %c330}331 332define i32 @mul160(i32 %a) {333; RV32I-LABEL: mul160:334; RV32I:       # %bb.0:335; RV32I-NEXT:    slli a1, a0, 5336; RV32I-NEXT:    slli a0, a0, 7337; RV32I-NEXT:    add a0, a0, a1338; RV32I-NEXT:    ret339;340; RV32ZBA-LABEL: mul160:341; RV32ZBA:       # %bb.0:342; RV32ZBA-NEXT:    sh2add a0, a0, a0343; RV32ZBA-NEXT:    slli a0, a0, 5344; RV32ZBA-NEXT:    ret345;346; RV32XANDESPERF-LABEL: mul160:347; RV32XANDESPERF:       # %bb.0:348; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a0349; RV32XANDESPERF-NEXT:    slli a0, a0, 5350; RV32XANDESPERF-NEXT:    ret351  %c = mul i32 %a, 160352  ret i32 %c353}354 355define i32 @mul288(i32 %a) {356; RV32I-LABEL: mul288:357; RV32I:       # %bb.0:358; RV32I-NEXT:    slli a1, a0, 5359; RV32I-NEXT:    slli a0, a0, 8360; RV32I-NEXT:    add a0, a0, a1361; RV32I-NEXT:    ret362;363; RV32ZBA-LABEL: mul288:364; RV32ZBA:       # %bb.0:365; RV32ZBA-NEXT:    sh3add a0, a0, a0366; RV32ZBA-NEXT:    slli a0, a0, 5367; RV32ZBA-NEXT:    ret368;369; RV32XANDESPERF-LABEL: mul288:370; RV32XANDESPERF:       # %bb.0:371; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a0372; RV32XANDESPERF-NEXT:    slli a0, a0, 5373; RV32XANDESPERF-NEXT:    ret374  %c = mul i32 %a, 288375  ret i32 %c376}377 378define i32 @mul258(i32 %a) {379; RV32I-LABEL: mul258:380; RV32I:       # %bb.0:381; RV32I-NEXT:    slli a1, a0, 1382; RV32I-NEXT:    slli a0, a0, 8383; RV32I-NEXT:    add a0, a0, a1384; RV32I-NEXT:    ret385;386; RV32ZBA-LABEL: mul258:387; RV32ZBA:       # %bb.0:388; RV32ZBA-NEXT:    slli a1, a0, 8389; RV32ZBA-NEXT:    sh1add a0, a0, a1390; RV32ZBA-NEXT:    ret391;392; RV32XANDESPERF-LABEL: mul258:393; RV32XANDESPERF:       # %bb.0:394; RV32XANDESPERF-NEXT:    slli a1, a0, 8395; RV32XANDESPERF-NEXT:    nds.lea.h a0, a1, a0396; RV32XANDESPERF-NEXT:    ret397  %c = mul i32 %a, 258398  ret i32 %c399}400 401define i32 @mul260(i32 %a) {402; RV32I-LABEL: mul260:403; RV32I:       # %bb.0:404; RV32I-NEXT:    slli a1, a0, 2405; RV32I-NEXT:    slli a0, a0, 8406; RV32I-NEXT:    add a0, a0, a1407; RV32I-NEXT:    ret408;409; RV32ZBA-LABEL: mul260:410; RV32ZBA:       # %bb.0:411; RV32ZBA-NEXT:    slli a1, a0, 8412; RV32ZBA-NEXT:    sh2add a0, a0, a1413; RV32ZBA-NEXT:    ret414;415; RV32XANDESPERF-LABEL: mul260:416; RV32XANDESPERF:       # %bb.0:417; RV32XANDESPERF-NEXT:    slli a1, a0, 8418; RV32XANDESPERF-NEXT:    nds.lea.w a0, a1, a0419; RV32XANDESPERF-NEXT:    ret420  %c = mul i32 %a, 260421  ret i32 %c422}423 424define i32 @mul264(i32 %a) {425; RV32I-LABEL: mul264:426; RV32I:       # %bb.0:427; RV32I-NEXT:    slli a1, a0, 3428; RV32I-NEXT:    slli a0, a0, 8429; RV32I-NEXT:    add a0, a0, a1430; RV32I-NEXT:    ret431;432; RV32ZBA-LABEL: mul264:433; RV32ZBA:       # %bb.0:434; RV32ZBA-NEXT:    slli a1, a0, 8435; RV32ZBA-NEXT:    sh3add a0, a0, a1436; RV32ZBA-NEXT:    ret437;438; RV32XANDESPERF-LABEL: mul264:439; RV32XANDESPERF:       # %bb.0:440; RV32XANDESPERF-NEXT:    slli a1, a0, 8441; RV32XANDESPERF-NEXT:    nds.lea.d a0, a1, a0442; RV32XANDESPERF-NEXT:    ret443  %c = mul i32 %a, 264444  ret i32 %c445}446 447define i32 @mul11(i32 %a) {448; RV32I-LABEL: mul11:449; RV32I:       # %bb.0:450; RV32I-NEXT:    li a1, 11451; RV32I-NEXT:    mul a0, a0, a1452; RV32I-NEXT:    ret453;454; RV32ZBA-LABEL: mul11:455; RV32ZBA:       # %bb.0:456; RV32ZBA-NEXT:    sh2add a1, a0, a0457; RV32ZBA-NEXT:    sh1add a0, a1, a0458; RV32ZBA-NEXT:    ret459;460; RV32XANDESPERF-LABEL: mul11:461; RV32XANDESPERF:       # %bb.0:462; RV32XANDESPERF-NEXT:    nds.lea.w a1, a0, a0463; RV32XANDESPERF-NEXT:    nds.lea.h a0, a0, a1464; RV32XANDESPERF-NEXT:    ret465  %c = mul i32 %a, 11466  ret i32 %c467}468 469define i32 @mul19(i32 %a) {470; RV32I-LABEL: mul19:471; RV32I:       # %bb.0:472; RV32I-NEXT:    li a1, 19473; RV32I-NEXT:    mul a0, a0, a1474; RV32I-NEXT:    ret475;476; RV32ZBA-LABEL: mul19:477; RV32ZBA:       # %bb.0:478; RV32ZBA-NEXT:    sh3add a1, a0, a0479; RV32ZBA-NEXT:    sh1add a0, a1, a0480; RV32ZBA-NEXT:    ret481;482; RV32XANDESPERF-LABEL: mul19:483; RV32XANDESPERF:       # %bb.0:484; RV32XANDESPERF-NEXT:    nds.lea.d a1, a0, a0485; RV32XANDESPERF-NEXT:    nds.lea.h a0, a0, a1486; RV32XANDESPERF-NEXT:    ret487  %c = mul i32 %a, 19488  ret i32 %c489}490 491define i32 @mul13(i32 %a) {492; RV32I-LABEL: mul13:493; RV32I:       # %bb.0:494; RV32I-NEXT:    li a1, 13495; RV32I-NEXT:    mul a0, a0, a1496; RV32I-NEXT:    ret497;498; RV32ZBA-LABEL: mul13:499; RV32ZBA:       # %bb.0:500; RV32ZBA-NEXT:    sh1add a1, a0, a0501; RV32ZBA-NEXT:    sh2add a0, a1, a0502; RV32ZBA-NEXT:    ret503;504; RV32XANDESPERF-LABEL: mul13:505; RV32XANDESPERF:       # %bb.0:506; RV32XANDESPERF-NEXT:    nds.lea.h a1, a0, a0507; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a1508; RV32XANDESPERF-NEXT:    ret509  %c = mul i32 %a, 13510  ret i32 %c511}512 513define i32 @mul21(i32 %a) {514; RV32I-LABEL: mul21:515; RV32I:       # %bb.0:516; RV32I-NEXT:    li a1, 21517; RV32I-NEXT:    mul a0, a0, a1518; RV32I-NEXT:    ret519;520; RV32ZBA-LABEL: mul21:521; RV32ZBA:       # %bb.0:522; RV32ZBA-NEXT:    sh2add a1, a0, a0523; RV32ZBA-NEXT:    sh2add a0, a1, a0524; RV32ZBA-NEXT:    ret525;526; RV32XANDESPERF-LABEL: mul21:527; RV32XANDESPERF:       # %bb.0:528; RV32XANDESPERF-NEXT:    nds.lea.w a1, a0, a0529; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a1530; RV32XANDESPERF-NEXT:    ret531  %c = mul i32 %a, 21532  ret i32 %c533}534 535define i32 @mul37(i32 %a) {536; RV32I-LABEL: mul37:537; RV32I:       # %bb.0:538; RV32I-NEXT:    li a1, 37539; RV32I-NEXT:    mul a0, a0, a1540; RV32I-NEXT:    ret541;542; RV32ZBA-LABEL: mul37:543; RV32ZBA:       # %bb.0:544; RV32ZBA-NEXT:    sh3add a1, a0, a0545; RV32ZBA-NEXT:    sh2add a0, a1, a0546; RV32ZBA-NEXT:    ret547;548; RV32XANDESPERF-LABEL: mul37:549; RV32XANDESPERF:       # %bb.0:550; RV32XANDESPERF-NEXT:    nds.lea.d a1, a0, a0551; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a1552; RV32XANDESPERF-NEXT:    ret553  %c = mul i32 %a, 37554  ret i32 %c555}556 557define i32 @mul25(i32 %a) {558; RV32I-LABEL: mul25:559; RV32I:       # %bb.0:560; RV32I-NEXT:    li a1, 25561; RV32I-NEXT:    mul a0, a0, a1562; RV32I-NEXT:    ret563;564; RV32ZBA-LABEL: mul25:565; RV32ZBA:       # %bb.0:566; RV32ZBA-NEXT:    sh2add a0, a0, a0567; RV32ZBA-NEXT:    sh2add a0, a0, a0568; RV32ZBA-NEXT:    ret569;570; RV32XANDESPERF-LABEL: mul25:571; RV32XANDESPERF:       # %bb.0:572; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a0573; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a0574; RV32XANDESPERF-NEXT:    ret575  %c = mul i32 %a, 25576  ret i32 %c577}578 579define i32 @mul41(i32 %a) {580; RV32I-LABEL: mul41:581; RV32I:       # %bb.0:582; RV32I-NEXT:    li a1, 41583; RV32I-NEXT:    mul a0, a0, a1584; RV32I-NEXT:    ret585;586; RV32ZBA-LABEL: mul41:587; RV32ZBA:       # %bb.0:588; RV32ZBA-NEXT:    sh2add a1, a0, a0589; RV32ZBA-NEXT:    sh3add a0, a1, a0590; RV32ZBA-NEXT:    ret591;592; RV32XANDESPERF-LABEL: mul41:593; RV32XANDESPERF:       # %bb.0:594; RV32XANDESPERF-NEXT:    nds.lea.w a1, a0, a0595; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a1596; RV32XANDESPERF-NEXT:    ret597  %c = mul i32 %a, 41598  ret i32 %c599}600 601define i32 @mul73(i32 %a) {602; RV32I-LABEL: mul73:603; RV32I:       # %bb.0:604; RV32I-NEXT:    li a1, 73605; RV32I-NEXT:    mul a0, a0, a1606; RV32I-NEXT:    ret607;608; RV32ZBA-LABEL: mul73:609; RV32ZBA:       # %bb.0:610; RV32ZBA-NEXT:    sh3add a1, a0, a0611; RV32ZBA-NEXT:    sh3add a0, a1, a0612; RV32ZBA-NEXT:    ret613;614; RV32XANDESPERF-LABEL: mul73:615; RV32XANDESPERF:       # %bb.0:616; RV32XANDESPERF-NEXT:    nds.lea.d a1, a0, a0617; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a1618; RV32XANDESPERF-NEXT:    ret619  %c = mul i32 %a, 73620  ret i32 %c621}622 623define i32 @mul27(i32 %a) {624; RV32I-LABEL: mul27:625; RV32I:       # %bb.0:626; RV32I-NEXT:    li a1, 27627; RV32I-NEXT:    mul a0, a0, a1628; RV32I-NEXT:    ret629;630; RV32ZBA-LABEL: mul27:631; RV32ZBA:       # %bb.0:632; RV32ZBA-NEXT:    sh1add a0, a0, a0633; RV32ZBA-NEXT:    sh3add a0, a0, a0634; RV32ZBA-NEXT:    ret635;636; RV32XANDESPERF-LABEL: mul27:637; RV32XANDESPERF:       # %bb.0:638; RV32XANDESPERF-NEXT:    nds.lea.h a0, a0, a0639; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a0640; RV32XANDESPERF-NEXT:    ret641  %c = mul i32 %a, 27642  ret i32 %c643}644 645define i32 @mul45(i32 %a) {646; RV32I-LABEL: mul45:647; RV32I:       # %bb.0:648; RV32I-NEXT:    li a1, 45649; RV32I-NEXT:    mul a0, a0, a1650; RV32I-NEXT:    ret651;652; RV32ZBA-LABEL: mul45:653; RV32ZBA:       # %bb.0:654; RV32ZBA-NEXT:    sh2add a0, a0, a0655; RV32ZBA-NEXT:    sh3add a0, a0, a0656; RV32ZBA-NEXT:    ret657;658; RV32XANDESPERF-LABEL: mul45:659; RV32XANDESPERF:       # %bb.0:660; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a0661; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a0662; RV32XANDESPERF-NEXT:    ret663  %c = mul i32 %a, 45664  ret i32 %c665}666 667define i32 @mul81(i32 %a) {668; RV32I-LABEL: mul81:669; RV32I:       # %bb.0:670; RV32I-NEXT:    li a1, 81671; RV32I-NEXT:    mul a0, a0, a1672; RV32I-NEXT:    ret673;674; RV32ZBA-LABEL: mul81:675; RV32ZBA:       # %bb.0:676; RV32ZBA-NEXT:    sh3add a0, a0, a0677; RV32ZBA-NEXT:    sh3add a0, a0, a0678; RV32ZBA-NEXT:    ret679;680; RV32XANDESPERF-LABEL: mul81:681; RV32XANDESPERF:       # %bb.0:682; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a0683; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a0684; RV32XANDESPERF-NEXT:    ret685  %c = mul i32 %a, 81686  ret i32 %c687}688 689define i32 @mul4098(i32 %a) {690; RV32I-LABEL: mul4098:691; RV32I:       # %bb.0:692; RV32I-NEXT:    slli a1, a0, 1693; RV32I-NEXT:    slli a0, a0, 12694; RV32I-NEXT:    add a0, a0, a1695; RV32I-NEXT:    ret696;697; RV32ZBA-LABEL: mul4098:698; RV32ZBA:       # %bb.0:699; RV32ZBA-NEXT:    slli a1, a0, 12700; RV32ZBA-NEXT:    sh1add a0, a0, a1701; RV32ZBA-NEXT:    ret702;703; RV32XANDESPERF-LABEL: mul4098:704; RV32XANDESPERF:       # %bb.0:705; RV32XANDESPERF-NEXT:    slli a1, a0, 12706; RV32XANDESPERF-NEXT:    nds.lea.h a0, a1, a0707; RV32XANDESPERF-NEXT:    ret708  %c = mul i32 %a, 4098709  ret i32 %c710}711 712define i32 @mul4100(i32 %a) {713; RV32I-LABEL: mul4100:714; RV32I:       # %bb.0:715; RV32I-NEXT:    slli a1, a0, 2716; RV32I-NEXT:    slli a0, a0, 12717; RV32I-NEXT:    add a0, a0, a1718; RV32I-NEXT:    ret719;720; RV32ZBA-LABEL: mul4100:721; RV32ZBA:       # %bb.0:722; RV32ZBA-NEXT:    slli a1, a0, 12723; RV32ZBA-NEXT:    sh2add a0, a0, a1724; RV32ZBA-NEXT:    ret725;726; RV32XANDESPERF-LABEL: mul4100:727; RV32XANDESPERF:       # %bb.0:728; RV32XANDESPERF-NEXT:    slli a1, a0, 12729; RV32XANDESPERF-NEXT:    nds.lea.w a0, a1, a0730; RV32XANDESPERF-NEXT:    ret731  %c = mul i32 %a, 4100732  ret i32 %c733}734 735define i32 @mul4104(i32 %a) {736; RV32I-LABEL: mul4104:737; RV32I:       # %bb.0:738; RV32I-NEXT:    slli a1, a0, 3739; RV32I-NEXT:    slli a0, a0, 12740; RV32I-NEXT:    add a0, a0, a1741; RV32I-NEXT:    ret742;743; RV32ZBA-LABEL: mul4104:744; RV32ZBA:       # %bb.0:745; RV32ZBA-NEXT:    slli a1, a0, 12746; RV32ZBA-NEXT:    sh3add a0, a0, a1747; RV32ZBA-NEXT:    ret748;749; RV32XANDESPERF-LABEL: mul4104:750; RV32XANDESPERF:       # %bb.0:751; RV32XANDESPERF-NEXT:    slli a1, a0, 12752; RV32XANDESPERF-NEXT:    nds.lea.d a0, a1, a0753; RV32XANDESPERF-NEXT:    ret754  %c = mul i32 %a, 4104755  ret i32 %c756}757 758define i32 @add4104(i32 %a) {759; RV32I-LABEL: add4104:760; RV32I:       # %bb.0:761; RV32I-NEXT:    lui a1, 1762; RV32I-NEXT:    addi a1, a1, 8763; RV32I-NEXT:    add a0, a0, a1764; RV32I-NEXT:    ret765;766; RV32ZBA-LABEL: add4104:767; RV32ZBA:       # %bb.0:768; RV32ZBA-NEXT:    li a1, 1026769; RV32ZBA-NEXT:    sh2add a0, a1, a0770; RV32ZBA-NEXT:    ret771;772; RV32XANDESPERF-LABEL: add4104:773; RV32XANDESPERF:       # %bb.0:774; RV32XANDESPERF-NEXT:    li a1, 1026775; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a1776; RV32XANDESPERF-NEXT:    ret777  %c = add i32 %a, 4104778  ret i32 %c779}780 781define i32 @add8208(i32 %a) {782; RV32I-LABEL: add8208:783; RV32I:       # %bb.0:784; RV32I-NEXT:    lui a1, 2785; RV32I-NEXT:    addi a1, a1, 16786; RV32I-NEXT:    add a0, a0, a1787; RV32I-NEXT:    ret788;789; RV32ZBA-LABEL: add8208:790; RV32ZBA:       # %bb.0:791; RV32ZBA-NEXT:    li a1, 1026792; RV32ZBA-NEXT:    sh3add a0, a1, a0793; RV32ZBA-NEXT:    ret794;795; RV32XANDESPERF-LABEL: add8208:796; RV32XANDESPERF:       # %bb.0:797; RV32XANDESPERF-NEXT:    li a1, 1026798; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a1799; RV32XANDESPERF-NEXT:    ret800  %c = add i32 %a, 8208801  ret i32 %c802}803 804define i32 @add8192(i32 %a) {805; CHECK-LABEL: add8192:806; CHECK:       # %bb.0:807; CHECK-NEXT:    lui a1, 2808; CHECK-NEXT:    add a0, a0, a1809; CHECK-NEXT:    ret810  %c = add i32 %a, 8192811  ret i32 %c812}813 814define i32 @addshl_5_6(i32 %a, i32 %b) {815; RV32I-LABEL: addshl_5_6:816; RV32I:       # %bb.0:817; RV32I-NEXT:    slli a0, a0, 5818; RV32I-NEXT:    slli a1, a1, 6819; RV32I-NEXT:    add a0, a0, a1820; RV32I-NEXT:    ret821;822; RV32ZBA-LABEL: addshl_5_6:823; RV32ZBA:       # %bb.0:824; RV32ZBA-NEXT:    sh1add a0, a1, a0825; RV32ZBA-NEXT:    slli a0, a0, 5826; RV32ZBA-NEXT:    ret827;828; RV32XANDESPERF-LABEL: addshl_5_6:829; RV32XANDESPERF:       # %bb.0:830; RV32XANDESPERF-NEXT:    nds.lea.h a0, a0, a1831; RV32XANDESPERF-NEXT:    slli a0, a0, 5832; RV32XANDESPERF-NEXT:    ret833  %c = shl i32 %a, 5834  %d = shl i32 %b, 6835  %e = add i32 %c, %d836  ret i32 %e837}838 839define i32 @addshl_5_7(i32 %a, i32 %b) {840; RV32I-LABEL: addshl_5_7:841; RV32I:       # %bb.0:842; RV32I-NEXT:    slli a0, a0, 5843; RV32I-NEXT:    slli a1, a1, 7844; RV32I-NEXT:    add a0, a0, a1845; RV32I-NEXT:    ret846;847; RV32ZBA-LABEL: addshl_5_7:848; RV32ZBA:       # %bb.0:849; RV32ZBA-NEXT:    sh2add a0, a1, a0850; RV32ZBA-NEXT:    slli a0, a0, 5851; RV32ZBA-NEXT:    ret852;853; RV32XANDESPERF-LABEL: addshl_5_7:854; RV32XANDESPERF:       # %bb.0:855; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a1856; RV32XANDESPERF-NEXT:    slli a0, a0, 5857; RV32XANDESPERF-NEXT:    ret858  %c = shl i32 %a, 5859  %d = shl i32 %b, 7860  %e = add i32 %c, %d861  ret i32 %e862}863 864define i32 @addshl_5_8(i32 %a, i32 %b) {865; RV32I-LABEL: addshl_5_8:866; RV32I:       # %bb.0:867; RV32I-NEXT:    slli a0, a0, 5868; RV32I-NEXT:    slli a1, a1, 8869; RV32I-NEXT:    add a0, a0, a1870; RV32I-NEXT:    ret871;872; RV32ZBA-LABEL: addshl_5_8:873; RV32ZBA:       # %bb.0:874; RV32ZBA-NEXT:    sh3add a0, a1, a0875; RV32ZBA-NEXT:    slli a0, a0, 5876; RV32ZBA-NEXT:    ret877;878; RV32XANDESPERF-LABEL: addshl_5_8:879; RV32XANDESPERF:       # %bb.0:880; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a1881; RV32XANDESPERF-NEXT:    slli a0, a0, 5882; RV32XANDESPERF-NEXT:    ret883  %c = shl i32 %a, 5884  %d = shl i32 %b, 8885  %e = add i32 %c, %d886  ret i32 %e887}888 889define i32 @srli_1_sh2add(ptr %0, i32 %1) {890; RV32I-LABEL: srli_1_sh2add:891; RV32I:       # %bb.0:892; RV32I-NEXT:    slli a1, a1, 1893; RV32I-NEXT:    andi a1, a1, -4894; RV32I-NEXT:    add a0, a0, a1895; RV32I-NEXT:    lw a0, 0(a0)896; RV32I-NEXT:    ret897;898; RV32ZBA-LABEL: srli_1_sh2add:899; RV32ZBA:       # %bb.0:900; RV32ZBA-NEXT:    srli a1, a1, 1901; RV32ZBA-NEXT:    sh2add a0, a1, a0902; RV32ZBA-NEXT:    lw a0, 0(a0)903; RV32ZBA-NEXT:    ret904;905; RV32XANDESPERF-LABEL: srli_1_sh2add:906; RV32XANDESPERF:       # %bb.0:907; RV32XANDESPERF-NEXT:    srli a1, a1, 1908; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a1909; RV32XANDESPERF-NEXT:    lw a0, 0(a0)910; RV32XANDESPERF-NEXT:    ret911  %3 = lshr i32 %1, 1912  %4 = getelementptr inbounds i32, ptr %0, i32 %3913  %5 = load i32, ptr %4, align 4914  ret i32 %5915}916 917define i64 @srli_2_sh3add(ptr %0, i32 %1) {918; RV32I-LABEL: srli_2_sh3add:919; RV32I:       # %bb.0:920; RV32I-NEXT:    slli a1, a1, 1921; RV32I-NEXT:    andi a1, a1, -8922; RV32I-NEXT:    add a1, a0, a1923; RV32I-NEXT:    lw a0, 0(a1)924; RV32I-NEXT:    lw a1, 4(a1)925; RV32I-NEXT:    ret926;927; RV32ZBA-LABEL: srli_2_sh3add:928; RV32ZBA:       # %bb.0:929; RV32ZBA-NEXT:    srli a1, a1, 2930; RV32ZBA-NEXT:    sh3add a1, a1, a0931; RV32ZBA-NEXT:    lw a0, 0(a1)932; RV32ZBA-NEXT:    lw a1, 4(a1)933; RV32ZBA-NEXT:    ret934;935; RV32XANDESPERF-LABEL: srli_2_sh3add:936; RV32XANDESPERF:       # %bb.0:937; RV32XANDESPERF-NEXT:    srli a1, a1, 2938; RV32XANDESPERF-NEXT:    nds.lea.d a1, a0, a1939; RV32XANDESPERF-NEXT:    lw a0, 0(a1)940; RV32XANDESPERF-NEXT:    lw a1, 4(a1)941; RV32XANDESPERF-NEXT:    ret942  %3 = lshr i32 %1, 2943  %4 = getelementptr inbounds i64, ptr %0, i32 %3944  %5 = load i64, ptr %4, align 8945  ret i64 %5946}947 948define signext i16 @srli_2_sh1add(ptr %0, i32 %1) {949; RV32I-LABEL: srli_2_sh1add:950; RV32I:       # %bb.0:951; RV32I-NEXT:    srli a1, a1, 1952; RV32I-NEXT:    andi a1, a1, -2953; RV32I-NEXT:    add a0, a0, a1954; RV32I-NEXT:    lh a0, 0(a0)955; RV32I-NEXT:    ret956;957; RV32ZBA-LABEL: srli_2_sh1add:958; RV32ZBA:       # %bb.0:959; RV32ZBA-NEXT:    srli a1, a1, 2960; RV32ZBA-NEXT:    sh1add a0, a1, a0961; RV32ZBA-NEXT:    lh a0, 0(a0)962; RV32ZBA-NEXT:    ret963;964; RV32XANDESPERF-LABEL: srli_2_sh1add:965; RV32XANDESPERF:       # %bb.0:966; RV32XANDESPERF-NEXT:    srli a1, a1, 2967; RV32XANDESPERF-NEXT:    nds.lea.h a0, a0, a1968; RV32XANDESPERF-NEXT:    lh a0, 0(a0)969; RV32XANDESPERF-NEXT:    ret970  %3 = lshr i32 %1, 2971  %4 = getelementptr inbounds i16, ptr %0, i32 %3972  %5 = load i16, ptr %4, align 2973  ret i16 %5974}975 976define i32 @srli_3_sh2add(ptr %0, i32 %1) {977; RV32I-LABEL: srli_3_sh2add:978; RV32I:       # %bb.0:979; RV32I-NEXT:    srli a1, a1, 1980; RV32I-NEXT:    andi a1, a1, -4981; RV32I-NEXT:    add a0, a0, a1982; RV32I-NEXT:    lw a0, 0(a0)983; RV32I-NEXT:    ret984;985; RV32ZBA-LABEL: srli_3_sh2add:986; RV32ZBA:       # %bb.0:987; RV32ZBA-NEXT:    srli a1, a1, 3988; RV32ZBA-NEXT:    sh2add a0, a1, a0989; RV32ZBA-NEXT:    lw a0, 0(a0)990; RV32ZBA-NEXT:    ret991;992; RV32XANDESPERF-LABEL: srli_3_sh2add:993; RV32XANDESPERF:       # %bb.0:994; RV32XANDESPERF-NEXT:    srli a1, a1, 3995; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a1996; RV32XANDESPERF-NEXT:    lw a0, 0(a0)997; RV32XANDESPERF-NEXT:    ret998  %3 = lshr i32 %1, 3999  %4 = getelementptr inbounds i32, ptr %0, i32 %31000  %5 = load i32, ptr %4, align 41001  ret i32 %51002}1003 1004define i64 @srli_4_sh3add(ptr %0, i32 %1) {1005; RV32I-LABEL: srli_4_sh3add:1006; RV32I:       # %bb.0:1007; RV32I-NEXT:    srli a1, a1, 11008; RV32I-NEXT:    andi a1, a1, -81009; RV32I-NEXT:    add a1, a0, a11010; RV32I-NEXT:    lw a0, 0(a1)1011; RV32I-NEXT:    lw a1, 4(a1)1012; RV32I-NEXT:    ret1013;1014; RV32ZBA-LABEL: srli_4_sh3add:1015; RV32ZBA:       # %bb.0:1016; RV32ZBA-NEXT:    srli a1, a1, 41017; RV32ZBA-NEXT:    sh3add a1, a1, a01018; RV32ZBA-NEXT:    lw a0, 0(a1)1019; RV32ZBA-NEXT:    lw a1, 4(a1)1020; RV32ZBA-NEXT:    ret1021;1022; RV32XANDESPERF-LABEL: srli_4_sh3add:1023; RV32XANDESPERF:       # %bb.0:1024; RV32XANDESPERF-NEXT:    srli a1, a1, 41025; RV32XANDESPERF-NEXT:    nds.lea.d a1, a0, a11026; RV32XANDESPERF-NEXT:    lw a0, 0(a1)1027; RV32XANDESPERF-NEXT:    lw a1, 4(a1)1028; RV32XANDESPERF-NEXT:    ret1029  %3 = lshr i32 %1, 41030  %4 = getelementptr inbounds i64, ptr %0, i32 %31031  %5 = load i64, ptr %4, align 81032  ret i64 %51033}1034 1035define i32 @mul_neg1(i32 %a) {1036; CHECK-LABEL: mul_neg1:1037; CHECK:       # %bb.0:1038; CHECK-NEXT:    neg a0, a01039; CHECK-NEXT:    ret1040  %c = mul i32 %a, -11041  ret i32 %c1042}1043 1044define i32 @mul_neg2(i32 %a) {1045; CHECK-LABEL: mul_neg2:1046; CHECK:       # %bb.0:1047; CHECK-NEXT:    slli a0, a0, 11048; CHECK-NEXT:    neg a0, a01049; CHECK-NEXT:    ret1050  %c = mul i32 %a, -21051  ret i32 %c1052}1053 1054define i32 @mul_neg3(i32 %a) {1055; RV32I-LABEL: mul_neg3:1056; RV32I:       # %bb.0:1057; RV32I-NEXT:    slli a1, a0, 11058; RV32I-NEXT:    neg a0, a01059; RV32I-NEXT:    sub a0, a0, a11060; RV32I-NEXT:    ret1061;1062; RV32ZBA-LABEL: mul_neg3:1063; RV32ZBA:       # %bb.0:1064; RV32ZBA-NEXT:    sh1add a0, a0, a01065; RV32ZBA-NEXT:    neg a0, a01066; RV32ZBA-NEXT:    ret1067;1068; RV32XANDESPERF-LABEL: mul_neg3:1069; RV32XANDESPERF:       # %bb.0:1070; RV32XANDESPERF-NEXT:    nds.lea.h a0, a0, a01071; RV32XANDESPERF-NEXT:    neg a0, a01072; RV32XANDESPERF-NEXT:    ret1073  %c = mul i32 %a, -31074  ret i32 %c1075}1076 1077define i32 @mul_neg4(i32 %a) {1078; CHECK-LABEL: mul_neg4:1079; CHECK:       # %bb.0:1080; CHECK-NEXT:    slli a0, a0, 21081; CHECK-NEXT:    neg a0, a01082; CHECK-NEXT:    ret1083  %c = mul i32 %a, -41084  ret i32 %c1085}1086 1087define i32 @mul_neg5(i32 %a) {1088; RV32I-LABEL: mul_neg5:1089; RV32I:       # %bb.0:1090; RV32I-NEXT:    slli a1, a0, 21091; RV32I-NEXT:    neg a0, a01092; RV32I-NEXT:    sub a0, a0, a11093; RV32I-NEXT:    ret1094;1095; RV32ZBA-LABEL: mul_neg5:1096; RV32ZBA:       # %bb.0:1097; RV32ZBA-NEXT:    sh2add a0, a0, a01098; RV32ZBA-NEXT:    neg a0, a01099; RV32ZBA-NEXT:    ret1100;1101; RV32XANDESPERF-LABEL: mul_neg5:1102; RV32XANDESPERF:       # %bb.0:1103; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a01104; RV32XANDESPERF-NEXT:    neg a0, a01105; RV32XANDESPERF-NEXT:    ret1106  %c = mul i32 %a, -51107  ret i32 %c1108}1109 1110define i32 @mul_neg6(i32 %a) {1111; CHECK-LABEL: mul_neg6:1112; CHECK:       # %bb.0:1113; CHECK-NEXT:    li a1, -61114; CHECK-NEXT:    mul a0, a0, a11115; CHECK-NEXT:    ret1116  %c = mul i32 %a, -61117  ret i32 %c1118}1119 1120define i32 @mul_neg7(i32 %a) {1121; CHECK-LABEL: mul_neg7:1122; CHECK:       # %bb.0:1123; CHECK-NEXT:    slli a1, a0, 31124; CHECK-NEXT:    sub a0, a0, a11125; CHECK-NEXT:    ret1126  %c = mul i32 %a, -71127  ret i32 %c1128}1129 1130define i32 @mul_neg8(i32 %a) {1131; CHECK-LABEL: mul_neg8:1132; CHECK:       # %bb.0:1133; CHECK-NEXT:    slli a0, a0, 31134; CHECK-NEXT:    neg a0, a01135; CHECK-NEXT:    ret1136  %c = mul i32 %a, -81137  ret i32 %c1138}1139 1140define i32 @select3i32(i1 zeroext %x) {1141; RV32I-LABEL: select3i32:1142; RV32I:       # %bb.0:1143; RV32I-NEXT:    neg a0, a01144; RV32I-NEXT:    andi a0, a0, 31145; RV32I-NEXT:    ret1146;1147; RV32ZBA-LABEL: select3i32:1148; RV32ZBA:       # %bb.0:1149; RV32ZBA-NEXT:    sh1add a0, a0, a01150; RV32ZBA-NEXT:    ret1151;1152; RV32XANDESPERF-LABEL: select3i32:1153; RV32XANDESPERF:       # %bb.0:1154; RV32XANDESPERF-NEXT:    nds.lea.h a0, a0, a01155; RV32XANDESPERF-NEXT:    ret1156  %select = select i1 %x, i32 3, i32 01157  ret i32 %select1158}1159 1160define i32 @select5i32(i1 zeroext %x) {1161; RV32I-LABEL: select5i32:1162; RV32I:       # %bb.0:1163; RV32I-NEXT:    neg a0, a01164; RV32I-NEXT:    andi a0, a0, 51165; RV32I-NEXT:    ret1166;1167; RV32ZBA-LABEL: select5i32:1168; RV32ZBA:       # %bb.0:1169; RV32ZBA-NEXT:    sh2add a0, a0, a01170; RV32ZBA-NEXT:    ret1171;1172; RV32XANDESPERF-LABEL: select5i32:1173; RV32XANDESPERF:       # %bb.0:1174; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a01175; RV32XANDESPERF-NEXT:    ret1176  %select = select i1 %x, i32 5, i32 01177  ret i32 %select1178}1179 1180define i32 @select9i32(i1 zeroext %x) {1181; RV32I-LABEL: select9i32:1182; RV32I:       # %bb.0:1183; RV32I-NEXT:    neg a0, a01184; RV32I-NEXT:    andi a0, a0, 91185; RV32I-NEXT:    ret1186;1187; RV32ZBA-LABEL: select9i32:1188; RV32ZBA:       # %bb.0:1189; RV32ZBA-NEXT:    sh3add a0, a0, a01190; RV32ZBA-NEXT:    ret1191;1192; RV32XANDESPERF-LABEL: select9i32:1193; RV32XANDESPERF:       # %bb.0:1194; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a01195; RV32XANDESPERF-NEXT:    ret1196  %select = select i1 %x, i32 9, i32 01197  ret i32 %select1198}1199 1200define i64 @select3i64(i1 zeroext %x) {1201; RV32I-LABEL: select3i64:1202; RV32I:       # %bb.0:1203; RV32I-NEXT:    neg a0, a01204; RV32I-NEXT:    andi a0, a0, 31205; RV32I-NEXT:    li a1, 01206; RV32I-NEXT:    ret1207;1208; RV32ZBA-LABEL: select3i64:1209; RV32ZBA:       # %bb.0:1210; RV32ZBA-NEXT:    sh1add a0, a0, a01211; RV32ZBA-NEXT:    li a1, 01212; RV32ZBA-NEXT:    ret1213;1214; RV32XANDESPERF-LABEL: select3i64:1215; RV32XANDESPERF:       # %bb.0:1216; RV32XANDESPERF-NEXT:    nds.lea.h a0, a0, a01217; RV32XANDESPERF-NEXT:    li a1, 01218; RV32XANDESPERF-NEXT:    ret1219  %select = select i1 %x, i64 3, i64 01220  ret i64 %select1221}1222 1223define i64 @select5i64(i1 zeroext %x) {1224; RV32I-LABEL: select5i64:1225; RV32I:       # %bb.0:1226; RV32I-NEXT:    neg a0, a01227; RV32I-NEXT:    andi a0, a0, 51228; RV32I-NEXT:    li a1, 01229; RV32I-NEXT:    ret1230;1231; RV32ZBA-LABEL: select5i64:1232; RV32ZBA:       # %bb.0:1233; RV32ZBA-NEXT:    sh2add a0, a0, a01234; RV32ZBA-NEXT:    li a1, 01235; RV32ZBA-NEXT:    ret1236;1237; RV32XANDESPERF-LABEL: select5i64:1238; RV32XANDESPERF:       # %bb.0:1239; RV32XANDESPERF-NEXT:    nds.lea.w a0, a0, a01240; RV32XANDESPERF-NEXT:    li a1, 01241; RV32XANDESPERF-NEXT:    ret1242  %select = select i1 %x, i64 5, i64 01243  ret i64 %select1244}1245 1246define i64 @select9i64(i1 zeroext %x) {1247; RV32I-LABEL: select9i64:1248; RV32I:       # %bb.0:1249; RV32I-NEXT:    neg a0, a01250; RV32I-NEXT:    andi a0, a0, 91251; RV32I-NEXT:    li a1, 01252; RV32I-NEXT:    ret1253;1254; RV32ZBA-LABEL: select9i64:1255; RV32ZBA:       # %bb.0:1256; RV32ZBA-NEXT:    sh3add a0, a0, a01257; RV32ZBA-NEXT:    li a1, 01258; RV32ZBA-NEXT:    ret1259;1260; RV32XANDESPERF-LABEL: select9i64:1261; RV32XANDESPERF:       # %bb.0:1262; RV32XANDESPERF-NEXT:    nds.lea.d a0, a0, a01263; RV32XANDESPERF-NEXT:    li a1, 01264; RV32XANDESPERF-NEXT:    ret1265  %select = select i1 %x, i64 9, i64 01266  ret i64 %select1267}1268 1269define ptr @shl_add_knownbits(ptr %p, i32 %i) {1270; RV32I-LABEL: shl_add_knownbits:1271; RV32I:       # %bb.0:1272; RV32I-NEXT:    slli a1, a1, 181273; RV32I-NEXT:    srli a1, a1, 181274; RV32I-NEXT:    slli a2, a1, 11275; RV32I-NEXT:    slli a1, a1, 21276; RV32I-NEXT:    add a1, a1, a21277; RV32I-NEXT:    srli a1, a1, 31278; RV32I-NEXT:    add a0, a0, a11279; RV32I-NEXT:    ret1280;1281; RV32ZBA-LABEL: shl_add_knownbits:1282; RV32ZBA:       # %bb.0:1283; RV32ZBA-NEXT:    slli a1, a1, 181284; RV32ZBA-NEXT:    srli a1, a1, 181285; RV32ZBA-NEXT:    sh1add a1, a1, a11286; RV32ZBA-NEXT:    srli a1, a1, 21287; RV32ZBA-NEXT:    add a0, a0, a11288; RV32ZBA-NEXT:    ret1289;1290; RV32XANDESPERF-LABEL: shl_add_knownbits:1291; RV32XANDESPERF:       # %bb.0:1292; RV32XANDESPERF-NEXT:    nds.bfoz a1, a1, 13, 01293; RV32XANDESPERF-NEXT:    nds.lea.h a1, a1, a11294; RV32XANDESPERF-NEXT:    srli a1, a1, 21295; RV32XANDESPERF-NEXT:    add a0, a0, a11296; RV32XANDESPERF-NEXT:    ret1297  %and = and i32 %i, 163831298  %mul = mul i32 %and, 61299  %shr = lshr i32 %mul, 31300  %r = getelementptr i8, ptr %p, i32 %shr1301  ret ptr %r1302}1303