diff --git a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 088589fbfb1..ade60847528 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 00000000000..28459c20672 --- /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 d0a3beaeeaa..65d584dfa8a 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