diff options
Diffstat (limited to 'test/CodeGen/ARM/Windows')
-rw-r--r-- | test/CodeGen/ARM/Windows/chkstk-movw-movt-isel.ll | 27 | ||||
-rw-r--r-- | test/CodeGen/ARM/Windows/chkstk.ll | 24 | ||||
-rw-r--r-- | test/CodeGen/ARM/Windows/frame-register.ll | 22 | ||||
-rw-r--r-- | test/CodeGen/ARM/Windows/integer-floating-point-conversion.ll | 74 | ||||
-rw-r--r-- | test/CodeGen/ARM/Windows/memset.ll | 18 | ||||
-rw-r--r-- | test/CodeGen/ARM/Windows/mov32t-bundling.ll | 28 | ||||
-rw-r--r-- | test/CodeGen/ARM/Windows/movw-movt-relocations.ll | 27 | ||||
-rw-r--r-- | test/CodeGen/ARM/Windows/no-aeabi.ll | 22 | ||||
-rw-r--r-- | test/CodeGen/ARM/Windows/pic.ll | 16 | ||||
-rw-r--r-- | test/CodeGen/ARM/Windows/read-only-data.ll | 15 |
10 files changed, 273 insertions, 0 deletions
diff --git a/test/CodeGen/ARM/Windows/chkstk-movw-movt-isel.ll b/test/CodeGen/ARM/Windows/chkstk-movw-movt-isel.ll new file mode 100644 index 0000000..a82f614 --- /dev/null +++ b/test/CodeGen/ARM/Windows/chkstk-movw-movt-isel.ll @@ -0,0 +1,27 @@ +; RUN: llc -mtriple thumbv7--windows-itanium -code-model large -filetype obj -o - %s \ +; RUN: | llvm-objdump -no-show-raw-insn -d - | FileCheck %s + +; ModuleID = 'reduced.c' +target datalayout = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "thumbv7--windows-itanium" + +define arm_aapcs_vfpcc i8 @isel(i32 %i) { +entry: + %i.addr = alloca i32, align 4 + %buffer = alloca [4096 x i8], align 1 + store i32 %i, i32* %i.addr, align 4 + %0 = load i32* %i.addr, align 4 + %rem = urem i32 %0, 4096 + %arrayidx = getelementptr inbounds [4096 x i8]* %buffer, i32 0, i32 %rem + %1 = load volatile i8* %arrayidx, align 1 + ret i8 %1 +} + +; CHECK-LABEL: isel +; CHECK: push {r4, r5} +; CHECK: movw r4, #{{\d*}} +; CHECK: movw r12, #0 +; CHECK: movt r12, #0 +; CHECK: blx r12 +; CHECK: sub.w sp, sp, r4 + diff --git a/test/CodeGen/ARM/Windows/chkstk.ll b/test/CodeGen/ARM/Windows/chkstk.ll new file mode 100644 index 0000000..cb787e1 --- /dev/null +++ b/test/CodeGen/ARM/Windows/chkstk.ll @@ -0,0 +1,24 @@ +; RUN: llc -mtriple=thumbv7-windows -mcpu=cortex-a9 %s -o - \ +; RUN: | FileCheck -check-prefix CHECK-DEFAULT-CODE-MODEL %s + +; RUN: llc -mtriple=thumbv7-windows -mcpu=cortex-a9 -code-model=large %s -o - \ +; RUN: | FileCheck -check-prefix CHECK-LARGE-CODE-MODEL %s + +define arm_aapcs_vfpcc void @check_watermark() { +entry: + %buffer = alloca [4096 x i8], align 1 + ret void +} + +; CHECK-DEFAULT-CODE-MODEL: check_watermark: +; CHECK-DEFAULT-CODE-MODEL: movw r4, #1024 +; CHECK-DEFAULT-CODE-MODEL: bl __chkstk +; CHECK-DEFAULT-CODE-MODEL: sub.w sp, sp, r4 + +; CHECK-LARGE-CODE-MODEL: check_watermark: +; CHECK-LARGE-CODE-MODEL: movw r12, :lower16:__chkstk +; CHECK-LARGE-CODE-MODEL: movt r12, :upper16:__chkstk +; CHECK-LARGE-CODE-MODEL: movw r4, #1024 +; CHECK-LARGE-CODE-MODEL: blx r12 +; CHECK-LARGE-CODE-MODEL: sub.w sp, sp, r4 + diff --git a/test/CodeGen/ARM/Windows/frame-register.ll b/test/CodeGen/ARM/Windows/frame-register.ll new file mode 100644 index 0000000..31167d7 --- /dev/null +++ b/test/CodeGen/ARM/Windows/frame-register.ll @@ -0,0 +1,22 @@ +; RUN: llc -mtriple thumbv7-windows -disable-fp-elim -filetype asm -o - %s \ +; RUN: | FileCheck %s + +declare void @callee(i32) + +define i32 @calleer(i32 %i) { +entry: + %i.addr = alloca i32, align 4 + %j = alloca i32, align 4 + store i32 %i, i32* %i.addr, align 4 + %0 = load i32* %i.addr, align 4 + %add = add nsw i32 %0, 1 + store i32 %add, i32* %j, align 4 + %1 = load i32* %j, align 4 + call void @callee(i32 %1) + %2 = load i32* %j, align 4 + %add1 = add nsw i32 %2, 1 + ret i32 %add1 +} + +; CHECK: push.w {r11, lr} + diff --git a/test/CodeGen/ARM/Windows/integer-floating-point-conversion.ll b/test/CodeGen/ARM/Windows/integer-floating-point-conversion.ll new file mode 100644 index 0000000..acf21a1 --- /dev/null +++ b/test/CodeGen/ARM/Windows/integer-floating-point-conversion.ll @@ -0,0 +1,74 @@ +; RUN: llc -mtriple thumbv7-windows -filetype asm -o - %s | FileCheck %s + +define arm_aapcs_vfpcc i64 @stoi64(float %f) { +entry: + %conv = fptosi float %f to i64 + ret i64 %conv +} + +; CHECK-LABEL: stoi64 +; CHECK: bl __stoi64 + +define arm_aapcs_vfpcc i64 @stou64(float %f) { +entry: + %conv = fptoui float %f to i64 + ret i64 %conv +} + +; CHECK-LABEL: stou64 +; CHECK: bl __stou64 + +define arm_aapcs_vfpcc float @i64tos(i64 %i64) { +entry: + %conv = sitofp i64 %i64 to float + ret float %conv +} + +; CHECK-LABEL: i64tos +; CHECK: bl __i64tos + +define arm_aapcs_vfpcc float @u64tos(i64 %u64) { +entry: + %conv = uitofp i64 %u64 to float + ret float %conv +} + +; CHECK-LABEL: u64tos +; CHECK: bl __u64tos + +define arm_aapcs_vfpcc i64 @dtoi64(double %d) { +entry: + %conv = fptosi double %d to i64 + ret i64 %conv +} + +; CHECK-LABEL: dtoi64 +; CHECK: bl __dtoi64 + +define arm_aapcs_vfpcc i64 @dtou64(double %d) { +entry: + %conv = fptoui double %d to i64 + ret i64 %conv +} + +; CHECK-LABEL: dtou64 +; CHECK: bl __dtou64 + +define arm_aapcs_vfpcc double @i64tod(i64 %i64) { +entry: + %conv = sitofp i64 %i64 to double + ret double %conv +} + +; CHECK-LABEL: i64tod +; CHECK: bl __i64tod + +define arm_aapcs_vfpcc double @u64tod(i64 %i64) { +entry: + %conv = uitofp i64 %i64 to double + ret double %conv +} + +; CHECK-LABEL: u64tod +; CHECK: bl __u64tod + diff --git a/test/CodeGen/ARM/Windows/memset.ll b/test/CodeGen/ARM/Windows/memset.ll new file mode 100644 index 0000000..500e25e --- /dev/null +++ b/test/CodeGen/ARM/Windows/memset.ll @@ -0,0 +1,18 @@ +; RUN: llc -mtriple thumbv7--windows-itanium -filetype asm -o - %s | FileCheck %s + +@source = common global [512 x i8] zeroinitializer, align 4 + +declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind + +define void @function() { +entry: + call void @llvm.memset.p0i8.i32(i8* bitcast ([512 x i8]* @source to i8*), i8 0, i32 512, i32 0, i1 false) + unreachable +} + +; CHECK: movw r0, :lower16:source +; CHECK: movt r0, :upper16:source +; CHECK: movs r1, #0 +; CHECK: mov.w r2, #512 +; CHECK: memset + diff --git a/test/CodeGen/ARM/Windows/mov32t-bundling.ll b/test/CodeGen/ARM/Windows/mov32t-bundling.ll new file mode 100644 index 0000000..5f83837 --- /dev/null +++ b/test/CodeGen/ARM/Windows/mov32t-bundling.ll @@ -0,0 +1,28 @@ +; RUN: llc -mtriple thumbv7-windows-itanium -filetype asm -o - %s | FileCheck %s + +@_begin = external global i8 +@_end = external global i8 + +declare arm_aapcs_vfpcc void @force_emission() + +define arm_aapcs_vfpcc void @bundle() { +entry: + br i1 icmp uge (i32 sub (i32 ptrtoint (i8* @_end to i32), i32 ptrtoint (i8* @_begin to i32)), i32 4), label %if.then, label %if.end + +if.then: + tail call arm_aapcs_vfpcc void @force_emission() + br label %if.end + +if.end: + ret void +} + +; CHECK-LABEL: bundle +; CHECK-NOT: subs r0, r1, r0 +; CHECK: movw r0, :lower16:_begin +; CHECK-NEXT: movt r0, :upper16:_begin +; CHECK-NEXT: movw r1, :lower16:_end +; CHECK-NEXT: movt r1, :upper16:_end +; CHECK-NEXT: subs r0, r1, r0 +; CHECK-NEXT: cmp r0, #4 + diff --git a/test/CodeGen/ARM/Windows/movw-movt-relocations.ll b/test/CodeGen/ARM/Windows/movw-movt-relocations.ll new file mode 100644 index 0000000..3ae6428 --- /dev/null +++ b/test/CodeGen/ARM/Windows/movw-movt-relocations.ll @@ -0,0 +1,27 @@ +; RUN: llc -mtriple=thumbv7-windows -o - %s \ +; RUN: | FileCheck %s -check-prefix CHECK-WINDOWS + +; RUN: llc -mtriple=thumbv7-eabi -o - %s \ +; RUN: | FileCheck %s -check-prefix CHECK-EABI + +@i = common global i32 0, align 4 +@j = common global i32 0, align 4 + +; Function Attrs: nounwind optsize readonly +define i32 @relocation(i32 %j, i32 %k) { +entry: + %0 = load i32* @i, align 4 + %1 = load i32* @j, align 4 + %add = add nsw i32 %1, %0 + ret i32 %add +} + +; CHECK-WINDOWS: movw r[[i:[0-4]]], :lower16:i +; CHECK-WINDOWS-NEXT: movt r[[i]], :upper16:i +; CHECK-WINDOWS: movw r[[j:[0-4]]], :lower16:j +; CHECK-WINDOWS-NEXT: movt r[[j]], :upper16:j + +; CHECK-EABI: movw r[[i:[0-4]]], :lower16:i +; CHECK-EABI: movw r[[j:[0-4]]], :lower16:j +; CHECK-EABI-NEXT: movt r[[i]], :upper16:i +; CHECK-EABI-NEXT: movt r[[j]], :upper16:j diff --git a/test/CodeGen/ARM/Windows/no-aeabi.ll b/test/CodeGen/ARM/Windows/no-aeabi.ll index 4c6676f..3971b9c 100644 --- a/test/CodeGen/ARM/Windows/no-aeabi.ll +++ b/test/CodeGen/ARM/Windows/no-aeabi.ll @@ -1,5 +1,27 @@ ; RUN: llc -mtriple=thumbv7-windows-itanium -mcpu=cortex-a9 -o - %s | FileCheck %s +declare void @llvm.memmove.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind +declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind + +@source = common global [512 x i8] zeroinitializer, align 4 +@target = common global [512 x i8] zeroinitializer, align 4 + +define void @move() nounwind { +entry: + call void @llvm.memmove.p0i8.p0i8.i32(i8* bitcast ([512 x i8]* @target to i8*), i8* bitcast ([512 x i8]* @source to i8*), i32 512, i32 0, i1 false) + unreachable +} + +; CHECK-NOT: __aeabi_memmove + +define void @copy() nounwind { +entry: + call void @llvm.memcpy.p0i8.p0i8.i32(i8* bitcast ([512 x i8]* @target to i8*), i8* bitcast ([512 x i8]* @source to i8*), i32 512, i32 0, i1 false) + unreachable +} + +; CHECK-NOT: __aeabi_memcpy + define i32 @divide(i32 %i, i32 %j) nounwind { entry: %quotient = sdiv i32 %i, %j diff --git a/test/CodeGen/ARM/Windows/pic.ll b/test/CodeGen/ARM/Windows/pic.ll new file mode 100644 index 0000000..28d371f --- /dev/null +++ b/test/CodeGen/ARM/Windows/pic.ll @@ -0,0 +1,16 @@ +; RUN: llc -mtriple thumbv7-windows-itanium -relocation-model pic -filetype asm -o - %s \ +; RUN: | FileCheck %s + +@external = external global i8 + +define arm_aapcs_vfpcc i8 @return_external() { +entry: + %0 = load i8* @external, align 1 + ret i8 %0 +} + +; CHECK-LABEL: return_external +; CHECK: movw r0, :lower16:external +; CHECK: movt r0, :upper16:external +; CHECK: ldrb r0, [r0] + diff --git a/test/CodeGen/ARM/Windows/read-only-data.ll b/test/CodeGen/ARM/Windows/read-only-data.ll new file mode 100644 index 0000000..0ccb5ed --- /dev/null +++ b/test/CodeGen/ARM/Windows/read-only-data.ll @@ -0,0 +1,15 @@ +; RUN: llc -mtriple thumbv7-windows -filetype asm -o - %s | FileCheck %s + +@.str = private unnamed_addr constant [7 x i8] c"string\00", align 1 + +declare arm_aapcs_vfpcc void @callee(i8*) + +define arm_aapcs_vfpcc void @function() { +entry: + call arm_aapcs_vfpcc void @callee(i8* getelementptr inbounds ([7 x i8]* @.str, i32 0, i32 0)) + ret void +} + +; CHECK: .section .rdata,"rd" +; CHECK-NOT: .section ".rodata.str1.1" + |