From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=48765 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PbL36-0001ha-Vz for qemu-devel@nongnu.org; Fri, 07 Jan 2011 17:44:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PbL1o-0003M6-A4 for qemu-devel@nongnu.org; Fri, 07 Jan 2011 17:43:27 -0500 Received: from a.mail.sonic.net ([64.142.16.245]:46697) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PbL1o-0003LV-1E for qemu-devel@nongnu.org; Fri, 07 Jan 2011 17:43:24 -0500 From: Richard Henderson Date: Fri, 7 Jan 2011 14:42:56 -0800 Message-Id: <1294440183-885-1-git-send-email-rth@twiddle.net> Subject: [Qemu-devel] [PATCH 0/7] Define "deposit" tcg operation List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Alexander Graf , Aurelien Jarno 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