From ef93cecd80ebdecb0ea2b2c316370998151308e2 Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Sat, 11 Oct 2008 19:09:15 +0000 Subject: [PATCH] Add ability to override segment (mostly for code emitter purposes). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@57380 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86.td | 2 ++ lib/Target/X86/X86CodeEmitter.cpp | 10 ++++++++++ lib/Target/X86/X86InstrFormats.td | 3 +++ lib/Target/X86/X86InstrInfo.h | 9 ++++++++- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/Target/X86/X86.td b/lib/Target/X86/X86.td index 39ba093be74..779d0b4ce4c 100644 --- a/lib/Target/X86/X86.td +++ b/lib/Target/X86/X86.td @@ -116,6 +116,7 @@ def X86InstrInfo : InstrInfo { "ImmTypeBits", "FPFormBits", "hasLockPrefix", + "SegOvrBits", "Opcode"]; let TSFlagsShifts = [0, 6, @@ -125,6 +126,7 @@ def X86InstrInfo : InstrInfo { 13, 16, 19, + 20, 24]; } diff --git a/lib/Target/X86/X86CodeEmitter.cpp b/lib/Target/X86/X86CodeEmitter.cpp index 37c1e99aeb1..16124fa8a85 100644 --- a/lib/Target/X86/X86CodeEmitter.cpp +++ b/lib/Target/X86/X86CodeEmitter.cpp @@ -412,6 +412,16 @@ void Emitter::emitInstruction(const MachineInstr &MI, // Emit the lock opcode prefix as needed. if (Desc->TSFlags & X86II::LOCK) MCE.emitByte(0xF0); + // Emit segment overrid opcode prefix as needed. + switch (Desc->TSFlags & X86II::SegOvrMask) { + case X86II::FS: + MCE.emitByte(0x64); + break; + case X86II::GS: + MCE.emitByte(0x65); + break; + } + // Emit the repeat opcode prefix as needed. if ((Desc->TSFlags & X86II::Op0Mask) == X86II::REP) MCE.emitByte(0xF3); diff --git a/lib/Target/X86/X86InstrFormats.td b/lib/Target/X86/X86InstrFormats.td index c26ea01dc65..eeed5bd27ff 100644 --- a/lib/Target/X86/X86InstrFormats.td +++ b/lib/Target/X86/X86InstrFormats.td @@ -63,6 +63,8 @@ class OpSize { bit hasOpSizePrefix = 1; } class AdSize { bit hasAdSizePrefix = 1; } class REX_W { bit hasREX_WPrefix = 1; } class LOCK { bit hasLockPrefix = 1; } +class SegFS { bits<2> SegOvrBits = 1; } +class SegGS { bits<2> SegOvrBits = 2; } class TB { bits<4> Prefix = 1; } class REP { bits<4> Prefix = 2; } class D8 { bits<4> Prefix = 3; } @@ -104,6 +106,7 @@ class X86Inst opcod, Format f, ImmType i, dag outs, dag ins, FPFormat FPForm; // What flavor of FP instruction is this? bits<3> FPFormBits = 0; bit hasLockPrefix = 0; // Does this inst have a 0xF0 prefix? + bits<2> SegOvrBits = 0; // Segment override prefix. } class I o, Format f, dag outs, dag ins, string asm, list pattern> diff --git a/lib/Target/X86/X86InstrInfo.h b/lib/Target/X86/X86InstrInfo.h index b2de31051cf..1413310b3c0 100644 --- a/lib/Target/X86/X86InstrInfo.h +++ b/lib/Target/X86/X86InstrInfo.h @@ -221,7 +221,14 @@ namespace X86II { LOCKShift = 19, LOCK = 1 << LOCKShift, - // Bits 20 -> 23 are unused + // Segment override prefixes. Currently we just need ability to address + // stuff in gs and fs segments. + SegOvrShift = 20, + SegOvrMask = 3 << SegOvrShift, + FS = 1 << SegOvrShift, + GS = 2 << SegOvrShift, + + // Bits 22 -> 23 are unused OpcodeShift = 24, OpcodeMask = 0xFF << OpcodeShift }; -- 2.34.1