diff options
author | Stefanus Du Toit <stefanus.du.toit@intel.com> | 2013-06-18 17:08:10 +0000 |
---|---|---|
committer | Stefanus Du Toit <stefanus.du.toit@intel.com> | 2013-06-18 17:08:10 +0000 |
commit | 23306deb92e2424165f2145895e21e223c3887eb (patch) | |
tree | 010de068999f5a5d00ea5b28788b7609666f07aa | |
parent | 8ee23f00c7e9343d09313051c318906558d6ad17 (diff) | |
download | llvm-23306deb92e2424165f2145895e21e223c3887eb.tar.gz llvm-23306deb92e2424165f2145895e21e223c3887eb.tar.bz2 llvm-23306deb92e2424165f2145895e21e223c3887eb.tar.xz |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184207 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/X86/X86InstrTSX.td | 7 | ||||
-rw-r--r-- | test/MC/X86/x86_64-hle-encoding.s | 9 | ||||
-rw-r--r-- | utils/TableGen/X86RecognizableInstr.cpp | 6 |
3 files changed, 22 insertions, 0 deletions
diff --git a/lib/Target/X86/X86InstrTSX.td b/lib/Target/X86/X86InstrTSX.td index 363a190aa8..59a6f1e376 100644 --- a/lib/Target/X86/X86InstrTSX.td +++ b/lib/Target/X86/X86InstrTSX.td @@ -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]>; + diff --git a/test/MC/X86/x86_64-hle-encoding.s b/test/MC/X86/x86_64-hle-encoding.s new file mode 100644 index 0000000000..aaaca7d9c0 --- /dev/null +++ b/test/MC/X86/x86_64-hle-encoding.s @@ -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 diff --git a/utils/TableGen/X86RecognizableInstr.cpp b/utils/TableGen/X86RecognizableInstr.cpp index 46f2052b01..76d986b1c1 100644 --- a/utils/TableGen/X86RecognizableInstr.cpp +++ b/utils/TableGen/X86RecognizableInstr.cpp @@ -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))) |