219 lines · plain
1; RUN: llc < %s | FileCheck %s2 3target datalayout = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16-a0:16:16"4target triple = "msp430---elf"5 6define void @test() #0 {7entry:8; CHECK: test:9 10; CHECK: mov #1, r1211; CHECK: call #f_i1612 call void @f_i16(i16 1)13 14; CHECK: mov #772, r1215; CHECK: mov #258, r1316; CHECK: call #f_i3217 call void @f_i32(i32 16909060)18 19; CHECK: mov #1800, r1220; CHECK: mov #1286, r1321; CHECK: mov #772, r1422; CHECK: mov #258, r1523; CHECK: call #f_i6424 call void @f_i64(i64 72623859790382856)25 26; CHECK: mov #772, r1227; CHECK: mov #258, r1328; CHECK: mov #1800, r1429; CHECK: mov #1286, r1530; CHECK: call #f_i32_i3231 call void @f_i32_i32(i32 16909060, i32 84281096)32 33; CHECK: mov #1, r1234; CHECK: mov #772, r1335; CHECK: mov #258, r1436; CHECK: mov #2, r1537; CHECK: call #f_i16_i32_i1638 call void @f_i16_i32_i16(i16 1, i32 16909060, i16 2)39 40; CHECK: mov #1286, 0(r1)41; CHECK: mov #1, r1242; CHECK: mov #772, r1343; CHECK: mov #258, r1444; CHECK: mov #1800, r1545; CHECK: call #f_i16_i32_i3246 call void @f_i16_i32_i32(i16 1, i32 16909060, i32 84281096)47 48; CHECK: mov #258, 6(r1)49; CHECK: mov #772, 4(r1)50; CHECK: mov #1286, 2(r1)51; CHECK: mov #1800, 0(r1)52; CHECK: mov #1, r1253; CHECK: mov #2, r1354; CHECK: call #f_i16_i64_i1655 call void @f_i16_i64_i16(i16 1, i64 72623859790382856, i16 2)56 57; Check that r15 is not used and the last i32 argument passed through the stack.58; CHECK: mov #258, 10(r1)59; CHECK: mov #772, 8(r1)60; CHECK: mov #258, 6(r1)61; CHECK: mov #772, 4(r1)62; CHECK: mov #1286, 2(r1)63; CHECK: mov #1800, 0(r1)64; CHECK: mov #1, r1265; CHECK: mov #772, r1366; CHECK: mov #258, r1467 call void @f_i16_i64_i32_i32(i16 1, i64 72623859790382856, i32 16909060, i32 16909060)68 69; CHECK: mov #258, 6(r1)70; CHECK: mov #772, 4(r1)71; CHECK: mov #1286, 2(r1)72; CHECK: mov #1800, 0(r1)73; CHECK: mov #1800, r1274; CHECK: mov #1286, r1375; CHECK: mov #772, r1476; CHECK: mov #258, r1577; CHECK: call #f_i64_i6478 call void @f_i64_i64(i64 72623859790382856, i64 72623859790382856)79 80 ret void81}82 83@g_i16 = common global i16 0, align 284@g_i32 = common global i32 0, align 285@g_i64 = common global i64 0, align 286 87define void @f_i16(i16 %a) #0 {88; CHECK: f_i16:89; CHECK: mov r12, &g_i1690 store volatile i16 %a, ptr @g_i16, align 291 ret void92}93 94define void @f_i32(i32 %a) #0 {95; CHECK: f_i32:96; CHECK: mov r13, &g_i32+297; CHECK: mov r12, &g_i3298 store volatile i32 %a, ptr @g_i32, align 299 ret void100}101 102define void @f_i64(i64 %a) #0 {103; CHECK: f_i64:104; CHECK: mov r15, &g_i64+6105; CHECK: mov r14, &g_i64+4106; CHECK: mov r13, &g_i64+2107; CHECK: mov r12, &g_i64108 store volatile i64 %a, ptr @g_i64, align 2109 ret void110}111 112define void @f_i32_i32(i32 %a, i32 %b) #0 {113; CHECK: f_i32_i32:114; CHECK: mov r13, &g_i32+2115; CHECK: mov r12, &g_i32116 store volatile i32 %a, ptr @g_i32, align 2117; CHECK: mov r15, &g_i32+2118; CHECK: mov r14, &g_i32119 store volatile i32 %b, ptr @g_i32, align 2120 ret void121}122 123define void @f_i16_i32_i32(i16 %a, i32 %b, i32 %c) #0 {124; CHECK: f_i16_i32_i32:125; CHECK: mov r12, &g_i16126 store volatile i16 %a, ptr @g_i16, align 2127; CHECK: mov r14, &g_i32+2128; CHECK: mov r13, &g_i32129 store volatile i32 %b, ptr @g_i32, align 2130; CHECK: mov r15, &g_i32131; CHECK: mov 4(r4), &g_i32+2132 store volatile i32 %c, ptr @g_i32, align 2133 ret void134}135 136define void @f_i16_i32_i16(i16 %a, i32 %b, i16 %c) #0 {137; CHECK: f_i16_i32_i16:138; CHECK: mov r12, &g_i16139 store volatile i16 %a, ptr @g_i16, align 2140; CHECK: mov r14, &g_i32+2141; CHECK: mov r13, &g_i32142 store volatile i32 %b, ptr @g_i32, align 2143; CHECK: mov r15, &g_i16144 store volatile i16 %c, ptr @g_i16, align 2145 ret void146}147 148define void @f_i16_i64_i16(i16 %a, i64 %b, i16 %c) #0 {149; CHECK: f_i16_i64_i16:150; CHECK: mov r12, &g_i16151 store volatile i16 %a, ptr @g_i16, align 2152;CHECK: mov 10(r4), &g_i64+6153;CHECK: mov 8(r4), &g_i64+4154;CHECK: mov 6(r4), &g_i64+2155;CHECK: mov 4(r4), &g_i64156 store volatile i64 %b, ptr @g_i64, align 2157;CHECK: mov r13, &g_i16158 store volatile i16 %c, ptr @g_i16, align 2159 ret void160}161 162define void @f_i64_i64(i64 %a, i64 %b) #0 {163; CHECK: f_i64_i64:164; CHECK: mov r15, &g_i64+6165; CHECK: mov r14, &g_i64+4166; CHECK: mov r13, &g_i64+2167; CHECK: mov r12, &g_i64168 store volatile i64 %a, ptr @g_i64, align 2169; CHECK-DAG: mov 10(r4), &g_i64+6170; CHECK-DAG: mov 8(r4), &g_i64+4171; CHECK-DAG: mov 6(r4), &g_i64+2172; CHECK-DAG: mov 4(r4), &g_i64173 store volatile i64 %b, ptr @g_i64, align 2174 ret void175}176 177define void @f_i16_i64_i32_i32(i16 %a, i64 %b, i32 %c, i32 %d) #0 {178; CHECK-LABEL: f_i16_i64_i32_i32:179; CHECK: mov r12, &g_i16180 store volatile i16 %a, ptr @g_i16, align 2181; CHECK: mov 10(r4), &g_i64+6182; CHECK: mov 8(r4), &g_i64+4183; CHECK: mov 6(r4), &g_i64+2184; CHECK: mov 4(r4), &g_i64185 store volatile i64 %b, ptr @g_i64, align 2186; CHECK: mov r14, &g_i32+2187; CHECK: mov r13, &g_i32188 store volatile i32 %c, ptr @g_i32, align 2189; CHECK: mov 14(r4), &g_i32+2190; CHECK: mov 12(r4), &g_i32191 store volatile i32 %d, ptr @g_i32, align 2192 ret void193}194; MSP430 EABI p. 6.3195; For helper functions which take two long long arguments196; the first argument is passed in R8::R11 and the second argument197; is in R12::R15.198 199@g_i64_2 = common global i64 0, align 2200 201define i64 @helper_call_i64() #0 {202 %1 = load i64, ptr @g_i64, align 2203 %2 = load i64, ptr @g_i64_2, align 2204; CHECK-LABEL: helper_call_i64:205; CHECK: mov &g_i64, r8206; CHECK: mov &g_i64+2, r9207; CHECK: mov &g_i64+4, r10208; CHECK: mov &g_i64+6, r11209; CHECK: mov &g_i64_2, r12210; CHECK: mov &g_i64_2+2, r13211; CHECK: mov &g_i64_2+4, r14212; CHECK: mov &g_i64_2+6, r15213; CHECK: call #__mspabi_divlli214 %3 = sdiv i64 %1, %2215 ret i64 %3216}217 218attributes #0 = { nounwind "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }219