diff options
author | Simon Dardis <simon.dardis@imgtec.com> | 2017-06-30 15:44:27 +0000 |
---|---|---|
committer | Simon Dardis <simon.dardis@imgtec.com> | 2017-06-30 15:44:27 +0000 |
commit | 333b6cb76040b4d32705e1f16f96d18b2ad7e4d5 (patch) | |
tree | 37de31c9c4a51b214159c2ae18a865af5b1a6f24 /test/MC/Mips/macro-dla-pic.s | |
parent | adc0734b69ffc73195c06bd24c01081992182d83 (diff) |
[MIPS] Handle PIC load address macro instructions in N64.
In particular, use CALL16 (similar to O32) for address loads into T9 for certain
cases. Otherwise use a %got_disp relocation to load the address of a symbol.
Small offsets (small enough to fit in a 16-bit signed immediate) can be used and
are added to the symbol address after it is loaded from the GOT. Larger offsets
are currently unsupported and result in an error from the assembler.
Reviewers: sdardis
Reviewed By: sdardis
Patch by: John Baldwin
Subscribers: llvm-commits, seanbruno, arichardson, emaste, dim
Differential Revision: https://reviews.llvm.org/D33948
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306831 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/MC/Mips/macro-dla-pic.s')
-rw-r--r-- | test/MC/Mips/macro-dla-pic.s | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/test/MC/Mips/macro-dla-pic.s b/test/MC/Mips/macro-dla-pic.s new file mode 100644 index 00000000000..ed5aa202618 --- /dev/null +++ b/test/MC/Mips/macro-dla-pic.s @@ -0,0 +1,50 @@ +# RUN: llvm-mc %s -triple=mips64-unknown-linux -show-encoding -mcpu=mips3 | \ +# RUN: FileCheck %s + +.option pic2 +dla $5, symbol # CHECK: ld $5, %got_disp(symbol)($gp) # encoding: [0xdf,0x85,A,A] + # CHECK: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP +dla $5, symbol($6) # CHECK: ld $5, %got_disp(symbol)($gp) # encoding: [0xdf,0x85,A,A] + # CHECK: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP + # CHECK: daddu $5, $5, $6 # encoding: [0x00,0xa6,0x28,0x2d] +dla $6, symbol($6) # CHECK: ld $1, %got_disp(symbol)($gp) # encoding: [0xdf,0x81,A,A] + # CHECK: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP + # CHECK: daddu $6, $1, $6 # encoding: [0x00,0x26,0x30,0x2d] +dla $5, symbol+8 # CHECK: ld $5, %got_disp(symbol)($gp) # encoding: [0xdf,0x85,A,A] + # CHECK: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP + # CHECK: daddiu $5, $5, 8 # encoding: [0x64,0xa5,0x00,0x08] +dla $5, symbol+8($6) # CHECK: ld $5, %got_disp(symbol)($gp) # encoding: [0xdf,0x85,A,A] + # CHECK: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP + # CHECK: daddiu $5, $5, 8 # encoding: [0x64,0xa5,0x00,0x08] + # CHECK: daddu $5, $5, $6 # encoding: [0x00,0xa6,0x28,0x2d] +dla $6, symbol+8($6) # CHECK: ld $1, %got_disp(symbol)($gp) # encoding: [0xdf,0x81,A,A] + # CHECK: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP + # CHECK: daddiu $1, $1, 8 # encoding: [0x64,0x21,0x00,0x08] + # CHECK: daddu $6, $1, $6 # encoding: [0x00,0x26,0x30,0x2d] +dla $5, 1f # CHECK: ld $5, %got_disp(.Ltmp0)($gp) # encoding: [0xdf,0x85,A,A] + # CHECK: # fixup A - offset: 0, value: %got_disp(.Ltmp0), kind: fixup_Mips_GOT_DISP +1: + +# PIC expansions involving $25 are special. +dla $25, symbol # CHECK: ld $25, %call16(symbol)($gp) # encoding: [0xdf,0x99,A,A] + # CHECK: # fixup A - offset: 0, value: %call16(symbol), kind: fixup_Mips_CALL16 +dla $25, symbol($6) # CHECK: ld $25, %got_disp(symbol)($gp) # encoding: [0xdf,0x99,A,A] + # CHECK: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP + # CHECK: daddu $25, $25, $6 # encoding: [0x03,0x26,0xc8,0x2d] +dla $25, symbol($25) # CHECK: ld $1, %got_disp(symbol)($gp) # encoding: [0xdf,0x81,A,A] + # CHECK: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP + # CHECK: daddu $25, $1, $25 # encoding: [0x00,0x39,0xc8,0x2d] +dla $25, symbol+8 # CHECK: ld $25, %got_disp(symbol)($gp) # encoding: [0xdf,0x99,A,A] + # CHECK: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP + # CHECK: daddiu $25, $25, 8 # encoding: [0x67,0x39,0x00,0x08] +dla $25, symbol+8($6) # CHECK: ld $25, %got_disp(symbol)($gp) # encoding: [0xdf,0x99,A,A] + # CHECK: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP + # CHECK: daddiu $25, $25, 8 # encoding: [0x67,0x39,0x00,0x08] + # CHECK: daddu $25, $25, $6 # encoding: [0x03,0x26,0xc8,0x2d] +dla $25, symbol+8($25)# CHECK: ld $1, %got_disp(symbol)($gp) # encoding: [0xdf,0x81,A,A] + # CHECK: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP + # CHECK: daddiu $1, $1, 8 # encoding: [0x64,0x21,0x00,0x08] + # CHECK: daddu $25, $1, $25 # encoding: [0x00,0x39,0xc8,0x2d] +dla $25, 1f # CHECK: ld $25, %got_disp(.Ltmp1)($gp) # encoding: [0xdf,0x99,A,A] + # CHECK: # fixup A - offset: 0, value: %got_disp(.Ltmp1), kind: fixup_Mips_GOT_DISP +1: |