summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Carter <jcarter@mips.com>2013-02-21 02:09:31 +0000
committerJack Carter <jcarter@mips.com>2013-02-21 02:09:31 +0000
commit77217229ba1bbc92f3a53099fa91bcdaa7797da8 (patch)
tree0ee4752914269e634804686290d43a88c3020bba
parent421021157eda12453b4fea7ea853d8c472bd8532 (diff)
downloadllvm-77217229ba1bbc92f3a53099fa91bcdaa7797da8.tar.gz
llvm-77217229ba1bbc92f3a53099fa91bcdaa7797da8.tar.bz2
llvm-77217229ba1bbc92f3a53099fa91bcdaa7797da8.tar.xz
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
-rw-r--r--lib/Target/Mips/AsmParser/MipsAsmParser.cpp5
-rw-r--r--test/MC/Mips/hilo-addressing.s11
-rw-r--r--test/MC/Mips/mips_directives.s5
3 files changed, 18 insertions, 3 deletions
diff --git a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
index 088589fbfb..ade6084752 100644
--- a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
+++ b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
@@ -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;
diff --git a/test/MC/Mips/hilo-addressing.s b/test/MC/Mips/hilo-addressing.s
new file mode 100644
index 0000000000..28459c2067
--- /dev/null
+++ b/test/MC/Mips/hilo-addressing.s
@@ -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
diff --git a/test/MC/Mips/mips_directives.s b/test/MC/Mips/mips_directives.s
index d0a3beaeea..65d584dfa8 100644
--- a/test/MC/Mips/mips_directives.s
+++ b/test/MC/Mips/mips_directives.s
@@ -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