266 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=m68k-linux | FileCheck %s3 4define i32 @mul4_32(i32 %A) {5; CHECK-LABEL: mul4_32:6; CHECK: .cfi_startproc7; CHECK-NEXT: ; %bb.0:8; CHECK-NEXT: move.l (4,%sp), %d09; CHECK-NEXT: lsl.l #2, %d010; CHECK-NEXT: rts11 %mul = mul i32 %A, 412 ret i32 %mul13}14 15define i64 @mul4_64(i64 %A) {16; CHECK-LABEL: mul4_64:17; CHECK: .cfi_startproc18; CHECK-NEXT: ; %bb.0:19; CHECK-NEXT: suba.l #4, %sp20; CHECK-NEXT: .cfi_def_cfa_offset -821; CHECK-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill22; CHECK-NEXT: moveq #30, %d023; CHECK-NEXT: move.l (12,%sp), %d124; CHECK-NEXT: move.l %d1, %d225; CHECK-NEXT: lsr.l %d0, %d226; CHECK-NEXT: move.l (8,%sp), %d027; CHECK-NEXT: lsl.l #2, %d028; CHECK-NEXT: or.l %d2, %d029; CHECK-NEXT: lsl.l #2, %d130; CHECK-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload31; CHECK-NEXT: adda.l #4, %sp32; CHECK-NEXT: rts33 %mul = mul i64 %A, 434 ret i64 %mul35}36 37define i32 @mul4096_32(i32 %A) {38; CHECK-LABEL: mul4096_32:39; CHECK: .cfi_startproc40; CHECK-NEXT: ; %bb.0:41; CHECK-NEXT: moveq #12, %d142; CHECK-NEXT: move.l (4,%sp), %d043; CHECK-NEXT: lsl.l %d1, %d044; CHECK-NEXT: rts45 %mul = mul i32 %A, 409646 ret i32 %mul47}48 49define i64 @mul4096_64(i64 %A) {50; CHECK-LABEL: mul4096_64:51; CHECK: .cfi_startproc52; CHECK-NEXT: ; %bb.0:53; CHECK-NEXT: suba.l #8, %sp54; CHECK-NEXT: .cfi_def_cfa_offset -1255; CHECK-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill56; CHECK-NEXT: moveq #20, %d057; CHECK-NEXT: move.l (16,%sp), %d158; CHECK-NEXT: move.l %d1, %d259; CHECK-NEXT: lsr.l %d0, %d260; CHECK-NEXT: moveq #12, %d361; CHECK-NEXT: move.l (12,%sp), %d062; CHECK-NEXT: lsl.l %d3, %d063; CHECK-NEXT: or.l %d2, %d064; CHECK-NEXT: lsl.l %d3, %d165; CHECK-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload66; CHECK-NEXT: adda.l #8, %sp67; CHECK-NEXT: rts68 %mul = mul i64 %A, 409669 ret i64 %mul70}71 72define i32 @mulmin4096_32(i32 %A) {73; CHECK-LABEL: mulmin4096_32:74; CHECK: .cfi_startproc75; CHECK-NEXT: ; %bb.0:76; CHECK-NEXT: moveq #12, %d177; CHECK-NEXT: move.l (4,%sp), %d078; CHECK-NEXT: lsl.l %d1, %d079; CHECK-NEXT: neg.l %d080; CHECK-NEXT: rts81 %mul = mul i32 %A, -409682 ret i32 %mul83}84 85define i64 @mulmin4096_64(i64 %A) {86; CHECK-LABEL: mulmin4096_64:87; CHECK: .cfi_startproc88; CHECK-NEXT: ; %bb.0:89; CHECK-NEXT: suba.l #8, %sp90; CHECK-NEXT: .cfi_def_cfa_offset -1291; CHECK-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill92; CHECK-NEXT: moveq #20, %d093; CHECK-NEXT: move.l (16,%sp), %d194; CHECK-NEXT: move.l %d1, %d295; CHECK-NEXT: lsr.l %d0, %d296; CHECK-NEXT: moveq #12, %d397; CHECK-NEXT: move.l (12,%sp), %d098; CHECK-NEXT: lsl.l %d3, %d099; CHECK-NEXT: or.l %d2, %d0100; CHECK-NEXT: lsl.l %d3, %d1101; CHECK-NEXT: neg.l %d1102; CHECK-NEXT: negx.l %d0103; CHECK-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload104; CHECK-NEXT: adda.l #8, %sp105; CHECK-NEXT: rts106 %mul = mul i64 %A, -4096107 ret i64 %mul108}109 110; No i32 multiply for M68000111define i32 @mul_32(i32 %a, i32 %b) {112; CHECK-LABEL: mul_32:113; CHECK: .cfi_startproc114; CHECK-NEXT: ; %bb.0:115; CHECK-NEXT: suba.l #12, %sp116; CHECK-NEXT: .cfi_def_cfa_offset -16117; CHECK-NEXT: move.l (20,%sp), (4,%sp)118; CHECK-NEXT: move.l (16,%sp), (%sp)119; CHECK-NEXT: jsr __mulsi3120; CHECK-NEXT: adda.l #12, %sp121; CHECK-NEXT: rts122 %mul = mul i32 %a, %b123 ret i32 %mul124}125 126; Lower to shift and add if we can127define i32 @mul3_32(i32 %A) {128; CHECK-LABEL: mul3_32:129; CHECK: .cfi_startproc130; CHECK-NEXT: ; %bb.0:131; CHECK-NEXT: move.l (4,%sp), %d1132; CHECK-NEXT: move.l %d1, %d0133; CHECK-NEXT: lsl.l #1, %d0134; CHECK-NEXT: add.l %d1, %d0135; CHECK-NEXT: rts136 %mul = mul i32 %A, 3137 ret i32 %mul138}139 140define i32 @mul40_32(i32 %A) {141; CHECK-LABEL: mul40_32:142; CHECK: .cfi_startproc143; CHECK-NEXT: ; %bb.0:144; CHECK-NEXT: move.l (4,%sp), %d0145; CHECK-NEXT: move.l %d0, %d1146; CHECK-NEXT: lsl.l #3, %d1147; CHECK-NEXT: lsl.l #5, %d0148; CHECK-NEXT: add.l %d1, %d0149; CHECK-NEXT: rts150 %mul = mul i32 %A, 40151 ret i32 %mul152}153 154; No i64 multiply for M68000155define i64 @mul_64(i64 %a, i64 %b) {156; CHECK-LABEL: mul_64:157; CHECK: .cfi_startproc158; CHECK-NEXT: ; %bb.0:159; CHECK-NEXT: suba.l #20, %sp160; CHECK-NEXT: .cfi_def_cfa_offset -24161; CHECK-NEXT: move.l (36,%sp), (12,%sp)162; CHECK-NEXT: move.l (32,%sp), (8,%sp)163; CHECK-NEXT: move.l (28,%sp), (4,%sp)164; CHECK-NEXT: move.l (24,%sp), (%sp)165; CHECK-NEXT: jsr __muldi3166; CHECK-NEXT: adda.l #20, %sp167; CHECK-NEXT: rts168 %mul = mul i64 %a, %b169 ret i64 %mul170}171 172define i64 @mul3_64(i64 %A) {173; CHECK-LABEL: mul3_64:174; CHECK: .cfi_startproc175; CHECK-NEXT: ; %bb.0:176; CHECK-NEXT: suba.l #20, %sp177; CHECK-NEXT: .cfi_def_cfa_offset -24178; CHECK-NEXT: move.l #3, (12,%sp)179; CHECK-NEXT: move.l #0, (8,%sp)180; CHECK-NEXT: move.l (28,%sp), (4,%sp)181; CHECK-NEXT: move.l (24,%sp), (%sp)182; CHECK-NEXT: jsr __muldi3183; CHECK-NEXT: adda.l #20, %sp184; CHECK-NEXT: rts185 %mul = mul i64 %A, 3186 ret i64 %mul187}188 189define i64 @mul40_64(i64 %A) {190; CHECK-LABEL: mul40_64:191; CHECK: .cfi_startproc192; CHECK-NEXT: ; %bb.0:193; CHECK-NEXT: suba.l #20, %sp194; CHECK-NEXT: .cfi_def_cfa_offset -24195; CHECK-NEXT: move.l #40, (12,%sp)196; CHECK-NEXT: move.l #0, (8,%sp)197; CHECK-NEXT: move.l (28,%sp), (4,%sp)198; CHECK-NEXT: move.l (24,%sp), (%sp)199; CHECK-NEXT: jsr __muldi3200; CHECK-NEXT: adda.l #20, %sp201; CHECK-NEXT: rts202 %mul = mul i64 %A, 40203 ret i64 %mul204}205 206define i32 @mul4_32_minsize(i32 %A) minsize {207; CHECK-LABEL: mul4_32_minsize:208; CHECK: .cfi_startproc209; CHECK-NEXT: ; %bb.0:210; CHECK-NEXT: move.l (4,%sp), %d0211; CHECK-NEXT: lsl.l #2, %d0212; CHECK-NEXT: rts213 %mul = mul i32 %A, 4214 ret i32 %mul215}216 217define i32 @mul40_32_minsize(i32 %A) minsize {218; CHECK-LABEL: mul40_32_minsize:219; CHECK: .cfi_startproc220; CHECK-NEXT: ; %bb.0:221; CHECK-NEXT: move.l (4,%sp), %d0222; CHECK-NEXT: move.l %d0, %d1223; CHECK-NEXT: lsl.l #3, %d1224; CHECK-NEXT: lsl.l #5, %d0225; CHECK-NEXT: add.l %d1, %d0226; CHECK-NEXT: rts227 %mul = mul i32 %A, 40228 ret i32 %mul229}230 231define i32 @mul33_32(i32 %A) {232; CHECK-LABEL: mul33_32:233; CHECK: .cfi_startproc234; CHECK-NEXT: ; %bb.0:235; CHECK-NEXT: move.l (4,%sp), %d1236; CHECK-NEXT: move.l %d1, %d0237; CHECK-NEXT: lsl.l #5, %d0238; CHECK-NEXT: add.l %d1, %d0239; CHECK-NEXT: rts240 %mul = mul i32 %A, 33241 ret i32 %mul242}243 244define i32 @mul31_32(i32 %A) {245; CHECK-LABEL: mul31_32:246; CHECK: .cfi_startproc247; CHECK-NEXT: ; %bb.0:248; CHECK-NEXT: move.l (4,%sp), %d1249; CHECK-NEXT: move.l %d1, %d0250; CHECK-NEXT: lsl.l #5, %d0251; CHECK-NEXT: sub.l %d1, %d0252; CHECK-NEXT: rts253 %mul = mul i32 %A, 31254 ret i32 %mul255}256 257define i32 @mul0_32(i32 %A) {258; CHECK-LABEL: mul0_32:259; CHECK: .cfi_startproc260; CHECK-NEXT: ; %bb.0:261; CHECK-NEXT: moveq #0, %d0262; CHECK-NEXT: rts263 %mul = mul i32 %A, 0264 ret i32 %mul265}266