From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58191) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1anT72-0004KR-B9 for qemu-devel@nongnu.org; Tue, 05 Apr 2016 11:41:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1anT6y-0001nU-F2 for qemu-devel@nongnu.org; Tue, 05 Apr 2016 11:41:52 -0400 Received: from mail-qg0-x244.google.com ([2607:f8b0:400d:c04::244]:36372) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1anT6y-0001nQ-AA for qemu-devel@nongnu.org; Tue, 05 Apr 2016 11:41:48 -0400 Received: by mail-qg0-x244.google.com with SMTP id f105so1541001qge.3 for ; Tue, 05 Apr 2016 08:41:48 -0700 (PDT) Sender: Richard Henderson References: <1459834253-8291-1-git-send-email-cota@braap.org> <1459834253-8291-8-git-send-email-cota@braap.org> From: Richard Henderson Message-ID: <5703DCB7.50302@twiddle.net> Date: Tue, 5 Apr 2016 08:41:43 -0700 MIME-Version: 1.0 In-Reply-To: <1459834253-8291-8-git-send-email-cota@braap.org> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 07/10] tb hash: hash phys_pc, pc, and flags with xxhash List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Emilio G. Cota" , QEMU Developers , MTTCG Devel Cc: Peter Maydell , Paolo Bonzini , Sergey Fedorov , =?UTF-8?Q?Alex_Benn=c3=a9e?= , Peter Crosthwaite On 04/04/2016 10:30 PM, Emilio G. Cota wrote: > Tests show that the other element checked for in tb_find_physical, > cs_base, is always a match when tb_phys+pc+flags are a match, > so hashing cs_base is wasteful. It could be that this is an ARM-only > thing, though. The cs_base field is only used by i386 (in 16-bit modes), and sparc (for a TB consisting of only a delay slot). It may well still turn out to be reasonable to ignore cs_base for hashing. > +static inline > +uint32_t tb_hash_func(tb_page_addr_t phys_pc, target_ulong pc, uint64_t flags) > { > - return (pc >> 2) & (CODE_GEN_PHYS_HASH_SIZE - 1); > + struct key { > + tb_page_addr_t phys_pc; > + target_ulong pc; > + uint64_t flags; The flags field should be uint32_t, not uint64_t. See its definition in TranslationBlock. > + } QEMU_PACKED k; > + unsigned int hash; > + > + k.phys_pc = phys_pc; > + k.pc = pc; > + k.flags = flags; > + hash = qemu_xxh32((uint32_t *)&k, sizeof(k) / sizeof(uint32_t), 1); I'm less than happy about putting data into a struct and hashing that memory. Why don't you just take the ideas from xxh32/xxh64 and perform the hash directly right here? In particular, you've 3 data elements here, a maximum of 5 32-bit words, thus the loop within xxh32 will never roll, so it's mostly dead code. r~