291 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=armv7-unknown-linux < %s -verify-machineinstrs | FileCheck --check-prefix=CHECK-ARM %s3; RUN: llc -mtriple=thumb-eabi < %s -verify-machineinstrs | FileCheck --check-prefix=CHECK-THUMB1-NOMOV %s4; RUN: llc -mtriple=thumbv6-unknown-linux < %s -verify-machineinstrs | FileCheck --check-prefix=CHECK-THUMB1 %s5; RUN: llc -mtriple=thumbv7-unknown-linux < %s -verify-machineinstrs | FileCheck --check-prefix=CHECK-THUMB2 %s6 7define i32 @test_slt1(i64 %a, i64 %b) {8; CHECK-ARM-LABEL: test_slt1:9; CHECK-ARM: @ %bb.0: @ %entry10; CHECK-ARM-NEXT: subs r0, r0, r211; CHECK-ARM-NEXT: mov r12, #212; CHECK-ARM-NEXT: sbcs r0, r1, r313; CHECK-ARM-NEXT: movwlt r12, #114; CHECK-ARM-NEXT: mov r0, r1215; CHECK-ARM-NEXT: bx lr16;17; CHECK-THUMB1-NOMOV-LABEL: test_slt1:18; CHECK-THUMB1-NOMOV: @ %bb.0: @ %entry19; CHECK-THUMB1-NOMOV-NEXT: subs r0, r0, r220; CHECK-THUMB1-NOMOV-NEXT: sbcs r1, r321; CHECK-THUMB1-NOMOV-NEXT: bge .LBB0_222; CHECK-THUMB1-NOMOV-NEXT: @ %bb.1: @ %bb123; CHECK-THUMB1-NOMOV-NEXT: movs r0, #124; CHECK-THUMB1-NOMOV-NEXT: bx lr25; CHECK-THUMB1-NOMOV-NEXT: .LBB0_2: @ %bb226; CHECK-THUMB1-NOMOV-NEXT: movs r0, #227; CHECK-THUMB1-NOMOV-NEXT: bx lr28;29; CHECK-THUMB1-LABEL: test_slt1:30; CHECK-THUMB1: @ %bb.0: @ %entry31; CHECK-THUMB1-NEXT: subs r0, r0, r232; CHECK-THUMB1-NEXT: sbcs r1, r333; CHECK-THUMB1-NEXT: bge .LBB0_234; CHECK-THUMB1-NEXT: @ %bb.1: @ %bb135; CHECK-THUMB1-NEXT: movs r0, #136; CHECK-THUMB1-NEXT: bx lr37; CHECK-THUMB1-NEXT: .LBB0_2: @ %bb238; CHECK-THUMB1-NEXT: movs r0, #239; CHECK-THUMB1-NEXT: bx lr40;41; CHECK-THUMB2-LABEL: test_slt1:42; CHECK-THUMB2: @ %bb.0: @ %entry43; CHECK-THUMB2-NEXT: subs r0, r0, r244; CHECK-THUMB2-NEXT: mov.w r12, #245; CHECK-THUMB2-NEXT: sbcs.w r0, r1, r346; CHECK-THUMB2-NEXT: it lt47; CHECK-THUMB2-NEXT: movlt.w r12, #148; CHECK-THUMB2-NEXT: mov r0, r1249; CHECK-THUMB2-NEXT: bx lr50entry:51 %cmp = icmp slt i64 %a, %b52 br i1 %cmp, label %bb1, label %bb253bb1:54 ret i32 155bb2:56 ret i32 257}58 59define void @test_slt2(i64 %a, i64 %b) {60; CHECK-ARM-LABEL: test_slt2:61; CHECK-ARM: @ %bb.0: @ %entry62; CHECK-ARM-NEXT: push {r11, lr}63; CHECK-ARM-NEXT: subs r0, r0, r264; CHECK-ARM-NEXT: sbcs r0, r1, r365; CHECK-ARM-NEXT: bge .LBB1_266; CHECK-ARM-NEXT: @ %bb.1: @ %bb167; CHECK-ARM-NEXT: bl f68; CHECK-ARM-NEXT: pop {r11, pc}69; CHECK-ARM-NEXT: .LBB1_2: @ %bb270; CHECK-ARM-NEXT: bl g71; CHECK-ARM-NEXT: pop {r11, pc}72;73; CHECK-THUMB1-NOMOV-LABEL: test_slt2:74; CHECK-THUMB1-NOMOV: @ %bb.0: @ %entry75; CHECK-THUMB1-NOMOV-NEXT: .save {r7, lr}76; CHECK-THUMB1-NOMOV-NEXT: push {r7, lr}77; CHECK-THUMB1-NOMOV-NEXT: subs r0, r0, r278; CHECK-THUMB1-NOMOV-NEXT: sbcs r1, r379; CHECK-THUMB1-NOMOV-NEXT: bge .LBB1_280; CHECK-THUMB1-NOMOV-NEXT: @ %bb.1: @ %bb181; CHECK-THUMB1-NOMOV-NEXT: bl f82; CHECK-THUMB1-NOMOV-NEXT: b .LBB1_383; CHECK-THUMB1-NOMOV-NEXT: .LBB1_2: @ %bb284; CHECK-THUMB1-NOMOV-NEXT: bl g85; CHECK-THUMB1-NOMOV-NEXT: .LBB1_3: @ %bb186; CHECK-THUMB1-NOMOV-NEXT: pop {r7}87; CHECK-THUMB1-NOMOV-NEXT: pop {r0}88; CHECK-THUMB1-NOMOV-NEXT: bx r089;90; CHECK-THUMB1-LABEL: test_slt2:91; CHECK-THUMB1: @ %bb.0: @ %entry92; CHECK-THUMB1-NEXT: push {r7, lr}93; CHECK-THUMB1-NEXT: subs r0, r0, r294; CHECK-THUMB1-NEXT: sbcs r1, r395; CHECK-THUMB1-NEXT: bge .LBB1_296; CHECK-THUMB1-NEXT: @ %bb.1: @ %bb197; CHECK-THUMB1-NEXT: bl f98; CHECK-THUMB1-NEXT: pop {r7, pc}99; CHECK-THUMB1-NEXT: .LBB1_2: @ %bb2100; CHECK-THUMB1-NEXT: bl g101; CHECK-THUMB1-NEXT: pop {r7, pc}102;103; CHECK-THUMB2-LABEL: test_slt2:104; CHECK-THUMB2: @ %bb.0: @ %entry105; CHECK-THUMB2-NEXT: push {r7, lr}106; CHECK-THUMB2-NEXT: subs r0, r0, r2107; CHECK-THUMB2-NEXT: sbcs.w r0, r1, r3108; CHECK-THUMB2-NEXT: bge .LBB1_2109; CHECK-THUMB2-NEXT: @ %bb.1: @ %bb1110; CHECK-THUMB2-NEXT: bl f111; CHECK-THUMB2-NEXT: pop {r7, pc}112; CHECK-THUMB2-NEXT: .LBB1_2: @ %bb2113; CHECK-THUMB2-NEXT: bl g114; CHECK-THUMB2-NEXT: pop {r7, pc}115entry:116 %cmp = icmp slt i64 %a, %b117 br i1 %cmp, label %bb1, label %bb2118bb1:119 call void @f()120 ret void121bb2:122 call void @g()123 ret void124}125 126declare void @f()127declare void @g()128 129define i64 @test_slt_select(i64 %c, i64 %d, i64 %a, i64 %b) {130; CHECK-ARM-LABEL: test_slt_select:131; CHECK-ARM: @ %bb.0: @ %entry132; CHECK-ARM-NEXT: push {r4, r5, r6, lr}133; CHECK-ARM-NEXT: ldr r12, [sp, #24]134; CHECK-ARM-NEXT: ldr lr, [sp, #16]135; CHECK-ARM-NEXT: ldr r6, [sp, #28]136; CHECK-ARM-NEXT: ldr r5, [sp, #20]137; CHECK-ARM-NEXT: subs r4, lr, r12138; CHECK-ARM-NEXT: sbcs r6, r5, r6139; CHECK-ARM-NEXT: movhs r0, r2140; CHECK-ARM-NEXT: movhs r1, r3141; CHECK-ARM-NEXT: pop {r4, r5, r6, pc}142;143; CHECK-THUMB1-NOMOV-LABEL: test_slt_select:144; CHECK-THUMB1-NOMOV: @ %bb.0: @ %entry145; CHECK-THUMB1-NOMOV-NEXT: .save {r4, r5, r6, r7, lr}146; CHECK-THUMB1-NOMOV-NEXT: push {r4, r5, r6, r7, lr}147; CHECK-THUMB1-NOMOV-NEXT: .pad #4148; CHECK-THUMB1-NOMOV-NEXT: sub sp, #4149; CHECK-THUMB1-NOMOV-NEXT: ldr r4, [sp, #36]150; CHECK-THUMB1-NOMOV-NEXT: ldr r5, [sp, #28]151; CHECK-THUMB1-NOMOV-NEXT: ldr r6, [sp, #32]152; CHECK-THUMB1-NOMOV-NEXT: ldr r7, [sp, #24]153; CHECK-THUMB1-NOMOV-NEXT: subs r6, r7, r6154; CHECK-THUMB1-NOMOV-NEXT: sbcs r5, r4155; CHECK-THUMB1-NOMOV-NEXT: blo .LBB2_2156; CHECK-THUMB1-NOMOV-NEXT: @ %bb.1: @ %entry157; CHECK-THUMB1-NOMOV-NEXT: mov r12, r2158; CHECK-THUMB1-NOMOV-NEXT: mov r0, r12159; CHECK-THUMB1-NOMOV-NEXT: .LBB2_2: @ %entry160; CHECK-THUMB1-NOMOV-NEXT: blo .LBB2_4161; CHECK-THUMB1-NOMOV-NEXT: @ %bb.3: @ %entry162; CHECK-THUMB1-NOMOV-NEXT: movs r1, r3163; CHECK-THUMB1-NOMOV-NEXT: .LBB2_4: @ %entry164; CHECK-THUMB1-NOMOV-NEXT: add sp, #4165; CHECK-THUMB1-NOMOV-NEXT: pop {r4, r5, r6, r7}166; CHECK-THUMB1-NOMOV-NEXT: pop {r2}167; CHECK-THUMB1-NOMOV-NEXT: bx r2168;169; CHECK-THUMB1-LABEL: test_slt_select:170; CHECK-THUMB1: @ %bb.0: @ %entry171; CHECK-THUMB1-NEXT: push {r4, r5, r6, r7, lr}172; CHECK-THUMB1-NEXT: sub sp, #4173; CHECK-THUMB1-NEXT: ldr r4, [sp, #36]174; CHECK-THUMB1-NEXT: ldr r5, [sp, #28]175; CHECK-THUMB1-NEXT: ldr r6, [sp, #32]176; CHECK-THUMB1-NEXT: ldr r7, [sp, #24]177; CHECK-THUMB1-NEXT: subs r6, r7, r6178; CHECK-THUMB1-NEXT: sbcs r5, r4179; CHECK-THUMB1-NEXT: bhs .LBB2_3180; CHECK-THUMB1-NEXT: @ %bb.1: @ %entry181; CHECK-THUMB1-NEXT: bhs .LBB2_4182; CHECK-THUMB1-NEXT: .LBB2_2: @ %entry183; CHECK-THUMB1-NEXT: add sp, #4184; CHECK-THUMB1-NEXT: pop {r4, r5, r6, r7, pc}185; CHECK-THUMB1-NEXT: .LBB2_3: @ %entry186; CHECK-THUMB1-NEXT: mov r0, r2187; CHECK-THUMB1-NEXT: blo .LBB2_2188; CHECK-THUMB1-NEXT: .LBB2_4: @ %entry189; CHECK-THUMB1-NEXT: mov r1, r3190; CHECK-THUMB1-NEXT: add sp, #4191; CHECK-THUMB1-NEXT: pop {r4, r5, r6, r7, pc}192;193; CHECK-THUMB2-LABEL: test_slt_select:194; CHECK-THUMB2: @ %bb.0: @ %entry195; CHECK-THUMB2-NEXT: push {r4, r5, r6, lr}196; CHECK-THUMB2-NEXT: ldrd r12, r6, [sp, #24]197; CHECK-THUMB2-NEXT: ldrd lr, r5, [sp, #16]198; CHECK-THUMB2-NEXT: subs.w r4, lr, r12199; CHECK-THUMB2-NEXT: sbcs.w r6, r5, r6200; CHECK-THUMB2-NEXT: itt hs201; CHECK-THUMB2-NEXT: movhs r0, r2202; CHECK-THUMB2-NEXT: movhs r1, r3203; CHECK-THUMB2-NEXT: pop {r4, r5, r6, pc}204entry:205 %cmp = icmp ult i64 %a, %b206 %r1 = select i1 %cmp, i64 %c, i64 %d207 ret i64 %r1208}209 210define {i32, i32} @test_slt_not(i32 %c, i32 %d, i64 %a, i64 %b) {211; CHECK-ARM-LABEL: test_slt_not:212; CHECK-ARM: @ %bb.0: @ %entry213; CHECK-ARM-NEXT: ldr r12, [sp]214; CHECK-ARM-NEXT: mov r1, #0215; CHECK-ARM-NEXT: ldr r0, [sp, #4]216; CHECK-ARM-NEXT: subs r2, r2, r12217; CHECK-ARM-NEXT: sbcs r0, r3, r0218; CHECK-ARM-NEXT: mov r0, #0219; CHECK-ARM-NEXT: movwge r1, #1220; CHECK-ARM-NEXT: movwlt r0, #1221; CHECK-ARM-NEXT: bx lr222;223; CHECK-THUMB1-NOMOV-LABEL: test_slt_not:224; CHECK-THUMB1-NOMOV: @ %bb.0: @ %entry225; CHECK-THUMB1-NOMOV-NEXT: .save {r4, r5, r7, lr}226; CHECK-THUMB1-NOMOV-NEXT: push {r4, r5, r7, lr}227; CHECK-THUMB1-NOMOV-NEXT: movs r1, #1228; CHECK-THUMB1-NOMOV-NEXT: movs r4, #0229; CHECK-THUMB1-NOMOV-NEXT: ldr r0, [sp, #20]230; CHECK-THUMB1-NOMOV-NEXT: ldr r5, [sp, #16]231; CHECK-THUMB1-NOMOV-NEXT: subs r2, r2, r5232; CHECK-THUMB1-NOMOV-NEXT: sbcs r3, r0233; CHECK-THUMB1-NOMOV-NEXT: mov r12, r1234; CHECK-THUMB1-NOMOV-NEXT: mov r0, r12235; CHECK-THUMB1-NOMOV-NEXT: blt .LBB3_2236; CHECK-THUMB1-NOMOV-NEXT: @ %bb.1: @ %entry237; CHECK-THUMB1-NOMOV-NEXT: mov r12, r4238; CHECK-THUMB1-NOMOV-NEXT: mov r0, r12239; CHECK-THUMB1-NOMOV-NEXT: .LBB3_2: @ %entry240; CHECK-THUMB1-NOMOV-NEXT: bge .LBB3_4241; CHECK-THUMB1-NOMOV-NEXT: @ %bb.3: @ %entry242; CHECK-THUMB1-NOMOV-NEXT: movs r1, r4243; CHECK-THUMB1-NOMOV-NEXT: .LBB3_4: @ %entry244; CHECK-THUMB1-NOMOV-NEXT: pop {r4, r5, r7}245; CHECK-THUMB1-NOMOV-NEXT: pop {r2}246; CHECK-THUMB1-NOMOV-NEXT: bx r2247;248; CHECK-THUMB1-LABEL: test_slt_not:249; CHECK-THUMB1: @ %bb.0: @ %entry250; CHECK-THUMB1-NEXT: push {r4, r5, r7, lr}251; CHECK-THUMB1-NEXT: movs r1, #1252; CHECK-THUMB1-NEXT: movs r4, #0253; CHECK-THUMB1-NEXT: ldr r0, [sp, #20]254; CHECK-THUMB1-NEXT: ldr r5, [sp, #16]255; CHECK-THUMB1-NEXT: subs r2, r2, r5256; CHECK-THUMB1-NEXT: sbcs r3, r0257; CHECK-THUMB1-NEXT: mov r0, r1258; CHECK-THUMB1-NEXT: bge .LBB3_3259; CHECK-THUMB1-NEXT: @ %bb.1: @ %entry260; CHECK-THUMB1-NEXT: blt .LBB3_4261; CHECK-THUMB1-NEXT: .LBB3_2: @ %entry262; CHECK-THUMB1-NEXT: pop {r4, r5, r7, pc}263; CHECK-THUMB1-NEXT: .LBB3_3: @ %entry264; CHECK-THUMB1-NEXT: mov r0, r4265; CHECK-THUMB1-NEXT: bge .LBB3_2266; CHECK-THUMB1-NEXT: .LBB3_4: @ %entry267; CHECK-THUMB1-NEXT: mov r1, r4268; CHECK-THUMB1-NEXT: pop {r4, r5, r7, pc}269;270; CHECK-THUMB2-LABEL: test_slt_not:271; CHECK-THUMB2: @ %bb.0: @ %entry272; CHECK-THUMB2-NEXT: ldr.w r12, [sp]273; CHECK-THUMB2-NEXT: movs r1, #0274; CHECK-THUMB2-NEXT: ldr r0, [sp, #4]275; CHECK-THUMB2-NEXT: subs.w r2, r2, r12276; CHECK-THUMB2-NEXT: sbcs.w r0, r3, r0277; CHECK-THUMB2-NEXT: mov.w r0, #0278; CHECK-THUMB2-NEXT: ite lt279; CHECK-THUMB2-NEXT: movlt r0, #1280; CHECK-THUMB2-NEXT: movge r1, #1281; CHECK-THUMB2-NEXT: bx lr282entry:283 %cmp = icmp slt i64 %a, %b284 %not = xor i1 %cmp, true285 %r1 = zext i1 %cmp to i32286 %r2 = zext i1 %not to i32287 %z = insertvalue { i32, i32 } undef, i32 %r1, 0288 %z2 = insertvalue { i32, i32 } %z, i32 %r2, 1289 ret { i32, i32 } %z2290}291