mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-11 21:45:16 +00:00
X86: Produce @ABS8 symbol modifiers for absolute symbols in range [0,128).
Differential Revision: https://reviews.llvm.org/D28689 llvm-svn: 293844
This commit is contained in:
parent
fe35ee7d32
commit
e60585b091
@ -212,7 +212,12 @@ namespace X86II {
|
||||
/// the offset from beginning of section.
|
||||
///
|
||||
/// This is the TLS offset for the COFF/Windows TLS mechanism.
|
||||
MO_SECREL
|
||||
MO_SECREL,
|
||||
|
||||
/// MO_ABS8 - On a symbol operand this indicates that the symbol is known
|
||||
/// to be an absolute symbol in range [0,128), so we can use the @ABS8
|
||||
/// symbol modifier.
|
||||
MO_ABS8,
|
||||
};
|
||||
|
||||
enum : uint64_t {
|
||||
|
@ -215,6 +215,7 @@ MCOperand X86MCInstLower::LowerSymbolOperand(const MachineOperand &MO,
|
||||
case X86II::MO_GOT: RefKind = MCSymbolRefExpr::VK_GOT; break;
|
||||
case X86II::MO_GOTOFF: RefKind = MCSymbolRefExpr::VK_GOTOFF; break;
|
||||
case X86II::MO_PLT: RefKind = MCSymbolRefExpr::VK_PLT; break;
|
||||
case X86II::MO_ABS8: RefKind = MCSymbolRefExpr::VK_X86_ABS8; break;
|
||||
case X86II::MO_PIC_BASE_OFFSET:
|
||||
case X86II::MO_DARWIN_NONLAZY_PIC_BASE:
|
||||
Expr = MCSymbolRefExpr::create(Sym, Ctx);
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include "X86InstrInfo.h"
|
||||
#include "X86TargetMachine.h"
|
||||
#include "llvm/IR/Attributes.h"
|
||||
#include "llvm/IR/ConstantRange.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/GlobalValue.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
@ -93,8 +94,17 @@ unsigned char X86Subtarget::classifyGlobalReference(const GlobalValue *GV,
|
||||
return X86II::MO_NO_FLAG;
|
||||
|
||||
// Absolute symbols can be referenced directly.
|
||||
if (GV && GV->isAbsoluteSymbolRef())
|
||||
return X86II::MO_NO_FLAG;
|
||||
if (GV) {
|
||||
if (Optional<ConstantRange> CR = GV->getAbsoluteSymbolRange()) {
|
||||
// See if we can use the 8-bit immediate form. Note that some instructions
|
||||
// will sign extend the immediate operand, so to be conservative we only
|
||||
// accept the range [0,128).
|
||||
if (CR->getUnsignedMax().ult(128))
|
||||
return X86II::MO_ABS8;
|
||||
else
|
||||
return X86II::MO_NO_FLAG;
|
||||
}
|
||||
}
|
||||
|
||||
if (TM.shouldAssumeDSOLocal(M, GV))
|
||||
return classifyLocalReference(GV);
|
||||
|
@ -11,7 +11,7 @@ declare void @f()
|
||||
define void @foo(i64 %val) {
|
||||
%shr = lshr i64 %val, zext (i8 ptrtoint (i8* @align to i8) to i64)
|
||||
%shl = shl i64 %val, zext (i8 sub (i8 64, i8 ptrtoint (i8* @align to i8)) to i64)
|
||||
; CHECK: rorq $align, %rdi
|
||||
; CHECK: rorq $align@ABS8, %rdi
|
||||
%ror = or i64 %shr, %shl
|
||||
%cmp = icmp ult i64 %ror, 109
|
||||
br i1 %cmp, label %t, label %f
|
||||
@ -24,4 +24,4 @@ f:
|
||||
ret void
|
||||
}
|
||||
|
||||
!0 = !{i64 0, i64 256}
|
||||
!0 = !{i64 0, i64 128}
|
||||
|
Loading…
Reference in New Issue
Block a user