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