243 lines · plain
1; RUN: llc -mtriple=thumb-eabi %s -verify-machineinstrs -o - | \2; RUN: FileCheck %s -check-prefix CHECK --check-prefix CHECK-EABI3; RUN: llc -mtriple=thumb-apple-darwin %s -verify-machineinstrs -o - | \4; RUN: FileCheck %s -check-prefix CHECK -check-prefix CHECK-DARWIN5 6define i64 @f1() {7entry:8 ret i64 09; CHECK-LABEL: f1:10; CHECK: movs r0, #011; CHECK: movs r1, r012}13 14define i64 @f2() {15entry:16 ret i64 117; CHECK-LABEL: f2:18; CHECK: movs r0, #119; CHECK: movs r1, #020}21 22define i64 @f3() {23entry:24 ret i64 214748364725; CHECK-LABEL: f3:26; CHECK: ldr r0,27; CHECK: movs r1, #028}29 30define i64 @f4() {31entry:32 ret i64 214748364833; CHECK-LABEL: f4:34; CHECK: movs r0, #135; CHECK: lsls r0, r0, #3136; CHECK: movs r1, #037}38 39define i64 @f5() {40entry:41 ret i64 922337203685477580742; CHECK-LABEL: f5:43; CHECK: movs r0, #044; CHECK: mvns r0, r045; CHECK: ldr r1,46}47 48define i64 @f6(i64 %x, i64 %y) {49entry:50 %tmp1 = add i64 %y, 1 ; <i64> [#uses=1]51 ret i64 %tmp152; CHECK-LABEL: f6:53; CHECK: movs r1, #054; CHECK: adds r0, r2, #155; CHECK: adcs r1, r356}57 58define i64 @f6a(i64 %x, i64 %y) {59entry:60 %tmp1 = add i64 %y, 1061 ret i64 %tmp162; CHECK-LABEL: f6a:63; CHECK: movs r0, r264; CHECK: movs r1, #065; CHECK: adds r0, #1066; CHECK: adcs r1, r367}68 69define i64 @f6b(i64 %x, i64 %y) {70entry:71 %tmp1 = add i64 %y, 100072 ret i64 %tmp173; CHECK-LABEL: f6b:74; CHECK: movs r0, #12575; CHECK: lsls r0, r0, #376; CHECK: movs r1, #077; CHECK: adds r0, r2, r078; CHECK: adcs r1, r379}80 81define void @f7() {82entry:83 %tmp = call i64 @f8( ) ; <i64> [#uses=0]84 ret void85; CHECK-LABEL: f7:86; CHECK: bl87}88 89declare i64 @f8()90 91define i64 @f9(i64 %a, i64 %b) {92entry:93 %tmp = sub i64 %a, %b ; <i64> [#uses=1]94 ret i64 %tmp95; CHECK-LABEL: f9:96; CHECK: subs r0, r0, r297; CHECK: sbcs r1, r398}99 100define i64 @f9a(i64 %x, i64 %y) { ; ADDC with small negative imm => SUBS imm101entry:102 %tmp1 = sub i64 %y, 10103 ret i64 %tmp1104; CHECK-LABEL: f9a:105; CHECK: movs r1, r3106; CHECK: movs r0, r2107; CHECK: movs r2, #0108; CHECK: subs r0, #10109; CHECK: sbcs r1, r2110}111 112define i64 @f9b(i64 %x, i64 %y) { ; ADDC with big negative imm => SUBS reg113entry:114 %tmp1 = sub i64 1000, %y115 ret i64 %tmp1116; CHECK-LABEL: f9b:117; CHECK: movs r0, #125118; CHECK: lsls r0, r0, #3119; CHECK: movs r1, #0120; CHECK: subs r0, r0, r2121; CHECK: sbcs r1, r3122}123 124define i64 @f9c(i64 %x, i32 %y) { ; SUBS with small positive imm => SUBS imm125entry:126 %conv = sext i32 %y to i64127 %shl = shl i64 %conv, 32128 %or = or i64 %shl, 1129 %sub = sub nsw i64 %x, %or130 ret i64 %sub131; CHECK-LABEL: f9c:132; CHECK: subs r0, r0, #1133; CHECK: sbcs r1, r2134}135 136define i64 @f9d(i64 %x, i32 %y) { ; SUBS with small negative imm => ADDS imm137entry:138 %conv = sext i32 %y to i64139 %shl = shl i64 %conv, 32140 %or = or i64 %shl, 4294967295141 %sub = sub nsw i64 %x, %or142 ret i64 %sub143; CHECK-LABEL: f9d:144; CHECK: adds r0, r0, #1145; CHECK: sbcs r1, r2146}147 148define i64 @f(i32 %a, i32 %b) {149entry:150 %tmp = sext i32 %a to i64 ; <i64> [#uses=1]151 %tmp1 = sext i32 %b to i64 ; <i64> [#uses=1]152 %tmp2 = mul i64 %tmp1, %tmp ; <i64> [#uses=1]153 ret i64 %tmp2154; CHECK-LABEL: f:155; CHECK-V6: bl __aeabi_lmul156; CHECK-DARWIN: __muldi3157}158 159define i64 @g(i32 %a, i32 %b) {160entry:161 %tmp = zext i32 %a to i64 ; <i64> [#uses=1]162 %tmp1 = zext i32 %b to i64 ; <i64> [#uses=1]163 %tmp2 = mul i64 %tmp1, %tmp ; <i64> [#uses=1]164 ret i64 %tmp2165; CHECK-LABEL: g:166; CHECK-V6: bl __aeabi_lmul167; CHECK-DARWIN: __muldi3168}169 170define i64 @f10() {171entry:172 %a = alloca i64, align 8 ; <ptr> [#uses=1]173 %retval = load i64, ptr %a ; <i64> [#uses=1]174 ret i64 %retval175; CHECK-LABEL: f10:176; CHECK-EABI: sub sp, #8177; CHECK-DARWIN: add r7, sp, #4178; CHECK: ldr r0, [sp]179; CHECK: ldr r1, [sp, #4]180; CHECK-EABI: add sp, #8181; CHECK-DARWIN: mov sp, r4182}183 184define i64 @f11(i64 %x, i64 %y) {185entry:186 %tmp1 = add i64 -1000, %y187 %tmp2 = add i64 %tmp1, -1000188 ret i64 %tmp2189; CHECK-LABEL: f11:190; CHECK: movs r1, r3191; CHECK: movs r0, #125192; CHECK: lsls r0, r0, #3193; CHECK: movs r3, #0194; CHECK: subs r2, r2, r0195; CHECK: sbcs r1, r3196; CHECK: subs r0, r2, r0197; CHECK: sbcs r1, r3198}199 200; "sub 2147483648" has to be lowered into "add -2147483648"201define i64 @f12(i64 %x, i64 %y) {202entry:203 %tmp1 = sub i64 %x, 2147483648204 ret i64 %tmp1205; CHECK-LABEL: f12:206; CHECK: movs r2, #1207; CHECK: lsls r2, r2, #31208; CHECK: movs r3, #0209; CHECK: adds r0, r0, r2210; CHECK: sbcs r1, r3211}212 213declare void @f13(i64 %x)214 215define void @f14(i1 %x, i64 %y) #0 {216; CHECK-LABEL: f14:217entry:218 %a = add i64 %y, 47219 call void @f13(i64 %a)220; CHECK: bl221 br i1 %x, label %if.end, label %if.then222 223if.then:224 call void @f13(i64 %y)225; CHECK: bl226 br label %if.end227 228if.end:229 %b = add i64 %y, 45230 call void @f13(i64 %b)231; CHECK: adds232; CHECK: adcs233; CHECK: bl234 %c = add i64 %y, 47235 call void @f13(i64 %c)236; CHECK: adds237; CHECK-NEXT: adcs238; CHECK: bl239 ret void240}241 242attributes #0 = { optsize }243