From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 101998 invoked by alias); 8 Aug 2017 16:03:22 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 101890 invoked by uid 89); 8 Aug 2017 16:03:16 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2 spammy=subtraction, Sources X-HELO: EUR03-DB5-obe.outbound.protection.outlook.com From: Wilco Dijkstra To: "libc-alpha@sourceware.org" CC: nd , Szabolcs Nagy Subject: Re: [PATCH][AArch64] Optimized memcmp Date: Tue, 08 Aug 2017 16:03:00 -0000 Message-ID: References: In-Reply-To: authentication-results: spf=none (sender IP is ) smtp.mailfrom=Wilco.Dijkstra@arm.com; x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;AM5PR0802MB2482;6:zN/SSmaGKVclwg9IwewHZEd5MZu6VC6hmSRz5UUd68Rp3LpYmo4t8O/cbOyKMIhuZvdCyGyPcIngaZeiy37ZTdc/f6naDwf2nrXmH+LJDVqe1NdVdUndAtIKyCClQu5V57sIQ19DmT/1Iumj/FAhEbNkPSjlQVTQ6U35rkkMDyanrSlUGgZVe1M03NUSqRa9dBjUtbzuisz0AKUTfAGVuTMP2X44raDI4Gowpiw4E9pA4Jd0EWRgiKdhqU7DByZuDD820olXCoCU+uHDWERJTZKsZEmqLgS4nANS2LB41XIDiFebXyc3WV1eOXqP/GqkhTVMxp2MhwdX1MTcf67CwA==;5:IBtesWHNFL12+Yjm4QcH8e1u3t+IICHDA4hCMk15vjKd6socbGHZNMuqyu2KFoVNKLWcWuotsgsnPmxvAZdv3vQcKAtVAb5Fxd0SnThK2m37iIQ7JOaMjzbveipkqsPg38So9hQxfTLkDzUsaEiR7Q==;24:XcEMFhjOciloF+NAlqDxhfNl7DwdoU+JqOVF4yqiO9kEaErRqZnCrO8HgfoQu3c/SeiYS2kr+oqrN9uEN+dhQCi++GHUtPeim47YLwp9ICA=;7:949I5JbOeatlcuUMpzeHQgSs7lKX7nIm3ScvtuLUXTiaWl7ufel0mHOrORYIkqJzelqw3kL9DartI8NnCmB9oIv5KEs2nUbypG6+6JnPHDsB1fbQhi5abxR3RIopRP86a152ffDAZf99w8I0KwQBTT7QI4By+a3EwVa4Xv5Sykp9Kd3qrk0Av1hRPzIZ1GMx4anSz1+Oi9wKPuG9/J+E+cvefjpBegkMFqDDpdh/wo8= x-ms-exchange-antispam-srfa-diagnostics: SSOS; x-ms-office365-filtering-correlation-id: e2bfed16-5116-43c0-3204-08d4de76f6ea x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(48565401081)(300000503095)(300135400095)(2017052603031)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:AM5PR0802MB2482; x-ms-traffictypediagnostic: AM5PR0802MB2482: nodisclaimer: True x-exchange-antispam-report-test: UriScan:(180628864354917); x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(100000703101)(100105400095)(10201501046)(93006095)(93001095)(3002001)(6055026)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123558100)(20161123555025)(20161123562025)(20161123564025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:AM5PR0802MB2482;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:AM5PR0802MB2482; x-forefront-prvs: 03932714EB x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(6009001)(39860400002)(39840400002)(39450400003)(39410400002)(39850400002)(39400400002)(377424004)(54534003)(189002)(199003)(6116002)(102836003)(3846002)(2906002)(54356999)(6506006)(86362001)(76176999)(81166006)(50986999)(189998001)(25786009)(3660700001)(53936002)(6246003)(110136004)(38730400002)(3280700002)(4326008)(5640700003)(6436002)(305945005)(9686003)(54906002)(53946003)(99286003)(66066001)(55016002)(101416001)(33656002)(6916009)(2950100002)(229853002)(2900100001)(7736002)(68736007)(478600001)(7696004)(8936002)(74316002)(5660300001)(81156014)(2501003)(8676002)(106356001)(2351001)(105586002)(53546010)(5250100002)(72206003)(14454004)(97736004)(357404004);DIR:OUT;SFP:1101;SCL:1;SRVR:AM5PR0802MB2482;H:DB6PR0801MB2053.eurprd08.prod.outlook.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Aug 2017 16:03:09.4883 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0802MB2482 X-SW-Source: 2017-08/txt/msg00280.txt.bz2 ping From: Wilco Dijkstra Sent: 07 July 2017 16:11 To: libc-alpha@sourceware.org Cc: nd; Szabolcs Nagy Subject: [PATCH][AArch64] Optimized memcmp =A0=20=20=20 This is an optimized memcmp for AArch64.=A0 This is a complete rewrite using a different algorithm.=A0 The previous version split into cases where both inputs were aligned, the inputs were mutually aligned and unaligned using a byte loop.=A0 The new version combines all these cases, while small inputs of less than 8 bytes are handled separately. This allows the main code to be sped up using unaligned loads since there are now at least 8 bytes to be compared.=A0 After the first 8 bytes, align the first input.=A0 This ensures each iteration does at most one unaligned access and mutually aligned inputs behave as aligned. After the main loop, process the last 8 bytes using unaligned accesses. This improves performance of (mutually) aligned cases by 25% and=20 unaligned by >500% (yes >6 times faster) on large inputs. ChangeLog: 2017-07-07=A0 Wilco Dijkstra=A0 =A0=A0=A0=A0=A0=A0=A0 * sysdeps/aarch64/memcmp.S (memcmp):=20 =A0=A0=A0=A0=A0=A0=A0 Rewrite of optimized memcmp. GLIBC benchtests/bench-memcmp.c performance comparison for Cortex-A53: Length=A0=A0=A0 1, alignment=A0 1/ 1:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 153% Length=A0=A0=A0 1, alignment=A0 1/ 1:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 119% Length=A0=A0=A0 1, alignment=A0 1/ 1:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 154% Length=A0=A0=A0 2, alignment=A0 2/ 2:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 121% Length=A0=A0=A0 2, alignment=A0 2/ 2:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 140% Length=A0=A0=A0 2, alignment=A0 2/ 2:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 121% Length=A0=A0=A0 3, alignment=A0 3/ 3:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 105% Length=A0=A0=A0 3, alignment=A0 3/ 3:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 105% Length=A0=A0=A0 3, alignment=A0 3/ 3:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 105% Length=A0=A0=A0 4, alignment=A0 4/ 4:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 155% Length=A0=A0=A0 4, alignment=A0 4/ 4:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 154% Length=A0=A0=A0 4, alignment=A0 4/ 4:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 161% Length=A0=A0=A0 5, alignment=A0 5/ 5:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 173% Length=A0=A0=A0 5, alignment=A0 5/ 5:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 173% Length=A0=A0=A0 5, alignment=A0 5/ 5:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 173% Length=A0=A0=A0 6, alignment=A0 6/ 6:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 145% Length=A0=A0=A0 6, alignment=A0 6/ 6:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 145% Length=A0=A0=A0 6, alignment=A0 6/ 6:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 145% Length=A0=A0=A0 7, alignment=A0 7/ 7:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length=A0=A0=A0 7, alignment=A0 7/ 7:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length=A0=A0=A0 7, alignment=A0 7/ 7:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length=A0=A0=A0 8, alignment=A0 8/ 8:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 111% Length=A0=A0=A0 8, alignment=A0 8/ 8:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 130% Length=A0=A0=A0 8, alignment=A0 8/ 8:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 124% Length=A0=A0=A0 9, alignment=A0 9/ 9:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 160% Length=A0=A0=A0 9, alignment=A0 9/ 9:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 160% Length=A0=A0=A0 9, alignment=A0 9/ 9:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 150% Length=A0=A0 10, alignment 10/10:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 170% Length=A0=A0 10, alignment 10/10:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 137% Length=A0=A0 10, alignment 10/10:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 150% Length=A0=A0 11, alignment 11/11:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 160% Length=A0=A0 11, alignment 11/11:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 160% Length=A0=A0 11, alignment 11/11:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 160% Length=A0=A0 12, alignment 12/12:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 146% Length=A0=A0 12, alignment 12/12:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 168% Length=A0=A0 12, alignment 12/12:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 156% Length=A0=A0 13, alignment 13/13:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 167% Length=A0=A0 13, alignment 13/13:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 167% Length=A0=A0 13, alignment 13/13:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 173% Length=A0=A0 14, alignment 14/14:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 167% Length=A0=A0 14, alignment 14/14:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 168% Length=A0=A0 14, alignment 14/14:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 168% Length=A0=A0 15, alignment 15/15:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 168% Length=A0=A0 15, alignment 15/15:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 173% Length=A0=A0 15, alignment 15/15:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 173% Length=A0=A0=A0 1, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 134% Length=A0=A0=A0 1, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 127% Length=A0=A0=A0 1, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 119% Length=A0=A0=A0 2, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 94% Length=A0=A0=A0 2, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 94% Length=A0=A0=A0 2, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 106% Length=A0=A0=A0 3, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 82% Length=A0=A0=A0 3, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 87% Length=A0=A0=A0 3, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 82% Length=A0=A0=A0 4, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 115% Length=A0=A0=A0 4, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 115% Length=A0=A0=A0 4, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 122% Length=A0=A0=A0 5, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 127% Length=A0=A0=A0 5, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 119% Length=A0=A0=A0 5, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 127% Length=A0=A0=A0 6, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 103% Length=A0=A0=A0 6, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 100% Length=A0=A0=A0 6, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 100% Length=A0=A0=A0 7, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 82% Length=A0=A0=A0 7, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 91% Length=A0=A0=A0 7, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 87% Length=A0=A0=A0 8, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 111% Length=A0=A0=A0 8, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 124% Length=A0=A0=A0 8, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 124% Length=A0=A0=A0 9, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0=A0 9, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0=A0 9, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 10, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 10, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 135% Length=A0=A0 10, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 11, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 11, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 11, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 135% Length=A0=A0 12, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 12, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 12, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 13, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 135% Length=A0=A0 13, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 13, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 14, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 14, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 14, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 15, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 15, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0 15, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 136% Length=A0=A0=A0 4, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 115% Length=A0=A0=A0 4, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 115% Length=A0=A0=A0 4, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 115% Length=A0=A0 32, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 127% Length=A0=A0 32, alignment=A0 7/ 2:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 395% Length=A0=A0 32, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 127% Length=A0=A0 32, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 127% Length=A0=A0=A0 8, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 111% Length=A0=A0=A0 8, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 124% Length=A0=A0=A0 8, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 124% Length=A0=A0 64, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 128% Length=A0=A0 64, alignment=A0 6/ 4:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 475% Length=A0=A0 64, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 131% Length=A0=A0 64, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 134% Length=A0=A0 16, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 128% Length=A0=A0 16, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 119% Length=A0=A0 16, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 128% Length=A0 128, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 129% Length=A0 128, alignment=A0 5/ 6:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 475% Length=A0 128, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 130% Length=A0 128, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 129% Length=A0=A0 32, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 126% Length=A0=A0 32, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 126% Length=A0=A0 32, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 126% Length=A0 256, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 127% Length=A0 256, alignment=A0 4/ 8:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 545% Length=A0 256, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 126% Length=A0 256, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 128% Length=A0=A0 64, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 171% Length=A0=A0 64, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 171% Length=A0=A0 64, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 174% Length=A0 512, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 126% Length=A0 512, alignment=A0 3/10:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 585% Length=A0 512, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 126% Length=A0 512, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 127% Length=A0 128, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 129% Length=A0 128, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 128% Length=A0 128, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 129% Length 1024, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length 1024, alignment=A0 2/12:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 611% Length 1024, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 126% Length 1024, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 126% Length=A0 256, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 128% Length=A0 256, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 127% Length=A0 256, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 128% Length 2048, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length 2048, alignment=A0 1/14:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 625% Length 2048, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length 2048, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length=A0 512, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 126% Length=A0 512, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 127% Length=A0 512, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 127% Length 4096, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length 4096, alignment=A0 0/16:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length 4096, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length 4096, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length 1024, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 126% Length 1024, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 126% Length 1024, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 126% Length 8192, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length 8192, alignment 63/18:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 636% Length 8192, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length 8192, alignment=A0 0/ 0:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 125% Length=A0=A0 16, alignment=A0 1/ 2:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 317% Length=A0=A0 16, alignment=A0 1/ 2:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 317% Length=A0=A0 16, alignment=A0 1/ 2:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 317% Length=A0=A0 32, alignment=A0 2/ 4:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 395% Length=A0=A0 32, alignment=A0 2/ 4:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 395% Length=A0=A0 32, alignment=A0 2/ 4:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 398% Length=A0=A0 64, alignment=A0 3/ 6:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 475% Length=A0=A0 64, alignment=A0 3/ 6:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 475% Length=A0=A0 64, alignment=A0 3/ 6:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 477% Length=A0 128, alignment=A0 4/ 8:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 479% Length=A0 128, alignment=A0 4/ 8:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 479% Length=A0 128, alignment=A0 4/ 8:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 479% Length=A0 256, alignment=A0 5/10:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 543% Length=A0 256, alignment=A0 5/10:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 539% Length=A0 256, alignment=A0 5/10:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 543% Length=A0 512, alignment=A0 6/12:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 585% Length=A0 512, alignment=A0 6/12:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 585% Length=A0 512, alignment=A0 6/12:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 585% Length 1024, alignment=A0 7/14:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 611% Length 1024, alignment=A0 7/14:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 611% Length 1024, alignment=A0 7/14:=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 611% --- diff --git a/sysdeps/aarch64/memcmp.S b/sysdeps/aarch64/memcmp.S index 4cfcb89297551a07fcfa055827564b833e86f8fb..b99c081bba2c7f26b5b53315d6b= 806ae22eaaafc 100644 --- a/sysdeps/aarch64/memcmp.S +++ b/sysdeps/aarch64/memcmp.S @@ -22,132 +22,98 @@ =A0 =A0/* Assumptions: =A0 * - * ARMv8-a, AArch64 + * ARMv8-a, AArch64, unaligned accesses. =A0 */ =A0 =A0/* Parameters and result.=A0 */ =A0#define src1=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x0 =A0#define src2=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x1 =A0#define limit=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x2 -#define result=A0=A0=A0=A0=A0=A0=A0=A0 x0 +#define result=A0=A0=A0=A0=A0=A0=A0=A0 w0 =A0 =A0/* Internal variables.=A0 */ =A0#define data1=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x3 =A0#define data1w=A0=A0=A0=A0=A0=A0=A0=A0=A0 w3 =A0#define data2=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x4 =A0#define data2w=A0=A0=A0=A0=A0=A0=A0=A0=A0 w4 -#define has_nul=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x5 -#define diff=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x6 -#define endloop=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x7 -#define tmp1=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x8 -#define tmp2=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x9 -#define tmp3=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x10 -#define pos=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x11 -#define limit_wd=A0=A0=A0=A0=A0=A0 x12 -#define mask=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x13 +#define tmp1=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 x5 =A0 =A0ENTRY_ALIGN (memcmp, 6) =A0=A0=A0=A0=A0=A0=A0=A0 DELOUSE (0) =A0=A0=A0=A0=A0=A0=A0=A0 DELOUSE (1) =A0=A0=A0=A0=A0=A0=A0=A0 DELOUSE (2) -=A0=A0=A0=A0=A0=A0 cbz=A0=A0=A0=A0 limit, L(ret0) -=A0=A0=A0=A0=A0=A0 eor=A0=A0=A0=A0 tmp1, src1, src2 -=A0=A0=A0=A0=A0=A0 tst=A0=A0=A0=A0 tmp1, #7 -=A0=A0=A0=A0=A0=A0 b.ne=A0=A0=A0 L(misaligned8) -=A0=A0=A0=A0=A0=A0 ands=A0=A0=A0 tmp1, src1, #7 -=A0=A0=A0=A0=A0=A0 b.ne=A0=A0=A0 L(mutual_align) -=A0=A0=A0=A0=A0=A0 add=A0=A0=A0=A0 limit_wd, limit, #7 -=A0=A0=A0=A0=A0=A0 lsr=A0=A0=A0=A0 limit_wd, limit_wd, #3 -=A0=A0=A0=A0=A0=A0 /* Start of performance-critical section=A0 -- one 64B = cache line.=A0 */ -L(loop_aligned): -=A0=A0=A0=A0=A0=A0 ldr=A0=A0=A0=A0 data1, [src1], #8 -=A0=A0=A0=A0=A0=A0 ldr=A0=A0=A0=A0 data2, [src2], #8 -L(start_realigned): -=A0=A0=A0=A0=A0=A0 subs=A0=A0=A0 limit_wd, limit_wd, #1 -=A0=A0=A0=A0=A0=A0 eor=A0=A0=A0=A0 diff, data1, data2=A0=A0=A0=A0=A0 /* No= n-zero if differences found.=A0 */ -=A0=A0=A0=A0=A0=A0 csinv=A0=A0 endloop, diff, xzr, ne=A0 /* Last Dword or = differences.=A0 */ -=A0=A0=A0=A0=A0=A0 cbz=A0=A0=A0=A0 endloop, L(loop_aligned) -=A0=A0=A0=A0=A0=A0 /* End of performance-critical section=A0 -- one 64B ca= che line.=A0 */ - -=A0=A0=A0=A0=A0=A0 /* Not reached the limit, must have found a diff.=A0 */ -=A0=A0=A0=A0=A0=A0 cbnz=A0=A0=A0 limit_wd, L(not_limit) - -=A0=A0=A0=A0=A0=A0 /* Limit % 8 =3D=3D 0 =3D> all bytes significant.=A0 */ -=A0=A0=A0=A0=A0=A0 ands=A0=A0=A0 limit, limit, #7 -=A0=A0=A0=A0=A0=A0 b.eq=A0=A0=A0 L(not_limit) - -=A0=A0=A0=A0=A0=A0 lsl=A0=A0=A0=A0 limit, limit, #3=A0=A0=A0=A0=A0=A0=A0 /= * Bits -> bytes.=A0 */ -=A0=A0=A0=A0=A0=A0 mov=A0=A0=A0=A0 mask, #~0 -#ifdef __AARCH64EB__ -=A0=A0=A0=A0=A0=A0 lsr=A0=A0=A0=A0 mask, mask, limit -#else -=A0=A0=A0=A0=A0=A0 lsl=A0=A0=A0=A0 mask, mask, limit -#endif -=A0=A0=A0=A0=A0=A0 bic=A0=A0=A0=A0 data1, data1, mask -=A0=A0=A0=A0=A0=A0 bic=A0=A0=A0=A0 data2, data2, mask - -=A0=A0=A0=A0=A0=A0 orr=A0=A0=A0=A0 diff, diff, mask -L(not_limit): =A0 -#ifndef=A0=A0=A0=A0=A0=A0=A0 __AARCH64EB__ -=A0=A0=A0=A0=A0=A0 rev=A0=A0=A0=A0 diff, diff +=A0=A0=A0=A0=A0=A0 subs=A0=A0=A0 limit, limit, 8 +=A0=A0=A0=A0=A0=A0 b.lo=A0=A0=A0 .Lless8 + +=A0=A0=A0=A0=A0=A0 /* Limit >=3D 8, so check first 8 bytes using unaligned= loads.=A0 */ +=A0=A0=A0=A0=A0=A0 ldr=A0=A0=A0=A0 data1, [src1], 8 +=A0=A0=A0=A0=A0=A0 ldr=A0=A0=A0=A0 data2, [src2], 8 +=A0=A0=A0=A0=A0=A0 and=A0=A0=A0=A0 tmp1, src1, 7 +=A0=A0=A0=A0=A0=A0 add=A0=A0=A0=A0 limit, limit, tmp1 +=A0=A0=A0=A0=A0=A0 cmp=A0=A0=A0=A0 data1, data2 +=A0=A0=A0=A0=A0=A0 bne=A0=A0=A0=A0 .Lreturn + +=A0=A0=A0=A0=A0=A0 /* Align src1 and adjust src2 with bytes not yet done.= =A0 */ +=A0=A0=A0=A0=A0=A0 sub=A0=A0=A0=A0 src1, src1, tmp1 +=A0=A0=A0=A0=A0=A0 sub=A0=A0=A0=A0 src2, src2, tmp1 + +=A0=A0=A0=A0=A0=A0 subs=A0=A0=A0 limit, limit, 8 +=A0=A0=A0=A0=A0=A0 b.ls=A0=A0=A0 .Llast_bytes + +=A0=A0=A0=A0=A0=A0 /* Loop performing 8 bytes per iteration using aligned = src1. +=A0=A0=A0=A0=A0=A0=A0=A0=A0 Limit is pre-decremented by 8 and must be larg= er than zero. +=A0=A0=A0=A0=A0=A0=A0=A0=A0 Exit if <=3D 8 bytes left to do or if the data= is not equal.=A0 */ +=A0=A0=A0=A0=A0=A0 .p2align 4 +.Lloop8: +=A0=A0=A0=A0=A0=A0 ldr=A0=A0=A0=A0 data1, [src1], 8 +=A0=A0=A0=A0=A0=A0 ldr=A0=A0=A0=A0 data2, [src2], 8 +=A0=A0=A0=A0=A0=A0 subs=A0=A0=A0 limit, limit, 8 +=A0=A0=A0=A0=A0=A0 ccmp=A0=A0=A0 data1, data2, 0, hi=A0 /* NZCV =3D 0b0000= .=A0 */ +=A0=A0=A0=A0=A0=A0 b.eq=A0=A0=A0 .Lloop8 + +=A0=A0=A0=A0=A0=A0 cmp=A0=A0=A0=A0 data1, data2 +=A0=A0=A0=A0=A0=A0 bne=A0=A0=A0=A0 .Lreturn + +=A0=A0=A0=A0=A0=A0 /* Compare last 1-8 bytes using unaligned access.=A0 */ +.Llast_bytes: +=A0=A0=A0=A0=A0=A0 ldr=A0=A0=A0=A0 data1, [src1, limit] +=A0=A0=A0=A0=A0=A0 ldr=A0=A0=A0=A0 data2, [src2, limit] + +=A0=A0=A0=A0=A0=A0 /* Compare data bytes and set return value to 0, -1 or = 1.=A0 */ +.Lreturn: +#ifndef __AARCH64EB__ =A0=A0=A0=A0=A0=A0=A0=A0 rev=A0=A0=A0=A0 data1, data1 =A0=A0=A0=A0=A0=A0=A0=A0 rev=A0=A0=A0=A0 data2, data2 =A0#endif -=A0=A0=A0=A0=A0=A0 /* The MS-non-zero bit of DIFF marks either the first b= it -=A0=A0=A0=A0=A0=A0=A0=A0=A0 that is different, or the end of the significa= nt data. -=A0=A0=A0=A0=A0=A0=A0=A0=A0 Shifting left now will bring the critical info= rmation into the -=A0=A0=A0=A0=A0=A0=A0=A0=A0 top bits.=A0 */ -=A0=A0=A0=A0=A0=A0 clz=A0=A0=A0=A0 pos, diff -=A0=A0=A0=A0=A0=A0 lsl=A0=A0=A0=A0 data1, data1, pos -=A0=A0=A0=A0=A0=A0 lsl=A0=A0=A0=A0 data2, data2, pos -=A0=A0=A0=A0=A0=A0 /* But we need to zero-extend (char is unsigned) the va= lue and then -=A0=A0=A0=A0=A0=A0=A0=A0=A0 perform a signed 32-bit subtraction.=A0 */ -=A0=A0=A0=A0=A0=A0 lsr=A0=A0=A0=A0 data1, data1, #56 -=A0=A0=A0=A0=A0=A0 sub=A0=A0=A0=A0 result, data1, data2, lsr #56 -=A0=A0=A0=A0=A0=A0 RET - -L(mutual_align): -=A0=A0=A0=A0=A0=A0 /* Sources are mutually aligned, but are not currently = at an -=A0=A0=A0=A0=A0=A0=A0=A0=A0 alignment boundary.=A0 Round down the addresse= s and then mask off -=A0=A0=A0=A0=A0=A0=A0=A0=A0 the bytes that precede the start point.=A0 */ -=A0=A0=A0=A0=A0=A0 bic=A0=A0=A0=A0 src1, src1, #7 -=A0=A0=A0=A0=A0=A0 bic=A0=A0=A0=A0 src2, src2, #7 -=A0=A0=A0=A0=A0=A0 add=A0=A0=A0=A0 limit, limit, tmp1=A0=A0=A0=A0=A0 /* Ad= just the limit for the extra.=A0 */ -=A0=A0=A0=A0=A0=A0 lsl=A0=A0=A0=A0 tmp1, tmp1, #3=A0=A0=A0=A0=A0=A0=A0=A0= =A0 /* Bytes beyond alignment -> bits.=A0 */ -=A0=A0=A0=A0=A0=A0 ldr=A0=A0=A0=A0 data1, [src1], #8 -=A0=A0=A0=A0=A0=A0 neg=A0=A0=A0=A0 tmp1, tmp1=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 /* Bits to alignment -64.=A0 */ -=A0=A0=A0=A0=A0=A0 ldr=A0=A0=A0=A0 data2, [src2], #8 -=A0=A0=A0=A0=A0=A0 mov=A0=A0=A0=A0 tmp2, #~0 -#ifdef __AARCH64EB__ -=A0=A0=A0=A0=A0=A0 /* Big-endian.=A0 Early bytes are at MSB.=A0 */ -=A0=A0=A0=A0=A0=A0 lsl=A0=A0=A0=A0 tmp2, tmp2, tmp1=A0=A0=A0=A0=A0=A0=A0 /= * Shift (tmp1 & 63).=A0 */ -#else -=A0=A0=A0=A0=A0=A0 /* Little-endian.=A0 Early bytes are at LSB.=A0 */ -=A0=A0=A0=A0=A0=A0 lsr=A0=A0=A0=A0 tmp2, tmp2, tmp1=A0=A0=A0=A0=A0=A0=A0 /= * Shift (tmp1 & 63).=A0 */ -#endif -=A0=A0=A0=A0=A0=A0 add=A0=A0=A0=A0 limit_wd, limit, #7 -=A0=A0=A0=A0=A0=A0 orr=A0=A0=A0=A0 data1, data1, tmp2 -=A0=A0=A0=A0=A0=A0 orr=A0=A0=A0=A0 data2, data2, tmp2 -=A0=A0=A0=A0=A0=A0 lsr=A0=A0=A0=A0 limit_wd, limit_wd, #3 -=A0=A0=A0=A0=A0=A0 b=A0=A0=A0=A0=A0=A0 L(start_realigned) - -L(ret0): -=A0=A0=A0=A0=A0=A0 mov=A0=A0=A0=A0 result, #0 -=A0=A0=A0=A0=A0=A0 RET - -=A0=A0=A0=A0=A0=A0 .p2align 6 -L(misaligned8): -=A0=A0=A0=A0=A0=A0 sub=A0=A0=A0=A0 limit, limit, #1 -1: -=A0=A0=A0=A0=A0=A0 /* Perhaps we can do better than this.=A0 */ -=A0=A0=A0=A0=A0=A0 ldrb=A0=A0=A0 data1w, [src1], #1 -=A0=A0=A0=A0=A0=A0 ldrb=A0=A0=A0 data2w, [src2], #1 -=A0=A0=A0=A0=A0=A0 subs=A0=A0=A0 limit, limit, #1 -=A0=A0=A0=A0=A0=A0 ccmp=A0=A0=A0 data1w, data2w, #0, cs=A0 /* NZCV =3D 0b0= 000.=A0 */ -=A0=A0=A0=A0=A0=A0 b.eq=A0=A0=A0 1b -=A0=A0=A0=A0=A0=A0 sub=A0=A0=A0=A0 result, data1, data2 -=A0=A0=A0=A0=A0=A0 RET +=A0=A0=A0=A0=A0=A0 cmp=A0=A0=A0=A0 data1, data2 +.Lret_eq: +=A0=A0=A0=A0=A0=A0 cset=A0=A0=A0 result, ne +=A0=A0=A0=A0=A0=A0 cneg=A0=A0=A0 result, result, lo +=A0=A0=A0=A0=A0=A0 ret + +=A0=A0=A0=A0=A0=A0 .p2align 4 +=A0=A0=A0=A0=A0=A0 /* Compare up to 8 bytes.=A0 Limit is [-8..-1].=A0 */ +.Lless8: +=A0=A0=A0=A0=A0=A0 adds=A0=A0=A0 limit, limit, 4 +=A0=A0=A0=A0=A0=A0 b.lo=A0=A0=A0 .Lless4 +=A0=A0=A0=A0=A0=A0 ldr=A0=A0=A0=A0 data1w, [src1], 4 +=A0=A0=A0=A0=A0=A0 ldr=A0=A0=A0=A0 data2w, [src2], 4 +=A0=A0=A0=A0=A0=A0 cmp=A0=A0=A0=A0 data1w, data2w +=A0=A0=A0=A0=A0=A0 b.ne=A0=A0=A0 .Lreturn +=A0=A0=A0=A0=A0=A0 sub=A0=A0=A0=A0 limit, limit, 4 +.Lless4: +=A0=A0=A0=A0=A0=A0 adds=A0=A0=A0 limit, limit, 4 +=A0=A0=A0=A0=A0=A0 beq=A0=A0=A0=A0 .Lret_eq +.Lbyte_loop: +=A0=A0=A0=A0=A0=A0 ldrb=A0=A0=A0 data1w, [src1], 1 +=A0=A0=A0=A0=A0=A0 ldrb=A0=A0=A0 data2w, [src2], 1 +=A0=A0=A0=A0=A0=A0 subs=A0=A0=A0 limit, limit, 1 +=A0=A0=A0=A0=A0=A0 ccmp=A0=A0=A0 data1w, data2w, 0, ne=A0=A0 /* NZCV =3D 0= b0000.=A0 */ +=A0=A0=A0=A0=A0=A0 b.eq=A0=A0=A0 .Lbyte_loop +=A0=A0=A0=A0=A0=A0 sub=A0=A0=A0=A0 result, data1w, data2w +=A0=A0=A0=A0=A0=A0 ret + =A0END (memcmp) =A0#undef bcmp =A0weak_alias (memcmp, bcmp) =20=20=20=20