mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 07:31:53 +00:00
Add an address space for the X86 SS segment.
Patch by Michael LeMay (michael.lemay@intel.com) Differential Revision: http://reviews.llvm.org/D17093 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268431 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
692cb17dfd
commit
ded3b7b8d2
@ -2197,9 +2197,9 @@ prefix byte on an instruction causes the instruction's memory access to go to
|
||||
the specified segment. LLVM address space 0 is the default address space, which
|
||||
includes the stack, and any unqualified memory accesses in a program. Address
|
||||
spaces 1-255 are currently reserved for user-defined code. The GS-segment is
|
||||
represented by address space 256, while the FS-segment is represented by address
|
||||
space 257. Other x86 segments have yet to be allocated address space
|
||||
numbers.
|
||||
represented by address space 256, the FS-segment is represented by address space
|
||||
257, and the SS-segment is represented by address space 258. Other x86 segments
|
||||
have yet to be allocated address space numbers.
|
||||
|
||||
While these address spaces may seem similar to TLS via the ``thread_local``
|
||||
keyword, and often use the same underlying hardware, there are some fundamental
|
||||
|
@ -727,6 +727,8 @@ bool X86DAGToDAGISel::matchLoadInAddress(LoadSDNode *N, X86ISelAddressMode &AM){
|
||||
case 257:
|
||||
AM.Segment = CurDAG->getRegister(X86::FS, MVT::i16);
|
||||
return false;
|
||||
// Address space 258 is not handled here, because it is not used to
|
||||
// address TLS areas.
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -1424,11 +1426,13 @@ bool X86DAGToDAGISel::selectVectorAddr(SDNode *Parent, SDValue N, SDValue &Base,
|
||||
return false;
|
||||
X86ISelAddressMode AM;
|
||||
unsigned AddrSpace = Mgs->getPointerInfo().getAddrSpace();
|
||||
// AddrSpace 256 -> GS, 257 -> FS.
|
||||
// AddrSpace 256 -> GS, 257 -> FS, 258 -> SS.
|
||||
if (AddrSpace == 256)
|
||||
AM.Segment = CurDAG->getRegister(X86::GS, MVT::i16);
|
||||
if (AddrSpace == 257)
|
||||
AM.Segment = CurDAG->getRegister(X86::FS, MVT::i16);
|
||||
if (AddrSpace == 258)
|
||||
AM.Segment = CurDAG->getRegister(X86::SS, MVT::i16);
|
||||
|
||||
SDLoc DL(N);
|
||||
Base = Mgs->getBasePtr();
|
||||
@ -1473,11 +1477,13 @@ bool X86DAGToDAGISel::selectAddr(SDNode *Parent, SDValue N, SDValue &Base,
|
||||
Parent->getOpcode() != X86ISD::EH_SJLJ_LONGJMP) { // longjmp
|
||||
unsigned AddrSpace =
|
||||
cast<MemSDNode>(Parent)->getPointerInfo().getAddrSpace();
|
||||
// AddrSpace 256 -> GS, 257 -> FS.
|
||||
// AddrSpace 256 -> GS, 257 -> FS, 258 -> SS.
|
||||
if (AddrSpace == 256)
|
||||
AM.Segment = CurDAG->getRegister(X86::GS, MVT::i16);
|
||||
if (AddrSpace == 257)
|
||||
AM.Segment = CurDAG->getRegister(X86::FS, MVT::i16);
|
||||
if (AddrSpace == 258)
|
||||
AM.Segment = CurDAG->getRegister(X86::SS, MVT::i16);
|
||||
}
|
||||
|
||||
if (matchAddress(N, AM))
|
||||
|
Loading…
Reference in New Issue
Block a user