[PATCH] D48606: [X86] Use bts/btr/btc for single bit set/clear/complement of a variable bit position

Roman Lebedev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 26 23:48:48 PDT 2018


lebedev.ri added inline comments.


================
Comment at: lib/Target/X86/X86InstrCompiler.td:1811-1813
+  def : Pat<(and RC:$src1, (rotl -2, GR8:$src2)),
+            (BTR RC:$src1,
+                 (INSERT_SUBREG (VT (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
----------------
It doesn't look like the 16-bit cases matched?
```
# *** IR Dump After X86 DAG->DAG Instruction Selection ***:
# Machine code for function btr_16: IsSSA, TracksLiveness
Function Live Ins: $edi in %0, $esi in %1

bb.0 (%ir-block.0):
  liveins: $edi, $esi
  %1:gr32 = COPY $esi
  %0:gr32 = COPY $edi
  %2:gr8 = COPY %1.sub_8bit:gr32
  %3:gr16 = MOV16ri -2
  $cl = COPY %2:gr8
  %4:gr16 = ROL16rCL %3:gr16, implicit-def dead $eflags, implicit $cl
  %6:gr32 = IMPLICIT_DEF
  %5:gr32 = INSERT_SUBREG %6:gr32, killed %4:gr16, %subreg.sub_16bit
  %7:gr32 = AND32rr %0:gr32, killed %5:gr32, implicit-def dead $eflags
  %8:gr16 = COPY %7.sub_16bit:gr32
  $ax = COPY %8:gr16
  RET 0, $ax
```



================
Comment at: test/CodeGen/X86/btc_bts_btr.ll:513-517
+; X64-NEXT:    movl $-2, %eax
+; X64-NEXT:    movl %esi, %ecx
+; X64-NEXT:    roll %cl, %eax
+; X64-NEXT:    andl (%rdi), %eax
+; X64-NEXT:    retq
----------------
I wonder if something like
```
mov (%rdi), %edi
btr %esi, %edi
```
would be better still than not folding at all?


https://reviews.llvm.org/D48606





More information about the llvm-commits mailing list