qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 0/7] Define "deposit" tcg operation


From: Richard Henderson
Subject: [Qemu-devel] [PATCH 0/7] Define "deposit" tcg operation
Date: Fri, 7 Jan 2011 14:42:56 -0800

Emulating i386 -- particularly in 16-bit mode -- requires quite a few
bitfield insert operations, to handle byte and word stores into the
dword registers.  On several hosts, this can be done natively, without
resorting to a sequence of and and or instructions.  Even i386 as a
host can do better than the naive approach, and not merely for the set
that's implementable with byte/word stores.

Examples from i386-on-amd64:

0x4080d274:  movzbw -0x1335(%ebx),%ax

        before:
        0x60219f5d:  movzbl 0x0(%r13),%ebp
        0x60219f62:  movzwl %bp,%ebp
        0x60219f65:  mov    (%r14),%ebx
        0x60219f68:  and    $0xffff0000,%ebx
        0x60219f6e:  or     %ebp,%ebx

        after:
        0x6021aa5d:  movzbl 0x0(%r13),%ebp
        0x6021aa62:  mov    (%r14),%ebx
        0x6021aa65:  mov    %bp,%bx

        Note that we were able to use the word store.

0x4080e259:  mov    %dl,%dh

        before:
        0x6021d035:  mov    %ebp,%ebx
        0x6021d037:  movzbl %bl,%ebx
        0x6021d03a:  shl    $0x8,%ebx
        0x6021d03d:  and    $0xffff00ff,%ebp
        0x6021d043:  or     %ebx,%ebp

        after:
        0x6021da95:  mov    %ebp,%ebx
        0x6021da97:  ror    $0x8,%ebp
        0x6021da9a:  shrd   $0x8,%ebx,%ebp
        0x6021da9e:  rol    $0x10,%ebp

        Note that the replacement is 1 insn and 4 bytes shorter.

Counts as seen in -d in_asm:
                           byte    word
        i386/ls:            240      28
        fedora 12 boot:   30938   11459
        freedos boot:      6936   74803

Examples from ppc-on-amd64

0x4080add0:  rlwimi  r0,r25,30,0,1

        before:
        0x6027d886:  mov    0x64(%r14),%ebx
        0x6027d88a:  mov    %ebx,%r12d
        0x6027d88d:  rol    $0x1e,%r12d
        0x6027d891:  and    $0xc0000000,%r12d
        0x6027d898:  mov    (%r14),%r13d
        0x6027d89b:  and    $0x3fffffff,%r13d
        0x6027d8a2:  or     %r13d,%r12d

        after:
        0x6027e186:  mov    (%r14),%ebx
        0x6027e189:  mov    0x64(%r14),%r12d
        0x6027e18d:  ror    $0x1e,%ebx
        0x6027e190:  shrd   $0x2,%r12d,%ebx

Counts as seen in -d in_asm:
                  rlwimi
        ppc/ls:        9
        (no ppc kernel in qemu.org downloads?)



r~



Richard Henderson (7):
  tcg: Define "deposit" as an optional operation.
  tcg-ppc: Implement deposit operation.
  tcg-hppa: Implement deposit operation.
  tcg-ia64: Implement deposit operation.
  tcg-i386: Implement deposit operation.
  target-i386: Use deposit operation.
  target-ppc: Use deposit operation.

 target-i386/translate.c |   34 +++--------------
 target-ppc/translate.c  |   10 +++++
 tcg/README              |   14 +++++++
 tcg/hppa/tcg-target.c   |   58 ++++++++++++++++++++++++++---
 tcg/hppa/tcg-target.h   |    1 +
 tcg/i386/tcg-target.c   |   68 +++++++++++++++++++++++++++++++++--
 tcg/i386/tcg-target.h   |    2 +
 tcg/ia64/tcg-target.c   |   92 +++++++++++++++++++++++++++++++++++++++++++++++
 tcg/ia64/tcg-target.h   |    2 +
 tcg/ppc/tcg-target.c    |   17 ++++++++-
 tcg/ppc/tcg-target.h    |    1 +
 tcg/tcg-op.h            |   40 ++++++++++++++++++++
 tcg/tcg-opc.h           |    6 +++
 tcg/tcg.c               |   15 ++++++++
 14 files changed, 322 insertions(+), 38 deletions(-)

-- 
1.7.2.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]