134 lines
2.9 KiB
ArmAsm
134 lines
2.9 KiB
ArmAsm
# REQUIRES: aarch64
|
|
|
|
# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %s -o %t.o
|
|
# RUN: %lld -arch arm64 %t.o -o %t
|
|
# RUN: llvm-objdump --no-print-imm-hex -d --macho %t | FileCheck %s
|
|
|
|
.text
|
|
.align 2
|
|
_before_far:
|
|
.space 1048576
|
|
|
|
.align 2
|
|
_before_near:
|
|
.quad 0
|
|
|
|
.globl _main
|
|
# CHECK-LABEL: _main:
|
|
_main:
|
|
## Out of range, before
|
|
L1: adrp x0, _before_far@PAGE
|
|
L2: ldr x0, [x0, _before_far@PAGEOFF]
|
|
# CHECK-NEXT: adrp x0
|
|
# CHECK-NEXT: ldr x0
|
|
|
|
## In range, before
|
|
L3: adrp x1, _before_near@PAGE
|
|
L4: ldr x1, [x1, _before_near@PAGEOFF]
|
|
# CHECK-NEXT: nop
|
|
# CHECK-NEXT: ldr x1, #-20
|
|
|
|
## Registers don't match (invalid input)
|
|
L5: adrp x2, _before_near@PAGE
|
|
L6: ldr x3, [x3, _before_near@PAGEOFF]
|
|
# CHECK-NEXT: adrp x2
|
|
# CHECK-NEXT: ldr x3
|
|
|
|
## Not an adrp instruction
|
|
L9: udf 0
|
|
L10: ldr x5, [x5, _after_near@PAGEOFF]
|
|
# CHECK-NEXT: udf
|
|
# CHECK-NEXT: ldr x5
|
|
|
|
## Not an ldr with an immediate offset
|
|
L11: adrp x6, _after_near@PAGE
|
|
L12: ldr x6, 0
|
|
# CHECK-NEXT: adrp x6
|
|
# CHECK-NEXT: ldr x6, #0
|
|
|
|
## Byte load, unsupported
|
|
L15: adrp x8, _after_near@PAGE
|
|
L16: ldr b8, [x8, _after_near@PAGEOFF]
|
|
# CHECK-NEXT: adrp x8
|
|
# CHECK-NEXT: ldr b8
|
|
|
|
## Halfword load, unsupported
|
|
L17: adrp x9, _after_near@PAGE
|
|
L18: ldr h9, [x9, _after_near@PAGEOFF]
|
|
# CHECK-NEXT: adrp x9
|
|
# CHECK-NEXT: ldr h9
|
|
|
|
## Word load
|
|
L19: adrp x10, _after_near@PAGE
|
|
L20: ldr w10, [x10, _after_near@PAGEOFF]
|
|
# CHECK-NEXT: nop
|
|
# CHECK-NEXT: ldr w10, _after_near
|
|
|
|
## With addend
|
|
L21: adrp x11, _after_near@PAGE + 8
|
|
L22: ldr x11, [x11, _after_near@PAGEOFF + 8]
|
|
# CHECK-NEXT: nop
|
|
# CHECK-NEXT: ldr x11
|
|
|
|
## Signed 32-bit read from 16-bit value, unsupported
|
|
L23: adrp x12, _after_near@PAGE
|
|
L24: ldrsb w12, [x12, _after_near@PAGEOFF]
|
|
# CHECK-NEXT: adrp x12
|
|
# CHECK-NEXT: ldrsb w12
|
|
|
|
## 64-bit load from signed 32-bit value
|
|
L25: adrp x13, _after_near@PAGE
|
|
L26: ldrsw x13, [x13, _after_near@PAGEOFF]
|
|
# CHECK-NEXT: nop
|
|
# CHECK-NEXT: ldrsw x13, _after_near
|
|
|
|
## Single precision FP read
|
|
L27: adrp x14, _after_near@PAGE
|
|
L28: ldr s0, [x14, _after_near@PAGEOFF]
|
|
# CHECK-NEXT: nop
|
|
# CHECK-NEXT: ldr s0, _after_near
|
|
|
|
## Double precision FP read
|
|
L29: adrp x15, _after_near@PAGE
|
|
L30: ldr d0, [x15, _after_near@PAGEOFF]
|
|
# CHECK-NEXT: nop
|
|
# CHECK-NEXT: ldr d0, _after_near
|
|
|
|
## Quad precision FP read
|
|
L31: adrp x16, _after_near@PAGE
|
|
L32: ldr q0, [x16, _after_near@PAGEOFF]
|
|
# CHECK-NEXT: nop
|
|
# CHECK-NEXT: ldr q0, _after_near
|
|
|
|
## Out of range, after
|
|
L33: adrp x17, _after_far@PAGE
|
|
L34: ldr x17, [x17, _after_far@PAGEOFF]
|
|
# CHECK-NEXT: adrp x17
|
|
# CHECK-NEXT: ldr x17
|
|
|
|
.data
|
|
.align 4
|
|
_after_near:
|
|
.quad 0
|
|
.quad 0
|
|
.space 1048576
|
|
|
|
_after_far:
|
|
.quad 0
|
|
|
|
.loh AdrpLdr L1, L2
|
|
.loh AdrpLdr L3, L4
|
|
.loh AdrpLdr L5, L6
|
|
.loh AdrpLdr L9, L10
|
|
.loh AdrpLdr L11, L12
|
|
.loh AdrpLdr L15, L16
|
|
.loh AdrpLdr L17, L18
|
|
.loh AdrpLdr L19, L20
|
|
.loh AdrpLdr L21, L22
|
|
.loh AdrpLdr L23, L24
|
|
.loh AdrpLdr L25, L26
|
|
.loh AdrpLdr L27, L28
|
|
.loh AdrpLdr L29, L30
|
|
.loh AdrpLdr L31, L32
|
|
.loh AdrpLdr L33, L34
|