280 lines · plain
1# RUN: llvm-mc %s -triple=mips-unknown-linux -show-encoding \2# RUN: -mcpu=mips32r2 | FileCheck -check-prefix=O32 %s3# RUN: llvm-mc %s -triple=mips-unknown-linux -show-encoding \4# RUN: -mcpu=mips32r6 | FileCheck -check-prefix=O32 %s5 6# RUN: llvm-mc %s -triple=mips-unknown-linux -show-encoding \7# RUN: -mattr=+xgot -mcpu=mips32r2 \8# RUN: | FileCheck -check-prefixes=XGOT,XO32 %s9 10# RUN: llvm-mc %s -triple=mipsn32 -show-encoding \11# RUN: -mcpu=mips64r2 | FileCheck -check-prefix=N32 %s12 13# RUN: llvm-mc %s -triple=mipsn32 -show-encoding \14# RUN: -mattr=+xgot -mcpu=mips64r2 \15# RUN: | FileCheck -check-prefixes=XGOT,XN32 %s16 17# N64 should be acceptable too but we cannot convert la to dla yet.18 19.option pic220la $5, symbol21# O32: lw $5, %got(symbol)($gp) # encoding: [0x8f,0x85,A,A]22# O32: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT23 24# XGOT: lui $5, %got_hi(symbol) # encoding: [0x3c,0x05,A,A]25# XGOT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI1626# XGOT: addu $5, $5, $gp # encoding: [0x00,0xbc,0x28,0x21]27# XGOT: lw $5, %got_lo(symbol)($5) # encoding: [0x8c,0xa5,A,A]28# XGOT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO1629 30# N32: lw $5, %got_disp(symbol)($gp) # encoding: [0x8f,0x85,A,A]31 # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP32 33la $5, symbol($6)34# O32: lw $5, %got(symbol)($gp) # encoding: [0x8f,0x85,A,A]35# O32: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT36# O32: addu $5, $5, $6 # encoding: [0x00,0xa6,0x28,0x21]37 38# XGOT: lui $5, %got_hi(symbol) # encoding: [0x3c,0x05,A,A]39# XGOT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI1640# XGOT: addu $5, $5, $gp # encoding: [0x00,0xbc,0x28,0x21]41# XGOT: lw $5, %got_lo(symbol)($5) # encoding: [0x8c,0xa5,A,A]42# XGOT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO1643# XGOT: addu $5, $5, $6 # encoding: [0x00,0xa6,0x28,0x21]44 45# N32: lw $5, %got_disp(symbol)($gp) # encoding: [0x8f,0x85,A,A]46# N32: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP47# N32: addu $5, $5, $6 # encoding: [0x00,0xa6,0x28,0x21]48 49la $6, symbol($6)50# O32: lw $1, %got(symbol)($gp) # encoding: [0x8f,0x81,A,A]51# O32: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT52# O32: addu $6, $1, $6 # encoding: [0x00,0x26,0x30,0x21]53 54# XGOT: lui $1, %got_hi(symbol) # encoding: [0x3c,0x01,A,A]55# XGOT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI1656# XGOT: addu $1, $1, $gp # encoding: [0x00,0x3c,0x08,0x21]57# XGOT: lw $1, %got_lo(symbol)($1) # encoding: [0x8c,0x21,A,A]58# XGOT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO1659# XGOT: addu $6, $1, $6 # encoding: [0x00,0x26,0x30,0x21]60 61# N32: lw $1, %got_disp(symbol)($gp) # encoding: [0x8f,0x81,A,A]62# N32: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP63# N32: addu $6, $1, $6 # encoding: [0x00,0x26,0x30,0x21]64 65la $5, symbol+866# O32: lw $5, %got(symbol)($gp) # encoding: [0x8f,0x85,A,A]67# O32: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT68# O32: addiu $5, $5, 8 # encoding: [0x24,0xa5,0x00,0x08]69 70# XGOT: lui $5, %got_hi(symbol+8) # encoding: [0x3c,0x05,A,A]71# XGOT: # fixup A - offset: 0, value: %got_hi(symbol+8), kind: fixup_Mips_GOT_HI1672# XGOT: addu $5, $5, $gp # encoding: [0x00,0xbc,0x28,0x21]73# XGOT: lw $5, %got_lo(symbol)($5) # encoding: [0x8c,0xa5,A,A]74# XGOT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO1675# XGOT: addiu $5, $5, 8 # encoding: [0x24,0xa5,0x00,0x08]76 77# N32: lw $5, %got_disp(symbol)($gp) # encoding: [0x8f,0x85,A,A]78# N32: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP79# N32: addiu $5, $5, 8 # encoding: [0x24,0xa5,0x00,0x08]80 81la $5, symbol+8($6)82# O32: lw $5, %got(symbol)($gp) # encoding: [0x8f,0x85,A,A]83# O32: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT84# O32: addiu $5, $5, 8 # encoding: [0x24,0xa5,0x00,0x08]85# O32: addu $5, $5, $6 # encoding: [0x00,0xa6,0x28,0x21]86 87# XGOT: lui $5, %got_hi(symbol+8) # encoding: [0x3c,0x05,A,A]88# XGOT: # fixup A - offset: 0, value: %got_hi(symbol+8), kind: fixup_Mips_GOT_HI1689# XGOT: addu $5, $5, $gp # encoding: [0x00,0xbc,0x28,0x21]90# XGOT: lw $5, %got_lo(symbol)($5) # encoding: [0x8c,0xa5,A,A]91# XGOT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO1692# XGOT: addiu $5, $5, 8 # encoding: [0x24,0xa5,0x00,0x08]93# XGOT: addu $5, $5, $6 # encoding: [0x00,0xa6,0x28,0x21]94 95# N32: lw $5, %got_disp(symbol)($gp) # encoding: [0x8f,0x85,A,A]96# N32: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP97# N32: addiu $5, $5, 8 # encoding: [0x24,0xa5,0x00,0x08]98# N32: addu $5, $5, $6 # encoding: [0x00,0xa6,0x28,0x21]99 100la $6, symbol+8($6)101# O32: lw $1, %got(symbol)($gp) # encoding: [0x8f,0x81,A,A]102# O32: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT103# O32: addiu $1, $1, 8 # encoding: [0x24,0x21,0x00,0x08]104# O32: addu $6, $1, $6 # encoding: [0x00,0x26,0x30,0x21]105 106# XGOT: lui $1, %got_hi(symbol+8) # encoding: [0x3c,0x01,A,A]107# XGOT: # fixup A - offset: 0, value: %got_hi(symbol+8), kind: fixup_Mips_GOT_HI16108# XGOT: addu $1, $1, $gp # encoding: [0x00,0x3c,0x08,0x21]109# XGOT: lw $1, %got_lo(symbol)($1) # encoding: [0x8c,0x21,A,A]110# XGOT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16111# XGOT: addiu $1, $1, 8 # encoding: [0x24,0x21,0x00,0x08]112# XGOT: addu $6, $1, $6 # encoding: [0x00,0x26,0x30,0x21]113 114# N32: lw $1, %got_disp(symbol)($gp) # encoding: [0x8f,0x81,A,A]115# N32: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP116# N32: addiu $1, $1, 8 # encoding: [0x24,0x21,0x00,0x08]117# N32: addu $6, $1, $6 # encoding: [0x00,0x26,0x30,0x21]118 119la $5, 1f120# O32: lw $5, %got($tmp0)($gp) # encoding: [0x8f,0x85,A,A]121# O32: # fixup A - offset: 0, value: %got($tmp0), kind: fixup_Mips_GOT122# O32: addiu $5, $5, %lo($tmp0) # encoding: [0x24,0xa5,A,A]123# O32: # fixup A - offset: 0, value: %lo($tmp0), kind: fixup_Mips_LO16124 125# XO32: lw $5, %got($tmp0)($gp) # encoding: [0x8f,0x85,A,A]126# XO32: # fixup A - offset: 0, value: %got($tmp0), kind: fixup_Mips_GOT127# XO32: addiu $5, $5, %lo($tmp0) # encoding: [0x24,0xa5,A,A]128# XO32: # fixup A - offset: 0, value: %lo($tmp0), kind: fixup_Mips_LO16129 130# N32: lw $5, %got_disp(.Ltmp0)($gp) # encoding: [0x8f,0x85,A,A]131# N32: # fixup A - offset: 0, value: %got_disp(.Ltmp0), kind: fixup_Mips_GOT_DISP132 133## FIXME: GAS generates R_MIPS_GOT_PAGE / R_MIPS_GOT_OFST pair of relocations134## in case of using N32 ABI + XGOT.135# XN32: lw $5, %got_disp(.Ltmp0)($gp) # encoding: [0x8f,0x85,A,A]136# XN32: # fixup A - offset: 0, value: %got_disp(.Ltmp0), kind: fixup_Mips_GOT_DISP1371:138 139# PIC expansions involving $25 are special.140la $25, symbol141# O32: lw $25, %call16(symbol)($gp) # encoding: [0x8f,0x99,A,A]142# O32: # fixup A - offset: 0, value: %call16(symbol), kind: fixup_Mips_CALL16143 144# XGOT: lui $25, %call_hi(symbol) # encoding: [0x3c,0x19,A,A]145# XGOT: # fixup A - offset: 0, value: %call_hi(symbol), kind: fixup_Mips_CALL_HI16146# XGOT: addu $25, $25, $gp # encoding: [0x03,0x3c,0xc8,0x21]147# XGOT: lw $25, %call_lo(symbol)($25) # encoding: [0x8f,0x39,A,A]148# XGOT: # fixup A - offset: 0, value: %call_lo(symbol), kind: fixup_Mips_CALL_LO16149 150# N32: lw $25, %call16(symbol)($gp) # encoding: [0x8f,0x99,A,A]151# N32: # fixup A - offset: 0, value: %call16(symbol), kind: fixup_Mips_CALL16152 153la $25, symbol($6)154# O32: lw $25, %got(symbol)($gp) # encoding: [0x8f,0x99,A,A]155# O32: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT156# O32: addu $25, $25, $6 # encoding: [0x03,0x26,0xc8,0x21]157 158# XGOT: lui $25, %got_hi(symbol) # encoding: [0x3c,0x19,A,A]159# XGOT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16160# XGOT: addu $25, $25, $gp # encoding: [0x03,0x3c,0xc8,0x21]161# XGOT: lw $25, %got_lo(symbol)($25) # encoding: [0x8f,0x39,A,A]162# XGOT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16163# XGOT: addu $25, $25, $6 # encoding: [0x03,0x26,0xc8,0x21]164 165# N32: lw $25, %got_disp(symbol)($gp) # encoding: [0x8f,0x99,A,A]166# N32: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP167# N32: addu $25, $25, $6 # encoding: [0x03,0x26,0xc8,0x21]168 169la $25, symbol($25)170# O32: lw $1, %got(symbol)($gp) # encoding: [0x8f,0x81,A,A]171# O32: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT172# O32: addu $25, $1, $25 # encoding: [0x00,0x39,0xc8,0x21]173 174# XGOT: lui $1, %got_hi(symbol) # encoding: [0x3c,0x01,A,A]175# XGOT: # fixup A - offset: 0, value: %got_hi(symbol), kind: fixup_Mips_GOT_HI16176# XGOT: addu $1, $1, $gp # encoding: [0x00,0x3c,0x08,0x21]177# XGOT: lw $1, %got_lo(symbol)($1) # encoding: [0x8c,0x21,A,A]178# XGOT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16179# XGOT: addu $25, $1, $25 # encoding: [0x00,0x39,0xc8,0x21]180 181# N32: lw $1, %got_disp(symbol)($gp) # encoding: [0x8f,0x81,A,A]182# N32: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP183# N32: addu $25, $1, $25 # encoding: [0x00,0x39,0xc8,0x21]184 185la $25, symbol+8186# O32: lw $25, %got(symbol)($gp) # encoding: [0x8f,0x99,A,A]187# O32: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT188# O32: addiu $25, $25, 8 # encoding: [0x27,0x39,0x00,0x08]189 190# XGOT: lui $25, %got_hi(symbol+8) # encoding: [0x3c,0x19,A,A]191# XGOT: # fixup A - offset: 0, value: %got_hi(symbol+8), kind: fixup_Mips_GOT_HI16192# XGOT: addu $25, $25, $gp # encoding: [0x03,0x3c,0xc8,0x21]193# XGOT: lw $25, %got_lo(symbol)($25) # encoding: [0x8f,0x39,A,A]194# XGOT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16195# XGOT: addiu $25, $25, 8 # encoding: [0x27,0x39,0x00,0x08]196 197# N32: lw $25, %got_disp(symbol)($gp) # encoding: [0x8f,0x99,A,A]198# N32: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP199# N32: addiu $25, $25, 8 # encoding: [0x27,0x39,0x00,0x08]200 201la $25, symbol+8($6)202# O32: lw $25, %got(symbol)($gp) # encoding: [0x8f,0x99,A,A]203# O32: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT204# O32: addiu $25, $25, 8 # encoding: [0x27,0x39,0x00,0x08]205# O32: addu $25, $25, $6 # encoding: [0x03,0x26,0xc8,0x21]206 207# XGOT: lui $25, %got_hi(symbol+8) # encoding: [0x3c,0x19,A,A]208# XGOT: # fixup A - offset: 0, value: %got_hi(symbol+8), kind: fixup_Mips_GOT_HI16209# XGOT: addu $25, $25, $gp # encoding: [0x03,0x3c,0xc8,0x21]210# XGOT: lw $25, %got_lo(symbol)($25) # encoding: [0x8f,0x39,A,A]211# XGOT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16212# XGOT: addiu $25, $25, 8 # encoding: [0x27,0x39,0x00,0x08]213# XGOT: addu $25, $25, $6 # encoding: [0x03,0x26,0xc8,0x21]214 215# N32: lw $25, %got_disp(symbol)($gp) # encoding: [0x8f,0x99,A,A]216# N32: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP217# N32: addiu $25, $25, 8 # encoding: [0x27,0x39,0x00,0x08]218# N32: addu $25, $25, $6 # encoding: [0x03,0x26,0xc8,0x21]219 220la $25, symbol+8($25)221# O32: lw $1, %got(symbol)($gp) # encoding: [0x8f,0x81,A,A]222# O32: # fixup A - offset: 0, value: %got(symbol), kind: fixup_Mips_GOT223# O32: addiu $1, $1, 8 # encoding: [0x24,0x21,0x00,0x08]224# O32: addu $25, $1, $25 # encoding: [0x00,0x39,0xc8,0x21]225 226# XGOT: lui $1, %got_hi(symbol+8) # encoding: [0x3c,0x01,A,A]227# XGOT: # fixup A - offset: 0, value: %got_hi(symbol+8), kind: fixup_Mips_GOT_HI16228# XGOT: addu $1, $1, $gp # encoding: [0x00,0x3c,0x08,0x21]229# XGOT: lw $1, %got_lo(symbol)($1) # encoding: [0x8c,0x21,A,A]230# XGOT: # fixup A - offset: 0, value: %got_lo(symbol), kind: fixup_Mips_GOT_LO16231# XGOT: addiu $1, $1, 8 # encoding: [0x24,0x21,0x00,0x08]232# XGOT: addu $25, $1, $25 # encoding: [0x00,0x39,0xc8,0x21]233 234# N32: lw $1, %got_disp(symbol)($gp) # encoding: [0x8f,0x81,A,A]235# N32: # fixup A - offset: 0, value: %got_disp(symbol), kind: fixup_Mips_GOT_DISP236# N32: addiu $1, $1, 8 # encoding: [0x24,0x21,0x00,0x08]237# N32: addu $25, $1, $25 # encoding: [0x00,0x39,0xc8,0x21]238 239la $25, 2f240# O32: lw $25, %got($tmp1)($gp) # encoding: [0x8f,0x99,A,A]241# O32: # fixup A - offset: 0, value: %got($tmp1), kind: fixup_Mips_GOT242# O32: addiu $25, $25, %lo($tmp1) # encoding: [0x27,0x39,A,A]243# O32: # fixup A - offset: 0, value: %lo($tmp1), kind: fixup_Mips_LO16244 245# XO32: lw $25, %got($tmp1)($gp) # encoding: [0x8f,0x99,A,A]246# XO32: # fixup A - offset: 0, value: %got($tmp1), kind: fixup_Mips_GOT247# XO32: addiu $25, $25, %lo($tmp1) # encoding: [0x27,0x39,A,A]248# XO32: # fixup A - offset: 0, value: %lo($tmp1), kind: fixup_Mips_LO16249 250# N32: lw $25, %got_disp(.Ltmp1)($gp) # encoding: [0x8f,0x99,A,A]251# N32: # fixup A - offset: 0, value: %got_disp(.Ltmp1), kind: fixup_Mips_GOT_DISP252 253## FIXME: GAS generates R_MIPS_GOT_PAGE / R_MIPS_GOT_OFST pair of relocations254## in case of using N32 ABI + XGOT.255# XN32: lw $25, %got_disp(.Ltmp1)($gp) # encoding: [0x8f,0x99,A,A]256# XN32: # fixup A - offset: 0, value: %got_disp(.Ltmp1), kind: fixup_Mips_GOT_DISP2572:258 259la $2,.Lstr260# O32: lw $2, %got(.Lstr)($gp) # encoding: [0x8f,0x82,A,A]261# O32-NEXT: # fixup A - offset: 0, value: %got(.Lstr), kind: fixup_Mips_GOT262# O32-NEXT: addiu $2, $2, %lo(.Lstr) # encoding: [0x24,0x42,A,A]263# O32-NEXT: # fixup A - offset: 0, value: %lo(.Lstr), kind: fixup_Mips_LO16264 265# N32: lw $2, %got_disp(.Lstr)($gp) # encoding: [0x8f,0x82,A,A]266# N32-NEXT: # fixup A - offset: 0, value: %got_disp(.Lstr), kind: fixup_Mips_GOT_DISP267 268la $2,$str2269# O32: lw $2, %got($str2)($gp) # encoding: [0x8f,0x82,A,A]270# O32-NEXT: # fixup A - offset: 0, value: %got($str2), kind: fixup_Mips_GOT271# O32-NEXT: addiu $2, $2, %lo($str2) # encoding: [0x24,0x42,A,A]272# O32-NEXT: # fixup A - offset: 0, value: %lo($str2), kind: fixup_Mips_LO16273 274# N32: lw $2, %got_disp($str2)($gp) # encoding: [0x8f,0x82,A,A]275# N32-NEXT: # fixup A - offset: 0, value: %got_disp($str2), kind: fixup_Mips_GOT_DISP276 277.rodata278.Lstr: .4byte 0279$str2: .4byte 0280