From c93f1046fc15ca01f55c2e7955e88eaf8e0569d6 Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Thu, 5 Mar 2020 09:43:20 -0800 Subject: [PATCH] [X86/MC] Factor out common code [NFC] --- llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp | 18 ++------------- llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h | 23 +++++++++++++++++++ .../Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp | 26 ++-------------------- 3 files changed, 27 insertions(+), 40 deletions(-) diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp index 88487f5..426ddb7 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp @@ -390,22 +390,8 @@ uint8_t X86AsmBackend::determinePaddingPrefix(const MCInst &Inst) const { } } - switch (SegmentReg) { - case 0: - break; - case X86::CS: - return X86::CS_Encoding; - case X86::DS: - return X86::DS_Encoding; - case X86::ES: - return X86::ES_Encoding; - case X86::FS: - return X86::FS_Encoding; - case X86::GS: - return X86::GS_Encoding; - case X86::SS: - return X86::SS_Encoding; - } + if (SegmentReg != 0) + return X86::getSegmentOverridePrefixForReg(SegmentReg); if (STI.hasFeature(X86::Mode64Bit)) return X86::CS_Encoding; diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h b/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h index c006c3f..3e4a513 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h +++ b/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h @@ -393,6 +393,29 @@ namespace X86 { GS_Encoding = 0x65, SS_Encoding = 0x36 }; + + /// Given a segment register, return the encoding of the segment override + /// prefix for it. + inline EncodingOfSegmentOverridePrefix + getSegmentOverridePrefixForReg(unsigned Reg) { + switch (Reg) { + default: + llvm_unreachable("Unknown segment register!"); + case X86::CS: + return CS_Encoding; + case X86::DS: + return DS_Encoding; + case X86::ES: + return ES_Encoding; + case X86::FS: + return FS_Encoding; + case X86::GS: + return GS_Encoding; + case X86::SS: + return SS_Encoding; + } + } + } // end namespace X86; /// X86II - This namespace holds all of the target specific flags that diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp index c93f851..357599b 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp @@ -1262,30 +1262,8 @@ void X86MCCodeEmitter::emitSegmentOverridePrefix(unsigned &CurByte, const MCInst &MI, raw_ostream &OS) const { // Check for explicit segment override on memory operand. - switch (MI.getOperand(SegOperand).getReg()) { - default: - llvm_unreachable("Unknown segment register!"); - case 0: - break; - case X86::CS: - emitByte(0x2E, CurByte, OS); - break; - case X86::SS: - emitByte(0x36, CurByte, OS); - break; - case X86::DS: - emitByte(0x3E, CurByte, OS); - break; - case X86::ES: - emitByte(0x26, CurByte, OS); - break; - case X86::FS: - emitByte(0x64, CurByte, OS); - break; - case X86::GS: - emitByte(0x65, CurByte, OS); - break; - } + if (unsigned Reg = MI.getOperand(SegOperand).getReg()) + emitByte(X86::getSegmentOverridePrefixForReg(Reg), CurByte, OS); } /// Emit all instruction prefixes prior to the opcode. -- 2.7.4