From c721bc081eabd818990d92be4cb85cf7150b5468 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Fri, 19 Jun 2020 23:47:43 -0700 Subject: [PATCH] [X86] Correct the implementation of ud1(a.k.a. ud2b) instruction. We were missing the modrm byte this instruction has according to current Intel SDM. Experiments with gcc indicate that different modrm values are chosen based on 2 operands so I've added those as well. I think our previous implementation was based on an older behavior of binutils that has since been changed. --- llvm/lib/Target/X86/X86InstrInfo.td | 3 +++ llvm/lib/Target/X86/X86InstrSystem.td | 15 ++++++++++++++- llvm/test/MC/Disassembler/X86/x86-16.txt | 4 ++-- llvm/test/MC/X86/x86-16.s | 10 +++++++--- llvm/test/MC/X86/x86-32.s | 10 +++++++--- llvm/test/MC/X86/x86-64.s | 8 ++++++++ 6 files changed, 41 insertions(+), 9 deletions(-) diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td index 7474b2c..262961a 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/lib/Target/X86/X86InstrInfo.td @@ -3166,6 +3166,9 @@ def : MnemonicAlias<"smovl", "movsl", "att">; def : MnemonicAlias<"smovq", "movsq", "att">; def : MnemonicAlias<"ud2a", "ud2", "att">; +def : MnemonicAlias<"ud2bw", "ud1w", "att">; +def : MnemonicAlias<"ud2bl", "ud1l", "att">; +def : MnemonicAlias<"ud2bq", "ud1q", "att">; def : MnemonicAlias<"verrw", "verr", "att">; // MS recognizes 'xacquire'/'xrelease' as 'acquire'/'release' diff --git a/llvm/lib/Target/X86/X86InstrSystem.td b/llvm/lib/Target/X86/X86InstrSystem.td index 2523e80..c23bc7e 100644 --- a/llvm/lib/Target/X86/X86InstrSystem.td +++ b/llvm/lib/Target/X86/X86InstrSystem.td @@ -23,7 +23,20 @@ def RDTSCP : I<0x01, MRM_F9, (outs), (ins), "rdtscp", []>, TB; let mayLoad = 1, mayStore = 0, hasSideEffects = 1, isTrap = 1 in { def TRAP : I<0x0B, RawFrm, (outs), (ins), "ud2", [(trap)]>, TB; - def UD2B : I<0xB9, RawFrm, (outs), (ins), "ud2b", []>, TB; + + def UD1Wm : I<0xB9, MRMSrcMem, (outs), (ins GR16:$src1, i16mem:$src2), + "ud1{w} {$src2, $src1|$src1, $src2}", []>, TB, OpSize16; + def UD1Lm : I<0xB9, MRMSrcMem, (outs), (ins GR32:$src1, i32mem:$src2), + "ud1{l} {$src2, $src1|$src1, $src2}", []>, TB, OpSize32; + def UD1Qm : RI<0xB9, MRMSrcMem, (outs), (ins GR64:$src1, i64mem:$src2), + "ud1{q} {$src2, $src1|$src1, $src2}", []>, TB; + + def UD1Wr : I<0xB9, MRMSrcReg, (outs), (ins GR16:$src1, GR16:$src2), + "ud1{w} {$src2, $src1|$src1, $src2}", []>, TB, OpSize16; + def UD1Lr : I<0xB9, MRMSrcReg, (outs), (ins GR32:$src1, GR32:$src2), + "ud1{l} {$src2, $src1|$src1, $src2}", []>, TB, OpSize32; + def UD1Qr : RI<0xB9, MRMSrcReg, (outs), (ins GR64:$src1, GR64:$src2), + "ud1{q} {$src2, $src1|$src1, $src2}", []>, TB; } def HLT : I<0xF4, RawFrm, (outs), (ins), "hlt", []>; diff --git a/llvm/test/MC/Disassembler/X86/x86-16.txt b/llvm/test/MC/Disassembler/X86/x86-16.txt index 824daef..7de3141 100644 --- a/llvm/test/MC/Disassembler/X86/x86-16.txt +++ b/llvm/test/MC/Disassembler/X86/x86-16.txt @@ -699,8 +699,8 @@ # CHECK: ud2 0x0f 0x0b -# CHECK: ud2b -0x0f 0xb9 +# CHECK: ud1w %ax, %ax +0x0f 0xb9 0xc0 # CHECK: loope 0xe1 0x00 diff --git a/llvm/test/MC/X86/x86-16.s b/llvm/test/MC/X86/x86-16.s index 955f1e2..ed35409 100644 --- a/llvm/test/MC/X86/x86-16.s +++ b/llvm/test/MC/X86/x86-16.s @@ -789,9 +789,13 @@ pshufw $90, %mm4, %mm0 // CHECK: encoding: [0x0f,0x0b] ud2a -// CHECK: ud2b -// CHECK: encoding: [0x0f,0xb9] - ud2b +// CHECK: ud1w %ax, %ax +// CHECK: encoding: [0x0f,0xb9,0xc0] + ud1 %ax, %ax + +// CHECK: ud1w %ax, %ax +// CHECK: encoding: [0x0f,0xb9,0xc0] + ud2b %ax, %ax // CHECK: loope 0 // CHECK: encoding: [0xe1,A] diff --git a/llvm/test/MC/X86/x86-32.s b/llvm/test/MC/X86/x86-32.s index 5b249a6..fdd3c53 100644 --- a/llvm/test/MC/X86/x86-32.s +++ b/llvm/test/MC/X86/x86-32.s @@ -918,9 +918,13 @@ pshufw $90, %mm4, %mm0 // CHECK: encoding: [0x0f,0x0b] ud2a -// CHECK: ud2b -// CHECK: encoding: [0x0f,0xb9] - ud2b +// CHECK: ud1l %edx, %edi +// CHECK: encoding: [0x0f,0xb9,0xfa] + ud1 %edx, %edi + +// CHECK: ud1l (%ebx), %ecx +// CHECK: encoding: [0x0f,0xb9,0x0b] + ud2b (%ebx), %ecx // CHECK: loope 0 // CHECK: encoding: [0xe1,A] diff --git a/llvm/test/MC/X86/x86-64.s b/llvm/test/MC/X86/x86-64.s index 1b73ace..54b7c33 100644 --- a/llvm/test/MC/X86/x86-64.s +++ b/llvm/test/MC/X86/x86-64.s @@ -1892,3 +1892,11 @@ xsusldtrk // CHECK: xresldtrk // CHECK: encoding: [0xf2,0x0f,0x01,0xe9] xresldtrk + +// CHECK: ud1q %rdx, %rdi +// CHECK: encoding: [0x48,0x0f,0xb9,0xfa] +ud1 %rdx, %rdi + +// CHECK: ud1q (%rbx), %rcx +// CHECK: encoding: [0x48,0x0f,0xb9,0x0b] +ud2b (%rbx), %rcx -- 2.7.4