brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · e2559d4 Raw
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