diff options
Diffstat (limited to 'lib/builtins/arm/clzdi2.S')
| -rw-r--r-- | lib/builtins/arm/clzdi2.S | 73 | 
1 files changed, 33 insertions, 40 deletions
diff --git a/lib/builtins/arm/clzdi2.S b/lib/builtins/arm/clzdi2.S index fc03b385cdfa..685668b11b8e 100644 --- a/lib/builtins/arm/clzdi2.S +++ b/lib/builtins/arm/clzdi2.S @@ -1,16 +1,15 @@ -/* ===-- clzdi2.c - Implement __clzdi2 -------------------------------------=== - * - *               The LLVM Compiler Infrastructure - * - * This file is dual licensed under the MIT and the University of Illinois Open - * Source Licenses. See LICENSE.TXT for details. - * - * ===----------------------------------------------------------------------=== - * - * This file implements count leading zeros for 64bit arguments. - * - * ===----------------------------------------------------------------------=== - */ +//===-- clzdi2.c - Implement __clzdi2 -------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements count leading zeros for 64bit arguments. +// +//===----------------------------------------------------------------------===// +  #include "../assembly.h"  	.syntax unified @@ -35,14 +34,12 @@ DEFINE_COMPILERRT_FUNCTION(__clzdi2)  #endif  	JMP(lr)  #else -	/* Assumption: n != 0 */ +	// Assumption: n != 0 -	/* -	 * r0: n -	 * r1: upper half of n, overwritten after check -	 * r1: count of leading zeros in n + 1 -	 * r2: scratch register for shifted r0 -	 */ +	// r0: n +	// r1: upper half of n, overwritten after check +	// r1: count of leading zeros in n + 1 +	// r2: scratch register for shifted r0  #ifdef __ARMEB__  	cmp	r0, 0  	moveq	r0, r1 @@ -53,14 +50,12 @@ DEFINE_COMPILERRT_FUNCTION(__clzdi2)  	movne	r1, 1  	moveq	r1, 33 -	/* -	 * Basic block: -	 * if ((r0 >> SHIFT) == 0) -	 *   r1 += SHIFT; -	 * else -	 *   r0 >>= SHIFT; -	 * for descending powers of two as SHIFT. -	 */ +	// Basic block: +	// if ((r0 >> SHIFT) == 0) +	//   r1 += SHIFT; +	// else +	//   r0 >>= SHIFT; +	// for descending powers of two as SHIFT.  #define BLOCK(shift) \  	lsrs	r2, r0, shift; \  	movne	r0, r2; \ @@ -71,18 +66,16 @@ DEFINE_COMPILERRT_FUNCTION(__clzdi2)  	BLOCK(4)  	BLOCK(2) -	/* -	 * The basic block invariants at this point are (r0 >> 2) == 0 and -	 * r0 != 0. This means 1 <= r0 <= 3 and 0 <= (r0 >> 1) <= 1. -	 * -	 * r0 | (r0 >> 1) == 0 | (r0 >> 1) == 1 | -(r0 >> 1) | 1 - (r0 >> 1) -	 * ---+----------------+----------------+------------+-------------- -	 * 1  | 1              | 0              | 0          | 1 -	 * 2  | 0              | 1              | -1         | 0 -	 * 3  | 0              | 1              | -1         | 0 -	 * -	 * The r1's initial value of 1 compensates for the 1 here. -	 */ +	// The basic block invariants at this point are (r0 >> 2) == 0 and +	// r0 != 0. This means 1 <= r0 <= 3 and 0 <= (r0 >> 1) <= 1. +	// +	// r0 | (r0 >> 1) == 0 | (r0 >> 1) == 1 | -(r0 >> 1) | 1 - (r0 >> 1) +	// ---+----------------+----------------+------------+-------------- +	// 1  | 1              | 0              | 0          | 1 +	// 2  | 0              | 1              | -1         | 0 +	// 3  | 0              | 1              | -1         | 0 +	// +	// The r1's initial value of 1 compensates for the 1 here.  	sub	r0, r1, r0, lsr #1  	JMP(lr)  | 
