mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-27 05:30:49 +00:00
Mips specific standalone assembler addressing mode %hi and %lo.
The constructs %hi() and %lo() represent the high and low 16 bits of the address. Because the 16 bit offset field of an LW instruction is interpreted as signed, if bit 15 of the low part is 1 then the low part will act as a negative and 1 needs to be added to the high part. Contributer: Vladimir Medic git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175707 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
421021157e
commit
77217229ba
@ -888,7 +888,12 @@ bool MipsAsmParser::parseRelocOperand(const MCExpr *&Res) {
|
||||
if (Str == "lo") {
|
||||
Val = Val & 0xffff;
|
||||
} else if (Str == "hi") {
|
||||
int LoSign = Val & 0x8000;
|
||||
Val = (Val & 0xffff0000) >> 16;
|
||||
//lower part is treated as signed int, so if it is negative
|
||||
//we must add 1 to hi part to compensate
|
||||
if (LoSign)
|
||||
Val++;
|
||||
}
|
||||
Res = MCConstantExpr::Create(Val, getContext());
|
||||
return false;
|
||||
|
11
test/MC/Mips/hilo-addressing.s
Normal file
11
test/MC/Mips/hilo-addressing.s
Normal file
@ -0,0 +1,11 @@
|
||||
# RUN: llvm-mc -show-encoding -triple mips-unknown-unknown %s | FileCheck %s
|
||||
|
||||
.ent hilo_test
|
||||
.equ addr, 0xdeadbeef
|
||||
# CHECK: # encoding: [0x3c,0x04,0xde,0xae]
|
||||
lui $4,%hi(addr)
|
||||
# CHECK: # encoding: [0x03,0xe0,0x00,0x08]
|
||||
jr $31
|
||||
# CHECK: # encoding: [0x80,0x82,0xbe,0xef]
|
||||
lb $2,%lo(addr)($4)
|
||||
.end hilo_test
|
@ -1,5 +1,5 @@
|
||||
# RUN: llvm-mc -triple mips-unknown-unknown %s | FileCheck %s
|
||||
#this test produces no output so there isS no FileCheck call
|
||||
# RUN: llvm-mc -show-encoding -triple mips-unknown-unknown %s | FileCheck %s
|
||||
#
|
||||
$BB0_2:
|
||||
.ent directives_test
|
||||
.frame $sp,0,$ra
|
||||
@ -17,4 +17,3 @@ $JTI0_0:
|
||||
.set macro
|
||||
.set reorder
|
||||
.set at=$a0
|
||||
.end directives_test
|
||||
|
Loading…
Reference in New Issue
Block a user