186 lines · plain
1# REQUIRES: aarch642 3# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %s -o %t.o4# RUN: %lld -arch arm64 %t.o -o %t5# RUN: llvm-objdump --no-print-imm-hex -d --macho %t | FileCheck %s6 7## This is mostly a copy of loh-adrp-ldr-got-ldr.s's `local.s` test, except that Adrp+Ldr+Ldr8## triples have been changed to Adrp+Add+Ldr. The performed optimization is the same.9.text10.align 211.globl _main12_main:13 14### Transformation to a literal LDR15## Basic case16L1: adrp x0, _close@PAGE17L2: add x1, x0, _close@PAGEOFF18L3: ldr x2, [x1]19# CHECK-LABEL: _main:20# CHECK-NEXT: nop21# CHECK-NEXT: nop22# CHECK-NEXT: ldr x223 24## Load with offset25L4: adrp x0, _close@PAGE26L5: add x1, x0, _close@PAGEOFF27L6: ldr x2, [x1, #8]28# CHECK-NEXT: nop29# CHECK-NEXT: nop30# CHECK-NEXT: ldr x231 32## 32 bit load33L7: adrp x0, _close@PAGE34L8: add x1, x0, _close@PAGEOFF35L9: ldr w1, [x1]36# CHECK-NEXT: nop37# CHECK-NEXT: nop38# CHECK-NEXT: ldr w1, _close39 40## Floating point41L10: adrp x0, _close@PAGE42L11: add x1, x0, _close@PAGEOFF43L12: ldr s1, [x1]44# CHECK-NEXT: nop45# CHECK-NEXT: nop46# CHECK-NEXT: ldr s1, _close47 48L13: adrp x0, _close@PAGE49L14: add x1, x0, _close@PAGEOFF50L15: ldr d1, [x1, #8]51# CHECK-NEXT: nop52# CHECK-NEXT: nop53# CHECK-NEXT: ldr d1, _close854 55L16: adrp x0, _close@PAGE56L17: add x1, x0, _close@PAGEOFF57L18: ldr q0, [x1]58# CHECK-NEXT: nop59# CHECK-NEXT: nop60# CHECK-NEXT: ldr q0, _close61 62 63### Transformation to ADR+LDR64## 1 byte floating point load65L19: adrp x0, _close@PAGE66L20: add x1, x0, _close@PAGEOFF67L21: ldr b2, [x1]68# CHECK-NEXT: adr x169# CHECK-NEXT: nop70# CHECK-NEXT: ldr b2, [x1]71 72## 1 byte GPR load, zero extend73L22: adrp x0, _close@PAGE74L23: add x1, x0, _close@PAGEOFF75L24: ldrb w2, [x1]76# CHECK-NEXT: adr x177# CHECK-NEXT: nop78# CHECK-NEXT: ldrb w2, [x1]79 80## 1 byte GPR load, sign extend81L25: adrp x0, _close@PAGE82L26: add x1, x0, _close@PAGEOFF83L27: ldrsb x2, [x1]84# CHECK-NEXT: adr x185# CHECK-NEXT: nop86# CHECK-NEXT: ldrsb x2, [x1]87 88## Unaligned89L28: adrp x0, _unaligned@PAGE90L29: add x1, x0, _unaligned@PAGEOFF91L30: ldr x2, [x1]92# CHECK-NEXT: adr x193# CHECK-NEXT: nop94# CHECK-NEXT: ldr x2, [x1]95 96 97### Transformation to ADRP + immediate LDR98## Basic test: target is far99L31: adrp x0, _far@PAGE100L32: add x1, x0, _far@PAGEOFF101L33: ldr x2, [x1]102# CHECK-NEXT: adrp x0103# CHECK-NEXT: nop104# CHECK-NEXT: ldr x2105 106## With offset107L34: adrp x0, _far@PAGE108L35: add x1, x0, _far@PAGEOFF109L36: ldr x2, [x1, #8]110# CHECK-NEXT: adrp x0111# CHECK-NEXT: nop112# CHECK-NEXT: ldr x2113 114### No changes115## Far and unaligned116L37: adrp x0, _far_unaligned@PAGE117L38: add x1, x0, _far_unaligned@PAGEOFF118L39: ldr x2, [x1]119# CHECK-NEXT: adrp x0120# CHECK-NEXT: add x1, x0121# CHECK-NEXT: ldr x2, [x1]122 123## Far with large offset (_far_offset@PAGE + #255 > 4095)124L40: adrp x0, _far_offset@PAGE125L41: add x1, x0, _far_offset@PAGEOFF126L42: ldrb w2, [x1, #255]127# CHECK-NEXT: adrp x0128# CHECK-NEXT: add x1, x0129# CHECK-NEXT: ldrb w2, [x1, #255]130 131### Invalid inputs; the instructions should be left untouched.132## Registers don't match133L43: adrp x0, _far@PAGE134L44: add x1, x0, _far@PAGEOFF135L45: ldr x2, [x2]136# CHECK-NEXT: adrp x0137# CHECK-NEXT: add x1, x0138# CHECK-NEXT: ldr x2, [x2]139 140## Targets don't match141L46: adrp x0, _close@PAGE142L47: add x1, x0, _close8@PAGEOFF143L48: ldr x2, [x1]144# CHECK-NEXT: adrp x0145# CHECK-NEXT: add x1, x0146# CHECK-NEXT: ldr x2, [x1]147 148.data149.align 4150 .quad 0151_close:152 .quad 0153_close8:154 .quad 0155 .byte 0156_unaligned:157 .quad 0158 159.space 1048576160.align 12161 .quad 0162_far:163 .quad 0164 .byte 0165_far_unaligned:166 .quad 0167.space 4000168_far_offset:169 .byte 0170 171.loh AdrpAddLdr L1, L2, L3172.loh AdrpAddLdr L4, L5, L6173.loh AdrpAddLdr L7, L8, L9174.loh AdrpAddLdr L10, L11, L12175.loh AdrpAddLdr L13, L14, L15176.loh AdrpAddLdr L16, L17, L18177.loh AdrpAddLdr L19, L20, L21178.loh AdrpAddLdr L22, L23, L24179.loh AdrpAddLdr L25, L26, L27180.loh AdrpAddLdr L28, L29, L30181.loh AdrpAddLdr L31, L32, L33182.loh AdrpAddLdr L34, L35, L36183.loh AdrpAddLdr L37, L38, L39184.loh AdrpAddLdr L40, L41, L42185.loh AdrpAddLdr L43, L44, L45186