331 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=m68k -verify-machineinstrs | FileCheck %s3 4define i32 @test1(ptr %y) nounwind {5; CHECK-LABEL: test1:6; CHECK: ; %bb.0:7; CHECK-NEXT: move.l (4,%sp), %a08; CHECK-NEXT: cmpi.l #0, (%a0)9; CHECK-NEXT: beq .LBB0_210; CHECK-NEXT: ; %bb.1: ; %cond_false11; CHECK-NEXT: moveq #0, %d012; CHECK-NEXT: rts13; CHECK-NEXT: .LBB0_2: ; %cond_true14; CHECK-NEXT: moveq #1, %d015; CHECK-NEXT: rts16 %tmp = load i32, ptr %y ; <i32> [#uses=1]17 %tmp.upgrd.1 = icmp eq i32 %tmp, 0 ; <i1> [#uses=1]18 br i1 %tmp.upgrd.1, label %cond_true, label %cond_false19 20cond_false: ; preds = %021 ret i32 022 23cond_true: ; preds = %024 ret i32 125}26 27define i32 @test2(ptr %y) nounwind {28; CHECK-LABEL: test2:29; CHECK: ; %bb.0:30; CHECK-NEXT: move.l (4,%sp), %a031; CHECK-NEXT: move.l (%a0), %d032; CHECK-NEXT: and.l #536870911, %d033; CHECK-NEXT: cmpi.l #0, %d034; CHECK-NEXT: beq .LBB1_235; CHECK-NEXT: ; %bb.1: ; %cond_false36; CHECK-NEXT: moveq #0, %d037; CHECK-NEXT: rts38; CHECK-NEXT: .LBB1_2: ; %cond_true39; CHECK-NEXT: moveq #1, %d040; CHECK-NEXT: rts41 %tmp = load i32, ptr %y ; <i32> [#uses=1]42 %tmp1 = shl i32 %tmp, 3 ; <i32> [#uses=1]43 %tmp1.upgrd.2 = icmp eq i32 %tmp1, 0 ; <i1> [#uses=1]44 br i1 %tmp1.upgrd.2, label %cond_true, label %cond_false45 46cond_false: ; preds = %047 ret i32 048 49cond_true: ; preds = %050 ret i32 151}52 53define i8 @test2b(ptr %y) nounwind {54; CHECK-LABEL: test2b:55; CHECK: ; %bb.0:56; CHECK-NEXT: move.l (4,%sp), %a057; CHECK-NEXT: move.b (%a0), %d058; CHECK-NEXT: and.b #31, %d059; CHECK-NEXT: cmpi.b #0, %d060; CHECK-NEXT: beq .LBB2_261; CHECK-NEXT: ; %bb.1: ; %cond_false62; CHECK-NEXT: moveq #0, %d063; CHECK-NEXT: rts64; CHECK-NEXT: .LBB2_2: ; %cond_true65; CHECK-NEXT: moveq #1, %d066; CHECK-NEXT: rts67 %tmp = load i8, ptr %y ; <i8> [#uses=1]68 %tmp1 = shl i8 %tmp, 3 ; <i8> [#uses=1]69 %tmp1.upgrd.2 = icmp eq i8 %tmp1, 0 ; <i1> [#uses=1]70 br i1 %tmp1.upgrd.2, label %cond_true, label %cond_false71 72cond_false: ; preds = %073 ret i8 074 75cond_true: ; preds = %076 ret i8 177}78 79define i64 @test3(i64 %x) nounwind {80; CHECK-LABEL: test3:81; CHECK: ; %bb.0:82; CHECK-NEXT: move.l (8,%sp), %d083; CHECK-NEXT: or.l (4,%sp), %d084; CHECK-NEXT: seq %d085; CHECK-NEXT: move.l %d0, %d186; CHECK-NEXT: and.l #255, %d187; CHECK-NEXT: and.l #1, %d188; CHECK-NEXT: moveq #0, %d089; CHECK-NEXT: rts90 %t = icmp eq i64 %x, 091 %r = zext i1 %t to i6492 ret i64 %r93}94 95define i64 @test4(i64 %x) nounwind {96; CHECK-LABEL: test4:97; CHECK: ; %bb.0:98; CHECK-NEXT: suba.l #4, %sp99; CHECK-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill100; CHECK-NEXT: move.l (8,%sp), %d1101; CHECK-NEXT: moveq #0, %d0102; CHECK-NEXT: move.l (12,%sp), %d2103; CHECK-NEXT: sub.l #1, %d2104; CHECK-NEXT: subx.l %d0, %d1105; CHECK-NEXT: slt %d1106; CHECK-NEXT: and.l #255, %d1107; CHECK-NEXT: and.l #1, %d1108; CHECK-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload109; CHECK-NEXT: adda.l #4, %sp110; CHECK-NEXT: rts111 %t = icmp slt i64 %x, 1112 %r = zext i1 %t to i64113 ret i64 %r114}115 116define i32 @test6() nounwind align 2 {117; CHECK-LABEL: test6:118; CHECK: ; %bb.0:119; CHECK-NEXT: suba.l #20, %sp120; CHECK-NEXT: move.l (12,%sp), %d0121; CHECK-NEXT: or.l (8,%sp), %d0122; CHECK-NEXT: beq .LBB5_1123; CHECK-NEXT: ; %bb.2: ; %F124; CHECK-NEXT: moveq #0, %d0125; CHECK-NEXT: adda.l #20, %sp126; CHECK-NEXT: rts127; CHECK-NEXT: .LBB5_1: ; %T128; CHECK-NEXT: moveq #1, %d0129; CHECK-NEXT: adda.l #20, %sp130; CHECK-NEXT: rts131 %A = alloca {i64, i64}, align 8132 %B = getelementptr inbounds {i64, i64}, ptr %A, i64 0, i32 1133 %C = load i64, ptr %B134 %D = icmp eq i64 %C, 0135 br i1 %D, label %T, label %F136T:137 ret i32 1138 139F:140 ret i32 0141}142 143define i32 @test7(i64 %res) nounwind {144; CHECK-LABEL: test7:145; CHECK: ; %bb.0: ; %entry146; CHECK-NEXT: cmpi.l #0, (4,%sp)147; CHECK-NEXT: seq %d0148; CHECK-NEXT: and.l #255, %d0149; CHECK-NEXT: and.l #1, %d0150; CHECK-NEXT: rts151entry:152 %lnot = icmp ult i64 %res, 4294967296153 %lnot.ext = zext i1 %lnot to i32154 ret i32 %lnot.ext155}156 157define i32 @test8(i64 %res) nounwind {158; CHECK-LABEL: test8:159; CHECK: ; %bb.0: ; %entry160; CHECK-NEXT: move.l (4,%sp), %d0161; CHECK-NEXT: sub.l #3, %d0162; CHECK-NEXT: scs %d0163; CHECK-NEXT: and.l #255, %d0164; CHECK-NEXT: and.l #1, %d0165; CHECK-NEXT: rts166entry:167 %lnot = icmp ult i64 %res, 12884901888168 %lnot.ext = zext i1 %lnot to i32169 ret i32 %lnot.ext170}171 172define i32 @test11(i64 %l) nounwind {173; CHECK-LABEL: test11:174; CHECK: ; %bb.0: ; %entry175; CHECK-NEXT: move.l (4,%sp), %d0176; CHECK-NEXT: and.l #-32768, %d0177; CHECK-NEXT: sub.l #32768, %d0178; CHECK-NEXT: seq %d0179; CHECK-NEXT: and.l #255, %d0180; CHECK-NEXT: and.l #1, %d0181; CHECK-NEXT: rts182entry:183 %shr.mask = and i64 %l, -140737488355328184 %cmp = icmp eq i64 %shr.mask, 140737488355328185 %conv = zext i1 %cmp to i32186 ret i32 %conv187}188 189define i32 @test13(i32 %mask, i32 %base, i32 %intra) {190; CHECK-LABEL: test13:191; CHECK: .cfi_startproc192; CHECK-NEXT: ; %bb.0:193; CHECK-NEXT: move.b (7,%sp), %d0194; CHECK-NEXT: and.b #8, %d0195; CHECK-NEXT: cmpi.b #0, %d0196; CHECK-NEXT: bne .LBB9_1197; CHECK-NEXT: ; %bb.2:198; CHECK-NEXT: lea (8,%sp), %a0199; CHECK-NEXT: move.l (%a0), %d0200; CHECK-NEXT: rts201; CHECK-NEXT: .LBB9_1:202; CHECK-NEXT: lea (12,%sp), %a0203; CHECK-NEXT: move.l (%a0), %d0204; CHECK-NEXT: rts205 %and = and i32 %mask, 8206 %tobool = icmp ne i32 %and, 0207 %cond = select i1 %tobool, i32 %intra, i32 %base208 ret i32 %cond209}210 211define i32 @test14(i32 %mask, i32 %base, i32 %intra) #0 {212; CHECK-LABEL: test14:213; CHECK: .cfi_startproc214; CHECK-NEXT: ; %bb.0:215; CHECK-NEXT: move.l (4,%sp), %d0216; CHECK-NEXT: lsr.l #7, %d0217; CHECK-NEXT: cmpi.l #0, %d0218; CHECK-NEXT: bpl .LBB10_1219; CHECK-NEXT: ; %bb.2:220; CHECK-NEXT: lea (8,%sp), %a0221; CHECK-NEXT: move.l (%a0), %d0222; CHECK-NEXT: rts223; CHECK-NEXT: .LBB10_1:224; CHECK-NEXT: lea (12,%sp), %a0225; CHECK-NEXT: move.l (%a0), %d0226; CHECK-NEXT: rts227 %s = lshr i32 %mask, 7228 %tobool = icmp sgt i32 %s, -1229 %cond = select i1 %tobool, i32 %intra, i32 %base230 ret i32 %cond231}232 233define zeroext i1 @test15(i32 %bf.load, i32 %n) {234; CHECK-LABEL: test15:235; CHECK: .cfi_startproc236; CHECK-NEXT: ; %bb.0:237; CHECK-NEXT: moveq #16, %d0238; CHECK-NEXT: move.l (4,%sp), %d1239; CHECK-NEXT: lsr.l %d0, %d1240; CHECK-NEXT: move.l %d1, %d0241; CHECK-NEXT: sub.l (8,%sp), %d0242; CHECK-NEXT: scc %d0243; CHECK-NEXT: cmpi.l #0, %d1244; CHECK-NEXT: seq %d1245; CHECK-NEXT: or.b %d0, %d1246; CHECK-NEXT: move.l %d1, %d0247; CHECK-NEXT: and.l #255, %d0248; CHECK-NEXT: and.l #1, %d0249; CHECK-NEXT: rts250 %bf.lshr = lshr i32 %bf.load, 16251 %cmp2 = icmp eq i32 %bf.lshr, 0252 %cmp5 = icmp uge i32 %bf.lshr, %n253 %.cmp5 = or i1 %cmp2, %cmp5254 ret i1 %.cmp5255}256 257define i8 @test16(i16 signext %L) {258; CHECK-LABEL: test16:259; CHECK: .cfi_startproc260; CHECK-NEXT: ; %bb.0:261; CHECK-NEXT: moveq #15, %d1262; CHECK-NEXT: move.w (6,%sp), %d0263; CHECK-NEXT: lsr.w %d1, %d0264; CHECK-NEXT: eori.b #1, %d0265; CHECK-NEXT: ; kill: def $bd0 killed $bd0 killed $wd0266; CHECK-NEXT: rts267 %lshr = lshr i16 %L, 15268 %trunc = trunc i16 %lshr to i8269 %not = xor i8 %trunc, 1270 ret i8 %not271}272 273define i8 @test18(i64 %L) {274; CHECK-LABEL: test18:275; CHECK: .cfi_startproc276; CHECK-NEXT: ; %bb.0:277; CHECK-NEXT: moveq #31, %d1278; CHECK-NEXT: move.l (4,%sp), %d0279; CHECK-NEXT: lsr.l %d1, %d0280; CHECK-NEXT: eori.b #1, %d0281; CHECK-NEXT: ; kill: def $bd0 killed $bd0 killed $d0282; CHECK-NEXT: rts283 %lshr = lshr i64 %L, 63284 %trunc = trunc i64 %lshr to i8285 %not = xor i8 %trunc, 1286 ret i8 %not287}288 289@d = global i8 0, align 1290 291define void @test20(i32 %bf.load, i8 %x1, ptr %b_addr) {292; CHECK-LABEL: test20:293; CHECK: .cfi_startproc294; CHECK-NEXT: ; %bb.0:295; CHECK-NEXT: suba.l #4, %sp296; CHECK-NEXT: .cfi_def_cfa_offset -8297; CHECK-NEXT: movem.l %d2, (0,%sp) ; 8-byte Folded Spill298; CHECK-NEXT: move.l #16777215, %d0299; CHECK-NEXT: and.l (8,%sp), %d0300; CHECK-NEXT: sne %d1301; CHECK-NEXT: and.l #255, %d1302; CHECK-NEXT: and.l #1, %d1303; CHECK-NEXT: move.b (15,%sp), %d2304; CHECK-NEXT: and.l #255, %d2305; CHECK-NEXT: add.l %d1, %d2306; CHECK-NEXT: sne %d1307; CHECK-NEXT: and.b #1, %d1308; CHECK-NEXT: move.l (16,%sp), %a0309; CHECK-NEXT: move.b %d1, (%a0)310; CHECK-NEXT: cmpi.l #0, %d0311; CHECK-NEXT: sne %d0312; CHECK-NEXT: and.b #1, %d0313; CHECK-NEXT: move.b %d0, (d,%pc)314; CHECK-NEXT: movem.l (0,%sp), %d2 ; 8-byte Folded Reload315; CHECK-NEXT: adda.l #4, %sp316; CHECK-NEXT: rts317 %bf.shl = shl i32 %bf.load, 8318 %bf.ashr = ashr exact i32 %bf.shl, 8319 %tobool4 = icmp ne i32 %bf.ashr, 0320 %conv = zext i1 %tobool4 to i32321 %conv6 = zext i8 %x1 to i32322 %add = add nuw nsw i32 %conv, %conv6323 %tobool7 = icmp ne i32 %add, 0324 %frombool = zext i1 %tobool7 to i8325 store i8 %frombool, ptr %b_addr, align 1326 %tobool14 = icmp ne i32 %bf.shl, 0327 %frombool15 = zext i1 %tobool14 to i8328 store i8 %frombool15, ptr @d, align 1329 ret void330}331