| ; RUN: llc -relocation-model=static -mtriple=armv7a--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM_RO_ABS --check-prefix=ARM_RW_ABS | |
| ; RUN: llc -relocation-model=ropi -mtriple=armv7a--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM_RO_PC --check-prefix=ARM_RW_ABS | |
| ; RUN: llc -relocation-model=rwpi -mtriple=armv7a--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM_RO_ABS --check-prefix=ARM_RW_SB | |
| ; RUN: llc -relocation-model=ropi-rwpi -mtriple=armv7a--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM_RO_PC --check-prefix=ARM_RW_SB | |
| ; RUN: llc -relocation-model=static -mtriple=thumbv7m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2_RO_ABS --check-prefix=THUMB2_RW_ABS | |
| ; RUN: llc -relocation-model=ropi -mtriple=thumbv7m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2_RO_PC --check-prefix=THUMB2_RW_ABS | |
| ; RUN: llc -relocation-model=rwpi -mtriple=thumbv7m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2_RO_ABS --check-prefix=THUMB2_RW_SB | |
| ; RUN: llc -relocation-model=ropi-rwpi -mtriple=thumbv7m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2_RO_PC --check-prefix=THUMB2_RW_SB | |
| ; RUN: llc -relocation-model=static -mtriple=thumbv6m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1_RO_ABS --check-prefix=THUMB1_RW_ABS | |
| ; RUN: llc -relocation-model=ropi -mtriple=thumbv6m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1_RO_PC --check-prefix=THUMB1_RW_ABS | |
| ; RUN: llc -relocation-model=rwpi -mtriple=thumbv6m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1_RO_ABS --check-prefix=THUMB1_RW_SB | |
| ; RUN: llc -relocation-model=ropi-rwpi -mtriple=thumbv6m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1_RO_PC --check-prefix=THUMB1_RW_SB | |
| ; RUN: llc -relocation-model=rwpi -mtriple=armv7a--none-eabi -mattr=no-movt < %s | FileCheck %s --check-prefix=CHECK --check-prefix=NO_MOVT_ARM_RO_ABS --check-prefix=NO_MOVT_ARM_RW_SB | |
| ; RUN: llc -relocation-model=ropi-rwpi -mtriple=armv7a--none-eabi -mattr=no-movt < %s | FileCheck %s --check-prefix=CHECK --check-prefix=NO_MOVT_ARM_RO_PC --check-prefix=NO_MOVT_ARM_RW_SB | |
| ; RUN: llc -relocation-model=rwpi -mtriple=thumbv7m--none-eabi -mattr=no-movt < %s | FileCheck %s --check-prefix=CHECK --check-prefix=NO_MOVT_THUMB2_RO_ABS --check-prefix=NO_MOVT_THUMB2_RW_SB | |
| ; RUN: llc -relocation-model=ropi-rwpi -mtriple=thumbv7m--none-eabi -mattr=no-movt < %s | FileCheck %s --check-prefix=CHECK --check-prefix=NO_MOVT_THUMB2_RO_PC --check-prefix=NO_MOVT_THUMB2_RW_SB | |
| target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" | |
| @a = external global i32, align 4 | |
| @b = external constant i32, align 4 | |
| @c0 = global i32 42, align 4 | |
| @c1 = alias i32, ptr @c0 | |
| @d0 = constant i32 42, align 4 | |
| @d1 = alias i32, ptr @d0 | |
| @take_addr_func_alias1 = alias ptr (), ptr @take_addr_func_alias | |
| define i32 @read() { | |
| entry: | |
| %0 = load i32, ptr @a, align 4 | |
| ret i32 %0 | |
| ; CHECK-LABEL: read: | |
| ; ARM_RW_ABS: movw r[[REG:[0-9]]], :lower16:a | |
| ; ARM_RW_ABS: movt r[[REG]], :upper16:a | |
| ; ARM_RW_ABS: ldr r0, [r[[REG]]] | |
| ; ARM_RW_SB: movw r[[REG:[0-9]]], :lower16:a(sbrel) | |
| ; ARM_RW_SB: movt r[[REG]], :upper16:a(sbrel) | |
| ; ARM_RW_SB: ldr r0, [r9, r[[REG]]] | |
| ; NO_MOVT_ARM_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_ARM_RW_SB: ldr r0, [r9, r[[REG]]] | |
| ; THUMB2_RW_ABS: movw r[[REG:[0-9]]], :lower16:a | |
| ; THUMB2_RW_ABS: movt r[[REG]], :upper16:a | |
| ; THUMB2_RW_ABS: ldr r0, [r[[REG]]] | |
| ; THUMB2_RW_SB: movw r[[REG:[0-9]]], :lower16:a(sbrel) | |
| ; THUMB2_RW_SB: movt r[[REG]], :upper16:a(sbrel) | |
| ; THUMB2_RW_SB: ldr.w r0, [r9, r[[REG]]] | |
| ; NO_MOVT_THUMB2_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_THUMB2_RW_SB: ldr.w r0, [r9, r[[REG]]] | |
| ; THUMB1_RW_ABS: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RW_ABS: ldr r0, [r[[REG]]] | |
| ; THUMB1_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RW_SB: mov r[[REG_SB:[0-9]+]], r9 | |
| ; THUMB1_RW_SB: ldr r0, [r[[REG_SB]], r[[REG]]] | |
| ; CHECK: {{(bx lr|pop)}} | |
| ; NO_MOVT_ARM_RW_SB: [[LCPI]] | |
| ; NO_MOVT_ARM_RW_SB: .long a(sbrel) | |
| ; NO_MOVT_THUMB2_RW_SB: [[LCPI]] | |
| ; NO_MOVT_THUMB2_RW_SB: .long a(sbrel) | |
| ; THUMB1_RW_ABS: [[LCPI]] | |
| ; THUMB1_RW_ABS-NEXT: .long a | |
| ; THUMB1_RW_SB: [[LCPI]] | |
| ; THUMB1_RW_SB: .long a(sbrel) | |
| } | |
| define void @write(i32 %v) { | |
| entry: | |
| store i32 %v, ptr @a, align 4 | |
| ret void | |
| ; CHECK-LABEL: write: | |
| ; ARM_RW_ABS: movw r[[REG:[0-9]]], :lower16:a | |
| ; ARM_RW_ABS: movt r[[REG]], :upper16:a | |
| ; ARM_RW_ABS: str r0, [r[[REG:[0-9]]]] | |
| ; ARM_RW_SB: movw r[[REG:[0-9]]], :lower16:a | |
| ; ARM_RW_SB: movt r[[REG]], :upper16:a | |
| ; ARM_RW_SB: str r0, [r9, r[[REG:[0-9]]]] | |
| ; NO_MOVT_ARM_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_ARM_RW_SB: str r0, [r9, r[[REG]]] | |
| ; THUMB2_RW_ABS: movw r[[REG:[0-9]]], :lower16:a | |
| ; THUMB2_RW_ABS: movt r[[REG]], :upper16:a | |
| ; THUMB2_RW_ABS: str r0, [r[[REG]]] | |
| ; THUMB2_RW_SB: movw r[[REG:[0-9]]], :lower16:a(sbrel) | |
| ; THUMB2_RW_SB: movt r[[REG]], :upper16:a(sbrel) | |
| ; THUMB2_RW_SB: str.w r0, [r9, r[[REG]]] | |
| ; NO_MOVT_THUMB2_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_THUMB2_RW_SB: str.w r0, [r9, r[[REG]]] | |
| ; THUMB1_RW_ABS: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RW_ABS: str r0, [r[[REG]]] | |
| ; THUMB1_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RW_SB: mov r[[REG_SB:[0-9]+]], r9 | |
| ; THUMB1_RW_SB: str r0, [r[[REG_SB]], r[[REG]]] | |
| ; CHECK: {{(bx lr|pop)}} | |
| ; NO_MOVT_ARM_RW_SB: [[LCPI]] | |
| ; NO_MOVT_ARM_RW_SB: .long a(sbrel) | |
| ; NO_MOVT_THUMB2_RW_SB: [[LCPI]] | |
| ; NO_MOVT_THUMB2_RW_SB: .long a(sbrel) | |
| ; THUMB1_RW_ABS: [[LCPI]] | |
| ; THUMB1_RW_ABS-NEXT: .long a | |
| ; THUMB1_RW_SB: [[LCPI]] | |
| ; THUMB1_RW_SB: .long a(sbrel) | |
| } | |
| define i32 @read_const() { | |
| entry: | |
| %0 = load i32, ptr @b, align 4 | |
| ret i32 %0 | |
| ; CHECK-LABEL: read_const: | |
| ; ARM_RO_ABS: movw r[[reg:[0-9]]], :lower16:b | |
| ; ARM_RO_ABS: movt r[[reg]], :upper16:b | |
| ; ARM_RO_ABS: ldr r0, [r[[reg]]] | |
| ; NO_MOVT_ARM_RO_ABS: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_ARM_RO_ABS: ldr r0, [r[[REG]]] | |
| ; ARM_RO_PC: movw r[[REG:[0-9]]], :lower16:(b-([[LPC:.LPC[0-9]+_[0-9]+]]+8)) | |
| ; ARM_RO_PC: movt r[[REG]], :upper16:(b-([[LPC]]+8)) | |
| ; ARM_RO_PC: [[LPC]]: | |
| ; ARM_RO_PC-NEXT: ldr r0, [pc, r[[REG]]] | |
| ; NO_MOVT_ARM_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_ARM_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: | |
| ; NO_MOVT_ARM_RO_PC: ldr r0, [pc, r[[REG]]] | |
| ; THUMB2_RO_ABS: movw r[[REG:[0-9]]], :lower16:b | |
| ; THUMB2_RO_ABS: movt r[[REG]], :upper16:b | |
| ; THUMB2_RO_ABS: ldr r0, [r[[REG]]] | |
| ; NO_MOVT_THUMB2_RO_ABS: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_THUMB2_RO_ABS: ldr r0, [r[[REG]]] | |
| ; THUMB2_RO_PC: movw r[[REG:[0-9]]], :lower16:(b-([[LPC:.LPC[0-9]+_[0-9]+]]+4)) | |
| ; THUMB2_RO_PC: movt r[[REG]], :upper16:(b-([[LPC]]+4)) | |
| ; THUMB2_RO_PC: [[LPC]]: | |
| ; THUMB2_RO_PC-NEXT: add r[[REG]], pc | |
| ; THUMB2_RO_PC: ldr r0, [r[[REG]]] | |
| ; NO_MOVT_THUMB2_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_THUMB2_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: | |
| ; NO_MOVT_THUMB2_RO_PC-NEXT: add r[[REG]], pc | |
| ; NO_MOVT_THUMB2_RO_PC: ldr r0, [r[[REG]]] | |
| ; THUMB1_RO_ABS: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RO_ABS: ldr r0, [r[[REG]]] | |
| ; THUMB1_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: | |
| ; THUMB1_RO_PC-NEXT: add r[[REG]], pc | |
| ; THUMB1_RO_PC: ldr r0, [r[[REG]]] | |
| ; CHECK: {{(bx lr|pop)}} | |
| ; NO_MOVT_ARM_RO_ABS: [[LCPI]] | |
| ; NO_MOVT_ARM_RO_ABS-NEXT: .long b | |
| ; NO_MOVT_THUMB2_RO_ABS: [[LCPI]] | |
| ; NO_MOVT_THUMB2_RO_ABS-NEXT: .long b | |
| ; THUMB1_RO_ABS: [[LCPI]] | |
| ; THUMB1_RO_ABS-NEXT: .long b | |
| ; NO_MOVT_ARM_RO_PC: [[LCPI]] | |
| ; NO_MOVT_ARM_RO_PC-NEXT: .long b-([[LPC]]+8) | |
| ; NO_MOVT_THUMB2_RO_PC: [[LCPI]] | |
| ; NO_MOVT_THUMB2_RO_PC-NEXT: .long b-([[LPC]]+4) | |
| ; THUMB1_RO_PC: [[LCPI]] | |
| ; THUMB1_RO_PC-NEXT: .long b-([[LPC]]+4) | |
| } | |
| define ptr @take_addr() { | |
| entry: | |
| ret ptr @a | |
| ; CHECK-LABEL: take_addr: | |
| ; ARM_RW_ABS: movw r[[REG:[0-9]]], :lower16:a | |
| ; ARM_RW_ABS: movt r[[REG]], :upper16:a | |
| ; ARM_RW_SB: movw r[[REG:[0-9]]], :lower16:a(sbrel) | |
| ; ARM_RW_SB: movt r[[REG]], :upper16:a(sbrel) | |
| ; ARM_RW_SB: add r0, r9, r[[REG]] | |
| ; NO_MOVT_ARM_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_ARM_RW_SB: add r0, r9, r[[REG]] | |
| ; THUMB2_RW_ABS: movw r[[REG:[0-9]]], :lower16:a | |
| ; THUMB2_RW_ABS: movt r[[REG]], :upper16:a | |
| ; THUMB2_RW_SB: movw r[[REG:[0-9]]], :lower16:a(sbrel) | |
| ; THUMB2_RW_SB: movt r[[REG]], :upper16:a(sbrel) | |
| ; THUMB2_RW_SB: add r0, r9 | |
| ; NO_MOVT_THUMB2_RW_SB: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_THUMB2_RW_SB: add r0, r9 | |
| ; THUMB1_RW_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RW_SB: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RW_SB: mov r[[REG_SB:[0-9]+]], r9 | |
| ; THUMB1_RW_SB: adds r[[REG]], r[[REG_SB]], r[[REG]] | |
| ; CHECK: {{(bx lr|pop)}} | |
| ; NO_MOVT_ARM_RW_SB: [[LCPI]] | |
| ; NO_MOVT_ARM_RW_SB: .long a(sbrel) | |
| ; NO_MOVT_THUMB2_RW_SB: [[LCPI]] | |
| ; NO_MOVT_THUMB2_RW_SB: .long a(sbrel) | |
| ; THUMB1_RW_ABS: [[LCPI]] | |
| ; THUMB1_RW_ABS-NEXT: .long a | |
| ; THUMB1_RW_SB: [[LCPI]] | |
| ; THUMB1_RW_SB: .long a(sbrel) | |
| } | |
| define ptr @take_addr_const() { | |
| entry: | |
| ret ptr @b | |
| ; CHECK-LABEL: take_addr_const: | |
| ; ARM_RO_ABS: movw r[[REG:[0-9]]], :lower16:b | |
| ; ARM_RO_ABS: movt r[[REG]], :upper16:b | |
| ; NO_MOVT_ARM_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; ARM_RO_PC: movw r[[REG:[0-9]]], :lower16:(b-([[LPC:.LPC[0-9]+_[0-9]+]]+8)) | |
| ; ARM_RO_PC: movt r[[REG]], :upper16:(b-([[LPC]]+8)) | |
| ; ARM_RO_PC: [[LPC]]: | |
| ; ARM_RO_PC-NEXT: add r0, pc, r[[REG:[0-9]]] | |
| ; NO_MOVT_ARM_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_ARM_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: | |
| ; NO_MOVT_ARM_RO_PC-NEXT: add r0, pc, r[[REG]] | |
| ; THUMB2_RO_ABS: movw r[[REG:[0-9]]], :lower16:b | |
| ; THUMB2_RO_ABS: movt r[[REG]], :upper16:b | |
| ; NO_MOVT_THUMB2_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB2_RO_PC: movw r0, :lower16:(b-([[LPC:.LPC[0-9]+_[0-9]+]]+4)) | |
| ; THUMB2_RO_PC: movt r0, :upper16:(b-([[LPC]]+4)) | |
| ; THUMB2_RO_PC: [[LPC]]: | |
| ; THUMB2_RO_PC-NEXT: add r0, pc | |
| ; NO_MOVT_THUMB2_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_THUMB2_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: | |
| ; NO_MOVT_THUMB2_RO_PC-NEXT: add r[[REG]], pc | |
| ; THUMB1_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: | |
| ; THUMB1_RO_PC-NEXT: add r[[REG]], pc | |
| ; CHECK: {{(bx lr|pop)}} | |
| ; NO_MOVT_ARM_RO_ABS: [[LCPI]] | |
| ; NO_MOVT_ARM_RO_ABS-NEXT: .long b | |
| ; NO_MOVT_THUMB2_RO_ABS: [[LCPI]] | |
| ; NO_MOVT_THUMB2_RO_ABS-NEXT: .long b | |
| ; THUMB1_RO_ABS: [[LCPI]] | |
| ; THUMB1_RO_ABS-NEXT: .long b | |
| ; NO_MOVT_ARM_RO_PC: [[LCPI]] | |
| ; NO_MOVT_ARM_RO_PC-NEXT: .long b-([[LPC]]+8) | |
| ; NO_MOVT_THUMB2_RO_PC: [[LCPI]] | |
| ; NO_MOVT_THUMB2_RO_PC-NEXT: .long b-([[LPC]]+4) | |
| ; THUMB1_RO_PC: [[LCPI]] | |
| ; THUMB1_RO_PC-NEXT: .long b-([[LPC]]+4) | |
| } | |
| define ptr @take_addr_func() { | |
| entry: | |
| ret ptr @take_addr_func | |
| ; CHECK-LABEL: take_addr_func: | |
| ; ARM_RO_ABS: movw r[[REG:[0-9]]], :lower16:take_addr_func | |
| ; ARM_RO_ABS: movt r[[REG]], :upper16:take_addr_func | |
| ; NO_MOVT_ARM_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; ARM_RO_PC: movw r[[REG:[0-9]]], :lower16:(take_addr_func-([[LPC:.LPC[0-9]+_[0-9]+]]+8)) | |
| ; ARM_RO_PC: movt r[[REG]], :upper16:(take_addr_func-([[LPC]]+8)) | |
| ; ARM_RO_PC: [[LPC]]: | |
| ; ARM_RO_PC-NEXT: add r0, pc, r[[REG:[0-9]]] | |
| ; NO_MOVT_ARM_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_ARM_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: | |
| ; NO_MOVT_ARM_RO_PC-NEXT: add r0, pc, r[[REG]] | |
| ; THUMB2_RO_ABS: movw r[[REG:[0-9]]], :lower16:take_addr_func | |
| ; THUMB2_RO_ABS: movt r[[REG]], :upper16:take_addr_func | |
| ; NO_MOVT_THUMB2_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB2_RO_PC: movw r0, :lower16:(take_addr_func-([[LPC:.LPC[0-9]+_[0-9]+]]+4)) | |
| ; THUMB2_RO_PC: movt r0, :upper16:(take_addr_func-([[LPC]]+4)) | |
| ; THUMB2_RO_PC: [[LPC]]: | |
| ; THUMB2_RO_PC-NEXT: add r0, pc | |
| ; NO_MOVT_THUMB2_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; NO_MOVT_THUMB2_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: | |
| ; NO_MOVT_THUMB2_RO_PC-NEXT: add r[[REG]], pc | |
| ; THUMB1_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: | |
| ; THUMB1_RO_PC-NEXT: add r[[REG]], pc | |
| ; CHECK: {{(bx lr|pop)}} | |
| ; NO_MOVT_ARM_RO_ABS: [[LCPI]] | |
| ; NO_MOVT_ARM_RO_ABS-NEXT: .long take_addr_func | |
| ; NO_MOVT_THUMB2_RO_ABS: [[LCPI]] | |
| ; NO_MOVT_THUMB2_RO_ABS-NEXT: .long take_addr_func | |
| ; THUMB1_RO_ABS: [[LCPI]] | |
| ; THUMB1_RO_ABS-NEXT: .long take_addr_func | |
| ; NO_MOVT_ARM_RO_PC: [[LCPI]] | |
| ; NO_MOVT_ARM_RO_PC-NEXT: .long take_addr_func-([[LPC]]+8) | |
| ; NO_MOVT_THUMB2_RO_PC: [[LCPI]] | |
| ; NO_MOVT_THUMB2_RO_PC-NEXT: .long take_addr_func-([[LPC]]+4) | |
| ; THUMB1_RO_PC: [[LCPI]] | |
| ; THUMB1_RO_PC-NEXT: .long take_addr_func-([[LPC]]+4) | |
| } | |
| define ptr @take_addr_alias() { | |
| entry: | |
| ret ptr @c1 | |
| } | |
| ; CHECK-LABEL: take_addr_alias: | |
| ; ARM_RW_SB: movw r[[REG:[0-9]]], :lower16:c1(sbrel) | |
| ; ARM_RW_SB: movt r[[REG]], :upper16:c1(sbrel) | |
| ; ARM_RW_SB: add r0, r9, r[[REG]] | |
| define ptr @take_addr_const_alias() { | |
| entry: | |
| ret ptr @d1 | |
| } | |
| ; CHECK-LABEL: take_addr_const_alias: | |
| ; ARM_RO_PC: movw [[REG:r[0-9]]], :lower16:(d1-([[LPC:.LPC[0-9]+_[0-9]+]]+8)) | |
| ; ARM_RO_PC-NEXT: movt [[REG]], :upper16:(d1-([[LPC]]+8)) | |
| ; ARM_RO_PC-NEXT: [[LPC]]: | |
| ; ARM_RO_PC-NEXT: add r0, pc, [[REG]] | |
| define weak ptr @take_addr_func_alias() { | |
| entry: | |
| ret ptr @take_addr_func_alias1 | |
| } | |
| ; CHECK-LABEL: take_addr_func_alias: | |
| ; ARM_RO_PC: movw [[REG:r[0-9]]], :lower16:(take_addr_func_alias1-([[LPC:.LPC[0-9]+_[0-9]+]]+8)) | |
| ; ARM_RO_PC-NEXT: movt [[REG]], :upper16:(take_addr_func_alias1-([[LPC]]+8)) | |
| ; ARM_RO_PC-NEXT: [[LPC]]: | |
| ; ARM_RO_PC-NEXT: add r0, pc, [[REG]] | |
| define ptr @block_addr() { | |
| entry: | |
| br label %lab1 | |
| lab1: | |
| ret ptr blockaddress(@block_addr, %lab1) | |
| ; CHECK-LABEL: block_addr: | |
| ; ARM_RO_ABS: [[LTMP:.Ltmp[0-9]+]]: | |
| ; ARM_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; ARM_RO_PC: [[LTMP:.Ltmp[0-9]+]]: | |
| ; ARM_RO_PC: ldr r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; ARM_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: | |
| ; ARM_RO_PC: add r0, pc, r[[REG]] | |
| ; THUMB2_RO_ABS: [[LTMP:.Ltmp[0-9]+]]: | |
| ; THUMB2_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB2_RO_PC: [[LTMP:.Ltmp[0-9]+]]: | |
| ; THUMB2_RO_PC: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB2_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: | |
| ; THUMB2_RO_PC: add r0, pc | |
| ; THUMB1_RO_ABS: [[LTMP:.Ltmp[0-9]+]]: | |
| ; THUMB1_RO_ABS: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RO_PC: [[LTMP:.Ltmp[0-9]+]]: | |
| ; THUMB1_RO_PC: ldr r0, [[LCPI:.LCPI[0-9]+_[0-9]+]] | |
| ; THUMB1_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]: | |
| ; THUMB1_RO_PC: add r0, pc | |
| ; CHECK: bx lr | |
| ; ARM_RO_ABS: [[LCPI]] | |
| ; ARM_RO_ABS-NEXT: .long [[LTMP]] | |
| ; ARM_RO_PC: [[LCPI]] | |
| ; ARM_RO_PC-NEXT: .long [[LTMP]]-([[LPC]]+8) | |
| ; THUMB2_RO_ABS: [[LCPI]] | |
| ; THUMB2_RO_ABS-NEXT: .long [[LTMP]] | |
| ; THUMB2_RO_PC: [[LCPI]] | |
| ; THUMB2_RO_PC-NEXT: .long [[LTMP]]-([[LPC]]+4) | |
| ; THUMB1_RO_ABS: [[LCPI]] | |
| ; THUMB1_RO_ABS-NEXT: .long [[LTMP]] | |
| ; THUMB1_RO_PC: [[LCPI]] | |
| ; THUMB1_RO_PC-NEXT: .long [[LTMP]]-([[LPC]]+4) | |
| } |