From patchwork Fri Mar 13 16:03:52 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mason X-Patchwork-Id: 6006591 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 80514BF90F for ; Fri, 13 Mar 2015 16:06:33 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 946822020F for ; Fri, 13 Mar 2015 16:06:32 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9B49020211 for ; Fri, 13 Mar 2015 16:06:30 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1YWS4S-0005Vr-Tg; Fri, 13 Mar 2015 16:04:20 +0000 Received: from smtp2-g21.free.fr ([212.27.42.2]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1YWS4O-0005N0-Fi for linux-arm-kernel@lists.infradead.org; Fri, 13 Mar 2015 16:04:17 +0000 Received: from [172.27.0.114] (unknown [83.142.147.193]) (Authenticated sender: shill) by smtp2-g21.free.fr (Postfix) with ESMTPSA id 653D14B0288 for ; Fri, 13 Mar 2015 17:02:50 +0100 (CET) Message-ID: <55030A68.6070002@free.fr> Date: Fri, 13 Mar 2015 17:03:52 +0100 From: Mason User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0 SeaMonkey/2.32.1 MIME-Version: 1.0 To: Linux ARM Subject: read_cpuid_id() in arch/arm/kernel/setup.c X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150313_090416_701664_62B05637 X-CRM114-Status: GOOD ( 10.12 ) X-Spam-Score: -0.7 (/) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hello everyone, As far as I can tell, read_cpuid_id() resolves to read_cpuid(CPUID_ID) which resolves to mrc 15, 0, rN, cr0, cr0, {0} Consider this: /* * The CPU ID never changes at run time, so we might as well tell the * compiler that it's constant. Use this function to read the CPU ID * rather than directly reading processor_id or read_cpuid() directly. */ static inline unsigned int __attribute_const__ read_cpuid_id(void) { return read_cpuid(CPUID_ID); } Despite the comment and attribute, my compiler(*) still reloads the value every time. (*) gcc version 4.9.3 20141031 (prerelease) (Linaro GCC 2014.11) e.g. static int __get_cpu_architecture(void) { int cpu_arch; unsigned int id = read_cpuid_id(); if ((id & 0x0008f000) == 0) { cpu_arch = CPU_ARCH_UNKNOWN; } else if ((id & 0x0008f000) == 0x00007000) { cpu_arch = (id & (1 << 23)) ? CPU_ARCH_ARMv4T : CPU_ARCH_ARMv3; } else if ((id & 0x00080000) == 0x00000000) { cpu_arch = (id >> 16) & 7; if (cpu_arch) cpu_arch += CPU_ARCH_ARMv3; } else if ((id & 0x000f0000) == 0x000f0000) { resolves to c01fec74: ee10cf10 mrc 15, 0, ip, cr0, cr0, {0} c01fec78: e21cca8f ands ip, ip, #585728 ; 0x8f000 c01fec7c: e34c3023 movt r3, #49187 ; 0xc023 c01fec80: e5837008 str r7, [r3, #8] c01fec84: e50b304c str r3, [fp, #-76] ; 0x4c c01fec88: 0a000022 beq c01fed18 c01fec8c: ee103f10 mrc 15, 0, r3, cr0, cr0, {0} c01fec90: e2033a8f and r3, r3, #585728 ; 0x8f000 c01fec94: e3530a07 cmp r3, #28672 ; 0x7000 c01fec98: 1a000004 bne c01fecb0 c01fec9c: ee103f10 mrc 15, 0, r3, cr0, cr0, {0} c01feca0: e3130502 tst r3, #8388608 ; 0x800000 c01feca4: 13a0c003 movne ip, #3 c01feca8: 03a0c001 moveq ip, #1 c01fecac: ea000019 b c01fed18 c01fecb0: ee103f10 mrc 15, 0, r3, cr0, cr0, {0} c01fecb4: e3130702 tst r3, #524288 ; 0x80000 So I thought it would be nice to give the poor compiler a break, and just stuff the result in a local variable: which compiles to c01fec74: ee102f10 mrc 15, 0, r2, cr0, cr0, {0} c01fec78: e212ca8f ands ip, r2, #585728 ; 0x8f000 c01fec7c: e34c3023 movt r3, #49187 ; 0xc023 c01fec80: e5837008 str r7, [r3, #8] c01fec84: e50b304c str r3, [fp, #-76] ; 0x4c c01fec88: 0a00001c beq c01fed00 c01fec8c: e35c0a07 cmp ip, #28672 ; 0x7000 c01fec90: 1a000003 bne c01feca4 c01fec94: e3120502 tst r2, #8388608 ; 0x800000 c01fec98: 13a0c003 movne ip, #3 c01fec9c: 03a0c001 moveq ip, #1 c01feca0: ea000016 b c01fed00 c01feca4: e3120702 tst r2, #524288 ; 0x80000 Is this nano-optimization worth considering? Regards. --- setup.c 2015-03-03 18:04:59.000000000 +0100 +++ setup.foo.c 2015-03-13 16:26:56.413380663 +0100 @@ -237,15 +237,16 @@ { int cpu_arch; - if ((read_cpuid_id() & 0x0008f000) == 0) { + unsigned int id = read_cpuid_id(); + if ((id & 0x0008f000) == 0) { cpu_arch = CPU_ARCH_UNKNOWN; - } else if ((read_cpuid_id() & 0x0008f000) == 0x00007000) { - cpu_arch = (read_cpuid_id() & (1 << 23)) ? CPU_ARCH_ARMv4T : CPU_ARCH_ARMv3; - } else if ((read_cpuid_id() & 0x00080000) == 0x00000000) { - cpu_arch = (read_cpuid_id() >> 16) & 7; + } else if ((id & 0x0008f000) == 0x00007000) { + cpu_arch = (id & (1 << 23)) ? CPU_ARCH_ARMv4T : CPU_ARCH_ARMv3; + } else if ((id & 0x00080000) == 0x00000000) { + cpu_arch = (id >> 16) & 7; if (cpu_arch) cpu_arch += CPU_ARCH_ARMv3; - } else if ((read_cpuid_id() & 0x000f0000) == 0x000f0000) { + } else if ((id & 0x000f0000) == 0x000f0000) { unsigned int mmfr0; /* Revised CPUID format. Read the Memory Model Feature