| # 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 |