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