1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \ 3; RUN: | FileCheck %s -check-prefixes=CHECK,RV32I 4; RUN: llc -mtriple=riscv32 -mattr=+m,+zba -verify-machineinstrs < %s \ 5; RUN: | FileCheck %s -check-prefixes=CHECK,RV32ZBA 6 7define signext i16 @sh1add(i64 %0, ptr %1) { 8; RV32I-LABEL: sh1add: 9; RV32I: # %bb.0: 10; RV32I-NEXT: slli a0, a0, 1 11; RV32I-NEXT: add a0, a2, a0 12; RV32I-NEXT: lh a0, 0(a0) 13; RV32I-NEXT: ret 14; 15; RV32ZBA-LABEL: sh1add: 16; RV32ZBA: # %bb.0: 17; RV32ZBA-NEXT: sh1add a0, a0, a2 18; RV32ZBA-NEXT: lh a0, 0(a0) 19; RV32ZBA-NEXT: ret 20 %3 = getelementptr inbounds i16, ptr %1, i64 %0 21 %4 = load i16, ptr %3 22 ret i16 %4 23} 24 25define i32 @sh2add(i64 %0, ptr %1) { 26; RV32I-LABEL: sh2add: 27; RV32I: # %bb.0: 28; RV32I-NEXT: slli a0, a0, 2 29; RV32I-NEXT: add a0, a2, a0 30; RV32I-NEXT: lw a0, 0(a0) 31; RV32I-NEXT: ret 32; 33; RV32ZBA-LABEL: sh2add: 34; RV32ZBA: # %bb.0: 35; RV32ZBA-NEXT: sh2add a0, a0, a2 36; RV32ZBA-NEXT: lw a0, 0(a0) 37; RV32ZBA-NEXT: ret 38 %3 = getelementptr inbounds i32, ptr %1, i64 %0 39 %4 = load i32, ptr %3 40 ret i32 %4 41} 42 43define i64 @sh3add(i64 %0, ptr %1) { 44; RV32I-LABEL: sh3add: 45; RV32I: # %bb.0: 46; RV32I-NEXT: slli a0, a0, 3 47; RV32I-NEXT: add a2, a2, a0 48; RV32I-NEXT: lw a0, 0(a2) 49; RV32I-NEXT: lw a1, 4(a2) 50; RV32I-NEXT: ret 51; 52; RV32ZBA-LABEL: sh3add: 53; RV32ZBA: # %bb.0: 54; RV32ZBA-NEXT: sh3add a1, a0, a2 55; RV32ZBA-NEXT: lw a0, 0(a1) 56; RV32ZBA-NEXT: lw a1, 4(a1) 57; RV32ZBA-NEXT: ret 58 %3 = getelementptr inbounds i64, ptr %1, i64 %0 59 %4 = load i64, ptr %3 60 ret i64 %4 61} 62 63define i32 @addmul6(i32 %a, i32 %b) { 64; RV32I-LABEL: addmul6: 65; RV32I: # %bb.0: 66; RV32I-NEXT: slli a2, a0, 1 67; RV32I-NEXT: slli a0, a0, 3 68; RV32I-NEXT: sub a0, a0, a2 69; RV32I-NEXT: add a0, a0, a1 70; RV32I-NEXT: ret 71; 72; RV32ZBA-LABEL: addmul6: 73; RV32ZBA: # %bb.0: 74; RV32ZBA-NEXT: sh1add a0, a0, a0 75; RV32ZBA-NEXT: sh1add a0, a0, a1 76; RV32ZBA-NEXT: ret 77 %c = mul i32 %a, 6 78 %d = add i32 %c, %b 79 ret i32 %d 80} 81 82define i32 @addmul10(i32 %a, i32 %b) { 83; RV32I-LABEL: addmul10: 84; RV32I: # %bb.0: 85; RV32I-NEXT: li a2, 10 86; RV32I-NEXT: mul a0, a0, a2 87; RV32I-NEXT: add a0, a0, a1 88; RV32I-NEXT: ret 89; 90; RV32ZBA-LABEL: addmul10: 91; RV32ZBA: # %bb.0: 92; RV32ZBA-NEXT: sh2add a0, a0, a0 93; RV32ZBA-NEXT: sh1add a0, a0, a1 94; RV32ZBA-NEXT: ret 95 %c = mul i32 %a, 10 96 %d = add i32 %c, %b 97 ret i32 %d 98} 99 100define i32 @addmul12(i32 %a, i32 %b) { 101; RV32I-LABEL: addmul12: 102; RV32I: # %bb.0: 103; RV32I-NEXT: slli a2, a0, 2 104; RV32I-NEXT: slli a0, a0, 4 105; RV32I-NEXT: sub a0, a0, a2 106; RV32I-NEXT: add a0, a0, a1 107; RV32I-NEXT: ret 108; 109; RV32ZBA-LABEL: addmul12: 110; RV32ZBA: # %bb.0: 111; RV32ZBA-NEXT: sh1add a0, a0, a0 112; RV32ZBA-NEXT: sh2add a0, a0, a1 113; RV32ZBA-NEXT: ret 114 %c = mul i32 %a, 12 115 %d = add i32 %c, %b 116 ret i32 %d 117} 118 119define i32 @addmul18(i32 %a, i32 %b) { 120; RV32I-LABEL: addmul18: 121; RV32I: # %bb.0: 122; RV32I-NEXT: li a2, 18 123; RV32I-NEXT: mul a0, a0, a2 124; RV32I-NEXT: add a0, a0, a1 125; RV32I-NEXT: ret 126; 127; RV32ZBA-LABEL: addmul18: 128; RV32ZBA: # %bb.0: 129; RV32ZBA-NEXT: sh3add a0, a0, a0 130; RV32ZBA-NEXT: sh1add a0, a0, a1 131; RV32ZBA-NEXT: ret 132 %c = mul i32 %a, 18 133 %d = add i32 %c, %b 134 ret i32 %d 135} 136 137define i32 @addmul20(i32 %a, i32 %b) { 138; RV32I-LABEL: addmul20: 139; RV32I: # %bb.0: 140; RV32I-NEXT: li a2, 20 141; RV32I-NEXT: mul a0, a0, a2 142; RV32I-NEXT: add a0, a0, a1 143; RV32I-NEXT: ret 144; 145; RV32ZBA-LABEL: addmul20: 146; RV32ZBA: # %bb.0: 147; RV32ZBA-NEXT: sh2add a0, a0, a0 148; RV32ZBA-NEXT: sh2add a0, a0, a1 149; RV32ZBA-NEXT: ret 150 %c = mul i32 %a, 20 151 %d = add i32 %c, %b 152 ret i32 %d 153} 154 155define i32 @addmul24(i32 %a, i32 %b) { 156; RV32I-LABEL: addmul24: 157; RV32I: # %bb.0: 158; RV32I-NEXT: slli a2, a0, 3 159; RV32I-NEXT: slli a0, a0, 5 160; RV32I-NEXT: sub a0, a0, a2 161; RV32I-NEXT: add a0, a0, a1 162; RV32I-NEXT: ret 163; 164; RV32ZBA-LABEL: addmul24: 165; RV32ZBA: # %bb.0: 166; RV32ZBA-NEXT: sh1add a0, a0, a0 167; RV32ZBA-NEXT: sh3add a0, a0, a1 168; RV32ZBA-NEXT: ret 169 %c = mul i32 %a, 24 170 %d = add i32 %c, %b 171 ret i32 %d 172} 173 174define i32 @addmul36(i32 %a, i32 %b) { 175; RV32I-LABEL: addmul36: 176; RV32I: # %bb.0: 177; RV32I-NEXT: li a2, 36 178; RV32I-NEXT: mul a0, a0, a2 179; RV32I-NEXT: add a0, a0, a1 180; RV32I-NEXT: ret 181; 182; RV32ZBA-LABEL: addmul36: 183; RV32ZBA: # %bb.0: 184; RV32ZBA-NEXT: sh3add a0, a0, a0 185; RV32ZBA-NEXT: sh2add a0, a0, a1 186; RV32ZBA-NEXT: ret 187 %c = mul i32 %a, 36 188 %d = add i32 %c, %b 189 ret i32 %d 190} 191 192define i32 @addmul40(i32 %a, i32 %b) { 193; RV32I-LABEL: addmul40: 194; RV32I: # %bb.0: 195; RV32I-NEXT: li a2, 40 196; RV32I-NEXT: mul a0, a0, a2 197; RV32I-NEXT: add a0, a0, a1 198; RV32I-NEXT: ret 199; 200; RV32ZBA-LABEL: addmul40: 201; RV32ZBA: # %bb.0: 202; RV32ZBA-NEXT: sh2add a0, a0, a0 203; RV32ZBA-NEXT: sh3add a0, a0, a1 204; RV32ZBA-NEXT: ret 205 %c = mul i32 %a, 40 206 %d = add i32 %c, %b 207 ret i32 %d 208} 209 210define i32 @addmul72(i32 %a, i32 %b) { 211; RV32I-LABEL: addmul72: 212; RV32I: # %bb.0: 213; RV32I-NEXT: li a2, 72 214; RV32I-NEXT: mul a0, a0, a2 215; RV32I-NEXT: add a0, a0, a1 216; RV32I-NEXT: ret 217; 218; RV32ZBA-LABEL: addmul72: 219; RV32ZBA: # %bb.0: 220; RV32ZBA-NEXT: sh3add a0, a0, a0 221; RV32ZBA-NEXT: sh3add a0, a0, a1 222; RV32ZBA-NEXT: ret 223 %c = mul i32 %a, 72 224 %d = add i32 %c, %b 225 ret i32 %d 226} 227 228define i32 @mul96(i32 %a) { 229; RV32I-LABEL: mul96: 230; RV32I: # %bb.0: 231; RV32I-NEXT: slli a1, a0, 5 232; RV32I-NEXT: slli a0, a0, 7 233; RV32I-NEXT: sub a0, a0, a1 234; RV32I-NEXT: ret 235; 236; RV32ZBA-LABEL: mul96: 237; RV32ZBA: # %bb.0: 238; RV32ZBA-NEXT: sh1add a0, a0, a0 239; RV32ZBA-NEXT: slli a0, a0, 5 240; RV32ZBA-NEXT: ret 241 %c = mul i32 %a, 96 242 ret i32 %c 243} 244 245define i32 @mul160(i32 %a) { 246; RV32I-LABEL: mul160: 247; RV32I: # %bb.0: 248; RV32I-NEXT: li a1, 160 249; RV32I-NEXT: mul a0, a0, a1 250; RV32I-NEXT: ret 251; 252; RV32ZBA-LABEL: mul160: 253; RV32ZBA: # %bb.0: 254; RV32ZBA-NEXT: sh2add a0, a0, a0 255; RV32ZBA-NEXT: slli a0, a0, 5 256; RV32ZBA-NEXT: ret 257 %c = mul i32 %a, 160 258 ret i32 %c 259} 260 261define i32 @mul288(i32 %a) { 262; RV32I-LABEL: mul288: 263; RV32I: # %bb.0: 264; RV32I-NEXT: li a1, 288 265; RV32I-NEXT: mul a0, a0, a1 266; RV32I-NEXT: ret 267; 268; RV32ZBA-LABEL: mul288: 269; RV32ZBA: # %bb.0: 270; RV32ZBA-NEXT: sh3add a0, a0, a0 271; RV32ZBA-NEXT: slli a0, a0, 5 272; RV32ZBA-NEXT: ret 273 %c = mul i32 %a, 288 274 ret i32 %c 275} 276 277define i32 @mul258(i32 %a) { 278; RV32I-LABEL: mul258: 279; RV32I: # %bb.0: 280; RV32I-NEXT: li a1, 258 281; RV32I-NEXT: mul a0, a0, a1 282; RV32I-NEXT: ret 283; 284; RV32ZBA-LABEL: mul258: 285; RV32ZBA: # %bb.0: 286; RV32ZBA-NEXT: slli a1, a0, 8 287; RV32ZBA-NEXT: sh1add a0, a0, a1 288; RV32ZBA-NEXT: ret 289 %c = mul i32 %a, 258 290 ret i32 %c 291} 292 293define i32 @mul260(i32 %a) { 294; RV32I-LABEL: mul260: 295; RV32I: # %bb.0: 296; RV32I-NEXT: li a1, 260 297; RV32I-NEXT: mul a0, a0, a1 298; RV32I-NEXT: ret 299; 300; RV32ZBA-LABEL: mul260: 301; RV32ZBA: # %bb.0: 302; RV32ZBA-NEXT: slli a1, a0, 8 303; RV32ZBA-NEXT: sh2add a0, a0, a1 304; RV32ZBA-NEXT: ret 305 %c = mul i32 %a, 260 306 ret i32 %c 307} 308 309define i32 @mul264(i32 %a) { 310; RV32I-LABEL: mul264: 311; RV32I: # %bb.0: 312; RV32I-NEXT: li a1, 264 313; RV32I-NEXT: mul a0, a0, a1 314; RV32I-NEXT: ret 315; 316; RV32ZBA-LABEL: mul264: 317; RV32ZBA: # %bb.0: 318; RV32ZBA-NEXT: slli a1, a0, 8 319; RV32ZBA-NEXT: sh3add a0, a0, a1 320; RV32ZBA-NEXT: ret 321 %c = mul i32 %a, 264 322 ret i32 %c 323} 324 325define i32 @mul11(i32 %a) { 326; RV32I-LABEL: mul11: 327; RV32I: # %bb.0: 328; RV32I-NEXT: li a1, 11 329; RV32I-NEXT: mul a0, a0, a1 330; RV32I-NEXT: ret 331; 332; RV32ZBA-LABEL: mul11: 333; RV32ZBA: # %bb.0: 334; RV32ZBA-NEXT: sh2add a1, a0, a0 335; RV32ZBA-NEXT: sh1add a0, a1, a0 336; RV32ZBA-NEXT: ret 337 %c = mul i32 %a, 11 338 ret i32 %c 339} 340 341define i32 @mul19(i32 %a) { 342; RV32I-LABEL: mul19: 343; RV32I: # %bb.0: 344; RV32I-NEXT: li a1, 19 345; RV32I-NEXT: mul a0, a0, a1 346; RV32I-NEXT: ret 347; 348; RV32ZBA-LABEL: mul19: 349; RV32ZBA: # %bb.0: 350; RV32ZBA-NEXT: sh3add a1, a0, a0 351; RV32ZBA-NEXT: sh1add a0, a1, a0 352; RV32ZBA-NEXT: ret 353 %c = mul i32 %a, 19 354 ret i32 %c 355} 356 357define i32 @mul13(i32 %a) { 358; RV32I-LABEL: mul13: 359; RV32I: # %bb.0: 360; RV32I-NEXT: li a1, 13 361; RV32I-NEXT: mul a0, a0, a1 362; RV32I-NEXT: ret 363; 364; RV32ZBA-LABEL: mul13: 365; RV32ZBA: # %bb.0: 366; RV32ZBA-NEXT: sh1add a1, a0, a0 367; RV32ZBA-NEXT: sh2add a0, a1, a0 368; RV32ZBA-NEXT: ret 369 %c = mul i32 %a, 13 370 ret i32 %c 371} 372 373define i32 @mul21(i32 %a) { 374; RV32I-LABEL: mul21: 375; RV32I: # %bb.0: 376; RV32I-NEXT: li a1, 21 377; RV32I-NEXT: mul a0, a0, a1 378; RV32I-NEXT: ret 379; 380; RV32ZBA-LABEL: mul21: 381; RV32ZBA: # %bb.0: 382; RV32ZBA-NEXT: sh2add a1, a0, a0 383; RV32ZBA-NEXT: sh2add a0, a1, a0 384; RV32ZBA-NEXT: ret 385 %c = mul i32 %a, 21 386 ret i32 %c 387} 388 389define i32 @mul37(i32 %a) { 390; RV32I-LABEL: mul37: 391; RV32I: # %bb.0: 392; RV32I-NEXT: li a1, 37 393; RV32I-NEXT: mul a0, a0, a1 394; RV32I-NEXT: ret 395; 396; RV32ZBA-LABEL: mul37: 397; RV32ZBA: # %bb.0: 398; RV32ZBA-NEXT: sh3add a1, a0, a0 399; RV32ZBA-NEXT: sh2add a0, a1, a0 400; RV32ZBA-NEXT: ret 401 %c = mul i32 %a, 37 402 ret i32 %c 403} 404 405define i32 @mul25(i32 %a) { 406; RV32I-LABEL: mul25: 407; RV32I: # %bb.0: 408; RV32I-NEXT: li a1, 25 409; RV32I-NEXT: mul a0, a0, a1 410; RV32I-NEXT: ret 411; 412; RV32ZBA-LABEL: mul25: 413; RV32ZBA: # %bb.0: 414; RV32ZBA-NEXT: sh2add a0, a0, a0 415; RV32ZBA-NEXT: sh2add a0, a0, a0 416; RV32ZBA-NEXT: ret 417 %c = mul i32 %a, 25 418 ret i32 %c 419} 420 421define i32 @mul41(i32 %a) { 422; RV32I-LABEL: mul41: 423; RV32I: # %bb.0: 424; RV32I-NEXT: li a1, 41 425; RV32I-NEXT: mul a0, a0, a1 426; RV32I-NEXT: ret 427; 428; RV32ZBA-LABEL: mul41: 429; RV32ZBA: # %bb.0: 430; RV32ZBA-NEXT: sh2add a1, a0, a0 431; RV32ZBA-NEXT: sh3add a0, a1, a0 432; RV32ZBA-NEXT: ret 433 %c = mul i32 %a, 41 434 ret i32 %c 435} 436 437define i32 @mul73(i32 %a) { 438; RV32I-LABEL: mul73: 439; RV32I: # %bb.0: 440; RV32I-NEXT: li a1, 73 441; RV32I-NEXT: mul a0, a0, a1 442; RV32I-NEXT: ret 443; 444; RV32ZBA-LABEL: mul73: 445; RV32ZBA: # %bb.0: 446; RV32ZBA-NEXT: sh3add a1, a0, a0 447; RV32ZBA-NEXT: sh3add a0, a1, a0 448; RV32ZBA-NEXT: ret 449 %c = mul i32 %a, 73 450 ret i32 %c 451} 452 453define i32 @mul27(i32 %a) { 454; RV32I-LABEL: mul27: 455; RV32I: # %bb.0: 456; RV32I-NEXT: li a1, 27 457; RV32I-NEXT: mul a0, a0, a1 458; RV32I-NEXT: ret 459; 460; RV32ZBA-LABEL: mul27: 461; RV32ZBA: # %bb.0: 462; RV32ZBA-NEXT: sh1add a0, a0, a0 463; RV32ZBA-NEXT: sh3add a0, a0, a0 464; RV32ZBA-NEXT: ret 465 %c = mul i32 %a, 27 466 ret i32 %c 467} 468 469define i32 @mul45(i32 %a) { 470; RV32I-LABEL: mul45: 471; RV32I: # %bb.0: 472; RV32I-NEXT: li a1, 45 473; RV32I-NEXT: mul a0, a0, a1 474; RV32I-NEXT: ret 475; 476; RV32ZBA-LABEL: mul45: 477; RV32ZBA: # %bb.0: 478; RV32ZBA-NEXT: sh2add a0, a0, a0 479; RV32ZBA-NEXT: sh3add a0, a0, a0 480; RV32ZBA-NEXT: ret 481 %c = mul i32 %a, 45 482 ret i32 %c 483} 484 485define i32 @mul81(i32 %a) { 486; RV32I-LABEL: mul81: 487; RV32I: # %bb.0: 488; RV32I-NEXT: li a1, 81 489; RV32I-NEXT: mul a0, a0, a1 490; RV32I-NEXT: ret 491; 492; RV32ZBA-LABEL: mul81: 493; RV32ZBA: # %bb.0: 494; RV32ZBA-NEXT: sh3add a0, a0, a0 495; RV32ZBA-NEXT: sh3add a0, a0, a0 496; RV32ZBA-NEXT: ret 497 %c = mul i32 %a, 81 498 ret i32 %c 499} 500 501define i32 @mul4098(i32 %a) { 502; RV32I-LABEL: mul4098: 503; RV32I: # %bb.0: 504; RV32I-NEXT: slli a1, a0, 1 505; RV32I-NEXT: slli a0, a0, 12 506; RV32I-NEXT: add a0, a0, a1 507; RV32I-NEXT: ret 508; 509; RV32ZBA-LABEL: mul4098: 510; RV32ZBA: # %bb.0: 511; RV32ZBA-NEXT: slli a1, a0, 12 512; RV32ZBA-NEXT: sh1add a0, a0, a1 513; RV32ZBA-NEXT: ret 514 %c = mul i32 %a, 4098 515 ret i32 %c 516} 517 518define i32 @mul4100(i32 %a) { 519; RV32I-LABEL: mul4100: 520; RV32I: # %bb.0: 521; RV32I-NEXT: slli a1, a0, 2 522; RV32I-NEXT: slli a0, a0, 12 523; RV32I-NEXT: add a0, a0, a1 524; RV32I-NEXT: ret 525; 526; RV32ZBA-LABEL: mul4100: 527; RV32ZBA: # %bb.0: 528; RV32ZBA-NEXT: slli a1, a0, 12 529; RV32ZBA-NEXT: sh2add a0, a0, a1 530; RV32ZBA-NEXT: ret 531 %c = mul i32 %a, 4100 532 ret i32 %c 533} 534 535define i32 @mul4104(i32 %a) { 536; RV32I-LABEL: mul4104: 537; RV32I: # %bb.0: 538; RV32I-NEXT: slli a1, a0, 3 539; RV32I-NEXT: slli a0, a0, 12 540; RV32I-NEXT: add a0, a0, a1 541; RV32I-NEXT: ret 542; 543; RV32ZBA-LABEL: mul4104: 544; RV32ZBA: # %bb.0: 545; RV32ZBA-NEXT: slli a1, a0, 12 546; RV32ZBA-NEXT: sh3add a0, a0, a1 547; RV32ZBA-NEXT: ret 548 %c = mul i32 %a, 4104 549 ret i32 %c 550} 551 552define i32 @add4104(i32 %a) { 553; RV32I-LABEL: add4104: 554; RV32I: # %bb.0: 555; RV32I-NEXT: lui a1, 1 556; RV32I-NEXT: addi a1, a1, 8 557; RV32I-NEXT: add a0, a0, a1 558; RV32I-NEXT: ret 559; 560; RV32ZBA-LABEL: add4104: 561; RV32ZBA: # %bb.0: 562; RV32ZBA-NEXT: li a1, 1026 563; RV32ZBA-NEXT: sh2add a0, a1, a0 564; RV32ZBA-NEXT: ret 565 %c = add i32 %a, 4104 566 ret i32 %c 567} 568 569define i32 @add8208(i32 %a) { 570; RV32I-LABEL: add8208: 571; RV32I: # %bb.0: 572; RV32I-NEXT: lui a1, 2 573; RV32I-NEXT: addi a1, a1, 16 574; RV32I-NEXT: add a0, a0, a1 575; RV32I-NEXT: ret 576; 577; RV32ZBA-LABEL: add8208: 578; RV32ZBA: # %bb.0: 579; RV32ZBA-NEXT: li a1, 1026 580; RV32ZBA-NEXT: sh3add a0, a1, a0 581; RV32ZBA-NEXT: ret 582 %c = add i32 %a, 8208 583 ret i32 %c 584} 585 586define i32 @add8192(i32 %a) { 587; CHECK-LABEL: add8192: 588; CHECK: # %bb.0: 589; CHECK-NEXT: lui a1, 2 590; CHECK-NEXT: add a0, a0, a1 591; CHECK-NEXT: ret 592 %c = add i32 %a, 8192 593 ret i32 %c 594} 595 596define i32 @addshl_5_6(i32 %a, i32 %b) { 597; RV32I-LABEL: addshl_5_6: 598; RV32I: # %bb.0: 599; RV32I-NEXT: slli a0, a0, 5 600; RV32I-NEXT: slli a1, a1, 6 601; RV32I-NEXT: add a0, a0, a1 602; RV32I-NEXT: ret 603; 604; RV32ZBA-LABEL: addshl_5_6: 605; RV32ZBA: # %bb.0: 606; RV32ZBA-NEXT: sh1add a0, a1, a0 607; RV32ZBA-NEXT: slli a0, a0, 5 608; RV32ZBA-NEXT: ret 609 %c = shl i32 %a, 5 610 %d = shl i32 %b, 6 611 %e = add i32 %c, %d 612 ret i32 %e 613} 614 615define i32 @addshl_5_7(i32 %a, i32 %b) { 616; RV32I-LABEL: addshl_5_7: 617; RV32I: # %bb.0: 618; RV32I-NEXT: slli a0, a0, 5 619; RV32I-NEXT: slli a1, a1, 7 620; RV32I-NEXT: add a0, a0, a1 621; RV32I-NEXT: ret 622; 623; RV32ZBA-LABEL: addshl_5_7: 624; RV32ZBA: # %bb.0: 625; RV32ZBA-NEXT: sh2add a0, a1, a0 626; RV32ZBA-NEXT: slli a0, a0, 5 627; RV32ZBA-NEXT: ret 628 %c = shl i32 %a, 5 629 %d = shl i32 %b, 7 630 %e = add i32 %c, %d 631 ret i32 %e 632} 633 634define i32 @addshl_5_8(i32 %a, i32 %b) { 635; RV32I-LABEL: addshl_5_8: 636; RV32I: # %bb.0: 637; RV32I-NEXT: slli a0, a0, 5 638; RV32I-NEXT: slli a1, a1, 8 639; RV32I-NEXT: add a0, a0, a1 640; RV32I-NEXT: ret 641; 642; RV32ZBA-LABEL: addshl_5_8: 643; RV32ZBA: # %bb.0: 644; RV32ZBA-NEXT: sh3add a0, a1, a0 645; RV32ZBA-NEXT: slli a0, a0, 5 646; RV32ZBA-NEXT: ret 647 %c = shl i32 %a, 5 648 %d = shl i32 %b, 8 649 %e = add i32 %c, %d 650 ret i32 %e 651} 652 653define i32 @srli_1_sh2add(ptr %0, i32 %1) { 654; RV32I-LABEL: srli_1_sh2add: 655; RV32I: # %bb.0: 656; RV32I-NEXT: slli a1, a1, 1 657; RV32I-NEXT: andi a1, a1, -4 658; RV32I-NEXT: add a0, a0, a1 659; RV32I-NEXT: lw a0, 0(a0) 660; RV32I-NEXT: ret 661; 662; RV32ZBA-LABEL: srli_1_sh2add: 663; RV32ZBA: # %bb.0: 664; RV32ZBA-NEXT: srli a1, a1, 1 665; RV32ZBA-NEXT: sh2add a0, a1, a0 666; RV32ZBA-NEXT: lw a0, 0(a0) 667; RV32ZBA-NEXT: ret 668 %3 = lshr i32 %1, 1 669 %4 = getelementptr inbounds i32, ptr %0, i32 %3 670 %5 = load i32, ptr %4, align 4 671 ret i32 %5 672} 673 674define i64 @srli_2_sh3add(ptr %0, i32 %1) { 675; RV32I-LABEL: srli_2_sh3add: 676; RV32I: # %bb.0: 677; RV32I-NEXT: slli a1, a1, 1 678; RV32I-NEXT: andi a1, a1, -8 679; RV32I-NEXT: add a1, a0, a1 680; RV32I-NEXT: lw a0, 0(a1) 681; RV32I-NEXT: lw a1, 4(a1) 682; RV32I-NEXT: ret 683; 684; RV32ZBA-LABEL: srli_2_sh3add: 685; RV32ZBA: # %bb.0: 686; RV32ZBA-NEXT: srli a1, a1, 2 687; RV32ZBA-NEXT: sh3add a1, a1, a0 688; RV32ZBA-NEXT: lw a0, 0(a1) 689; RV32ZBA-NEXT: lw a1, 4(a1) 690; RV32ZBA-NEXT: ret 691 %3 = lshr i32 %1, 2 692 %4 = getelementptr inbounds i64, ptr %0, i32 %3 693 %5 = load i64, ptr %4, align 8 694 ret i64 %5 695} 696 697define signext i16 @srli_2_sh1add(ptr %0, i32 %1) { 698; RV32I-LABEL: srli_2_sh1add: 699; RV32I: # %bb.0: 700; RV32I-NEXT: srli a1, a1, 1 701; RV32I-NEXT: andi a1, a1, -2 702; RV32I-NEXT: add a0, a0, a1 703; RV32I-NEXT: lh a0, 0(a0) 704; RV32I-NEXT: ret 705; 706; RV32ZBA-LABEL: srli_2_sh1add: 707; RV32ZBA: # %bb.0: 708; RV32ZBA-NEXT: srli a1, a1, 2 709; RV32ZBA-NEXT: sh1add a0, a1, a0 710; RV32ZBA-NEXT: lh a0, 0(a0) 711; RV32ZBA-NEXT: ret 712 %3 = lshr i32 %1, 2 713 %4 = getelementptr inbounds i16, ptr %0, i32 %3 714 %5 = load i16, ptr %4, align 2 715 ret i16 %5 716} 717 718define i32 @srli_3_sh2add(ptr %0, i32 %1) { 719; RV32I-LABEL: srli_3_sh2add: 720; RV32I: # %bb.0: 721; RV32I-NEXT: srli a1, a1, 1 722; RV32I-NEXT: andi a1, a1, -4 723; RV32I-NEXT: add a0, a0, a1 724; RV32I-NEXT: lw a0, 0(a0) 725; RV32I-NEXT: ret 726; 727; RV32ZBA-LABEL: srli_3_sh2add: 728; RV32ZBA: # %bb.0: 729; RV32ZBA-NEXT: srli a1, a1, 3 730; RV32ZBA-NEXT: sh2add a0, a1, a0 731; RV32ZBA-NEXT: lw a0, 0(a0) 732; RV32ZBA-NEXT: ret 733 %3 = lshr i32 %1, 3 734 %4 = getelementptr inbounds i32, ptr %0, i32 %3 735 %5 = load i32, ptr %4, align 4 736 ret i32 %5 737} 738 739define i64 @srli_4_sh3add(ptr %0, i32 %1) { 740; RV32I-LABEL: srli_4_sh3add: 741; RV32I: # %bb.0: 742; RV32I-NEXT: srli a1, a1, 1 743; RV32I-NEXT: andi a1, a1, -8 744; RV32I-NEXT: add a1, a0, a1 745; RV32I-NEXT: lw a0, 0(a1) 746; RV32I-NEXT: lw a1, 4(a1) 747; RV32I-NEXT: ret 748; 749; RV32ZBA-LABEL: srli_4_sh3add: 750; RV32ZBA: # %bb.0: 751; RV32ZBA-NEXT: srli a1, a1, 4 752; RV32ZBA-NEXT: sh3add a1, a1, a0 753; RV32ZBA-NEXT: lw a0, 0(a1) 754; RV32ZBA-NEXT: lw a1, 4(a1) 755; RV32ZBA-NEXT: ret 756 %3 = lshr i32 %1, 4 757 %4 = getelementptr inbounds i64, ptr %0, i32 %3 758 %5 = load i64, ptr %4, align 8 759 ret i64 %5 760} 761 762define i32 @mul_neg1(i32 %a) { 763; CHECK-LABEL: mul_neg1: 764; CHECK: # %bb.0: 765; CHECK-NEXT: neg a0, a0 766; CHECK-NEXT: ret 767 %c = mul i32 %a, -1 768 ret i32 %c 769} 770 771define i32 @mul_neg2(i32 %a) { 772; CHECK-LABEL: mul_neg2: 773; CHECK: # %bb.0: 774; CHECK-NEXT: slli a0, a0, 1 775; CHECK-NEXT: neg a0, a0 776; CHECK-NEXT: ret 777 %c = mul i32 %a, -2 778 ret i32 %c 779} 780 781define i32 @mul_neg3(i32 %a) { 782; RV32I-LABEL: mul_neg3: 783; RV32I: # %bb.0: 784; RV32I-NEXT: slli a1, a0, 1 785; RV32I-NEXT: neg a0, a0 786; RV32I-NEXT: sub a0, a0, a1 787; RV32I-NEXT: ret 788; 789; RV32ZBA-LABEL: mul_neg3: 790; RV32ZBA: # %bb.0: 791; RV32ZBA-NEXT: sh1add a0, a0, a0 792; RV32ZBA-NEXT: neg a0, a0 793; RV32ZBA-NEXT: ret 794 %c = mul i32 %a, -3 795 ret i32 %c 796} 797 798define i32 @mul_neg4(i32 %a) { 799; CHECK-LABEL: mul_neg4: 800; CHECK: # %bb.0: 801; CHECK-NEXT: slli a0, a0, 2 802; CHECK-NEXT: neg a0, a0 803; CHECK-NEXT: ret 804 %c = mul i32 %a, -4 805 ret i32 %c 806} 807 808define i32 @mul_neg5(i32 %a) { 809; RV32I-LABEL: mul_neg5: 810; RV32I: # %bb.0: 811; RV32I-NEXT: slli a1, a0, 2 812; RV32I-NEXT: neg a0, a0 813; RV32I-NEXT: sub a0, a0, a1 814; RV32I-NEXT: ret 815; 816; RV32ZBA-LABEL: mul_neg5: 817; RV32ZBA: # %bb.0: 818; RV32ZBA-NEXT: sh2add a0, a0, a0 819; RV32ZBA-NEXT: neg a0, a0 820; RV32ZBA-NEXT: ret 821 %c = mul i32 %a, -5 822 ret i32 %c 823} 824 825define i32 @mul_neg6(i32 %a) { 826; CHECK-LABEL: mul_neg6: 827; CHECK: # %bb.0: 828; CHECK-NEXT: li a1, -6 829; CHECK-NEXT: mul a0, a0, a1 830; CHECK-NEXT: ret 831 %c = mul i32 %a, -6 832 ret i32 %c 833} 834 835define i32 @mul_neg7(i32 %a) { 836; CHECK-LABEL: mul_neg7: 837; CHECK: # %bb.0: 838; CHECK-NEXT: slli a1, a0, 3 839; CHECK-NEXT: sub a0, a0, a1 840; CHECK-NEXT: ret 841 %c = mul i32 %a, -7 842 ret i32 %c 843} 844 845define i32 @mul_neg8(i32 %a) { 846; CHECK-LABEL: mul_neg8: 847; CHECK: # %bb.0: 848; CHECK-NEXT: slli a0, a0, 3 849; CHECK-NEXT: neg a0, a0 850; CHECK-NEXT: ret 851 %c = mul i32 %a, -8 852 ret i32 %c 853} 854