417 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -verify-machineinstrs -csky-no-aliases -mattr=+2e3 < %s -mtriple=csky | FileCheck %s3; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky | FileCheck %s --check-prefix=GENERIC4 5;; This file shows if a multiplication can be simplified to an addition/subtraction6;; of left shifts.7 8define i32 @mul_i32_4097(i32 %x) {9; CHECK-LABEL: mul_i32_4097:10; CHECK: # %bb.0: # %entry11; CHECK-NEXT: lsli16 a1, a0, 1212; CHECK-NEXT: addu16 a0, a113; CHECK-NEXT: rts1614;15; GENERIC-LABEL: mul_i32_4097:16; GENERIC: # %bb.0: # %entry17; GENERIC-NEXT: .cfi_def_cfa_offset 018; GENERIC-NEXT: subi16 sp, sp, 419; GENERIC-NEXT: .cfi_def_cfa_offset 420; GENERIC-NEXT: lsli16 a1, a0, 1221; GENERIC-NEXT: addu16 a0, a1, a022; GENERIC-NEXT: addi16 sp, sp, 423; GENERIC-NEXT: rts1624entry:25 %y = mul nsw i32 %x, 409726 ret i32 %y27}28 29define i32 @mul_i32_4095(i32 %x) {30; CHECK-LABEL: mul_i32_4095:31; CHECK: # %bb.0: # %entry32; CHECK-NEXT: lsli16 a1, a0, 1233; CHECK-NEXT: subu16 a0, a1, a034; CHECK-NEXT: rts1635;36; GENERIC-LABEL: mul_i32_4095:37; GENERIC: # %bb.0: # %entry38; GENERIC-NEXT: .cfi_def_cfa_offset 039; GENERIC-NEXT: subi16 sp, sp, 440; GENERIC-NEXT: .cfi_def_cfa_offset 441; GENERIC-NEXT: lsli16 a1, a0, 1242; GENERIC-NEXT: subu16 a0, a1, a043; GENERIC-NEXT: addi16 sp, sp, 444; GENERIC-NEXT: rts1645entry:46 %y = mul nsw i32 %x, 409547 ret i32 %y48}49 50define i32 @mul_i32_minus_4095(i32 %x) {51; CHECK-LABEL: mul_i32_minus_4095:52; CHECK: # %bb.0: # %entry53; CHECK-NEXT: lsli16 a1, a0, 1254; CHECK-NEXT: subu16 a0, a155; CHECK-NEXT: rts1656;57; GENERIC-LABEL: mul_i32_minus_4095:58; GENERIC: # %bb.0: # %entry59; GENERIC-NEXT: .cfi_def_cfa_offset 060; GENERIC-NEXT: subi16 sp, sp, 461; GENERIC-NEXT: .cfi_def_cfa_offset 462; GENERIC-NEXT: lsli16 a1, a0, 1263; GENERIC-NEXT: subu16 a0, a0, a164; GENERIC-NEXT: addi16 sp, sp, 465; GENERIC-NEXT: rts1666entry:67 %y = mul nsw i32 %x, -409568 ret i32 %y69}70 71define i32 @mul_i32_131074(i32 %x) {72; CHECK-LABEL: mul_i32_131074:73; CHECK: # %bb.0: # %entry74; CHECK-NEXT: lsli16 a1, a0, 1775; CHECK-NEXT: ixh32 a0, a1, a076; CHECK-NEXT: rts1677;78; GENERIC-LABEL: mul_i32_131074:79; GENERIC: # %bb.0: # %entry80; GENERIC-NEXT: subi16 sp, sp, 481; GENERIC-NEXT: .cfi_def_cfa_offset 482; GENERIC-NEXT: st16.w l0, (sp, 0) # 4-byte Folded Spill83; GENERIC-NEXT: .cfi_offset l0, -484; GENERIC-NEXT: subi16 sp, sp, 485; GENERIC-NEXT: .cfi_def_cfa_offset 886; GENERIC-NEXT: movi16 a1, 087; GENERIC-NEXT: lsli16 a2, a1, 2488; GENERIC-NEXT: movi16 a3, 289; GENERIC-NEXT: lsli16 l0, a3, 1690; GENERIC-NEXT: or16 l0, a291; GENERIC-NEXT: lsli16 a1, a1, 892; GENERIC-NEXT: or16 a1, l093; GENERIC-NEXT: or16 a1, a394; GENERIC-NEXT: mult16 a0, a195; GENERIC-NEXT: addi16 sp, sp, 496; GENERIC-NEXT: ld16.w l0, (sp, 0) # 4-byte Folded Reload97; GENERIC-NEXT: addi16 sp, sp, 498; GENERIC-NEXT: rts1699entry:100 %y = mul nsw i32 %x, 131074101 ret i32 %y102}103 104define i32 @mul_i32_131076(i32 %x) {105; CHECK-LABEL: mul_i32_131076:106; CHECK: # %bb.0: # %entry107; CHECK-NEXT: lsli16 a1, a0, 17108; CHECK-NEXT: ixw32 a0, a1, a0109; CHECK-NEXT: rts16110;111; GENERIC-LABEL: mul_i32_131076:112; GENERIC: # %bb.0: # %entry113; GENERIC-NEXT: .cfi_def_cfa_offset 0114; GENERIC-NEXT: subi16 sp, sp, 4115; GENERIC-NEXT: .cfi_def_cfa_offset 4116; GENERIC-NEXT: movi16 a1, 0117; GENERIC-NEXT: lsli16 a2, a1, 24118; GENERIC-NEXT: movi16 a3, 2119; GENERIC-NEXT: lsli16 a3, a3, 16120; GENERIC-NEXT: or16 a3, a2121; GENERIC-NEXT: lsli16 a1, a1, 8122; GENERIC-NEXT: or16 a1, a3123; GENERIC-NEXT: movi16 a2, 4124; GENERIC-NEXT: or16 a2, a1125; GENERIC-NEXT: mult16 a0, a2126; GENERIC-NEXT: addi16 sp, sp, 4127; GENERIC-NEXT: rts16128entry:129 %y = mul nsw i32 %x, 131076130 ret i32 %y131}132 133define i32 @mul_i32_131080(i32 %x) {134; CHECK-LABEL: mul_i32_131080:135; CHECK: # %bb.0: # %entry136; CHECK-NEXT: lsli16 a1, a0, 17137; CHECK-NEXT: ixd32 a0, a1, a0138; CHECK-NEXT: rts16139;140; GENERIC-LABEL: mul_i32_131080:141; GENERIC: # %bb.0: # %entry142; GENERIC-NEXT: .cfi_def_cfa_offset 0143; GENERIC-NEXT: subi16 sp, sp, 4144; GENERIC-NEXT: .cfi_def_cfa_offset 4145; GENERIC-NEXT: movi16 a1, 0146; GENERIC-NEXT: lsli16 a2, a1, 24147; GENERIC-NEXT: movi16 a3, 2148; GENERIC-NEXT: lsli16 a3, a3, 16149; GENERIC-NEXT: or16 a3, a2150; GENERIC-NEXT: lsli16 a1, a1, 8151; GENERIC-NEXT: or16 a1, a3152; GENERIC-NEXT: movi16 a2, 8153; GENERIC-NEXT: or16 a2, a1154; GENERIC-NEXT: mult16 a0, a2155; GENERIC-NEXT: addi16 sp, sp, 4156; GENERIC-NEXT: rts16157entry:158 %y = mul nsw i32 %x, 131080159 ret i32 %y160}161 162define i16 @mul_i16_4097(i16 %x) {163; CHECK-LABEL: mul_i16_4097:164; CHECK: # %bb.0: # %entry165; CHECK-NEXT: lsli16 a1, a0, 12166; CHECK-NEXT: addu16 a0, a1167; CHECK-NEXT: rts16168;169; GENERIC-LABEL: mul_i16_4097:170; GENERIC: # %bb.0: # %entry171; GENERIC-NEXT: .cfi_def_cfa_offset 0172; GENERIC-NEXT: subi16 sp, sp, 4173; GENERIC-NEXT: .cfi_def_cfa_offset 4174; GENERIC-NEXT: lsli16 a1, a0, 12175; GENERIC-NEXT: addu16 a0, a1, a0176; GENERIC-NEXT: addi16 sp, sp, 4177; GENERIC-NEXT: rts16178entry:179 %y = mul nsw i16 %x, 4097180 ret i16 %y181}182 183define i16 @mul_i16_4095(i16 %x) {184; CHECK-LABEL: mul_i16_4095:185; CHECK: # %bb.0: # %entry186; CHECK-NEXT: lsli16 a1, a0, 12187; CHECK-NEXT: subu16 a0, a1, a0188; CHECK-NEXT: rts16189;190; GENERIC-LABEL: mul_i16_4095:191; GENERIC: # %bb.0: # %entry192; GENERIC-NEXT: .cfi_def_cfa_offset 0193; GENERIC-NEXT: subi16 sp, sp, 4194; GENERIC-NEXT: .cfi_def_cfa_offset 4195; GENERIC-NEXT: lsli16 a1, a0, 12196; GENERIC-NEXT: subu16 a0, a1, a0197; GENERIC-NEXT: addi16 sp, sp, 4198; GENERIC-NEXT: rts16199entry:200 %y = mul nsw i16 %x, 4095201 ret i16 %y202}203 204define i16 @mul_i16_minus_4095(i16 %x) {205; CHECK-LABEL: mul_i16_minus_4095:206; CHECK: # %bb.0: # %entry207; CHECK-NEXT: lsli16 a1, a0, 12208; CHECK-NEXT: subu16 a0, a1209; CHECK-NEXT: rts16210;211; GENERIC-LABEL: mul_i16_minus_4095:212; GENERIC: # %bb.0: # %entry213; GENERIC-NEXT: .cfi_def_cfa_offset 0214; GENERIC-NEXT: subi16 sp, sp, 4215; GENERIC-NEXT: .cfi_def_cfa_offset 4216; GENERIC-NEXT: lsli16 a1, a0, 12217; GENERIC-NEXT: subu16 a0, a0, a1218; GENERIC-NEXT: addi16 sp, sp, 4219; GENERIC-NEXT: rts16220entry:221 %y = mul nsw i16 %x, -4095222 ret i16 %y223}224 225define i8 @mul_i8_65(i8 %x) {226; CHECK-LABEL: mul_i8_65:227; CHECK: # %bb.0: # %entry228; CHECK-NEXT: lsli16 a1, a0, 6229; CHECK-NEXT: addu16 a0, a1230; CHECK-NEXT: rts16231;232; GENERIC-LABEL: mul_i8_65:233; GENERIC: # %bb.0: # %entry234; GENERIC-NEXT: .cfi_def_cfa_offset 0235; GENERIC-NEXT: subi16 sp, sp, 4236; GENERIC-NEXT: .cfi_def_cfa_offset 4237; GENERIC-NEXT: lsli16 a1, a0, 6238; GENERIC-NEXT: addu16 a0, a1, a0239; GENERIC-NEXT: addi16 sp, sp, 4240; GENERIC-NEXT: rts16241entry:242 %y = mul nsw i8 %x, 65243 ret i8 %y244}245 246define i8 @mul_i8_63(i8 %x) {247; CHECK-LABEL: mul_i8_63:248; CHECK: # %bb.0: # %entry249; CHECK-NEXT: lsli16 a1, a0, 6250; CHECK-NEXT: subu16 a0, a1, a0251; CHECK-NEXT: rts16252;253; GENERIC-LABEL: mul_i8_63:254; GENERIC: # %bb.0: # %entry255; GENERIC-NEXT: .cfi_def_cfa_offset 0256; GENERIC-NEXT: subi16 sp, sp, 4257; GENERIC-NEXT: .cfi_def_cfa_offset 4258; GENERIC-NEXT: lsli16 a1, a0, 6259; GENERIC-NEXT: subu16 a0, a1, a0260; GENERIC-NEXT: addi16 sp, sp, 4261; GENERIC-NEXT: rts16262entry:263 %y = mul nsw i8 %x, 63264 ret i8 %y265}266 267define i8 @mul_i8_minus_63(i8 %x) {268; CHECK-LABEL: mul_i8_minus_63:269; CHECK: # %bb.0: # %entry270; CHECK-NEXT: lsli16 a1, a0, 6271; CHECK-NEXT: subu16 a0, a1272; CHECK-NEXT: rts16273;274; GENERIC-LABEL: mul_i8_minus_63:275; GENERIC: # %bb.0: # %entry276; GENERIC-NEXT: .cfi_def_cfa_offset 0277; GENERIC-NEXT: subi16 sp, sp, 4278; GENERIC-NEXT: .cfi_def_cfa_offset 4279; GENERIC-NEXT: lsli16 a1, a0, 6280; GENERIC-NEXT: subu16 a0, a0, a1281; GENERIC-NEXT: addi16 sp, sp, 4282; GENERIC-NEXT: rts16283entry:284 %y = mul nsw i8 %x, -63285 ret i8 %y286}287 288define i32 @mul_i32_minus_4097(i32 %x) {289; CHECK-LABEL: mul_i32_minus_4097:290; CHECK: # %bb.0: # %entry291; CHECK-NEXT: movih32 a1, 65535292; CHECK-NEXT: ori32 a1, a1, 61439293; CHECK-NEXT: mult16 a0, a1294; CHECK-NEXT: rts16295;296; GENERIC-LABEL: mul_i32_minus_4097:297; GENERIC: # %bb.0: # %entry298; GENERIC-NEXT: .cfi_def_cfa_offset 0299; GENERIC-NEXT: subi16 sp, sp, 4300; GENERIC-NEXT: .cfi_def_cfa_offset 4301; GENERIC-NEXT: lsli16 a1, a0, 12302; GENERIC-NEXT: addu16 a0, a1, a0303; GENERIC-NEXT: movi16 a1, 0304; GENERIC-NEXT: subu16 a0, a1, a0305; GENERIC-NEXT: addi16 sp, sp, 4306; GENERIC-NEXT: rts16307entry:308 %y = mul nsw i32 %x, -4097309 ret i32 %y310}311 312define i16 @mul_i16_minus_4097(i16 %x) {313; CHECK-LABEL: mul_i16_minus_4097:314; CHECK: # %bb.0: # %entry315; CHECK-NEXT: movih32 a1, 65535316; CHECK-NEXT: ori32 a1, a1, 61439317; CHECK-NEXT: mult16 a0, a1318; CHECK-NEXT: rts16319;320; GENERIC-LABEL: mul_i16_minus_4097:321; GENERIC: # %bb.0: # %entry322; GENERIC-NEXT: .cfi_def_cfa_offset 0323; GENERIC-NEXT: subi16 sp, sp, 4324; GENERIC-NEXT: .cfi_def_cfa_offset 4325; GENERIC-NEXT: lsli16 a1, a0, 12326; GENERIC-NEXT: addu16 a0, a1, a0327; GENERIC-NEXT: movi16 a1, 0328; GENERIC-NEXT: subu16 a0, a1, a0329; GENERIC-NEXT: addi16 sp, sp, 4330; GENERIC-NEXT: rts16331entry:332 %y = mul nsw i16 %x, -4097333 ret i16 %y334}335 336define i8 @mul_i8_minus_65(i8 %x) {337; CHECK-LABEL: mul_i8_minus_65:338; CHECK: # %bb.0: # %entry339; CHECK-NEXT: movih32 a1, 65535340; CHECK-NEXT: ori32 a1, a1, 65471341; CHECK-NEXT: mult16 a0, a1342; CHECK-NEXT: rts16343;344; GENERIC-LABEL: mul_i8_minus_65:345; GENERIC: # %bb.0: # %entry346; GENERIC-NEXT: .cfi_def_cfa_offset 0347; GENERIC-NEXT: subi16 sp, sp, 4348; GENERIC-NEXT: .cfi_def_cfa_offset 4349; GENERIC-NEXT: lsli16 a1, a0, 6350; GENERIC-NEXT: addu16 a0, a1, a0351; GENERIC-NEXT: movi16 a1, 0352; GENERIC-NEXT: subu16 a0, a1, a0353; GENERIC-NEXT: addi16 sp, sp, 4354; GENERIC-NEXT: rts16355entry:356 %y = mul nsw i8 %x, -65357 ret i8 %y358}359 360;; This case can not be optimized, due to the data type exceeds.361define i64 @mul_i64_4097(i64 %x) {362; CHECK-LABEL: mul_i64_4097:363; CHECK: # %bb.0: # %entry364; CHECK-NEXT: subi16 sp, sp, 4365; CHECK-NEXT: .cfi_def_cfa_offset 4366; CHECK-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill367; CHECK-NEXT: .cfi_offset lr, -4368; CHECK-NEXT: .cfi_def_cfa_offset 4369; CHECK-NEXT: movi32 a2, 4097370; CHECK-NEXT: movi16 a3, 0371; CHECK-NEXT: jsri32 [.LCPI15_0]372; CHECK-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload373; CHECK-NEXT: addi16 sp, sp, 4374; CHECK-NEXT: rts16375; CHECK-NEXT: .p2align 1376; CHECK-NEXT: # %bb.1:377; CHECK-NEXT: .p2align 2, 0x0378; CHECK-NEXT: .LCPI15_0:379; CHECK-NEXT: .long __muldi3380;381; GENERIC-LABEL: mul_i64_4097:382; GENERIC: # %bb.0: # %entry383; GENERIC-NEXT: subi16 sp, sp, 8384; GENERIC-NEXT: .cfi_def_cfa_offset 8385; GENERIC-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill386; GENERIC-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill387; GENERIC-NEXT: .cfi_offset l0, -4388; GENERIC-NEXT: .cfi_offset lr, -8389; GENERIC-NEXT: subi16 sp, sp, 4390; GENERIC-NEXT: .cfi_def_cfa_offset 12391; GENERIC-NEXT: movi16 a2, 0392; GENERIC-NEXT: lsli16 a3, a2, 24393; GENERIC-NEXT: lsli16 a2, a2, 16394; GENERIC-NEXT: or16 a2, a3395; GENERIC-NEXT: movi16 a3, 16396; GENERIC-NEXT: lsli16 a3, a3, 8397; GENERIC-NEXT: or16 a3, a2398; GENERIC-NEXT: movi16 a2, 1399; GENERIC-NEXT: or16 a2, a3400; GENERIC-NEXT: lrw32 l0, [.LCPI15_0]401; GENERIC-NEXT: movi16 a3, 0402; GENERIC-NEXT: jsr16 l0403; GENERIC-NEXT: addi16 sp, sp, 4404; GENERIC-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload405; GENERIC-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload406; GENERIC-NEXT: addi16 sp, sp, 8407; GENERIC-NEXT: rts16408; GENERIC-NEXT: .p2align 1409; GENERIC-NEXT: # %bb.1:410; GENERIC-NEXT: .p2align 2, 0x0411; GENERIC-NEXT: .LCPI15_0:412; GENERIC-NEXT: .long __muldi3413entry:414 %y = mul nsw i64 %x, 4097415 ret i64 %y416}417