1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32 3; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64 4 5;; Exercise the 'mul' LLVM IR: https://llvm.org/docs/LangRef.html#mul-instruction 6 7define i1 @mul_i1(i1 %a, i1 %b) { 8; LA32-LABEL: mul_i1: 9; LA32: # %bb.0: # %entry 10; LA32-NEXT: mul.w $a0, $a0, $a1 11; LA32-NEXT: ret 12; 13; LA64-LABEL: mul_i1: 14; LA64: # %bb.0: # %entry 15; LA64-NEXT: mul.d $a0, $a0, $a1 16; LA64-NEXT: ret 17entry: 18 %r = mul i1 %a, %b 19 ret i1 %r 20} 21 22define i8 @mul_i8(i8 %a, i8 %b) { 23; LA32-LABEL: mul_i8: 24; LA32: # %bb.0: # %entry 25; LA32-NEXT: mul.w $a0, $a0, $a1 26; LA32-NEXT: ret 27; 28; LA64-LABEL: mul_i8: 29; LA64: # %bb.0: # %entry 30; LA64-NEXT: mul.d $a0, $a0, $a1 31; LA64-NEXT: ret 32entry: 33 %r = mul i8 %a, %b 34 ret i8 %r 35} 36 37define i16 @mul_i16(i16 %a, i16 %b) { 38; LA32-LABEL: mul_i16: 39; LA32: # %bb.0: # %entry 40; LA32-NEXT: mul.w $a0, $a0, $a1 41; LA32-NEXT: ret 42; 43; LA64-LABEL: mul_i16: 44; LA64: # %bb.0: # %entry 45; LA64-NEXT: mul.d $a0, $a0, $a1 46; LA64-NEXT: ret 47entry: 48 %r = mul i16 %a, %b 49 ret i16 %r 50} 51 52define i32 @mul_i32(i32 %a, i32 %b) { 53; LA32-LABEL: mul_i32: 54; LA32: # %bb.0: # %entry 55; LA32-NEXT: mul.w $a0, $a0, $a1 56; LA32-NEXT: ret 57; 58; LA64-LABEL: mul_i32: 59; LA64: # %bb.0: # %entry 60; LA64-NEXT: mul.d $a0, $a0, $a1 61; LA64-NEXT: ret 62entry: 63 %r = mul i32 %a, %b 64 ret i32 %r 65} 66 67define i64 @mul_i64(i64 %a, i64 %b) { 68; LA32-LABEL: mul_i64: 69; LA32: # %bb.0: # %entry 70; LA32-NEXT: mul.w $a3, $a0, $a3 71; LA32-NEXT: mulh.wu $a4, $a0, $a2 72; LA32-NEXT: add.w $a3, $a4, $a3 73; LA32-NEXT: mul.w $a1, $a1, $a2 74; LA32-NEXT: add.w $a1, $a3, $a1 75; LA32-NEXT: mul.w $a0, $a0, $a2 76; LA32-NEXT: ret 77; 78; LA64-LABEL: mul_i64: 79; LA64: # %bb.0: # %entry 80; LA64-NEXT: mul.d $a0, $a0, $a1 81; LA64-NEXT: ret 82entry: 83 %r = mul i64 %a, %b 84 ret i64 %r 85} 86 87define i64 @mul_pow2(i64 %a) { 88; LA32-LABEL: mul_pow2: 89; LA32: # %bb.0: 90; LA32-NEXT: srli.w $a2, $a0, 29 91; LA32-NEXT: slli.w $a1, $a1, 3 92; LA32-NEXT: or $a1, $a1, $a2 93; LA32-NEXT: slli.w $a0, $a0, 3 94; LA32-NEXT: ret 95; 96; LA64-LABEL: mul_pow2: 97; LA64: # %bb.0: 98; LA64-NEXT: slli.d $a0, $a0, 3 99; LA64-NEXT: ret 100 %1 = mul i64 %a, 8 101 ret i64 %1 102} 103 104define i64 @mul_p5(i64 %a) { 105; LA32-LABEL: mul_p5: 106; LA32: # %bb.0: 107; LA32-NEXT: ori $a2, $zero, 5 108; LA32-NEXT: mulh.wu $a2, $a0, $a2 109; LA32-NEXT: alsl.w $a1, $a1, $a1, 2 110; LA32-NEXT: add.w $a1, $a2, $a1 111; LA32-NEXT: alsl.w $a0, $a0, $a0, 2 112; LA32-NEXT: ret 113; 114; LA64-LABEL: mul_p5: 115; LA64: # %bb.0: 116; LA64-NEXT: alsl.d $a0, $a0, $a0, 2 117; LA64-NEXT: ret 118 %1 = mul i64 %a, 5 119 ret i64 %1 120} 121 122define i32 @mulh_w(i32 %a, i32 %b) { 123; LA32-LABEL: mulh_w: 124; LA32: # %bb.0: 125; LA32-NEXT: mulh.w $a0, $a0, $a1 126; LA32-NEXT: ret 127; 128; LA64-LABEL: mulh_w: 129; LA64: # %bb.0: 130; LA64-NEXT: mulw.d.w $a0, $a0, $a1 131; LA64-NEXT: srli.d $a0, $a0, 32 132; LA64-NEXT: ret 133 %1 = sext i32 %a to i64 134 %2 = sext i32 %b to i64 135 %3 = mul i64 %1, %2 136 %4 = lshr i64 %3, 32 137 %5 = trunc i64 %4 to i32 138 ret i32 %5 139} 140 141define i32 @mulh_wu(i32 %a, i32 %b) { 142; LA32-LABEL: mulh_wu: 143; LA32: # %bb.0: 144; LA32-NEXT: mulh.wu $a0, $a0, $a1 145; LA32-NEXT: ret 146; 147; LA64-LABEL: mulh_wu: 148; LA64: # %bb.0: 149; LA64-NEXT: mulw.d.wu $a0, $a0, $a1 150; LA64-NEXT: srli.d $a0, $a0, 32 151; LA64-NEXT: ret 152 %1 = zext i32 %a to i64 153 %2 = zext i32 %b to i64 154 %3 = mul i64 %1, %2 155 %4 = lshr i64 %3, 32 156 %5 = trunc i64 %4 to i32 157 ret i32 %5 158} 159 160define i64 @mulh_d(i64 %a, i64 %b) { 161; LA32-LABEL: mulh_d: 162; LA32: # %bb.0: 163; LA32-NEXT: srai.w $a5, $a1, 31 164; LA32-NEXT: srai.w $a6, $a3, 31 165; LA32-NEXT: mulh.wu $a4, $a0, $a2 166; LA32-NEXT: mul.w $a7, $a1, $a2 167; LA32-NEXT: add.w $a4, $a7, $a4 168; LA32-NEXT: sltu $a7, $a4, $a7 169; LA32-NEXT: mulh.wu $t0, $a1, $a2 170; LA32-NEXT: add.w $a7, $t0, $a7 171; LA32-NEXT: mul.w $t0, $a0, $a3 172; LA32-NEXT: add.w $a4, $t0, $a4 173; LA32-NEXT: sltu $a4, $a4, $t0 174; LA32-NEXT: mulh.wu $t0, $a0, $a3 175; LA32-NEXT: add.w $a4, $t0, $a4 176; LA32-NEXT: add.w $t0, $a7, $a4 177; LA32-NEXT: mul.w $t1, $a1, $a3 178; LA32-NEXT: add.w $t2, $t1, $t0 179; LA32-NEXT: mul.w $t3, $a2, $a5 180; LA32-NEXT: mul.w $t4, $a6, $a0 181; LA32-NEXT: add.w $t5, $t4, $t3 182; LA32-NEXT: add.w $a4, $t2, $t5 183; LA32-NEXT: sltu $t6, $a4, $t2 184; LA32-NEXT: sltu $t1, $t2, $t1 185; LA32-NEXT: sltu $a7, $t0, $a7 186; LA32-NEXT: mulh.wu $t0, $a1, $a3 187; LA32-NEXT: add.w $a7, $t0, $a7 188; LA32-NEXT: add.w $a7, $a7, $t1 189; LA32-NEXT: mulh.wu $a2, $a2, $a5 190; LA32-NEXT: add.w $a2, $a2, $t3 191; LA32-NEXT: mul.w $a3, $a3, $a5 192; LA32-NEXT: add.w $a2, $a2, $a3 193; LA32-NEXT: mul.w $a1, $a6, $a1 194; LA32-NEXT: mulh.wu $a0, $a6, $a0 195; LA32-NEXT: add.w $a0, $a0, $a1 196; LA32-NEXT: add.w $a0, $a0, $t4 197; LA32-NEXT: add.w $a0, $a0, $a2 198; LA32-NEXT: sltu $a1, $t5, $t4 199; LA32-NEXT: add.w $a0, $a0, $a1 200; LA32-NEXT: add.w $a0, $a7, $a0 201; LA32-NEXT: add.w $a1, $a0, $t6 202; LA32-NEXT: move $a0, $a4 203; LA32-NEXT: ret 204; 205; LA64-LABEL: mulh_d: 206; LA64: # %bb.0: 207; LA64-NEXT: mulh.d $a0, $a0, $a1 208; LA64-NEXT: ret 209 %1 = sext i64 %a to i128 210 %2 = sext i64 %b to i128 211 %3 = mul i128 %1, %2 212 %4 = lshr i128 %3, 64 213 %5 = trunc i128 %4 to i64 214 ret i64 %5 215} 216 217define i64 @mulh_du(i64 %a, i64 %b) { 218; LA32-LABEL: mulh_du: 219; LA32: # %bb.0: 220; LA32-NEXT: mulh.wu $a4, $a0, $a2 221; LA32-NEXT: mul.w $a5, $a1, $a2 222; LA32-NEXT: add.w $a4, $a5, $a4 223; LA32-NEXT: sltu $a5, $a4, $a5 224; LA32-NEXT: mulh.wu $a2, $a1, $a2 225; LA32-NEXT: add.w $a2, $a2, $a5 226; LA32-NEXT: mul.w $a5, $a0, $a3 227; LA32-NEXT: add.w $a4, $a5, $a4 228; LA32-NEXT: sltu $a4, $a4, $a5 229; LA32-NEXT: mulh.wu $a0, $a0, $a3 230; LA32-NEXT: add.w $a0, $a0, $a4 231; LA32-NEXT: add.w $a4, $a2, $a0 232; LA32-NEXT: mul.w $a5, $a1, $a3 233; LA32-NEXT: add.w $a0, $a5, $a4 234; LA32-NEXT: sltu $a5, $a0, $a5 235; LA32-NEXT: sltu $a2, $a4, $a2 236; LA32-NEXT: mulh.wu $a1, $a1, $a3 237; LA32-NEXT: add.w $a1, $a1, $a2 238; LA32-NEXT: add.w $a1, $a1, $a5 239; LA32-NEXT: ret 240; 241; LA64-LABEL: mulh_du: 242; LA64: # %bb.0: 243; LA64-NEXT: mulh.du $a0, $a0, $a1 244; LA64-NEXT: ret 245 %1 = zext i64 %a to i128 246 %2 = zext i64 %b to i128 247 %3 = mul i128 %1, %2 248 %4 = lshr i128 %3, 64 249 %5 = trunc i128 %4 to i64 250 ret i64 %5 251} 252 253define i64 @mulw_d_w(i32 %a, i32 %b) { 254; LA32-LABEL: mulw_d_w: 255; LA32: # %bb.0: 256; LA32-NEXT: mul.w $a2, $a0, $a1 257; LA32-NEXT: mulh.w $a1, $a0, $a1 258; LA32-NEXT: move $a0, $a2 259; LA32-NEXT: ret 260; 261; LA64-LABEL: mulw_d_w: 262; LA64: # %bb.0: 263; LA64-NEXT: mulw.d.w $a0, $a0, $a1 264; LA64-NEXT: ret 265 %1 = sext i32 %a to i64 266 %2 = sext i32 %b to i64 267 %3 = mul i64 %1, %2 268 ret i64 %3 269} 270 271define i64 @mulw_d_wu(i32 %a, i32 %b) { 272; LA32-LABEL: mulw_d_wu: 273; LA32: # %bb.0: 274; LA32-NEXT: mul.w $a2, $a0, $a1 275; LA32-NEXT: mulh.wu $a1, $a0, $a1 276; LA32-NEXT: move $a0, $a2 277; LA32-NEXT: ret 278; 279; LA64-LABEL: mulw_d_wu: 280; LA64: # %bb.0: 281; LA64-NEXT: mulw.d.wu $a0, $a0, $a1 282; LA64-NEXT: ret 283 %1 = zext i32 %a to i64 284 %2 = zext i32 %b to i64 285 %3 = mul i64 %1, %2 286 ret i64 %3 287} 288 289define signext i32 @mul_i32_11(i32 %a) { 290; LA32-LABEL: mul_i32_11: 291; LA32: # %bb.0: 292; LA32-NEXT: alsl.w $a1, $a0, $a0, 2 293; LA32-NEXT: alsl.w $a0, $a1, $a0, 1 294; LA32-NEXT: ret 295; 296; LA64-LABEL: mul_i32_11: 297; LA64: # %bb.0: 298; LA64-NEXT: alsl.w $a1, $a0, $a0, 2 299; LA64-NEXT: alsl.w $a0, $a1, $a0, 1 300; LA64-NEXT: ret 301 %b = mul i32 %a, 11 302 ret i32 %b 303} 304 305define signext i32 @mul_i32_13(i32 %a) { 306; LA32-LABEL: mul_i32_13: 307; LA32: # %bb.0: 308; LA32-NEXT: alsl.w $a1, $a0, $a0, 1 309; LA32-NEXT: alsl.w $a0, $a1, $a0, 2 310; LA32-NEXT: ret 311; 312; LA64-LABEL: mul_i32_13: 313; LA64: # %bb.0: 314; LA64-NEXT: alsl.w $a1, $a0, $a0, 1 315; LA64-NEXT: alsl.w $a0, $a1, $a0, 2 316; LA64-NEXT: ret 317 %b = mul i32 %a, 13 318 ret i32 %b 319} 320 321define signext i32 @mul_i32_19(i32 %a) { 322; LA32-LABEL: mul_i32_19: 323; LA32: # %bb.0: 324; LA32-NEXT: alsl.w $a1, $a0, $a0, 3 325; LA32-NEXT: alsl.w $a0, $a1, $a0, 1 326; LA32-NEXT: ret 327; 328; LA64-LABEL: mul_i32_19: 329; LA64: # %bb.0: 330; LA64-NEXT: alsl.w $a1, $a0, $a0, 3 331; LA64-NEXT: alsl.w $a0, $a1, $a0, 1 332; LA64-NEXT: ret 333 %b = mul i32 %a, 19 334 ret i32 %b 335} 336 337define signext i32 @mul_i32_21(i32 %a) { 338; LA32-LABEL: mul_i32_21: 339; LA32: # %bb.0: 340; LA32-NEXT: alsl.w $a1, $a0, $a0, 2 341; LA32-NEXT: alsl.w $a0, $a1, $a0, 2 342; LA32-NEXT: ret 343; 344; LA64-LABEL: mul_i32_21: 345; LA64: # %bb.0: 346; LA64-NEXT: alsl.w $a1, $a0, $a0, 2 347; LA64-NEXT: alsl.w $a0, $a1, $a0, 2 348; LA64-NEXT: ret 349 %b = mul i32 %a, 21 350 ret i32 %b 351} 352 353define signext i32 @mul_i32_25(i32 %a) { 354; LA32-LABEL: mul_i32_25: 355; LA32: # %bb.0: 356; LA32-NEXT: alsl.w $a1, $a0, $a0, 1 357; LA32-NEXT: alsl.w $a0, $a1, $a0, 3 358; LA32-NEXT: ret 359; 360; LA64-LABEL: mul_i32_25: 361; LA64: # %bb.0: 362; LA64-NEXT: alsl.w $a1, $a0, $a0, 1 363; LA64-NEXT: alsl.w $a0, $a1, $a0, 3 364; LA64-NEXT: ret 365 %b = mul i32 %a, 25 366 ret i32 %b 367} 368 369define signext i32 @mul_i32_27(i32 %a) { 370; LA32-LABEL: mul_i32_27: 371; LA32: # %bb.0: 372; LA32-NEXT: alsl.w $a0, $a0, $a0, 1 373; LA32-NEXT: alsl.w $a0, $a0, $a0, 3 374; LA32-NEXT: ret 375; 376; LA64-LABEL: mul_i32_27: 377; LA64: # %bb.0: 378; LA64-NEXT: alsl.w $a0, $a0, $a0, 1 379; LA64-NEXT: alsl.w $a0, $a0, $a0, 3 380; LA64-NEXT: ret 381 %b = mul i32 %a, 27 382 ret i32 %b 383} 384 385define signext i32 @mul_i32_35(i32 %a) { 386; LA32-LABEL: mul_i32_35: 387; LA32: # %bb.0: 388; LA32-NEXT: alsl.w $a1, $a0, $a0, 4 389; LA32-NEXT: alsl.w $a0, $a1, $a0, 1 390; LA32-NEXT: ret 391; 392; LA64-LABEL: mul_i32_35: 393; LA64: # %bb.0: 394; LA64-NEXT: alsl.w $a1, $a0, $a0, 4 395; LA64-NEXT: alsl.w $a0, $a1, $a0, 1 396; LA64-NEXT: ret 397 %b = mul i32 %a, 35 398 ret i32 %b 399} 400 401define signext i32 @mul_i32_37(i32 %a) { 402; LA32-LABEL: mul_i32_37: 403; LA32: # %bb.0: 404; LA32-NEXT: alsl.w $a1, $a0, $a0, 3 405; LA32-NEXT: alsl.w $a0, $a1, $a0, 2 406; LA32-NEXT: ret 407; 408; LA64-LABEL: mul_i32_37: 409; LA64: # %bb.0: 410; LA64-NEXT: alsl.w $a1, $a0, $a0, 3 411; LA64-NEXT: alsl.w $a0, $a1, $a0, 2 412; LA64-NEXT: ret 413 %b = mul i32 %a, 37 414 ret i32 %b 415} 416 417define signext i32 @mul_i32_41(i32 %a) { 418; LA32-LABEL: mul_i32_41: 419; LA32: # %bb.0: 420; LA32-NEXT: alsl.w $a1, $a0, $a0, 2 421; LA32-NEXT: alsl.w $a0, $a1, $a0, 3 422; LA32-NEXT: ret 423; 424; LA64-LABEL: mul_i32_41: 425; LA64: # %bb.0: 426; LA64-NEXT: alsl.w $a1, $a0, $a0, 2 427; LA64-NEXT: alsl.w $a0, $a1, $a0, 3 428; LA64-NEXT: ret 429 %b = mul i32 %a, 41 430 ret i32 %b 431} 432 433define signext i32 @mul_i32_45(i32 %a) { 434; LA32-LABEL: mul_i32_45: 435; LA32: # %bb.0: 436; LA32-NEXT: alsl.w $a0, $a0, $a0, 2 437; LA32-NEXT: alsl.w $a0, $a0, $a0, 3 438; LA32-NEXT: ret 439; 440; LA64-LABEL: mul_i32_45: 441; LA64: # %bb.0: 442; LA64-NEXT: alsl.w $a0, $a0, $a0, 2 443; LA64-NEXT: alsl.w $a0, $a0, $a0, 3 444; LA64-NEXT: ret 445 %b = mul i32 %a, 45 446 ret i32 %b 447} 448 449define signext i32 @mul_i32_49(i32 %a) { 450; LA32-LABEL: mul_i32_49: 451; LA32: # %bb.0: 452; LA32-NEXT: alsl.w $a1, $a0, $a0, 1 453; LA32-NEXT: alsl.w $a0, $a1, $a0, 4 454; LA32-NEXT: ret 455; 456; LA64-LABEL: mul_i32_49: 457; LA64: # %bb.0: 458; LA64-NEXT: alsl.w $a1, $a0, $a0, 1 459; LA64-NEXT: alsl.w $a0, $a1, $a0, 4 460; LA64-NEXT: ret 461 %b = mul i32 %a, 49 462 ret i32 %b 463} 464 465define signext i32 @mul_i32_51(i32 %a) { 466; LA32-LABEL: mul_i32_51: 467; LA32: # %bb.0: 468; LA32-NEXT: alsl.w $a0, $a0, $a0, 1 469; LA32-NEXT: alsl.w $a0, $a0, $a0, 4 470; LA32-NEXT: ret 471; 472; LA64-LABEL: mul_i32_51: 473; LA64: # %bb.0: 474; LA64-NEXT: alsl.w $a0, $a0, $a0, 1 475; LA64-NEXT: alsl.w $a0, $a0, $a0, 4 476; LA64-NEXT: ret 477 %b = mul i32 %a, 51 478 ret i32 %b 479} 480 481define signext i32 @mul_i32_69(i32 %a) { 482; LA32-LABEL: mul_i32_69: 483; LA32: # %bb.0: 484; LA32-NEXT: alsl.w $a1, $a0, $a0, 4 485; LA32-NEXT: alsl.w $a0, $a1, $a0, 2 486; LA32-NEXT: ret 487; 488; LA64-LABEL: mul_i32_69: 489; LA64: # %bb.0: 490; LA64-NEXT: alsl.w $a1, $a0, $a0, 4 491; LA64-NEXT: alsl.w $a0, $a1, $a0, 2 492; LA64-NEXT: ret 493 %b = mul i32 %a, 69 494 ret i32 %b 495} 496 497define signext i32 @mul_i32_73(i32 %a) { 498; LA32-LABEL: mul_i32_73: 499; LA32: # %bb.0: 500; LA32-NEXT: alsl.w $a1, $a0, $a0, 3 501; LA32-NEXT: alsl.w $a0, $a1, $a0, 3 502; LA32-NEXT: ret 503; 504; LA64-LABEL: mul_i32_73: 505; LA64: # %bb.0: 506; LA64-NEXT: alsl.w $a1, $a0, $a0, 3 507; LA64-NEXT: alsl.w $a0, $a1, $a0, 3 508; LA64-NEXT: ret 509 %b = mul i32 %a, 73 510 ret i32 %b 511} 512 513define signext i32 @mul_i32_81(i32 %a) { 514; LA32-LABEL: mul_i32_81: 515; LA32: # %bb.0: 516; LA32-NEXT: alsl.w $a1, $a0, $a0, 2 517; LA32-NEXT: alsl.w $a0, $a1, $a0, 4 518; LA32-NEXT: ret 519; 520; LA64-LABEL: mul_i32_81: 521; LA64: # %bb.0: 522; LA64-NEXT: alsl.w $a1, $a0, $a0, 2 523; LA64-NEXT: alsl.w $a0, $a1, $a0, 4 524; LA64-NEXT: ret 525 %b = mul i32 %a, 81 526 ret i32 %b 527} 528 529define signext i32 @mul_i32_85(i32 %a) { 530; LA32-LABEL: mul_i32_85: 531; LA32: # %bb.0: 532; LA32-NEXT: alsl.w $a0, $a0, $a0, 2 533; LA32-NEXT: alsl.w $a0, $a0, $a0, 4 534; LA32-NEXT: ret 535; 536; LA64-LABEL: mul_i32_85: 537; LA64: # %bb.0: 538; LA64-NEXT: alsl.w $a0, $a0, $a0, 2 539; LA64-NEXT: alsl.w $a0, $a0, $a0, 4 540; LA64-NEXT: ret 541 %b = mul i32 %a, 85 542 ret i32 %b 543} 544 545define signext i32 @mul_i32_137(i32 %a) { 546; LA32-LABEL: mul_i32_137: 547; LA32: # %bb.0: 548; LA32-NEXT: alsl.w $a1, $a0, $a0, 4 549; LA32-NEXT: alsl.w $a0, $a1, $a0, 3 550; LA32-NEXT: ret 551; 552; LA64-LABEL: mul_i32_137: 553; LA64: # %bb.0: 554; LA64-NEXT: alsl.w $a1, $a0, $a0, 4 555; LA64-NEXT: alsl.w $a0, $a1, $a0, 3 556; LA64-NEXT: ret 557 %b = mul i32 %a, 137 558 ret i32 %b 559} 560 561define signext i32 @mul_i32_145(i32 %a) { 562; LA32-LABEL: mul_i32_145: 563; LA32: # %bb.0: 564; LA32-NEXT: alsl.w $a1, $a0, $a0, 3 565; LA32-NEXT: alsl.w $a0, $a1, $a0, 4 566; LA32-NEXT: ret 567; 568; LA64-LABEL: mul_i32_145: 569; LA64: # %bb.0: 570; LA64-NEXT: alsl.w $a1, $a0, $a0, 3 571; LA64-NEXT: alsl.w $a0, $a1, $a0, 4 572; LA64-NEXT: ret 573 %b = mul i32 %a, 145 574 ret i32 %b 575} 576 577define signext i32 @mul_i32_153(i32 %a) { 578; LA32-LABEL: mul_i32_153: 579; LA32: # %bb.0: 580; LA32-NEXT: alsl.w $a0, $a0, $a0, 3 581; LA32-NEXT: alsl.w $a0, $a0, $a0, 4 582; LA32-NEXT: ret 583; 584; LA64-LABEL: mul_i32_153: 585; LA64: # %bb.0: 586; LA64-NEXT: alsl.w $a0, $a0, $a0, 3 587; LA64-NEXT: alsl.w $a0, $a0, $a0, 4 588; LA64-NEXT: ret 589 %b = mul i32 %a, 153 590 ret i32 %b 591} 592 593define signext i32 @mul_i32_273(i32 %a) { 594; LA32-LABEL: mul_i32_273: 595; LA32: # %bb.0: 596; LA32-NEXT: alsl.w $a1, $a0, $a0, 4 597; LA32-NEXT: alsl.w $a0, $a1, $a0, 4 598; LA32-NEXT: ret 599; 600; LA64-LABEL: mul_i32_273: 601; LA64: # %bb.0: 602; LA64-NEXT: alsl.w $a1, $a0, $a0, 4 603; LA64-NEXT: alsl.w $a0, $a1, $a0, 4 604; LA64-NEXT: ret 605 %b = mul i32 %a, 273 606 ret i32 %b 607} 608 609define signext i32 @mul_i32_289(i32 %a) { 610; LA32-LABEL: mul_i32_289: 611; LA32: # %bb.0: 612; LA32-NEXT: alsl.w $a0, $a0, $a0, 4 613; LA32-NEXT: alsl.w $a0, $a0, $a0, 4 614; LA32-NEXT: ret 615; 616; LA64-LABEL: mul_i32_289: 617; LA64: # %bb.0: 618; LA64-NEXT: alsl.w $a0, $a0, $a0, 4 619; LA64-NEXT: alsl.w $a0, $a0, $a0, 4 620; LA64-NEXT: ret 621 %b = mul i32 %a, 289 622 ret i32 %b 623} 624 625define i64 @mul_i64_11(i64 %a) { 626; LA32-LABEL: mul_i64_11: 627; LA32: # %bb.0: 628; LA32-NEXT: ori $a2, $zero, 11 629; LA32-NEXT: mul.w $a1, $a1, $a2 630; LA32-NEXT: mulh.wu $a3, $a0, $a2 631; LA32-NEXT: add.w $a1, $a3, $a1 632; LA32-NEXT: mul.w $a0, $a0, $a2 633; LA32-NEXT: ret 634; 635; LA64-LABEL: mul_i64_11: 636; LA64: # %bb.0: 637; LA64-NEXT: alsl.d $a1, $a0, $a0, 2 638; LA64-NEXT: alsl.d $a0, $a1, $a0, 1 639; LA64-NEXT: ret 640 %b = mul i64 %a, 11 641 ret i64 %b 642} 643 644define i64 @mul_i64_13(i64 %a) { 645; LA32-LABEL: mul_i64_13: 646; LA32: # %bb.0: 647; LA32-NEXT: ori $a2, $zero, 13 648; LA32-NEXT: mul.w $a1, $a1, $a2 649; LA32-NEXT: mulh.wu $a3, $a0, $a2 650; LA32-NEXT: add.w $a1, $a3, $a1 651; LA32-NEXT: mul.w $a0, $a0, $a2 652; LA32-NEXT: ret 653; 654; LA64-LABEL: mul_i64_13: 655; LA64: # %bb.0: 656; LA64-NEXT: alsl.d $a1, $a0, $a0, 1 657; LA64-NEXT: alsl.d $a0, $a1, $a0, 2 658; LA64-NEXT: ret 659 %b = mul i64 %a, 13 660 ret i64 %b 661} 662 663define i64 @mul_i64_19(i64 %a) { 664; LA32-LABEL: mul_i64_19: 665; LA32: # %bb.0: 666; LA32-NEXT: ori $a2, $zero, 19 667; LA32-NEXT: mul.w $a1, $a1, $a2 668; LA32-NEXT: mulh.wu $a3, $a0, $a2 669; LA32-NEXT: add.w $a1, $a3, $a1 670; LA32-NEXT: mul.w $a0, $a0, $a2 671; LA32-NEXT: ret 672; 673; LA64-LABEL: mul_i64_19: 674; LA64: # %bb.0: 675; LA64-NEXT: alsl.d $a1, $a0, $a0, 3 676; LA64-NEXT: alsl.d $a0, $a1, $a0, 1 677; LA64-NEXT: ret 678 %b = mul i64 %a, 19 679 ret i64 %b 680} 681 682define i64 @mul_i64_21(i64 %a) { 683; LA32-LABEL: mul_i64_21: 684; LA32: # %bb.0: 685; LA32-NEXT: ori $a2, $zero, 21 686; LA32-NEXT: mul.w $a1, $a1, $a2 687; LA32-NEXT: mulh.wu $a3, $a0, $a2 688; LA32-NEXT: add.w $a1, $a3, $a1 689; LA32-NEXT: mul.w $a0, $a0, $a2 690; LA32-NEXT: ret 691; 692; LA64-LABEL: mul_i64_21: 693; LA64: # %bb.0: 694; LA64-NEXT: alsl.d $a1, $a0, $a0, 2 695; LA64-NEXT: alsl.d $a0, $a1, $a0, 2 696; LA64-NEXT: ret 697 %b = mul i64 %a, 21 698 ret i64 %b 699} 700 701define i64 @mul_i64_25(i64 %a) { 702; LA32-LABEL: mul_i64_25: 703; LA32: # %bb.0: 704; LA32-NEXT: ori $a2, $zero, 25 705; LA32-NEXT: mul.w $a1, $a1, $a2 706; LA32-NEXT: mulh.wu $a3, $a0, $a2 707; LA32-NEXT: add.w $a1, $a3, $a1 708; LA32-NEXT: mul.w $a0, $a0, $a2 709; LA32-NEXT: ret 710; 711; LA64-LABEL: mul_i64_25: 712; LA64: # %bb.0: 713; LA64-NEXT: alsl.d $a1, $a0, $a0, 1 714; LA64-NEXT: alsl.d $a0, $a1, $a0, 3 715; LA64-NEXT: ret 716 %b = mul i64 %a, 25 717 ret i64 %b 718} 719 720define i64 @mul_i64_27(i64 %a) { 721; LA32-LABEL: mul_i64_27: 722; LA32: # %bb.0: 723; LA32-NEXT: ori $a2, $zero, 27 724; LA32-NEXT: mul.w $a1, $a1, $a2 725; LA32-NEXT: mulh.wu $a3, $a0, $a2 726; LA32-NEXT: add.w $a1, $a3, $a1 727; LA32-NEXT: mul.w $a0, $a0, $a2 728; LA32-NEXT: ret 729; 730; LA64-LABEL: mul_i64_27: 731; LA64: # %bb.0: 732; LA64-NEXT: alsl.d $a0, $a0, $a0, 1 733; LA64-NEXT: alsl.d $a0, $a0, $a0, 3 734; LA64-NEXT: ret 735 %b = mul i64 %a, 27 736 ret i64 %b 737} 738 739define i64 @mul_i64_35(i64 %a) { 740; LA32-LABEL: mul_i64_35: 741; LA32: # %bb.0: 742; LA32-NEXT: ori $a2, $zero, 35 743; LA32-NEXT: mul.w $a1, $a1, $a2 744; LA32-NEXT: mulh.wu $a3, $a0, $a2 745; LA32-NEXT: add.w $a1, $a3, $a1 746; LA32-NEXT: mul.w $a0, $a0, $a2 747; LA32-NEXT: ret 748; 749; LA64-LABEL: mul_i64_35: 750; LA64: # %bb.0: 751; LA64-NEXT: alsl.d $a1, $a0, $a0, 4 752; LA64-NEXT: alsl.d $a0, $a1, $a0, 1 753; LA64-NEXT: ret 754 %b = mul i64 %a, 35 755 ret i64 %b 756} 757 758define i64 @mul_i64_37(i64 %a) { 759; LA32-LABEL: mul_i64_37: 760; LA32: # %bb.0: 761; LA32-NEXT: ori $a2, $zero, 37 762; LA32-NEXT: mul.w $a1, $a1, $a2 763; LA32-NEXT: mulh.wu $a3, $a0, $a2 764; LA32-NEXT: add.w $a1, $a3, $a1 765; LA32-NEXT: mul.w $a0, $a0, $a2 766; LA32-NEXT: ret 767; 768; LA64-LABEL: mul_i64_37: 769; LA64: # %bb.0: 770; LA64-NEXT: alsl.d $a1, $a0, $a0, 3 771; LA64-NEXT: alsl.d $a0, $a1, $a0, 2 772; LA64-NEXT: ret 773 %b = mul i64 %a, 37 774 ret i64 %b 775} 776 777define i64 @mul_i64_41(i64 %a) { 778; LA32-LABEL: mul_i64_41: 779; LA32: # %bb.0: 780; LA32-NEXT: ori $a2, $zero, 41 781; LA32-NEXT: mul.w $a1, $a1, $a2 782; LA32-NEXT: mulh.wu $a3, $a0, $a2 783; LA32-NEXT: add.w $a1, $a3, $a1 784; LA32-NEXT: mul.w $a0, $a0, $a2 785; LA32-NEXT: ret 786; 787; LA64-LABEL: mul_i64_41: 788; LA64: # %bb.0: 789; LA64-NEXT: alsl.d $a1, $a0, $a0, 2 790; LA64-NEXT: alsl.d $a0, $a1, $a0, 3 791; LA64-NEXT: ret 792 %b = mul i64 %a, 41 793 ret i64 %b 794} 795 796define i64 @mul_i64_45(i64 %a) { 797; LA32-LABEL: mul_i64_45: 798; LA32: # %bb.0: 799; LA32-NEXT: ori $a2, $zero, 45 800; LA32-NEXT: mul.w $a1, $a1, $a2 801; LA32-NEXT: mulh.wu $a3, $a0, $a2 802; LA32-NEXT: add.w $a1, $a3, $a1 803; LA32-NEXT: mul.w $a0, $a0, $a2 804; LA32-NEXT: ret 805; 806; LA64-LABEL: mul_i64_45: 807; LA64: # %bb.0: 808; LA64-NEXT: alsl.d $a0, $a0, $a0, 2 809; LA64-NEXT: alsl.d $a0, $a0, $a0, 3 810; LA64-NEXT: ret 811 %b = mul i64 %a, 45 812 ret i64 %b 813} 814 815define i64 @mul_i64_49(i64 %a) { 816; LA32-LABEL: mul_i64_49: 817; LA32: # %bb.0: 818; LA32-NEXT: ori $a2, $zero, 49 819; LA32-NEXT: mul.w $a1, $a1, $a2 820; LA32-NEXT: mulh.wu $a3, $a0, $a2 821; LA32-NEXT: add.w $a1, $a3, $a1 822; LA32-NEXT: mul.w $a0, $a0, $a2 823; LA32-NEXT: ret 824; 825; LA64-LABEL: mul_i64_49: 826; LA64: # %bb.0: 827; LA64-NEXT: alsl.d $a1, $a0, $a0, 1 828; LA64-NEXT: alsl.d $a0, $a1, $a0, 4 829; LA64-NEXT: ret 830 %b = mul i64 %a, 49 831 ret i64 %b 832} 833 834define i64 @mul_i64_51(i64 %a) { 835; LA32-LABEL: mul_i64_51: 836; LA32: # %bb.0: 837; LA32-NEXT: ori $a2, $zero, 51 838; LA32-NEXT: mul.w $a1, $a1, $a2 839; LA32-NEXT: mulh.wu $a3, $a0, $a2 840; LA32-NEXT: add.w $a1, $a3, $a1 841; LA32-NEXT: mul.w $a0, $a0, $a2 842; LA32-NEXT: ret 843; 844; LA64-LABEL: mul_i64_51: 845; LA64: # %bb.0: 846; LA64-NEXT: alsl.d $a0, $a0, $a0, 1 847; LA64-NEXT: alsl.d $a0, $a0, $a0, 4 848; LA64-NEXT: ret 849 %b = mul i64 %a, 51 850 ret i64 %b 851} 852 853define i64 @mul_i64_69(i64 %a) { 854; LA32-LABEL: mul_i64_69: 855; LA32: # %bb.0: 856; LA32-NEXT: ori $a2, $zero, 69 857; LA32-NEXT: mul.w $a1, $a1, $a2 858; LA32-NEXT: mulh.wu $a3, $a0, $a2 859; LA32-NEXT: add.w $a1, $a3, $a1 860; LA32-NEXT: mul.w $a0, $a0, $a2 861; LA32-NEXT: ret 862; 863; LA64-LABEL: mul_i64_69: 864; LA64: # %bb.0: 865; LA64-NEXT: alsl.d $a1, $a0, $a0, 4 866; LA64-NEXT: alsl.d $a0, $a1, $a0, 2 867; LA64-NEXT: ret 868 %b = mul i64 %a, 69 869 ret i64 %b 870} 871 872define i64 @mul_i64_73(i64 %a) { 873; LA32-LABEL: mul_i64_73: 874; LA32: # %bb.0: 875; LA32-NEXT: ori $a2, $zero, 73 876; LA32-NEXT: mul.w $a1, $a1, $a2 877; LA32-NEXT: mulh.wu $a3, $a0, $a2 878; LA32-NEXT: add.w $a1, $a3, $a1 879; LA32-NEXT: mul.w $a0, $a0, $a2 880; LA32-NEXT: ret 881; 882; LA64-LABEL: mul_i64_73: 883; LA64: # %bb.0: 884; LA64-NEXT: alsl.d $a1, $a0, $a0, 3 885; LA64-NEXT: alsl.d $a0, $a1, $a0, 3 886; LA64-NEXT: ret 887 %b = mul i64 %a, 73 888 ret i64 %b 889} 890 891define i64 @mul_i64_81(i64 %a) { 892; LA32-LABEL: mul_i64_81: 893; LA32: # %bb.0: 894; LA32-NEXT: ori $a2, $zero, 81 895; LA32-NEXT: mul.w $a1, $a1, $a2 896; LA32-NEXT: mulh.wu $a3, $a0, $a2 897; LA32-NEXT: add.w $a1, $a3, $a1 898; LA32-NEXT: mul.w $a0, $a0, $a2 899; LA32-NEXT: ret 900; 901; LA64-LABEL: mul_i64_81: 902; LA64: # %bb.0: 903; LA64-NEXT: alsl.d $a1, $a0, $a0, 2 904; LA64-NEXT: alsl.d $a0, $a1, $a0, 4 905; LA64-NEXT: ret 906 %b = mul i64 %a, 81 907 ret i64 %b 908} 909 910define i64 @mul_i64_85(i64 %a) { 911; LA32-LABEL: mul_i64_85: 912; LA32: # %bb.0: 913; LA32-NEXT: ori $a2, $zero, 85 914; LA32-NEXT: mul.w $a1, $a1, $a2 915; LA32-NEXT: mulh.wu $a3, $a0, $a2 916; LA32-NEXT: add.w $a1, $a3, $a1 917; LA32-NEXT: mul.w $a0, $a0, $a2 918; LA32-NEXT: ret 919; 920; LA64-LABEL: mul_i64_85: 921; LA64: # %bb.0: 922; LA64-NEXT: alsl.d $a0, $a0, $a0, 2 923; LA64-NEXT: alsl.d $a0, $a0, $a0, 4 924; LA64-NEXT: ret 925 %b = mul i64 %a, 85 926 ret i64 %b 927} 928 929define i64 @mul_i64_137(i64 %a) { 930; LA32-LABEL: mul_i64_137: 931; LA32: # %bb.0: 932; LA32-NEXT: ori $a2, $zero, 137 933; LA32-NEXT: mul.w $a1, $a1, $a2 934; LA32-NEXT: mulh.wu $a3, $a0, $a2 935; LA32-NEXT: add.w $a1, $a3, $a1 936; LA32-NEXT: mul.w $a0, $a0, $a2 937; LA32-NEXT: ret 938; 939; LA64-LABEL: mul_i64_137: 940; LA64: # %bb.0: 941; LA64-NEXT: alsl.d $a1, $a0, $a0, 4 942; LA64-NEXT: alsl.d $a0, $a1, $a0, 3 943; LA64-NEXT: ret 944 %b = mul i64 %a, 137 945 ret i64 %b 946} 947 948define i64 @mul_i64_145(i64 %a) { 949; LA32-LABEL: mul_i64_145: 950; LA32: # %bb.0: 951; LA32-NEXT: ori $a2, $zero, 145 952; LA32-NEXT: mul.w $a1, $a1, $a2 953; LA32-NEXT: mulh.wu $a3, $a0, $a2 954; LA32-NEXT: add.w $a1, $a3, $a1 955; LA32-NEXT: mul.w $a0, $a0, $a2 956; LA32-NEXT: ret 957; 958; LA64-LABEL: mul_i64_145: 959; LA64: # %bb.0: 960; LA64-NEXT: alsl.d $a1, $a0, $a0, 3 961; LA64-NEXT: alsl.d $a0, $a1, $a0, 4 962; LA64-NEXT: ret 963 %b = mul i64 %a, 145 964 ret i64 %b 965} 966 967define i64 @mul_i64_153(i64 %a) { 968; LA32-LABEL: mul_i64_153: 969; LA32: # %bb.0: 970; LA32-NEXT: ori $a2, $zero, 153 971; LA32-NEXT: mul.w $a1, $a1, $a2 972; LA32-NEXT: mulh.wu $a3, $a0, $a2 973; LA32-NEXT: add.w $a1, $a3, $a1 974; LA32-NEXT: mul.w $a0, $a0, $a2 975; LA32-NEXT: ret 976; 977; LA64-LABEL: mul_i64_153: 978; LA64: # %bb.0: 979; LA64-NEXT: alsl.d $a0, $a0, $a0, 3 980; LA64-NEXT: alsl.d $a0, $a0, $a0, 4 981; LA64-NEXT: ret 982 %b = mul i64 %a, 153 983 ret i64 %b 984} 985 986define i64 @mul_i64_273(i64 %a) { 987; LA32-LABEL: mul_i64_273: 988; LA32: # %bb.0: 989; LA32-NEXT: ori $a2, $zero, 273 990; LA32-NEXT: mul.w $a1, $a1, $a2 991; LA32-NEXT: mulh.wu $a3, $a0, $a2 992; LA32-NEXT: add.w $a1, $a3, $a1 993; LA32-NEXT: mul.w $a0, $a0, $a2 994; LA32-NEXT: ret 995; 996; LA64-LABEL: mul_i64_273: 997; LA64: # %bb.0: 998; LA64-NEXT: alsl.d $a1, $a0, $a0, 4 999; LA64-NEXT: alsl.d $a0, $a1, $a0, 4 1000; LA64-NEXT: ret 1001 %b = mul i64 %a, 273 1002 ret i64 %b 1003} 1004 1005define i64 @mul_i64_289(i64 %a) { 1006; LA32-LABEL: mul_i64_289: 1007; LA32: # %bb.0: 1008; LA32-NEXT: ori $a2, $zero, 289 1009; LA32-NEXT: mul.w $a1, $a1, $a2 1010; LA32-NEXT: mulh.wu $a3, $a0, $a2 1011; LA32-NEXT: add.w $a1, $a3, $a1 1012; LA32-NEXT: mul.w $a0, $a0, $a2 1013; LA32-NEXT: ret 1014; 1015; LA64-LABEL: mul_i64_289: 1016; LA64: # %bb.0: 1017; LA64-NEXT: alsl.d $a0, $a0, $a0, 4 1018; LA64-NEXT: alsl.d $a0, $a0, $a0, 4 1019; LA64-NEXT: ret 1020 %b = mul i64 %a, 289 1021 ret i64 %b 1022} 1023 1024define signext i32 @mul_i32_4098(i32 %a) { 1025; LA32-LABEL: mul_i32_4098: 1026; LA32: # %bb.0: 1027; LA32-NEXT: slli.w $a1, $a0, 12 1028; LA32-NEXT: alsl.w $a0, $a0, $a1, 1 1029; LA32-NEXT: ret 1030; 1031; LA64-LABEL: mul_i32_4098: 1032; LA64: # %bb.0: 1033; LA64-NEXT: slli.d $a1, $a0, 12 1034; LA64-NEXT: alsl.w $a0, $a0, $a1, 1 1035; LA64-NEXT: ret 1036 %b = mul i32 %a, 4098 1037 ret i32 %b 1038} 1039 1040define signext i32 @mul_i32_4100(i32 %a) { 1041; LA32-LABEL: mul_i32_4100: 1042; LA32: # %bb.0: 1043; LA32-NEXT: slli.w $a1, $a0, 12 1044; LA32-NEXT: alsl.w $a0, $a0, $a1, 2 1045; LA32-NEXT: ret 1046; 1047; LA64-LABEL: mul_i32_4100: 1048; LA64: # %bb.0: 1049; LA64-NEXT: slli.d $a1, $a0, 12 1050; LA64-NEXT: alsl.w $a0, $a0, $a1, 2 1051; LA64-NEXT: ret 1052 %b = mul i32 %a, 4100 1053 ret i32 %b 1054} 1055 1056define signext i32 @mul_i32_4104(i32 %a) { 1057; LA32-LABEL: mul_i32_4104: 1058; LA32: # %bb.0: 1059; LA32-NEXT: slli.w $a1, $a0, 12 1060; LA32-NEXT: alsl.w $a0, $a0, $a1, 3 1061; LA32-NEXT: ret 1062; 1063; LA64-LABEL: mul_i32_4104: 1064; LA64: # %bb.0: 1065; LA64-NEXT: slli.d $a1, $a0, 12 1066; LA64-NEXT: alsl.w $a0, $a0, $a1, 3 1067; LA64-NEXT: ret 1068 %b = mul i32 %a, 4104 1069 ret i32 %b 1070} 1071 1072define signext i32 @mul_i32_4112(i32 %a) { 1073; LA32-LABEL: mul_i32_4112: 1074; LA32: # %bb.0: 1075; LA32-NEXT: slli.w $a1, $a0, 12 1076; LA32-NEXT: alsl.w $a0, $a0, $a1, 4 1077; LA32-NEXT: ret 1078; 1079; LA64-LABEL: mul_i32_4112: 1080; LA64: # %bb.0: 1081; LA64-NEXT: slli.d $a1, $a0, 12 1082; LA64-NEXT: alsl.w $a0, $a0, $a1, 4 1083; LA64-NEXT: ret 1084 %b = mul i32 %a, 4112 1085 ret i32 %b 1086} 1087 1088define i64 @mul_i64_4098(i64 %a) { 1089; LA32-LABEL: mul_i64_4098: 1090; LA32: # %bb.0: 1091; LA32-NEXT: lu12i.w $a2, 1 1092; LA32-NEXT: ori $a2, $a2, 2 1093; LA32-NEXT: mul.w $a1, $a1, $a2 1094; LA32-NEXT: mulh.wu $a3, $a0, $a2 1095; LA32-NEXT: add.w $a1, $a3, $a1 1096; LA32-NEXT: mul.w $a0, $a0, $a2 1097; LA32-NEXT: ret 1098; 1099; LA64-LABEL: mul_i64_4098: 1100; LA64: # %bb.0: 1101; LA64-NEXT: slli.d $a1, $a0, 12 1102; LA64-NEXT: alsl.d $a0, $a0, $a1, 1 1103; LA64-NEXT: ret 1104 %b = mul i64 %a, 4098 1105 ret i64 %b 1106} 1107 1108define i64 @mul_i64_4100(i64 %a) { 1109; LA32-LABEL: mul_i64_4100: 1110; LA32: # %bb.0: 1111; LA32-NEXT: lu12i.w $a2, 1 1112; LA32-NEXT: ori $a2, $a2, 4 1113; LA32-NEXT: mul.w $a1, $a1, $a2 1114; LA32-NEXT: mulh.wu $a3, $a0, $a2 1115; LA32-NEXT: add.w $a1, $a3, $a1 1116; LA32-NEXT: mul.w $a0, $a0, $a2 1117; LA32-NEXT: ret 1118; 1119; LA64-LABEL: mul_i64_4100: 1120; LA64: # %bb.0: 1121; LA64-NEXT: slli.d $a1, $a0, 12 1122; LA64-NEXT: alsl.d $a0, $a0, $a1, 2 1123; LA64-NEXT: ret 1124 %b = mul i64 %a, 4100 1125 ret i64 %b 1126} 1127 1128define i64 @mul_i64_4104(i64 %a) { 1129; LA32-LABEL: mul_i64_4104: 1130; LA32: # %bb.0: 1131; LA32-NEXT: lu12i.w $a2, 1 1132; LA32-NEXT: ori $a2, $a2, 8 1133; LA32-NEXT: mul.w $a1, $a1, $a2 1134; LA32-NEXT: mulh.wu $a3, $a0, $a2 1135; LA32-NEXT: add.w $a1, $a3, $a1 1136; LA32-NEXT: mul.w $a0, $a0, $a2 1137; LA32-NEXT: ret 1138; 1139; LA64-LABEL: mul_i64_4104: 1140; LA64: # %bb.0: 1141; LA64-NEXT: slli.d $a1, $a0, 12 1142; LA64-NEXT: alsl.d $a0, $a0, $a1, 3 1143; LA64-NEXT: ret 1144 %b = mul i64 %a, 4104 1145 ret i64 %b 1146} 1147 1148define i64 @mul_i64_4112(i64 %a) { 1149; LA32-LABEL: mul_i64_4112: 1150; LA32: # %bb.0: 1151; LA32-NEXT: lu12i.w $a2, 1 1152; LA32-NEXT: ori $a2, $a2, 16 1153; LA32-NEXT: mul.w $a1, $a1, $a2 1154; LA32-NEXT: mulh.wu $a3, $a0, $a2 1155; LA32-NEXT: add.w $a1, $a3, $a1 1156; LA32-NEXT: mul.w $a0, $a0, $a2 1157; LA32-NEXT: ret 1158; 1159; LA64-LABEL: mul_i64_4112: 1160; LA64: # %bb.0: 1161; LA64-NEXT: slli.d $a1, $a0, 12 1162; LA64-NEXT: alsl.d $a0, $a0, $a1, 4 1163; LA64-NEXT: ret 1164 %b = mul i64 %a, 4112 1165 ret i64 %b 1166} 1167 1168define signext i32 @mul_i32_768(i32 %a) { 1169; LA32-LABEL: mul_i32_768: 1170; LA32: # %bb.0: 1171; LA32-NEXT: alsl.w $a0, $a0, $a0, 1 1172; LA32-NEXT: slli.w $a0, $a0, 8 1173; LA32-NEXT: ret 1174; 1175; LA64-LABEL: mul_i32_768: 1176; LA64: # %bb.0: 1177; LA64-NEXT: alsl.w $a0, $a0, $a0, 1 1178; LA64-NEXT: slli.w $a0, $a0, 8 1179; LA64-NEXT: ret 1180 %b = mul i32 %a, 768 1181 ret i32 %b 1182} 1183 1184define signext i32 @mul_i32_1280(i32 %a) { 1185; LA32-LABEL: mul_i32_1280: 1186; LA32: # %bb.0: 1187; LA32-NEXT: alsl.w $a0, $a0, $a0, 2 1188; LA32-NEXT: slli.w $a0, $a0, 8 1189; LA32-NEXT: ret 1190; 1191; LA64-LABEL: mul_i32_1280: 1192; LA64: # %bb.0: 1193; LA64-NEXT: alsl.w $a0, $a0, $a0, 2 1194; LA64-NEXT: slli.w $a0, $a0, 8 1195; LA64-NEXT: ret 1196 %b = mul i32 %a, 1280 1197 ret i32 %b 1198} 1199 1200define signext i32 @mul_i32_2304(i32 %a) { 1201; LA32-LABEL: mul_i32_2304: 1202; LA32: # %bb.0: 1203; LA32-NEXT: alsl.w $a0, $a0, $a0, 3 1204; LA32-NEXT: slli.w $a0, $a0, 8 1205; LA32-NEXT: ret 1206; 1207; LA64-LABEL: mul_i32_2304: 1208; LA64: # %bb.0: 1209; LA64-NEXT: alsl.w $a0, $a0, $a0, 3 1210; LA64-NEXT: slli.w $a0, $a0, 8 1211; LA64-NEXT: ret 1212 %b = mul i32 %a, 2304 1213 ret i32 %b 1214} 1215 1216define signext i32 @mul_i32_4352(i32 %a) { 1217; LA32-LABEL: mul_i32_4352: 1218; LA32: # %bb.0: 1219; LA32-NEXT: alsl.w $a0, $a0, $a0, 4 1220; LA32-NEXT: slli.w $a0, $a0, 8 1221; LA32-NEXT: ret 1222; 1223; LA64-LABEL: mul_i32_4352: 1224; LA64: # %bb.0: 1225; LA64-NEXT: alsl.w $a0, $a0, $a0, 4 1226; LA64-NEXT: slli.w $a0, $a0, 8 1227; LA64-NEXT: ret 1228 %b = mul i32 %a, 4352 1229 ret i32 %b 1230} 1231 1232define i64 @mul_i64_768(i64 %a) { 1233; LA32-LABEL: mul_i64_768: 1234; LA32: # %bb.0: 1235; LA32-NEXT: ori $a2, $zero, 768 1236; LA32-NEXT: mul.w $a1, $a1, $a2 1237; LA32-NEXT: mulh.wu $a3, $a0, $a2 1238; LA32-NEXT: add.w $a1, $a3, $a1 1239; LA32-NEXT: mul.w $a0, $a0, $a2 1240; LA32-NEXT: ret 1241; 1242; LA64-LABEL: mul_i64_768: 1243; LA64: # %bb.0: 1244; LA64-NEXT: alsl.d $a0, $a0, $a0, 1 1245; LA64-NEXT: slli.d $a0, $a0, 8 1246; LA64-NEXT: ret 1247 %b = mul i64 %a, 768 1248 ret i64 %b 1249} 1250 1251define i64 @mul_i64_1280(i64 %a) { 1252; LA32-LABEL: mul_i64_1280: 1253; LA32: # %bb.0: 1254; LA32-NEXT: ori $a2, $zero, 1280 1255; LA32-NEXT: mul.w $a1, $a1, $a2 1256; LA32-NEXT: mulh.wu $a3, $a0, $a2 1257; LA32-NEXT: add.w $a1, $a3, $a1 1258; LA32-NEXT: mul.w $a0, $a0, $a2 1259; LA32-NEXT: ret 1260; 1261; LA64-LABEL: mul_i64_1280: 1262; LA64: # %bb.0: 1263; LA64-NEXT: alsl.d $a0, $a0, $a0, 2 1264; LA64-NEXT: slli.d $a0, $a0, 8 1265; LA64-NEXT: ret 1266 %b = mul i64 %a, 1280 1267 ret i64 %b 1268} 1269 1270define i64 @mul_i64_2304(i64 %a) { 1271; LA32-LABEL: mul_i64_2304: 1272; LA32: # %bb.0: 1273; LA32-NEXT: ori $a2, $zero, 2304 1274; LA32-NEXT: mul.w $a1, $a1, $a2 1275; LA32-NEXT: mulh.wu $a3, $a0, $a2 1276; LA32-NEXT: add.w $a1, $a3, $a1 1277; LA32-NEXT: mul.w $a0, $a0, $a2 1278; LA32-NEXT: ret 1279; 1280; LA64-LABEL: mul_i64_2304: 1281; LA64: # %bb.0: 1282; LA64-NEXT: alsl.d $a0, $a0, $a0, 3 1283; LA64-NEXT: slli.d $a0, $a0, 8 1284; LA64-NEXT: ret 1285 %b = mul i64 %a, 2304 1286 ret i64 %b 1287} 1288 1289define i64 @mul_i64_4352(i64 %a) { 1290; LA32-LABEL: mul_i64_4352: 1291; LA32: # %bb.0: 1292; LA32-NEXT: lu12i.w $a2, 1 1293; LA32-NEXT: ori $a2, $a2, 256 1294; LA32-NEXT: mul.w $a1, $a1, $a2 1295; LA32-NEXT: mulh.wu $a3, $a0, $a2 1296; LA32-NEXT: add.w $a1, $a3, $a1 1297; LA32-NEXT: mul.w $a0, $a0, $a2 1298; LA32-NEXT: ret 1299; 1300; LA64-LABEL: mul_i64_4352: 1301; LA64: # %bb.0: 1302; LA64-NEXT: alsl.d $a0, $a0, $a0, 4 1303; LA64-NEXT: slli.d $a0, $a0, 8 1304; LA64-NEXT: ret 1305 %b = mul i64 %a, 4352 1306 ret i64 %b 1307} 1308 1309define signext i32 @mul_i32_65792(i32 %a) { 1310; LA32-LABEL: mul_i32_65792: 1311; LA32: # %bb.0: 1312; LA32-NEXT: slli.w $a1, $a0, 8 1313; LA32-NEXT: slli.w $a0, $a0, 16 1314; LA32-NEXT: add.w $a0, $a0, $a1 1315; LA32-NEXT: ret 1316; 1317; LA64-LABEL: mul_i32_65792: 1318; LA64: # %bb.0: 1319; LA64-NEXT: slli.d $a1, $a0, 8 1320; LA64-NEXT: slli.d $a0, $a0, 16 1321; LA64-NEXT: add.w $a0, $a0, $a1 1322; LA64-NEXT: ret 1323 %b = mul i32 %a, 65792 1324 ret i32 %b 1325} 1326 1327define signext i32 @mul_i32_65280(i32 %a) { 1328; LA32-LABEL: mul_i32_65280: 1329; LA32: # %bb.0: 1330; LA32-NEXT: slli.w $a1, $a0, 8 1331; LA32-NEXT: slli.w $a0, $a0, 16 1332; LA32-NEXT: sub.w $a0, $a0, $a1 1333; LA32-NEXT: ret 1334; 1335; LA64-LABEL: mul_i32_65280: 1336; LA64: # %bb.0: 1337; LA64-NEXT: slli.d $a1, $a0, 8 1338; LA64-NEXT: slli.d $a0, $a0, 16 1339; LA64-NEXT: sub.w $a0, $a0, $a1 1340; LA64-NEXT: ret 1341 %b = mul i32 %a, 65280 1342 ret i32 %b 1343} 1344 1345define signext i32 @mul_i32_minus_65280(i32 %a) { 1346; LA32-LABEL: mul_i32_minus_65280: 1347; LA32: # %bb.0: 1348; LA32-NEXT: slli.w $a1, $a0, 16 1349; LA32-NEXT: slli.w $a0, $a0, 8 1350; LA32-NEXT: sub.w $a0, $a0, $a1 1351; LA32-NEXT: ret 1352; 1353; LA64-LABEL: mul_i32_minus_65280: 1354; LA64: # %bb.0: 1355; LA64-NEXT: slli.d $a1, $a0, 16 1356; LA64-NEXT: slli.d $a0, $a0, 8 1357; LA64-NEXT: sub.w $a0, $a0, $a1 1358; LA64-NEXT: ret 1359 %b = mul i32 %a, -65280 1360 ret i32 %b 1361} 1362 1363define i64 @mul_i64_65792(i64 %a) { 1364; LA32-LABEL: mul_i64_65792: 1365; LA32: # %bb.0: 1366; LA32-NEXT: lu12i.w $a2, 16 1367; LA32-NEXT: ori $a2, $a2, 256 1368; LA32-NEXT: mul.w $a1, $a1, $a2 1369; LA32-NEXT: mulh.wu $a3, $a0, $a2 1370; LA32-NEXT: add.w $a1, $a3, $a1 1371; LA32-NEXT: mul.w $a0, $a0, $a2 1372; LA32-NEXT: ret 1373; 1374; LA64-LABEL: mul_i64_65792: 1375; LA64: # %bb.0: 1376; LA64-NEXT: slli.d $a1, $a0, 8 1377; LA64-NEXT: slli.d $a0, $a0, 16 1378; LA64-NEXT: add.d $a0, $a0, $a1 1379; LA64-NEXT: ret 1380 %b = mul i64 %a, 65792 1381 ret i64 %b 1382} 1383 1384define i64 @mul_i64_65280(i64 %a) { 1385; LA32-LABEL: mul_i64_65280: 1386; LA32: # %bb.0: 1387; LA32-NEXT: lu12i.w $a2, 15 1388; LA32-NEXT: ori $a2, $a2, 3840 1389; LA32-NEXT: mul.w $a1, $a1, $a2 1390; LA32-NEXT: mulh.wu $a3, $a0, $a2 1391; LA32-NEXT: add.w $a1, $a3, $a1 1392; LA32-NEXT: mul.w $a0, $a0, $a2 1393; LA32-NEXT: ret 1394; 1395; LA64-LABEL: mul_i64_65280: 1396; LA64: # %bb.0: 1397; LA64-NEXT: slli.d $a1, $a0, 8 1398; LA64-NEXT: slli.d $a0, $a0, 16 1399; LA64-NEXT: sub.d $a0, $a0, $a1 1400; LA64-NEXT: ret 1401 %b = mul i64 %a, 65280 1402 ret i64 %b 1403} 1404 1405define i64 @mul_i64_minus_65280(i64 %a) { 1406; LA32-LABEL: mul_i64_minus_65280: 1407; LA32: # %bb.0: 1408; LA32-NEXT: lu12i.w $a2, -16 1409; LA32-NEXT: ori $a2, $a2, 256 1410; LA32-NEXT: mul.w $a1, $a1, $a2 1411; LA32-NEXT: mulh.wu $a3, $a0, $a2 1412; LA32-NEXT: sub.w $a3, $a3, $a0 1413; LA32-NEXT: add.w $a1, $a3, $a1 1414; LA32-NEXT: mul.w $a0, $a0, $a2 1415; LA32-NEXT: ret 1416; 1417; LA64-LABEL: mul_i64_minus_65280: 1418; LA64: # %bb.0: 1419; LA64-NEXT: slli.d $a1, $a0, 16 1420; LA64-NEXT: slli.d $a0, $a0, 8 1421; LA64-NEXT: sub.d $a0, $a0, $a1 1422; LA64-NEXT: ret 1423 %b = mul i64 %a, -65280 1424 ret i64 %b 1425} 1426 1427;; This multiplication is not transformed, due to 1428;; 1088 can be composed via a single ORI. 1429define i64 @mul_i64_1088(i64 %a) { 1430; LA32-LABEL: mul_i64_1088: 1431; LA32: # %bb.0: 1432; LA32-NEXT: ori $a2, $zero, 1088 1433; LA32-NEXT: mul.w $a1, $a1, $a2 1434; LA32-NEXT: mulh.wu $a3, $a0, $a2 1435; LA32-NEXT: add.w $a1, $a3, $a1 1436; LA32-NEXT: mul.w $a0, $a0, $a2 1437; LA32-NEXT: ret 1438; 1439; LA64-LABEL: mul_i64_1088: 1440; LA64: # %bb.0: 1441; LA64-NEXT: alsl.d $a0, $a0, $a0, 4 1442; LA64-NEXT: slli.d $a0, $a0, 6 1443; LA64-NEXT: ret 1444 %b = mul i64 %a, 1088 1445 ret i64 %b 1446} 1447 1448;; This multiplication is not transformed, due to 1449;; -992 can be composed via a single ADDI. 1450define i64 @mul_i64_minus_992(i64 %a) { 1451; LA32-LABEL: mul_i64_minus_992: 1452; LA32: # %bb.0: 1453; LA32-NEXT: addi.w $a2, $zero, -992 1454; LA32-NEXT: mul.w $a1, $a1, $a2 1455; LA32-NEXT: mulh.wu $a3, $a0, $a2 1456; LA32-NEXT: sub.w $a3, $a3, $a0 1457; LA32-NEXT: add.w $a1, $a3, $a1 1458; LA32-NEXT: mul.w $a0, $a0, $a2 1459; LA32-NEXT: ret 1460; 1461; LA64-LABEL: mul_i64_minus_992: 1462; LA64: # %bb.0: 1463; LA64-NEXT: addi.w $a1, $zero, -992 1464; LA64-NEXT: mul.d $a0, $a0, $a1 1465; LA64-NEXT: ret 1466 %b = mul i64 %a, -992 1467 ret i64 %b 1468} 1469 1470;; This multiplication is not transformed, due to 1471;; 4456448 can be composed via a single LUI. 1472define i64 @mul_i64_4456448(i64 %a) { 1473; LA32-LABEL: mul_i64_4456448: 1474; LA32: # %bb.0: 1475; LA32-NEXT: lu12i.w $a2, 1088 1476; LA32-NEXT: mul.w $a1, $a1, $a2 1477; LA32-NEXT: mulh.wu $a3, $a0, $a2 1478; LA32-NEXT: add.w $a1, $a3, $a1 1479; LA32-NEXT: mul.w $a0, $a0, $a2 1480; LA32-NEXT: ret 1481; 1482; LA64-LABEL: mul_i64_4456448: 1483; LA64: # %bb.0: 1484; LA64-NEXT: alsl.d $a0, $a0, $a0, 4 1485; LA64-NEXT: slli.d $a0, $a0, 18 1486; LA64-NEXT: ret 1487 %b = mul i64 %a, 4456448 1488 ret i64 %b 1489} 1490 1491;; This multiplication is not transformed, due to 1492;; 65280 is used multiple times. 1493define i64 @mul_i64_65280_twice(i64 %a, i64 %b) { 1494; LA32-LABEL: mul_i64_65280_twice: 1495; LA32: # %bb.0: 1496; LA32-NEXT: lu12i.w $a4, 15 1497; LA32-NEXT: ori $a4, $a4, 3840 1498; LA32-NEXT: mul.w $a1, $a1, $a4 1499; LA32-NEXT: mulh.wu $a5, $a0, $a4 1500; LA32-NEXT: add.w $a1, $a5, $a1 1501; LA32-NEXT: mul.w $a0, $a0, $a4 1502; LA32-NEXT: mul.w $a3, $a3, $a4 1503; LA32-NEXT: mulh.wu $a5, $a2, $a4 1504; LA32-NEXT: add.w $a3, $a5, $a3 1505; LA32-NEXT: mul.w $a2, $a2, $a4 1506; LA32-NEXT: xor $a1, $a1, $a3 1507; LA32-NEXT: xor $a0, $a0, $a2 1508; LA32-NEXT: ret 1509; 1510; LA64-LABEL: mul_i64_65280_twice: 1511; LA64: # %bb.0: 1512; LA64-NEXT: lu12i.w $a2, 15 1513; LA64-NEXT: ori $a2, $a2, 3840 1514; LA64-NEXT: mul.d $a0, $a0, $a2 1515; LA64-NEXT: mul.d $a1, $a1, $a2 1516; LA64-NEXT: xor $a0, $a0, $a1 1517; LA64-NEXT: ret 1518 %c = mul i64 %a, 65280 1519 %d = mul i64 %b, 65280 1520 %e = xor i64 %c, %d 1521 ret i64 %e 1522} 1523