Add support for encoding the HLE XACQUIRE and XRELEASE prefixes.

For decoding, keep the current behavior of always decoding these as their REP
versions. In the future, this could be improved to recognize the cases where
these behave as XACQUIRE and XRELEASE and decode them as such.

llvm-svn: 184207
This commit is contained in:
Stefanus Du Toit 2013-06-18 17:08:10 +00:00
parent 4526b1d410
commit 8811ad4f81
3 changed files with 22 additions and 0 deletions

View File

@ -37,3 +37,10 @@ def XTEST : I<0x01, MRM_D6, (outs), (ins),
def XABORT : Ii8<0xc6, MRM_F8, (outs), (ins i8imm:$imm),
"xabort\t$imm",
[(int_x86_xabort imm:$imm)]>, Requires<[HasRTM]>;
// HLE prefixes
def XACQUIRE_PREFIX : I<0xF2, RawFrm, (outs), (ins), "xacquire", []>, Requires<[HasHLE]>;
def XRELEASE_PREFIX : I<0xF3, RawFrm, (outs), (ins), "xrelease", []>, Requires<[HasHLE]>;

View File

@ -0,0 +1,9 @@
// RUN: llvm-mc -triple x86_64-unknown-unknown --show-encoding %s | FileCheck %s
// CHECK: xacquire
// CHECK: [0xf2]
xacquire
// CHECK: xrelease
// CHECK: [0xf3]
xrelease

View File

@ -461,6 +461,12 @@ RecognizableInstr::filter_ret RecognizableInstr::filter() const {
Name == "VMOVQs64rr")
return FILTER_WEAK;
// XACQUIRE and XRELEASE reuse REPNE and REP respectively.
// For now, just prefer the REP versions.
if (Name == "XACQUIRE_PREFIX" ||
Name == "XRELEASE_PREFIX")
return FILTER_WEAK;
if (HasFROperands && Name.find("MOV") != Name.npos &&
((Name.find("2") != Name.npos && Name.find("32") == Name.npos) ||
(Name.find("to") != Name.npos)))