[PATCH v2] X86: disambiguate unqualified btr, bts

PaX Team pageexec at gmail.com
Fri Jul 12 07:11:55 PDT 2013


On 11 Jul 2013 at 17:17, Eli Friedman wrote:

> On Wed, Jul 10, 2013 at 11:47 PM, Ramkumar Ramachandra
> <artagnon at gmail.com> wrote:
> > The instructions btr and bts are perfectly valid, and have existed since
> > Intel 386.  GNU as supports them fine, and there are instances of its
> > usage in linux.git.  Unfortunately, LLVM does not support them, and
> > barfs with:
> >
> >   error: ambiguous instructions require an explicit suffix
> >
> > Fix this problem by disambiguating it just like GNU as does, following
> > the example set by 824a907.
> >
> > Cc: Eli Friedman <eli.friedman at gmail.com>
> > Cc: Jim Grosbach <grosbach at apple.com>
> > Cc: Chris Lattner <sabre at nondot.org>
> > Signed-off-by: Ramkumar Ramachandra <artagnon at gmail.com>
> > ---
> >  FWIW, tests pass and clang goes past that point in linux.git.  Feel
> >  free to tweak the justification before applying (I couldn't think of
> >  anything else).
> >
> >  lib/Target/X86/X86InstrInfo.td | 4 ++++
> >  test/MC/X86/x86-64.s           | 6 ++++++
> >  2 files changed, 10 insertions(+)
> >
> > diff --git a/lib/Target/X86/X86InstrInfo.td b/lib/Target/X86/X86InstrInfo.td
> > index f33ae2a..d1b8d15 100644
> > --- a/lib/Target/X86/X86InstrInfo.td
> > +++ b/lib/Target/X86/X86InstrInfo.td
> > @@ -1971,6 +1971,10 @@ def : InstAlias<"aam", (AAM8i8 10)>;
> >  // Disambiguate the mem/imm form of bt-without-a-suffix as btl.
> >  def : InstAlias<"bt $imm, $mem", (BT32mi8 i32mem:$mem, i32i8imm:$imm)>;
> >
> > +// Disambiguate btr and bts, just like GNU as.
> > +def : InstAlias<"btr $imm, $mem", (BTR16mi8 i16mem:$mem, i16i8imm:$imm)>;
> > +def : InstAlias<"bts $imm, $mem", (BTS16mi8 i16mem:$mem, i16i8imm:$imm)>;
> > +
> >  // clr aliases.
> >  def : InstAlias<"clrb $reg", (XOR8rr  GR8 :$reg, GR8 :$reg)>;
> >  def : InstAlias<"clrw $reg", (XOR16rr GR16:$reg, GR16:$reg)>;
> > diff --git a/test/MC/X86/x86-64.s b/test/MC/X86/x86-64.s
> > index 521a077..9f89cda 100644
> > --- a/test/MC/X86/x86-64.s
> > +++ b/test/MC/X86/x86-64.s
> > @@ -698,6 +698,12 @@ movl       0, %eax   // CHECK: movl 0, %eax # encoding: [0x8b,0x04,0x25,0x00,0x00,0x00
> >  btl    $1, 0 // CHECK: btl $1, 0 # encoding: [0x0f,0xba,0x24,0x25,0x00,0x00,0x00,0x00,0x01]
> >  bt     $1, 0 // CHECK: btl $1, 0 # encoding: [0x0f,0xba,0x24,0x25,0x00,0x00,0x00,0x00,0x01]
> >
> > +// Disambiguate btr, bts
> > +btrw   $1, 0 // CHECK: btrw $1, 0 # encoding: [0x66,0x0f,0xba,0x34,0x25,0x00,0x00,0x00,0x00,0x01]
> > +btr    $1, 0 // CHECK: btrw $1, 0 # encoding: [0x66,0x0f,0xba,0x34,0x25,0x00,0x00,0x00,0x00,0x01]
> > +btsw   $1, 0 // CHECK: btsw $1, 0 # encoding: [0x66,0x0f,0xba,0x2c,0x25,0x00,0x00,0x00,0x00,0x01]
> > +bts    $1, 0 // CHECK: btsw $1, 0 # encoding: [0x66,0x0f,0xba,0x2c,0x25,0x00,0x00,0x00,0x00,0x01]
> 
> This doesn't match gas.

this has been discussed in the past already:

http://llvm.org/bugs/show_bug.cgi?id=9362
http://llvm.org/bugs/show_bug.cgi?id=9437

and the conclusion was to change the linux (user) side, not llvm.




More information about the llvm-commits mailing list