353 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=m68k-linux -verify-machineinstrs | FileCheck %s3 4; op reg, reg5 6define zeroext i8 @andb(i8 zeroext %a, i8 zeroext %b) nounwind {7; CHECK-LABEL: andb:8; CHECK: ; %bb.0:9; CHECK-NEXT: move.b (11,%sp), %d010; CHECK-NEXT: move.b (7,%sp), %d111; CHECK-NEXT: and.b %d0, %d112; CHECK-NEXT: move.l %d1, %d013; CHECK-NEXT: and.l #255, %d014; CHECK-NEXT: rts15 %1 = and i8 %a, %b16 ret i8 %117}18 19define zeroext i16 @andw(i16 zeroext %a, i16 zeroext %b) nounwind {20; CHECK-LABEL: andw:21; CHECK: ; %bb.0:22; CHECK-NEXT: move.w (10,%sp), %d023; CHECK-NEXT: move.w (6,%sp), %d124; CHECK-NEXT: and.w %d0, %d125; CHECK-NEXT: move.l %d1, %d026; CHECK-NEXT: and.l #65535, %d027; CHECK-NEXT: rts28 %1 = and i16 %a, %b29 ret i16 %130}31 32define i32 @andl(i32 %a, i32 %b) nounwind {33; CHECK-LABEL: andl:34; CHECK: ; %bb.0:35; CHECK-NEXT: move.l (8,%sp), %d136; CHECK-NEXT: move.l (4,%sp), %d037; CHECK-NEXT: and.l %d1, %d038; CHECK-NEXT: rts39 %1 = and i32 %a, %b40 ret i32 %141}42 43define zeroext i8 @orb(i8 zeroext %a, i8 zeroext %b) nounwind {44; CHECK-LABEL: orb:45; CHECK: ; %bb.0:46; CHECK-NEXT: move.b (11,%sp), %d047; CHECK-NEXT: move.b (7,%sp), %d148; CHECK-NEXT: or.b %d0, %d149; CHECK-NEXT: move.l %d1, %d050; CHECK-NEXT: and.l #255, %d051; CHECK-NEXT: rts52 %1 = or i8 %a, %b53 ret i8 %154}55 56define zeroext i16 @orw(i16 zeroext %a, i16 zeroext %b) nounwind {57; CHECK-LABEL: orw:58; CHECK: ; %bb.0:59; CHECK-NEXT: move.w (10,%sp), %d060; CHECK-NEXT: move.w (6,%sp), %d161; CHECK-NEXT: or.w %d0, %d162; CHECK-NEXT: move.l %d1, %d063; CHECK-NEXT: and.l #65535, %d064; CHECK-NEXT: rts65 %1 = or i16 %a, %b66 ret i16 %167}68 69define i32 @orl(i32 %a, i32 %b) nounwind {70; CHECK-LABEL: orl:71; CHECK: ; %bb.0:72; CHECK-NEXT: move.l (8,%sp), %d173; CHECK-NEXT: move.l (4,%sp), %d074; CHECK-NEXT: or.l %d1, %d075; CHECK-NEXT: rts76 %1 = or i32 %a, %b77 ret i32 %178}79 80define zeroext i8 @eorb(i8 zeroext %a, i8 zeroext %b) nounwind {81; CHECK-LABEL: eorb:82; CHECK: ; %bb.0:83; CHECK-NEXT: move.b (11,%sp), %d084; CHECK-NEXT: move.b (7,%sp), %d185; CHECK-NEXT: eor.b %d0, %d186; CHECK-NEXT: move.l %d1, %d087; CHECK-NEXT: and.l #255, %d088; CHECK-NEXT: rts89 %1 = xor i8 %a, %b90 ret i8 %191}92 93define zeroext i16 @eorw(i16 zeroext %a, i16 zeroext %b) nounwind {94; CHECK-LABEL: eorw:95; CHECK: ; %bb.0:96; CHECK-NEXT: move.w (10,%sp), %d097; CHECK-NEXT: move.w (6,%sp), %d198; CHECK-NEXT: eor.w %d0, %d199; CHECK-NEXT: move.l %d1, %d0100; CHECK-NEXT: and.l #65535, %d0101; CHECK-NEXT: rts102 %1 = xor i16 %a, %b103 ret i16 %1104}105 106define i32 @eorl(i32 %a, i32 %b) nounwind {107; CHECK-LABEL: eorl:108; CHECK: ; %bb.0:109; CHECK-NEXT: move.l (8,%sp), %d1110; CHECK-NEXT: move.l (4,%sp), %d0111; CHECK-NEXT: eor.l %d1, %d0112; CHECK-NEXT: rts113 %1 = xor i32 %a, %b114 ret i32 %1115}116 117; op reg, imm118; For type i8 and i16, value is loaded from memory to avoid optimizing it to *.l119 120define void @andib(ptr %a) nounwind {121; CHECK-LABEL: andib:122; CHECK: ; %bb.0:123; CHECK-NEXT: move.l (4,%sp), %a0124; CHECK-NEXT: move.b (%a0), %d0125; CHECK-NEXT: and.b #18, %d0126; CHECK-NEXT: move.b %d0, (%a0)127; CHECK-NEXT: rts128 %1 = load i8, ptr %a129 %2 = and i8 %1, 18130 store i8 %2, ptr %a131 ret void132}133 134define void @andiw(ptr %a) nounwind {135; CHECK-LABEL: andiw:136; CHECK: ; %bb.0:137; CHECK-NEXT: move.l (4,%sp), %a0138; CHECK-NEXT: move.w (%a0), %d0139; CHECK-NEXT: and.w #4660, %d0140; CHECK-NEXT: move.w %d0, (%a0)141; CHECK-NEXT: rts142 %1 = load i16, ptr %a143 %2 = and i16 %1, 4660144 store i16 %2, ptr %a145 ret void146}147 148define i32 @andil(i32 %a) nounwind {149; CHECK-LABEL: andil:150; CHECK: ; %bb.0:151; CHECK-NEXT: move.l (4,%sp), %d0152; CHECK-NEXT: and.l #305419896, %d0153; CHECK-NEXT: rts154 %1 = and i32 %a, 305419896155 ret i32 %1156}157 158define void @orib(ptr %a) nounwind {159; CHECK-LABEL: orib:160; CHECK: ; %bb.0:161; CHECK-NEXT: move.l (4,%sp), %a0162; CHECK-NEXT: move.b (%a0), %d0163; CHECK-NEXT: or.b #18, %d0164; CHECK-NEXT: move.b %d0, (%a0)165; CHECK-NEXT: rts166 %1 = load i8, ptr %a167 %2 = or i8 %1, 18168 store i8 %2, ptr %a169 ret void170}171 172define void @oriw(ptr %a) nounwind {173; CHECK-LABEL: oriw:174; CHECK: ; %bb.0:175; CHECK-NEXT: move.l (4,%sp), %a0176; CHECK-NEXT: move.w (%a0), %d0177; CHECK-NEXT: or.w #4660, %d0178; CHECK-NEXT: move.w %d0, (%a0)179; CHECK-NEXT: rts180 %1 = load i16, ptr %a181 %2 = or i16 %1, 4660182 store i16 %2, ptr %a183 ret void184}185 186define i32 @oril(i32 %a) nounwind {187; CHECK-LABEL: oril:188; CHECK: ; %bb.0:189; CHECK-NEXT: move.l (4,%sp), %d0190; CHECK-NEXT: or.l #305419896, %d0191; CHECK-NEXT: rts192 %1 = or i32 %a, 305419896193 ret i32 %1194}195 196define void @eorib(ptr %a) nounwind {197; CHECK-LABEL: eorib:198; CHECK: ; %bb.0:199; CHECK-NEXT: move.l (4,%sp), %a0200; CHECK-NEXT: move.b (%a0), %d0201; CHECK-NEXT: eori.b #18, %d0202; CHECK-NEXT: move.b %d0, (%a0)203; CHECK-NEXT: rts204 %1 = load i8, ptr %a205 %2 = xor i8 %1, 18206 store i8 %2, ptr %a207 ret void208}209 210define void @eoriw(ptr %a) nounwind {211; CHECK-LABEL: eoriw:212; CHECK: ; %bb.0:213; CHECK-NEXT: move.l (4,%sp), %a0214; CHECK-NEXT: move.w (%a0), %d0215; CHECK-NEXT: eori.w #4660, %d0216; CHECK-NEXT: move.w %d0, (%a0)217; CHECK-NEXT: rts218 %1 = load i16, ptr %a219 %2 = xor i16 %1, 4660220 store i16 %2, ptr %a221 ret void222}223 224define i32 @eoril(i32 %a) nounwind {225; CHECK-LABEL: eoril:226; CHECK: ; %bb.0:227; CHECK-NEXT: move.l (4,%sp), %d0228; CHECK-NEXT: eori.l #305419896, %d0229; CHECK-NEXT: rts230 %1 = xor i32 %a, 305419896231 ret i32 %1232}233 234define i64 @lshr64(i64 %a, i64 %b) nounwind {235; CHECK-LABEL: lshr64:236; CHECK: ; %bb.0:237; CHECK-NEXT: suba.l #12, %sp238; CHECK-NEXT: movem.l %d2-%d4, (0,%sp) ; 16-byte Folded Spill239; CHECK-NEXT: move.l (28,%sp), %d3240; CHECK-NEXT: move.l (16,%sp), %d2241; CHECK-NEXT: move.l %d3, %d1242; CHECK-NEXT: add.l #-32, %d1243; CHECK-NEXT: bmi .LBB18_1244; CHECK-NEXT: ; %bb.2:245; CHECK-NEXT: moveq #0, %d0246; CHECK-NEXT: bra .LBB18_3247; CHECK-NEXT: .LBB18_1:248; CHECK-NEXT: move.l %d2, %d0249; CHECK-NEXT: lsr.l %d3, %d0250; CHECK-NEXT: .LBB18_3:251; CHECK-NEXT: move.l %d3, %d4252; CHECK-NEXT: add.l #-32, %d4253; CHECK-NEXT: bmi .LBB18_4254; CHECK-NEXT: ; %bb.5:255; CHECK-NEXT: lsr.l %d1, %d2256; CHECK-NEXT: move.l %d2, %d1257; CHECK-NEXT: bra .LBB18_6258; CHECK-NEXT: .LBB18_4:259; CHECK-NEXT: move.l %d3, %d4260; CHECK-NEXT: eori.l #31, %d4261; CHECK-NEXT: lsl.l #1, %d2262; CHECK-NEXT: move.l (20,%sp), %d1263; CHECK-NEXT: lsl.l %d4, %d2264; CHECK-NEXT: lsr.l %d3, %d1265; CHECK-NEXT: or.l %d2, %d1266; CHECK-NEXT: .LBB18_6:267; CHECK-NEXT: movem.l (0,%sp), %d2-%d4 ; 16-byte Folded Reload268; CHECK-NEXT: adda.l #12, %sp269; CHECK-NEXT: rts270 %1 = lshr i64 %a, %b271 ret i64 %1272}273 274define i64 @ashr64(i64 %a, i64 %b) nounwind {275; CHECK-LABEL: ashr64:276; CHECK: ; %bb.0:277; CHECK-NEXT: suba.l #8, %sp278; CHECK-NEXT: movem.l %d2-%d3, (0,%sp) ; 12-byte Folded Spill279; CHECK-NEXT: move.l (24,%sp), %d2280; CHECK-NEXT: move.l (12,%sp), %d0281; CHECK-NEXT: move.l %d2, %d3282; CHECK-NEXT: add.l #-32, %d3283; CHECK-NEXT: move.l %d2, %d1284; CHECK-NEXT: add.l #-32, %d1285; CHECK-NEXT: bmi .LBB19_1286; CHECK-NEXT: ; %bb.2:287; CHECK-NEXT: move.l %d0, %d1288; CHECK-NEXT: asr.l %d3, %d1289; CHECK-NEXT: bra .LBB19_3290; CHECK-NEXT: .LBB19_1:291; CHECK-NEXT: move.l %d2, %d1292; CHECK-NEXT: eori.l #31, %d1293; CHECK-NEXT: move.l %d0, %d3294; CHECK-NEXT: lsl.l #1, %d3295; CHECK-NEXT: lsl.l %d1, %d3296; CHECK-NEXT: move.l (16,%sp), %d1297; CHECK-NEXT: lsr.l %d2, %d1298; CHECK-NEXT: or.l %d3, %d1299; CHECK-NEXT: .LBB19_3:300; CHECK-NEXT: move.l %d2, %d3301; CHECK-NEXT: add.l #-32, %d3302; CHECK-NEXT: bmi .LBB19_5303; CHECK-NEXT: ; %bb.4:304; CHECK-NEXT: moveq #31, %d2305; CHECK-NEXT: .LBB19_5:306; CHECK-NEXT: asr.l %d2, %d0307; CHECK-NEXT: movem.l (0,%sp), %d2-%d3 ; 12-byte Folded Reload308; CHECK-NEXT: adda.l #8, %sp309; CHECK-NEXT: rts310 %1 = ashr i64 %a, %b311 ret i64 %1312}313 314define i64 @shl64(i64 %a, i64 %b) nounwind {315; CHECK-LABEL: shl64:316; CHECK: ; %bb.0:317; CHECK-NEXT: suba.l #12, %sp318; CHECK-NEXT: movem.l %d2-%d4, (0,%sp) ; 16-byte Folded Spill319; CHECK-NEXT: move.l (28,%sp), %d3320; CHECK-NEXT: move.l (20,%sp), %d2321; CHECK-NEXT: move.l %d3, %d0322; CHECK-NEXT: add.l #-32, %d0323; CHECK-NEXT: bmi .LBB20_1324; CHECK-NEXT: ; %bb.2:325; CHECK-NEXT: moveq #0, %d1326; CHECK-NEXT: bra .LBB20_3327; CHECK-NEXT: .LBB20_1:328; CHECK-NEXT: move.l %d2, %d1329; CHECK-NEXT: lsl.l %d3, %d1330; CHECK-NEXT: .LBB20_3:331; CHECK-NEXT: move.l %d3, %d4332; CHECK-NEXT: add.l #-32, %d4333; CHECK-NEXT: bmi .LBB20_4334; CHECK-NEXT: ; %bb.5:335; CHECK-NEXT: lsl.l %d0, %d2336; CHECK-NEXT: move.l %d2, %d0337; CHECK-NEXT: bra .LBB20_6338; CHECK-NEXT: .LBB20_4:339; CHECK-NEXT: move.l %d3, %d4340; CHECK-NEXT: eori.l #31, %d4341; CHECK-NEXT: lsr.l #1, %d2342; CHECK-NEXT: move.l (16,%sp), %d0343; CHECK-NEXT: lsr.l %d4, %d2344; CHECK-NEXT: lsl.l %d3, %d0345; CHECK-NEXT: or.l %d2, %d0346; CHECK-NEXT: .LBB20_6:347; CHECK-NEXT: movem.l (0,%sp), %d2-%d4 ; 16-byte Folded Reload348; CHECK-NEXT: adda.l #12, %sp349; CHECK-NEXT: rts350 %1 = shl i64 %a, %b351 ret i64 %1352}353