| |
| ; RUN: not llc < %s -march=xcore -code-model=medium 2>&1 | FileCheck %s -check-prefix=BAD_CM |
| ; RUN: not llc < %s -march=xcore -code-model=kernel 2>&1 | FileCheck %s -check-prefix=BAD_CM |
| ; RUN: not llc < %s -march=xcore -code-model=tiny 2>&1 | FileCheck %s -check-prefix=BAD_CM |
| ; BAD_CM: Target only supports CodeModel Small or Large |
| |
| |
| ; RUN: llc < %s -march=xcore | FileCheck %s |
| ; RUN: llc < %s -march=xcore -code-model=small | FileCheck %s |
| ; RUN: llc < %s -march=xcore -code-model=large | FileCheck %s -check-prefix=LARGE |
| |
| |
| ; CHECK-LABEL: test: |
| ; CHECK: zext r0, 1 |
| ; CHECK: bt r0, [[JUMP:.LBB[0-9_]*]] |
| ; CHECK: ldaw r0, dp[A2] |
| ; CHECK: retsp 0 |
| ; CHECK: [[JUMP]] |
| ; CHECK: ldaw r0, dp[A1] |
| ; CHECK: retsp 0 |
| ; LARGE-LABEL: test: |
| ; LARGE: zext r0, 1 |
| ; LARGE: ldaw r11, cp[.LCPI{{[0-9_]*}}] |
| ; LARGE: mov r1, r11 |
| ; LARGE: ldaw r11, cp[.LCPI{{[0-9_]*}}] |
| ; LARGE: bt r0, [[JUMP:.LBB[0-9_]*]] |
| ; LARGE: mov r11, r1 |
| ; LARGE: [[JUMP]] |
| ; LARGE: ldw r0, r11[0] |
| ; LARGE: retsp 0 |
| @A1 = external global [50000 x i32] |
| @A2 = external global [50000 x i32] |
| define [50000 x i32]* @test(i1 %bool) nounwind { |
| entry: |
| %Addr = select i1 %bool, [50000 x i32]* @A1, [50000 x i32]* @A2 |
| ret [50000 x i32]* %Addr |
| } |
| |
| |
| ; CHECK: .section .cp.rodata.cst4,"aMc",@progbits,4 |
| ; CHECK: .long 65536 |
| ; CHECK: .text |
| ; CHECK-LABEL: f: |
| ; CHECK: ldc r1, 65532 |
| ; CHECK: add r1, r0, r1 |
| ; CHECK: ldw r1, r1[0] |
| ; CHECK: ldw r2, cp[.LCPI{{[0-9_]*}}] |
| ; CHECK: add r0, r0, r2 |
| ; CHECK: ldw r0, r0[0] |
| ; CHECK: add r0, r1, r0 |
| ; CHECK: ldw r1, dp[l] |
| ; CHECK: add r0, r0, r1 |
| ; CHECK: ldw r1, dp[l+4] |
| ; CHECK: add r0, r0, r1 |
| ; CHECK: ldw r1, dp[l+392] |
| ; CHECK: add r0, r0, r1 |
| ; CHECK: ldw r1, dp[l+396] |
| ; CHECK: add r0, r0, r1 |
| ; CHECK: ldw r1, dp[s] |
| ; CHECK: add r0, r0, r1 |
| ; CHECK: ldw r1, dp[s+36] |
| ; CHECK: add r0, r0, r1 |
| ; CHECK: retsp 0 |
| ; |
| ; LARGE: .section .cp.rodata.cst4,"aMc",@progbits,4 |
| ; LARGE: .long 65536 |
| ; LARGE: .section .cp.rodata,"ac",@progbits |
| ; LARGE: .long l |
| ; LARGE: .long l+4 |
| ; LARGE: .long l+392 |
| ; LARGE: .long l+396 |
| ; LARGE: .text |
| ; LARGE-LABEL: f: |
| ; LARGE: ldc r1, 65532 |
| ; LARGE: add r1, r0, r1 |
| ; LARGE: ldw r1, r1[0] |
| ; LARGE: ldw r2, cp[.LCPI{{[0-9_]*}}] |
| ; LARGE: add r0, r0, r2 |
| ; LARGE: ldw r0, r0[0] |
| ; LARGE: add r0, r1, r0 |
| ; LARGE: ldw r1, cp[.LCPI{{[0-9_]*}}] |
| ; LARGE: ldw r1, r1[0] |
| ; LARGE: add r0, r0, r1 |
| ; LARGE: ldw r1, cp[.LCPI{{[0-9_]*}}] |
| ; LARGE: ldw r1, r1[0] |
| ; LARGE: add r0, r0, r1 |
| ; LARGE: ldw r1, cp[.LCPI{{[0-9_]*}}] |
| ; LARGE: ldw r1, r1[0] |
| ; LARGE: add r0, r0, r1 |
| ; LARGE: ldw r1, cp[.LCPI{{[0-9_]*}}] |
| ; LARGE: ldw r1, r1[0] |
| ; LARGE: add r0, r0, r1 |
| ; LARGE: ldw r1, dp[s] |
| ; LARGE: add r0, r0, r1 |
| ; LARGE: ldw r1, dp[s+36] |
| ; LARGE: add r0, r0, r1 |
| ; LARGE: retsp 0 |
| define i32 @f(i32* %i) { |
| entry: |
| %0 = getelementptr inbounds i32, i32* %i, i32 16383 |
| %1 = load i32, i32* %0 |
| %2 = getelementptr inbounds i32, i32* %i, i32 16384 |
| %3 = load i32, i32* %2 |
| %4 = add nsw i32 %1, %3 |
| %5 = load i32, i32* getelementptr inbounds ([100 x i32], [100 x i32]* @l, i32 0, i32 0) |
| %6 = add nsw i32 %4, %5 |
| %7 = load i32, i32* getelementptr inbounds ([100 x i32], [100 x i32]* @l, i32 0, i32 1) |
| %8 = add nsw i32 %6, %7 |
| %9 = load i32, i32* getelementptr inbounds ([100 x i32], [100 x i32]* @l, i32 0, i32 98) |
| %10 = add nsw i32 %8, %9 |
| %11 = load i32, i32* getelementptr inbounds ([100 x i32], [100 x i32]* @l, i32 0, i32 99) |
| %12 = add nsw i32 %10, %11 |
| %13 = load i32, i32* getelementptr inbounds ([10 x i32], [10 x i32]* @s, i32 0, i32 0) |
| %14 = add nsw i32 %12, %13 |
| %15 = load i32, i32* getelementptr inbounds ([10 x i32], [10 x i32]* @s, i32 0, i32 9) |
| %16 = add nsw i32 %14, %15 |
| ret i32 %16 |
| } |
| |
| |
| ; CHECK-LABEL: UnknownSize: |
| ; CHECK: ldw r0, dp[NoSize+40] |
| ; CHECK-NEXT: retsp 0 |
| ; |
| ; LARGE: .section .cp.rodata,"ac",@progbits |
| ; LARGE: .LCPI{{[0-9_]*}} |
| ; LARGE-NEXT: .long NoSize |
| ; LARGE-NEXT: .text |
| ; LARGE-LABEL: UnknownSize: |
| ; LARGE: ldw r0, cp[.LCPI{{[0-9_]*}}] |
| ; LARGE-NEXT: ldw r0, r0[0] |
| ; LARGE-NEXT: retsp 0 |
| @NoSize = external global [0 x i32] |
| define i32 @UnknownSize() nounwind { |
| entry: |
| %0 = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @NoSize, i32 0, i32 10) |
| ret i32 %0 |
| } |
| |
| |
| ; CHECK-LABEL: UnknownStruct: |
| ; CHECK: ldaw r0, dp[Unknown] |
| ; CHECK-NEXT: retsp 0 |
| ; |
| ; LARGE: .section .cp.rodata,"ac",@progbits |
| ; LARGE: .LCPI{{[0-9_]*}} |
| ; LARGE-NEXT: .long Unknown |
| ; LARGE-NEXT: .text |
| ; LARGE-LABEL: UnknownStruct: |
| ; LARGE: ldw r0, cp[.LCPI{{[0-9_]*}}] |
| ; LARGE-NEXT: retsp 0 |
| %Struct = type opaque |
| @Unknown = external global %Struct |
| define %Struct* @UnknownStruct() nounwind { |
| entry: |
| ret %Struct* @Unknown |
| } |
| |
| |
| ; CHECK: .section .dp.bss,"awd",@nobits |
| ; CHECK-LABEL: l: |
| ; CHECK: .space 400 |
| ; LARGE: .section .dp.bss.large,"awd",@nobits |
| ; LARGE-LABEL: l: |
| ; LARGE: .space 400 |
| @l = global [100 x i32] zeroinitializer |
| |
| ; CHECK-LABEL: s: |
| ; CHECK: .space 40 |
| ; LARGE: .section .dp.bss,"awd",@nobits |
| ; LARGE-LABEL: s: |
| ; LARGE: .space 40 |
| @s = global [10 x i32] zeroinitializer |
| |
| ; CHECK: .section .dp.rodata,"awd",@progbits |
| ; CHECK-LABEL: cl: |
| ; CHECK: .space 400 |
| ; LARGE: .section .dp.rodata.large,"awd",@progbits |
| ; LARGE-LABEL: cl: |
| ; LARGE: .space 400 |
| @cl = constant [100 x i32] zeroinitializer |
| |
| ; CHECK-LABEL: cs: |
| ; CHECK: .space 40 |
| ; LARGE: .section .dp.rodata,"awd",@progbits |
| ; LARGE-LABEL: cs: |
| ; LARGE: .space 40 |
| @cs = constant [10 x i32] zeroinitializer |
| |
| ; CHECK: .section .cp.rodata,"ac",@progbits |
| ; CHECK-LABEL: icl: |
| ; CHECK: .space 400 |
| ; LARGE: .section .cp.rodata.large,"ac",@progbits |
| ; LARGE-LABEL: icl: |
| ; LARGE: .space 400 |
| @icl = internal constant [100 x i32] zeroinitializer |
| |
| ; CHECK-LABEL: cs: |
| ; CHECK: .space 40 |
| ; LARGE: .section .cp.rodata,"ac",@progbits |
| ; LARGE-LABEL: cs: |
| ; LARGE: .space 40 |
| @ics = internal constant [10 x i32] zeroinitializer |
| |
| ; CHECK: .section .cp.namedsection,"ac",@progbits |
| ; CHECK-LABEL: cpsec: |
| ; CHECK: .long 0 |
| @cpsec = constant i32 0, section ".cp.namedsection" |
| |
| ; CHECK: .section .dp.namedsection,"awd",@progbits |
| ; CHECK-LABEL: dpsec: |
| ; CHECK: .long 0 |
| @dpsec = global i32 0, section ".dp.namedsection" |
| |