162306a36Sopenharmony_ci/* longlong.h -- definitions for mixed size 32/64 bit arithmetic.
262306a36Sopenharmony_ci * Note: I added some stuff for use with gnupg
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) 1991, 1992, 1993, 1994, 1996, 1998,
562306a36Sopenharmony_ci *	2000, 2001, 2002, 2003 Free Software Foundation, Inc.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * This file is free software; you can redistribute it and/or modify
862306a36Sopenharmony_ci * it under the terms of the GNU Library General Public License as published by
962306a36Sopenharmony_ci * the Free Software Foundation; either version 2 of the License, or (at your
1062306a36Sopenharmony_ci * option) any later version.
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * This file is distributed in the hope that it will be useful, but
1362306a36Sopenharmony_ci * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1462306a36Sopenharmony_ci * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
1562306a36Sopenharmony_ci * License for more details.
1662306a36Sopenharmony_ci *
1762306a36Sopenharmony_ci * You should have received a copy of the GNU Library General Public License
1862306a36Sopenharmony_ci * along with this file; see the file COPYING.LIB.  If not, write to
1962306a36Sopenharmony_ci * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
2062306a36Sopenharmony_ci * MA 02111-1307, USA. */
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#include <linux/count_zeros.h>
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/* You have to define the following before including this file:
2562306a36Sopenharmony_ci *
2662306a36Sopenharmony_ci * UWtype -- An unsigned type, default type for operations (typically a "word")
2762306a36Sopenharmony_ci * UHWtype -- An unsigned type, at least half the size of UWtype.
2862306a36Sopenharmony_ci * UDWtype -- An unsigned type, at least twice as large a UWtype
2962306a36Sopenharmony_ci * W_TYPE_SIZE -- size in bits of UWtype
3062306a36Sopenharmony_ci *
3162306a36Sopenharmony_ci * SItype, USItype -- Signed and unsigned 32 bit types.
3262306a36Sopenharmony_ci * DItype, UDItype -- Signed and unsigned 64 bit types.
3362306a36Sopenharmony_ci *
3462306a36Sopenharmony_ci * On a 32 bit machine UWtype should typically be USItype;
3562306a36Sopenharmony_ci * on a 64 bit machine, UWtype should typically be UDItype.
3662306a36Sopenharmony_ci*/
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define __BITS4 (W_TYPE_SIZE / 4)
3962306a36Sopenharmony_ci#define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2))
4062306a36Sopenharmony_ci#define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1))
4162306a36Sopenharmony_ci#define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2))
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci/* This is used to make sure no undesirable sharing between different libraries
4462306a36Sopenharmony_ci	that use this file takes place.  */
4562306a36Sopenharmony_ci#ifndef __MPN
4662306a36Sopenharmony_ci#define __MPN(x) __##x
4762306a36Sopenharmony_ci#endif
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/* Define auxiliary asm macros.
5062306a36Sopenharmony_ci *
5162306a36Sopenharmony_ci * 1) umul_ppmm(high_prod, low_prod, multiplier, multiplicand) multiplies two
5262306a36Sopenharmony_ci * UWtype integers MULTIPLIER and MULTIPLICAND, and generates a two UWtype
5362306a36Sopenharmony_ci * word product in HIGH_PROD and LOW_PROD.
5462306a36Sopenharmony_ci *
5562306a36Sopenharmony_ci * 2) __umulsidi3(a,b) multiplies two UWtype integers A and B, and returns a
5662306a36Sopenharmony_ci * UDWtype product.  This is just a variant of umul_ppmm.
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci * 3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
5962306a36Sopenharmony_ci * denominator) divides a UDWtype, composed by the UWtype integers
6062306a36Sopenharmony_ci * HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient
6162306a36Sopenharmony_ci * in QUOTIENT and the remainder in REMAINDER.	HIGH_NUMERATOR must be less
6262306a36Sopenharmony_ci * than DENOMINATOR for correct operation.  If, in addition, the most
6362306a36Sopenharmony_ci * significant bit of DENOMINATOR must be 1, then the pre-processor symbol
6462306a36Sopenharmony_ci * UDIV_NEEDS_NORMALIZATION is defined to 1.
6562306a36Sopenharmony_ci * 4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
6662306a36Sopenharmony_ci * denominator).  Like udiv_qrnnd but the numbers are signed.  The quotient
6762306a36Sopenharmony_ci * is rounded towards 0.
6862306a36Sopenharmony_ci *
6962306a36Sopenharmony_ci * 5) count_leading_zeros(count, x) counts the number of zero-bits from the
7062306a36Sopenharmony_ci * msb to the first non-zero bit in the UWtype X.  This is the number of
7162306a36Sopenharmony_ci * steps X needs to be shifted left to set the msb.  Undefined for X == 0,
7262306a36Sopenharmony_ci * unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value.
7362306a36Sopenharmony_ci *
7462306a36Sopenharmony_ci * 6) count_trailing_zeros(count, x) like count_leading_zeros, but counts
7562306a36Sopenharmony_ci * from the least significant end.
7662306a36Sopenharmony_ci *
7762306a36Sopenharmony_ci * 7) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
7862306a36Sopenharmony_ci * high_addend_2, low_addend_2) adds two UWtype integers, composed by
7962306a36Sopenharmony_ci * HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and LOW_ADDEND_2
8062306a36Sopenharmony_ci * respectively.  The result is placed in HIGH_SUM and LOW_SUM.  Overflow
8162306a36Sopenharmony_ci * (i.e. carry out) is not stored anywhere, and is lost.
8262306a36Sopenharmony_ci *
8362306a36Sopenharmony_ci * 8) sub_ddmmss(high_difference, low_difference, high_minuend, low_minuend,
8462306a36Sopenharmony_ci * high_subtrahend, low_subtrahend) subtracts two two-word UWtype integers,
8562306a36Sopenharmony_ci * composed by HIGH_MINUEND_1 and LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and
8662306a36Sopenharmony_ci * LOW_SUBTRAHEND_2 respectively.  The result is placed in HIGH_DIFFERENCE
8762306a36Sopenharmony_ci * and LOW_DIFFERENCE.	Overflow (i.e. carry out) is not stored anywhere,
8862306a36Sopenharmony_ci * and is lost.
8962306a36Sopenharmony_ci *
9062306a36Sopenharmony_ci * If any of these macros are left undefined for a particular CPU,
9162306a36Sopenharmony_ci * C macros are used.  */
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci/* The CPUs come in alphabetical order below.
9462306a36Sopenharmony_ci *
9562306a36Sopenharmony_ci * Please add support for more CPUs here, or improve the current support
9662306a36Sopenharmony_ci * for the CPUs below!	*/
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci#if defined(__GNUC__) && !defined(NO_ASM)
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci/* We sometimes need to clobber "cc" with gcc2, but that would not be
10162306a36Sopenharmony_ci	understood by gcc1.	Use cpp to avoid major code duplication.  */
10262306a36Sopenharmony_ci#if __GNUC__ < 2
10362306a36Sopenharmony_ci#define __CLOBBER_CC
10462306a36Sopenharmony_ci#define __AND_CLOBBER_CC
10562306a36Sopenharmony_ci#else /* __GNUC__ >= 2 */
10662306a36Sopenharmony_ci#define __CLOBBER_CC : "cc"
10762306a36Sopenharmony_ci#define __AND_CLOBBER_CC , "cc"
10862306a36Sopenharmony_ci#endif /* __GNUC__ < 2 */
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci/***************************************
11162306a36Sopenharmony_ci	**************  A29K  *****************
11262306a36Sopenharmony_ci	***************************************/
11362306a36Sopenharmony_ci#if (defined(__a29k__) || defined(_AM29K)) && W_TYPE_SIZE == 32
11462306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
11562306a36Sopenharmony_ci	__asm__ ("add %1,%4,%5\n" \
11662306a36Sopenharmony_ci		"addc %0,%2,%3" \
11762306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
11862306a36Sopenharmony_ci		"=&r" ((USItype)(sl)) \
11962306a36Sopenharmony_ci	: "%r" ((USItype)(ah)), \
12062306a36Sopenharmony_ci		"rI" ((USItype)(bh)), \
12162306a36Sopenharmony_ci		"%r" ((USItype)(al)), \
12262306a36Sopenharmony_ci		"rI" ((USItype)(bl)))
12362306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
12462306a36Sopenharmony_ci	__asm__ ("sub %1,%4,%5\n" \
12562306a36Sopenharmony_ci		"subc %0,%2,%3" \
12662306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
12762306a36Sopenharmony_ci		"=&r" ((USItype)(sl)) \
12862306a36Sopenharmony_ci	: "r" ((USItype)(ah)), \
12962306a36Sopenharmony_ci		"rI" ((USItype)(bh)), \
13062306a36Sopenharmony_ci		"r" ((USItype)(al)), \
13162306a36Sopenharmony_ci		"rI" ((USItype)(bl)))
13262306a36Sopenharmony_ci#define umul_ppmm(xh, xl, m0, m1) \
13362306a36Sopenharmony_cido { \
13462306a36Sopenharmony_ci		USItype __m0 = (m0), __m1 = (m1); \
13562306a36Sopenharmony_ci		__asm__ ("multiplu %0,%1,%2" \
13662306a36Sopenharmony_ci		: "=r" ((USItype)(xl)) \
13762306a36Sopenharmony_ci		: "r" (__m0), \
13862306a36Sopenharmony_ci			"r" (__m1)); \
13962306a36Sopenharmony_ci		__asm__ ("multmu %0,%1,%2" \
14062306a36Sopenharmony_ci		: "=r" ((USItype)(xh)) \
14162306a36Sopenharmony_ci		: "r" (__m0), \
14262306a36Sopenharmony_ci			"r" (__m1)); \
14362306a36Sopenharmony_ci} while (0)
14462306a36Sopenharmony_ci#define udiv_qrnnd(q, r, n1, n0, d) \
14562306a36Sopenharmony_ci	__asm__ ("dividu %0,%3,%4" \
14662306a36Sopenharmony_ci	: "=r" ((USItype)(q)), \
14762306a36Sopenharmony_ci		"=q" ((USItype)(r)) \
14862306a36Sopenharmony_ci	: "1" ((USItype)(n1)), \
14962306a36Sopenharmony_ci		"r" ((USItype)(n0)), \
15062306a36Sopenharmony_ci		"r" ((USItype)(d)))
15162306a36Sopenharmony_ci#endif /* __a29k__ */
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci#if defined(__alpha) && W_TYPE_SIZE == 64
15462306a36Sopenharmony_ci#define umul_ppmm(ph, pl, m0, m1)			\
15562306a36Sopenharmony_cido {							\
15662306a36Sopenharmony_ci	UDItype __m0 = (m0), __m1 = (m1);		\
15762306a36Sopenharmony_ci	(ph) = __builtin_alpha_umulh(__m0, __m1);	\
15862306a36Sopenharmony_ci	(pl) = __m0 * __m1;                             \
15962306a36Sopenharmony_ci} while (0)
16062306a36Sopenharmony_ci#define UMUL_TIME 46
16162306a36Sopenharmony_ci#ifndef LONGLONG_STANDALONE
16262306a36Sopenharmony_ci#define udiv_qrnnd(q, r, n1, n0, d) \
16362306a36Sopenharmony_cido { UDItype __r; \
16462306a36Sopenharmony_ci	(q) = __udiv_qrnnd(&__r, (n1), (n0), (d)); \
16562306a36Sopenharmony_ci	(r) = __r; \
16662306a36Sopenharmony_ci} while (0)
16762306a36Sopenharmony_ciextern UDItype __udiv_qrnnd(UDItype *, UDItype, UDItype, UDItype);
16862306a36Sopenharmony_ci#define UDIV_TIME 220
16962306a36Sopenharmony_ci#endif /* LONGLONG_STANDALONE */
17062306a36Sopenharmony_ci#endif /* __alpha */
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci/***************************************
17362306a36Sopenharmony_ci	**************  ARM  ******************
17462306a36Sopenharmony_ci	***************************************/
17562306a36Sopenharmony_ci#if defined(__arm__) && W_TYPE_SIZE == 32
17662306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
17762306a36Sopenharmony_ci	__asm__ ("adds %1, %4, %5\n" \
17862306a36Sopenharmony_ci		"adc  %0, %2, %3" \
17962306a36Sopenharmony_ci	: "=r" (sh), \
18062306a36Sopenharmony_ci		"=&r" (sl) \
18162306a36Sopenharmony_ci	: "%r" ((USItype)(ah)), \
18262306a36Sopenharmony_ci		"rI" ((USItype)(bh)), \
18362306a36Sopenharmony_ci		"%r" ((USItype)(al)), \
18462306a36Sopenharmony_ci		"rI" ((USItype)(bl)))
18562306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
18662306a36Sopenharmony_ci	__asm__ ("subs %1, %4, %5\n" \
18762306a36Sopenharmony_ci		"sbc  %0, %2, %3" \
18862306a36Sopenharmony_ci	: "=r" (sh), \
18962306a36Sopenharmony_ci		"=&r" (sl) \
19062306a36Sopenharmony_ci	: "r" ((USItype)(ah)), \
19162306a36Sopenharmony_ci		"rI" ((USItype)(bh)), \
19262306a36Sopenharmony_ci		"r" ((USItype)(al)), \
19362306a36Sopenharmony_ci		"rI" ((USItype)(bl)))
19462306a36Sopenharmony_ci#if defined __ARM_ARCH_2__ || defined __ARM_ARCH_3__
19562306a36Sopenharmony_ci#define umul_ppmm(xh, xl, a, b) \
19662306a36Sopenharmony_ci	__asm__ ("@ Inlined umul_ppmm\n" \
19762306a36Sopenharmony_ci		"mov	%|r0, %2, lsr #16		@ AAAA\n" \
19862306a36Sopenharmony_ci		"mov	%|r2, %3, lsr #16		@ BBBB\n" \
19962306a36Sopenharmony_ci		"bic	%|r1, %2, %|r0, lsl #16		@ aaaa\n" \
20062306a36Sopenharmony_ci		"bic	%0, %3, %|r2, lsl #16		@ bbbb\n" \
20162306a36Sopenharmony_ci		"mul	%1, %|r1, %|r2			@ aaaa * BBBB\n" \
20262306a36Sopenharmony_ci		"mul	%|r2, %|r0, %|r2		@ AAAA * BBBB\n" \
20362306a36Sopenharmony_ci		"mul	%|r1, %0, %|r1			@ aaaa * bbbb\n" \
20462306a36Sopenharmony_ci		"mul	%0, %|r0, %0			@ AAAA * bbbb\n" \
20562306a36Sopenharmony_ci		"adds	%|r0, %1, %0			@ central sum\n" \
20662306a36Sopenharmony_ci		"addcs	%|r2, %|r2, #65536\n" \
20762306a36Sopenharmony_ci		"adds	%1, %|r1, %|r0, lsl #16\n" \
20862306a36Sopenharmony_ci		"adc	%0, %|r2, %|r0, lsr #16" \
20962306a36Sopenharmony_ci	: "=&r" (xh), \
21062306a36Sopenharmony_ci		"=r" (xl) \
21162306a36Sopenharmony_ci	: "r" ((USItype)(a)), \
21262306a36Sopenharmony_ci		"r" ((USItype)(b)) \
21362306a36Sopenharmony_ci	: "r0", "r1", "r2")
21462306a36Sopenharmony_ci#else
21562306a36Sopenharmony_ci#define umul_ppmm(xh, xl, a, b) \
21662306a36Sopenharmony_ci	__asm__ ("@ Inlined umul_ppmm\n" \
21762306a36Sopenharmony_ci		"umull %1, %0, %2, %3" \
21862306a36Sopenharmony_ci	: "=&r" (xh), \
21962306a36Sopenharmony_ci		"=&r" (xl) \
22062306a36Sopenharmony_ci	: "r" ((USItype)(a)), \
22162306a36Sopenharmony_ci		"r" ((USItype)(b)) \
22262306a36Sopenharmony_ci	: "r0", "r1")
22362306a36Sopenharmony_ci#endif
22462306a36Sopenharmony_ci#define UMUL_TIME 20
22562306a36Sopenharmony_ci#define UDIV_TIME 100
22662306a36Sopenharmony_ci#endif /* __arm__ */
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci/***************************************
22962306a36Sopenharmony_ci	**************  CLIPPER  **************
23062306a36Sopenharmony_ci	***************************************/
23162306a36Sopenharmony_ci#if defined(__clipper__) && W_TYPE_SIZE == 32
23262306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v) \
23362306a36Sopenharmony_ci	({union {UDItype __ll; \
23462306a36Sopenharmony_ci		struct {USItype __l, __h; } __i; \
23562306a36Sopenharmony_ci	} __xx; \
23662306a36Sopenharmony_ci	__asm__ ("mulwux %2,%0" \
23762306a36Sopenharmony_ci	: "=r" (__xx.__ll) \
23862306a36Sopenharmony_ci	: "%0" ((USItype)(u)), \
23962306a36Sopenharmony_ci		"r" ((USItype)(v))); \
24062306a36Sopenharmony_ci	(w1) = __xx.__i.__h; (w0) = __xx.__i.__l; })
24162306a36Sopenharmony_ci#define smul_ppmm(w1, w0, u, v) \
24262306a36Sopenharmony_ci	({union {DItype __ll; \
24362306a36Sopenharmony_ci		struct {SItype __l, __h; } __i; \
24462306a36Sopenharmony_ci	} __xx; \
24562306a36Sopenharmony_ci	__asm__ ("mulwx %2,%0" \
24662306a36Sopenharmony_ci	: "=r" (__xx.__ll) \
24762306a36Sopenharmony_ci	: "%0" ((SItype)(u)), \
24862306a36Sopenharmony_ci		"r" ((SItype)(v))); \
24962306a36Sopenharmony_ci	(w1) = __xx.__i.__h; (w0) = __xx.__i.__l; })
25062306a36Sopenharmony_ci#define __umulsidi3(u, v) \
25162306a36Sopenharmony_ci	({UDItype __w; \
25262306a36Sopenharmony_ci	__asm__ ("mulwux %2,%0" \
25362306a36Sopenharmony_ci	: "=r" (__w) \
25462306a36Sopenharmony_ci	: "%0" ((USItype)(u)), \
25562306a36Sopenharmony_ci		"r" ((USItype)(v))); \
25662306a36Sopenharmony_ci	__w; })
25762306a36Sopenharmony_ci#endif /* __clipper__ */
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci/***************************************
26062306a36Sopenharmony_ci	**************  GMICRO  ***************
26162306a36Sopenharmony_ci	***************************************/
26262306a36Sopenharmony_ci#if defined(__gmicro__) && W_TYPE_SIZE == 32
26362306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
26462306a36Sopenharmony_ci	__asm__ ("add.w %5,%1\n" \
26562306a36Sopenharmony_ci		"addx %3,%0" \
26662306a36Sopenharmony_ci	: "=g" ((USItype)(sh)), \
26762306a36Sopenharmony_ci		"=&g" ((USItype)(sl)) \
26862306a36Sopenharmony_ci	: "%0" ((USItype)(ah)), \
26962306a36Sopenharmony_ci		"g" ((USItype)(bh)), \
27062306a36Sopenharmony_ci		"%1" ((USItype)(al)), \
27162306a36Sopenharmony_ci		"g" ((USItype)(bl)))
27262306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
27362306a36Sopenharmony_ci	__asm__ ("sub.w %5,%1\n" \
27462306a36Sopenharmony_ci		"subx %3,%0" \
27562306a36Sopenharmony_ci	: "=g" ((USItype)(sh)), \
27662306a36Sopenharmony_ci		"=&g" ((USItype)(sl)) \
27762306a36Sopenharmony_ci	: "0" ((USItype)(ah)), \
27862306a36Sopenharmony_ci		"g" ((USItype)(bh)), \
27962306a36Sopenharmony_ci		"1" ((USItype)(al)), \
28062306a36Sopenharmony_ci		"g" ((USItype)(bl)))
28162306a36Sopenharmony_ci#define umul_ppmm(ph, pl, m0, m1) \
28262306a36Sopenharmony_ci	__asm__ ("mulx %3,%0,%1" \
28362306a36Sopenharmony_ci	: "=g" ((USItype)(ph)), \
28462306a36Sopenharmony_ci		"=r" ((USItype)(pl)) \
28562306a36Sopenharmony_ci	: "%0" ((USItype)(m0)), \
28662306a36Sopenharmony_ci		"g" ((USItype)(m1)))
28762306a36Sopenharmony_ci#define udiv_qrnnd(q, r, nh, nl, d) \
28862306a36Sopenharmony_ci	__asm__ ("divx %4,%0,%1" \
28962306a36Sopenharmony_ci	: "=g" ((USItype)(q)), \
29062306a36Sopenharmony_ci		"=r" ((USItype)(r)) \
29162306a36Sopenharmony_ci	: "1" ((USItype)(nh)), \
29262306a36Sopenharmony_ci		"0" ((USItype)(nl)), \
29362306a36Sopenharmony_ci		"g" ((USItype)(d)))
29462306a36Sopenharmony_ci#endif
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci/***************************************
29762306a36Sopenharmony_ci	**************  HPPA  *****************
29862306a36Sopenharmony_ci	***************************************/
29962306a36Sopenharmony_ci#if defined(__hppa) && W_TYPE_SIZE == 32
30062306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
30162306a36Sopenharmony_ci	__asm__ ("add %4,%5,%1\n" \
30262306a36Sopenharmony_ci		   "addc %2,%3,%0" \
30362306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
30462306a36Sopenharmony_ci	     "=&r" ((USItype)(sl)) \
30562306a36Sopenharmony_ci	: "%rM" ((USItype)(ah)), \
30662306a36Sopenharmony_ci	     "rM" ((USItype)(bh)), \
30762306a36Sopenharmony_ci	     "%rM" ((USItype)(al)), \
30862306a36Sopenharmony_ci	     "rM" ((USItype)(bl)))
30962306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
31062306a36Sopenharmony_ci	__asm__ ("sub %4,%5,%1\n" \
31162306a36Sopenharmony_ci	   "subb %2,%3,%0" \
31262306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
31362306a36Sopenharmony_ci	     "=&r" ((USItype)(sl)) \
31462306a36Sopenharmony_ci	: "rM" ((USItype)(ah)), \
31562306a36Sopenharmony_ci	     "rM" ((USItype)(bh)), \
31662306a36Sopenharmony_ci	     "rM" ((USItype)(al)), \
31762306a36Sopenharmony_ci	     "rM" ((USItype)(bl)))
31862306a36Sopenharmony_ci#if 0 && defined(_PA_RISC1_1)
31962306a36Sopenharmony_ci/* xmpyu uses floating point register which is not allowed in Linux kernel. */
32062306a36Sopenharmony_ci#define umul_ppmm(wh, wl, u, v) \
32162306a36Sopenharmony_cido { \
32262306a36Sopenharmony_ci	union {UDItype __ll; \
32362306a36Sopenharmony_ci	struct {USItype __h, __l; } __i; \
32462306a36Sopenharmony_ci	} __xx; \
32562306a36Sopenharmony_ci	__asm__ ("xmpyu %1,%2,%0" \
32662306a36Sopenharmony_ci	: "=*f" (__xx.__ll) \
32762306a36Sopenharmony_ci	: "*f" ((USItype)(u)), \
32862306a36Sopenharmony_ci	       "*f" ((USItype)(v))); \
32962306a36Sopenharmony_ci	(wh) = __xx.__i.__h; \
33062306a36Sopenharmony_ci	(wl) = __xx.__i.__l; \
33162306a36Sopenharmony_ci} while (0)
33262306a36Sopenharmony_ci#define UMUL_TIME 8
33362306a36Sopenharmony_ci#define UDIV_TIME 60
33462306a36Sopenharmony_ci#else
33562306a36Sopenharmony_ci#define UMUL_TIME 40
33662306a36Sopenharmony_ci#define UDIV_TIME 80
33762306a36Sopenharmony_ci#endif
33862306a36Sopenharmony_ci#if 0 /* #ifndef LONGLONG_STANDALONE */
33962306a36Sopenharmony_ci#define udiv_qrnnd(q, r, n1, n0, d) \
34062306a36Sopenharmony_cido { USItype __r; \
34162306a36Sopenharmony_ci	(q) = __udiv_qrnnd(&__r, (n1), (n0), (d)); \
34262306a36Sopenharmony_ci	(r) = __r; \
34362306a36Sopenharmony_ci} while (0)
34462306a36Sopenharmony_ciextern USItype __udiv_qrnnd();
34562306a36Sopenharmony_ci#endif /* LONGLONG_STANDALONE */
34662306a36Sopenharmony_ci#endif /* hppa */
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ci/***************************************
34962306a36Sopenharmony_ci	**************  I370  *****************
35062306a36Sopenharmony_ci	***************************************/
35162306a36Sopenharmony_ci#if (defined(__i370__) || defined(__mvs__)) && W_TYPE_SIZE == 32
35262306a36Sopenharmony_ci#define umul_ppmm(xh, xl, m0, m1) \
35362306a36Sopenharmony_cido { \
35462306a36Sopenharmony_ci	union {UDItype __ll; \
35562306a36Sopenharmony_ci	   struct {USItype __h, __l; } __i; \
35662306a36Sopenharmony_ci	} __xx; \
35762306a36Sopenharmony_ci	USItype __m0 = (m0), __m1 = (m1); \
35862306a36Sopenharmony_ci	__asm__ ("mr %0,%3" \
35962306a36Sopenharmony_ci	: "=r" (__xx.__i.__h), \
36062306a36Sopenharmony_ci	       "=r" (__xx.__i.__l) \
36162306a36Sopenharmony_ci	: "%1" (__m0), \
36262306a36Sopenharmony_ci	       "r" (__m1)); \
36362306a36Sopenharmony_ci	(xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \
36462306a36Sopenharmony_ci	(xh) += ((((SItype) __m0 >> 31) & __m1) \
36562306a36Sopenharmony_ci	     + (((SItype) __m1 >> 31) & __m0)); \
36662306a36Sopenharmony_ci} while (0)
36762306a36Sopenharmony_ci#define smul_ppmm(xh, xl, m0, m1) \
36862306a36Sopenharmony_cido { \
36962306a36Sopenharmony_ci	union {DItype __ll; \
37062306a36Sopenharmony_ci	   struct {USItype __h, __l; } __i; \
37162306a36Sopenharmony_ci	} __xx; \
37262306a36Sopenharmony_ci	__asm__ ("mr %0,%3" \
37362306a36Sopenharmony_ci	: "=r" (__xx.__i.__h), \
37462306a36Sopenharmony_ci	       "=r" (__xx.__i.__l) \
37562306a36Sopenharmony_ci	: "%1" (m0), \
37662306a36Sopenharmony_ci	       "r" (m1)); \
37762306a36Sopenharmony_ci	(xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \
37862306a36Sopenharmony_ci} while (0)
37962306a36Sopenharmony_ci#define sdiv_qrnnd(q, r, n1, n0, d) \
38062306a36Sopenharmony_cido { \
38162306a36Sopenharmony_ci	union {DItype __ll; \
38262306a36Sopenharmony_ci	   struct {USItype __h, __l; } __i; \
38362306a36Sopenharmony_ci	} __xx; \
38462306a36Sopenharmony_ci	__xx.__i.__h = n1; __xx.__i.__l = n0; \
38562306a36Sopenharmony_ci	__asm__ ("dr %0,%2" \
38662306a36Sopenharmony_ci	: "=r" (__xx.__ll) \
38762306a36Sopenharmony_ci	: "0" (__xx.__ll), "r" (d)); \
38862306a36Sopenharmony_ci	(q) = __xx.__i.__l; (r) = __xx.__i.__h; \
38962306a36Sopenharmony_ci} while (0)
39062306a36Sopenharmony_ci#endif
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_ci/***************************************
39362306a36Sopenharmony_ci	**************  I386  *****************
39462306a36Sopenharmony_ci	***************************************/
39562306a36Sopenharmony_ci#undef __i386__
39662306a36Sopenharmony_ci#if (defined(__i386__) || defined(__i486__)) && W_TYPE_SIZE == 32
39762306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
39862306a36Sopenharmony_ci	__asm__ ("addl %5,%1\n" \
39962306a36Sopenharmony_ci	   "adcl %3,%0" \
40062306a36Sopenharmony_ci	: "=r" (sh), \
40162306a36Sopenharmony_ci	     "=&r" (sl) \
40262306a36Sopenharmony_ci	: "%0" ((USItype)(ah)), \
40362306a36Sopenharmony_ci	     "g" ((USItype)(bh)), \
40462306a36Sopenharmony_ci	     "%1" ((USItype)(al)), \
40562306a36Sopenharmony_ci	     "g" ((USItype)(bl)))
40662306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
40762306a36Sopenharmony_ci	__asm__ ("subl %5,%1\n" \
40862306a36Sopenharmony_ci	   "sbbl %3,%0" \
40962306a36Sopenharmony_ci	: "=r" (sh), \
41062306a36Sopenharmony_ci	     "=&r" (sl) \
41162306a36Sopenharmony_ci	: "0" ((USItype)(ah)), \
41262306a36Sopenharmony_ci	     "g" ((USItype)(bh)), \
41362306a36Sopenharmony_ci	     "1" ((USItype)(al)), \
41462306a36Sopenharmony_ci	     "g" ((USItype)(bl)))
41562306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v) \
41662306a36Sopenharmony_ci	__asm__ ("mull %3" \
41762306a36Sopenharmony_ci	: "=a" (w0), \
41862306a36Sopenharmony_ci	     "=d" (w1) \
41962306a36Sopenharmony_ci	: "%0" ((USItype)(u)), \
42062306a36Sopenharmony_ci	     "rm" ((USItype)(v)))
42162306a36Sopenharmony_ci#define udiv_qrnnd(q, r, n1, n0, d) \
42262306a36Sopenharmony_ci	__asm__ ("divl %4" \
42362306a36Sopenharmony_ci	: "=a" (q), \
42462306a36Sopenharmony_ci	     "=d" (r) \
42562306a36Sopenharmony_ci	: "0" ((USItype)(n0)), \
42662306a36Sopenharmony_ci	     "1" ((USItype)(n1)), \
42762306a36Sopenharmony_ci	     "rm" ((USItype)(d)))
42862306a36Sopenharmony_ci#ifndef UMUL_TIME
42962306a36Sopenharmony_ci#define UMUL_TIME 40
43062306a36Sopenharmony_ci#endif
43162306a36Sopenharmony_ci#ifndef UDIV_TIME
43262306a36Sopenharmony_ci#define UDIV_TIME 40
43362306a36Sopenharmony_ci#endif
43462306a36Sopenharmony_ci#endif /* 80x86 */
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_ci/***************************************
43762306a36Sopenharmony_ci	**************  I860  *****************
43862306a36Sopenharmony_ci	***************************************/
43962306a36Sopenharmony_ci#if defined(__i860__) && W_TYPE_SIZE == 32
44062306a36Sopenharmony_ci#define rshift_rhlc(r, h, l, c) \
44162306a36Sopenharmony_ci	__asm__ ("shr %3,r0,r0\n" \
44262306a36Sopenharmony_ci	"shrd %1,%2,%0" \
44362306a36Sopenharmony_ci	   "=r" (r) : "r" (h), "r" (l), "rn" (c))
44462306a36Sopenharmony_ci#endif /* i860 */
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci/***************************************
44762306a36Sopenharmony_ci	**************  I960  *****************
44862306a36Sopenharmony_ci	***************************************/
44962306a36Sopenharmony_ci#if defined(__i960__) && W_TYPE_SIZE == 32
45062306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
45162306a36Sopenharmony_ci	__asm__ ("cmpo 1,0\n" \
45262306a36Sopenharmony_ci	"addc %5,%4,%1\n" \
45362306a36Sopenharmony_ci	"addc %3,%2,%0" \
45462306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
45562306a36Sopenharmony_ci	     "=&r" ((USItype)(sl)) \
45662306a36Sopenharmony_ci	: "%dI" ((USItype)(ah)), \
45762306a36Sopenharmony_ci	     "dI" ((USItype)(bh)), \
45862306a36Sopenharmony_ci	     "%dI" ((USItype)(al)), \
45962306a36Sopenharmony_ci	     "dI" ((USItype)(bl)))
46062306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
46162306a36Sopenharmony_ci	__asm__ ("cmpo 0,0\n" \
46262306a36Sopenharmony_ci	"subc %5,%4,%1\n" \
46362306a36Sopenharmony_ci	"subc %3,%2,%0" \
46462306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
46562306a36Sopenharmony_ci	     "=&r" ((USItype)(sl)) \
46662306a36Sopenharmony_ci	: "dI" ((USItype)(ah)), \
46762306a36Sopenharmony_ci	     "dI" ((USItype)(bh)), \
46862306a36Sopenharmony_ci	     "dI" ((USItype)(al)), \
46962306a36Sopenharmony_ci	     "dI" ((USItype)(bl)))
47062306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v) \
47162306a36Sopenharmony_ci	({union {UDItype __ll; \
47262306a36Sopenharmony_ci	   struct {USItype __l, __h; } __i; \
47362306a36Sopenharmony_ci	} __xx; \
47462306a36Sopenharmony_ci	__asm__ ("emul        %2,%1,%0" \
47562306a36Sopenharmony_ci	: "=d" (__xx.__ll) \
47662306a36Sopenharmony_ci	: "%dI" ((USItype)(u)), \
47762306a36Sopenharmony_ci	     "dI" ((USItype)(v))); \
47862306a36Sopenharmony_ci	(w1) = __xx.__i.__h; (w0) = __xx.__i.__l; })
47962306a36Sopenharmony_ci#define __umulsidi3(u, v) \
48062306a36Sopenharmony_ci	({UDItype __w; \
48162306a36Sopenharmony_ci	__asm__ ("emul      %2,%1,%0" \
48262306a36Sopenharmony_ci	: "=d" (__w) \
48362306a36Sopenharmony_ci	: "%dI" ((USItype)(u)), \
48462306a36Sopenharmony_ci	       "dI" ((USItype)(v))); \
48562306a36Sopenharmony_ci	__w; })
48662306a36Sopenharmony_ci#define udiv_qrnnd(q, r, nh, nl, d) \
48762306a36Sopenharmony_cido { \
48862306a36Sopenharmony_ci	union {UDItype __ll; \
48962306a36Sopenharmony_ci	   struct {USItype __l, __h; } __i; \
49062306a36Sopenharmony_ci	} __nn; \
49162306a36Sopenharmony_ci	__nn.__i.__h = (nh); __nn.__i.__l = (nl); \
49262306a36Sopenharmony_ci	__asm__ ("ediv %d,%n,%0" \
49362306a36Sopenharmony_ci	: "=d" (__rq.__ll) \
49462306a36Sopenharmony_ci	: "dI" (__nn.__ll), \
49562306a36Sopenharmony_ci	     "dI" ((USItype)(d))); \
49662306a36Sopenharmony_ci	(r) = __rq.__i.__l; (q) = __rq.__i.__h; \
49762306a36Sopenharmony_ci} while (0)
49862306a36Sopenharmony_ci#if defined(__i960mx)		/* what is the proper symbol to test??? */
49962306a36Sopenharmony_ci#define rshift_rhlc(r, h, l, c) \
50062306a36Sopenharmony_cido { \
50162306a36Sopenharmony_ci	union {UDItype __ll; \
50262306a36Sopenharmony_ci	   struct {USItype __l, __h; } __i; \
50362306a36Sopenharmony_ci	} __nn; \
50462306a36Sopenharmony_ci	__nn.__i.__h = (h); __nn.__i.__l = (l); \
50562306a36Sopenharmony_ci	__asm__ ("shre %2,%1,%0" \
50662306a36Sopenharmony_ci	: "=d" (r) : "dI" (__nn.__ll), "dI" (c)); \
50762306a36Sopenharmony_ci}
50862306a36Sopenharmony_ci#endif /* i960mx */
50962306a36Sopenharmony_ci#endif /* i960 */
51062306a36Sopenharmony_ci
51162306a36Sopenharmony_ci/***************************************
51262306a36Sopenharmony_ci	**************  68000	****************
51362306a36Sopenharmony_ci	***************************************/
51462306a36Sopenharmony_ci#if (defined(__mc68000__) || defined(__mc68020__) || defined(__NeXT__) || defined(mc68020)) && W_TYPE_SIZE == 32
51562306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
51662306a36Sopenharmony_ci	__asm__ ("add%.l %5,%1\n" \
51762306a36Sopenharmony_ci	   "addx%.l %3,%0" \
51862306a36Sopenharmony_ci	: "=d" ((USItype)(sh)), \
51962306a36Sopenharmony_ci	     "=&d" ((USItype)(sl)) \
52062306a36Sopenharmony_ci	: "%0" ((USItype)(ah)), \
52162306a36Sopenharmony_ci	     "d" ((USItype)(bh)), \
52262306a36Sopenharmony_ci	     "%1" ((USItype)(al)), \
52362306a36Sopenharmony_ci	     "g" ((USItype)(bl)))
52462306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
52562306a36Sopenharmony_ci	__asm__ ("sub%.l %5,%1\n" \
52662306a36Sopenharmony_ci	   "subx%.l %3,%0" \
52762306a36Sopenharmony_ci	: "=d" ((USItype)(sh)), \
52862306a36Sopenharmony_ci	     "=&d" ((USItype)(sl)) \
52962306a36Sopenharmony_ci	: "0" ((USItype)(ah)), \
53062306a36Sopenharmony_ci	     "d" ((USItype)(bh)), \
53162306a36Sopenharmony_ci	     "1" ((USItype)(al)), \
53262306a36Sopenharmony_ci	     "g" ((USItype)(bl)))
53362306a36Sopenharmony_ci#if (defined(__mc68020__) || defined(__NeXT__) || defined(mc68020))
53462306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v) \
53562306a36Sopenharmony_ci	__asm__ ("mulu%.l %3,%1:%0" \
53662306a36Sopenharmony_ci	: "=d" ((USItype)(w0)), \
53762306a36Sopenharmony_ci	     "=d" ((USItype)(w1)) \
53862306a36Sopenharmony_ci	: "%0" ((USItype)(u)), \
53962306a36Sopenharmony_ci	     "dmi" ((USItype)(v)))
54062306a36Sopenharmony_ci#define UMUL_TIME 45
54162306a36Sopenharmony_ci#define udiv_qrnnd(q, r, n1, n0, d) \
54262306a36Sopenharmony_ci	__asm__ ("divu%.l %4,%1:%0" \
54362306a36Sopenharmony_ci	: "=d" ((USItype)(q)), \
54462306a36Sopenharmony_ci	     "=d" ((USItype)(r)) \
54562306a36Sopenharmony_ci	: "0" ((USItype)(n0)), \
54662306a36Sopenharmony_ci	     "1" ((USItype)(n1)), \
54762306a36Sopenharmony_ci	     "dmi" ((USItype)(d)))
54862306a36Sopenharmony_ci#define UDIV_TIME 90
54962306a36Sopenharmony_ci#define sdiv_qrnnd(q, r, n1, n0, d) \
55062306a36Sopenharmony_ci	__asm__ ("divs%.l %4,%1:%0" \
55162306a36Sopenharmony_ci	: "=d" ((USItype)(q)), \
55262306a36Sopenharmony_ci	     "=d" ((USItype)(r)) \
55362306a36Sopenharmony_ci	: "0" ((USItype)(n0)), \
55462306a36Sopenharmony_ci	     "1" ((USItype)(n1)), \
55562306a36Sopenharmony_ci	     "dmi" ((USItype)(d)))
55662306a36Sopenharmony_ci#else /* not mc68020 */
55762306a36Sopenharmony_ci#define umul_ppmm(xh, xl, a, b) \
55862306a36Sopenharmony_cido { USItype __umul_tmp1, __umul_tmp2; \
55962306a36Sopenharmony_ci	__asm__ ("| Inlined umul_ppmm\n" \
56062306a36Sopenharmony_ci	"move%.l %5,%3\n" \
56162306a36Sopenharmony_ci	"move%.l %2,%0\n" \
56262306a36Sopenharmony_ci	"move%.w %3,%1\n" \
56362306a36Sopenharmony_ci	"swap	%3\n" \
56462306a36Sopenharmony_ci	"swap	%0\n" \
56562306a36Sopenharmony_ci	"mulu	%2,%1\n" \
56662306a36Sopenharmony_ci	"mulu	%3,%0\n" \
56762306a36Sopenharmony_ci	"mulu	%2,%3\n" \
56862306a36Sopenharmony_ci	"swap	%2\n" \
56962306a36Sopenharmony_ci	"mulu	%5,%2\n" \
57062306a36Sopenharmony_ci	"add%.l	%3,%2\n" \
57162306a36Sopenharmony_ci	"jcc	1f\n" \
57262306a36Sopenharmony_ci	"add%.l	%#0x10000,%0\n" \
57362306a36Sopenharmony_ci	"1:	move%.l %2,%3\n" \
57462306a36Sopenharmony_ci	"clr%.w	%2\n" \
57562306a36Sopenharmony_ci	"swap	%2\n" \
57662306a36Sopenharmony_ci	"swap	%3\n" \
57762306a36Sopenharmony_ci	"clr%.w	%3\n" \
57862306a36Sopenharmony_ci	"add%.l	%3,%1\n" \
57962306a36Sopenharmony_ci	"addx%.l %2,%0\n" \
58062306a36Sopenharmony_ci	"| End inlined umul_ppmm" \
58162306a36Sopenharmony_ci	: "=&d" ((USItype)(xh)), "=&d" ((USItype)(xl)), \
58262306a36Sopenharmony_ci		"=d" (__umul_tmp1), "=&d" (__umul_tmp2) \
58362306a36Sopenharmony_ci	: "%2" ((USItype)(a)), "d" ((USItype)(b))); \
58462306a36Sopenharmony_ci} while (0)
58562306a36Sopenharmony_ci#define UMUL_TIME 100
58662306a36Sopenharmony_ci#define UDIV_TIME 400
58762306a36Sopenharmony_ci#endif /* not mc68020 */
58862306a36Sopenharmony_ci#endif /* mc68000 */
58962306a36Sopenharmony_ci
59062306a36Sopenharmony_ci/***************************************
59162306a36Sopenharmony_ci	**************  88000	****************
59262306a36Sopenharmony_ci	***************************************/
59362306a36Sopenharmony_ci#if defined(__m88000__) && W_TYPE_SIZE == 32
59462306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
59562306a36Sopenharmony_ci	__asm__ ("addu.co %1,%r4,%r5\n" \
59662306a36Sopenharmony_ci	   "addu.ci %0,%r2,%r3" \
59762306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
59862306a36Sopenharmony_ci	     "=&r" ((USItype)(sl)) \
59962306a36Sopenharmony_ci	: "%rJ" ((USItype)(ah)), \
60062306a36Sopenharmony_ci	     "rJ" ((USItype)(bh)), \
60162306a36Sopenharmony_ci	     "%rJ" ((USItype)(al)), \
60262306a36Sopenharmony_ci	     "rJ" ((USItype)(bl)))
60362306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
60462306a36Sopenharmony_ci	__asm__ ("subu.co %1,%r4,%r5\n" \
60562306a36Sopenharmony_ci	   "subu.ci %0,%r2,%r3" \
60662306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
60762306a36Sopenharmony_ci	     "=&r" ((USItype)(sl)) \
60862306a36Sopenharmony_ci	: "rJ" ((USItype)(ah)), \
60962306a36Sopenharmony_ci	     "rJ" ((USItype)(bh)), \
61062306a36Sopenharmony_ci	     "rJ" ((USItype)(al)), \
61162306a36Sopenharmony_ci	     "rJ" ((USItype)(bl)))
61262306a36Sopenharmony_ci#if defined(__m88110__)
61362306a36Sopenharmony_ci#define umul_ppmm(wh, wl, u, v) \
61462306a36Sopenharmony_cido { \
61562306a36Sopenharmony_ci	union {UDItype __ll; \
61662306a36Sopenharmony_ci	   struct {USItype __h, __l; } __i; \
61762306a36Sopenharmony_ci	} __x; \
61862306a36Sopenharmony_ci	__asm__ ("mulu.d %0,%1,%2" : "=r" (__x.__ll) : "r" (u), "r" (v)); \
61962306a36Sopenharmony_ci	(wh) = __x.__i.__h; \
62062306a36Sopenharmony_ci	(wl) = __x.__i.__l; \
62162306a36Sopenharmony_ci} while (0)
62262306a36Sopenharmony_ci#define udiv_qrnnd(q, r, n1, n0, d) \
62362306a36Sopenharmony_ci	({union {UDItype __ll; \
62462306a36Sopenharmony_ci	   struct {USItype __h, __l; } __i; \
62562306a36Sopenharmony_ci	} __x, __q; \
62662306a36Sopenharmony_ci	__x.__i.__h = (n1); __x.__i.__l = (n0); \
62762306a36Sopenharmony_ci	__asm__ ("divu.d %0,%1,%2" \
62862306a36Sopenharmony_ci	: "=r" (__q.__ll) : "r" (__x.__ll), "r" (d)); \
62962306a36Sopenharmony_ci	(r) = (n0) - __q.__l * (d); (q) = __q.__l; })
63062306a36Sopenharmony_ci#define UMUL_TIME 5
63162306a36Sopenharmony_ci#define UDIV_TIME 25
63262306a36Sopenharmony_ci#else
63362306a36Sopenharmony_ci#define UMUL_TIME 17
63462306a36Sopenharmony_ci#define UDIV_TIME 150
63562306a36Sopenharmony_ci#endif /* __m88110__ */
63662306a36Sopenharmony_ci#endif /* __m88000__ */
63762306a36Sopenharmony_ci
63862306a36Sopenharmony_ci/***************************************
63962306a36Sopenharmony_ci	**************  MIPS  *****************
64062306a36Sopenharmony_ci	***************************************/
64162306a36Sopenharmony_ci#if defined(__mips__) && W_TYPE_SIZE == 32
64262306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v)			\
64362306a36Sopenharmony_cido {						\
64462306a36Sopenharmony_ci	UDItype __ll = (UDItype)(u) * (v);	\
64562306a36Sopenharmony_ci	w1 = __ll >> 32;			\
64662306a36Sopenharmony_ci	w0 = __ll;				\
64762306a36Sopenharmony_ci} while (0)
64862306a36Sopenharmony_ci#define UMUL_TIME 10
64962306a36Sopenharmony_ci#define UDIV_TIME 100
65062306a36Sopenharmony_ci#endif /* __mips__ */
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_ci/***************************************
65362306a36Sopenharmony_ci	**************  MIPS/64  **************
65462306a36Sopenharmony_ci	***************************************/
65562306a36Sopenharmony_ci#if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64
65662306a36Sopenharmony_ci#if defined(__mips_isa_rev) && __mips_isa_rev >= 6 && defined(CONFIG_CC_IS_GCC)
65762306a36Sopenharmony_ci/*
65862306a36Sopenharmony_ci * GCC ends up emitting a __multi3 intrinsic call for MIPS64r6 with the plain C
65962306a36Sopenharmony_ci * code below, so we special case MIPS64r6 until the compiler can do better.
66062306a36Sopenharmony_ci */
66162306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v)						\
66262306a36Sopenharmony_cido {									\
66362306a36Sopenharmony_ci	__asm__ ("dmulu %0,%1,%2"					\
66462306a36Sopenharmony_ci		 : "=d" ((UDItype)(w0))					\
66562306a36Sopenharmony_ci		 : "d" ((UDItype)(u)),					\
66662306a36Sopenharmony_ci		   "d" ((UDItype)(v)));					\
66762306a36Sopenharmony_ci	__asm__ ("dmuhu %0,%1,%2"					\
66862306a36Sopenharmony_ci		 : "=d" ((UDItype)(w1))					\
66962306a36Sopenharmony_ci		 : "d" ((UDItype)(u)),					\
67062306a36Sopenharmony_ci		   "d" ((UDItype)(v)));					\
67162306a36Sopenharmony_ci} while (0)
67262306a36Sopenharmony_ci#else
67362306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v) \
67462306a36Sopenharmony_cido {									\
67562306a36Sopenharmony_ci	typedef unsigned int __ll_UTItype __attribute__((mode(TI)));	\
67662306a36Sopenharmony_ci	__ll_UTItype __ll = (__ll_UTItype)(u) * (v);			\
67762306a36Sopenharmony_ci	w1 = __ll >> 64;						\
67862306a36Sopenharmony_ci	w0 = __ll;							\
67962306a36Sopenharmony_ci} while (0)
68062306a36Sopenharmony_ci#endif
68162306a36Sopenharmony_ci#define UMUL_TIME 20
68262306a36Sopenharmony_ci#define UDIV_TIME 140
68362306a36Sopenharmony_ci#endif /* __mips__ */
68462306a36Sopenharmony_ci
68562306a36Sopenharmony_ci/***************************************
68662306a36Sopenharmony_ci	**************  32000	****************
68762306a36Sopenharmony_ci	***************************************/
68862306a36Sopenharmony_ci#if defined(__ns32000__) && W_TYPE_SIZE == 32
68962306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v) \
69062306a36Sopenharmony_ci	({union {UDItype __ll; \
69162306a36Sopenharmony_ci	   struct {USItype __l, __h; } __i; \
69262306a36Sopenharmony_ci	} __xx; \
69362306a36Sopenharmony_ci	__asm__ ("meid %2,%0" \
69462306a36Sopenharmony_ci	: "=g" (__xx.__ll) \
69562306a36Sopenharmony_ci	: "%0" ((USItype)(u)), \
69662306a36Sopenharmony_ci	     "g" ((USItype)(v))); \
69762306a36Sopenharmony_ci	(w1) = __xx.__i.__h; (w0) = __xx.__i.__l; })
69862306a36Sopenharmony_ci#define __umulsidi3(u, v) \
69962306a36Sopenharmony_ci	({UDItype __w; \
70062306a36Sopenharmony_ci	__asm__ ("meid %2,%0" \
70162306a36Sopenharmony_ci	: "=g" (__w) \
70262306a36Sopenharmony_ci	: "%0" ((USItype)(u)), \
70362306a36Sopenharmony_ci	       "g" ((USItype)(v))); \
70462306a36Sopenharmony_ci	__w; })
70562306a36Sopenharmony_ci#define udiv_qrnnd(q, r, n1, n0, d) \
70662306a36Sopenharmony_ci	({union {UDItype __ll; \
70762306a36Sopenharmony_ci	   struct {USItype __l, __h; } __i; \
70862306a36Sopenharmony_ci	} __xx; \
70962306a36Sopenharmony_ci	__xx.__i.__h = (n1); __xx.__i.__l = (n0); \
71062306a36Sopenharmony_ci	__asm__ ("deid %2,%0" \
71162306a36Sopenharmony_ci	: "=g" (__xx.__ll) \
71262306a36Sopenharmony_ci	: "0" (__xx.__ll), \
71362306a36Sopenharmony_ci	     "g" ((USItype)(d))); \
71462306a36Sopenharmony_ci	(r) = __xx.__i.__l; (q) = __xx.__i.__h; })
71562306a36Sopenharmony_ci#endif /* __ns32000__ */
71662306a36Sopenharmony_ci
71762306a36Sopenharmony_ci/***************************************
71862306a36Sopenharmony_ci	**************  PPC  ******************
71962306a36Sopenharmony_ci	***************************************/
72062306a36Sopenharmony_ci#if (defined(_ARCH_PPC) || defined(_IBMR2)) && W_TYPE_SIZE == 32
72162306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
72262306a36Sopenharmony_cido { \
72362306a36Sopenharmony_ci	if (__builtin_constant_p(bh) && (bh) == 0) \
72462306a36Sopenharmony_ci		__asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \
72562306a36Sopenharmony_ci		: "=r" (sh), \
72662306a36Sopenharmony_ci		"=&r" (sl) \
72762306a36Sopenharmony_ci		: "%r" ((USItype)(ah)), \
72862306a36Sopenharmony_ci		"%r" ((USItype)(al)), \
72962306a36Sopenharmony_ci		"rI" ((USItype)(bl))); \
73062306a36Sopenharmony_ci	else if (__builtin_constant_p(bh) && (bh) == ~(USItype) 0) \
73162306a36Sopenharmony_ci		__asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \
73262306a36Sopenharmony_ci		: "=r" (sh), \
73362306a36Sopenharmony_ci		"=&r" (sl) \
73462306a36Sopenharmony_ci		: "%r" ((USItype)(ah)), \
73562306a36Sopenharmony_ci		"%r" ((USItype)(al)), \
73662306a36Sopenharmony_ci		"rI" ((USItype)(bl))); \
73762306a36Sopenharmony_ci	else \
73862306a36Sopenharmony_ci		__asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \
73962306a36Sopenharmony_ci		: "=r" (sh), \
74062306a36Sopenharmony_ci		"=&r" (sl) \
74162306a36Sopenharmony_ci		: "%r" ((USItype)(ah)), \
74262306a36Sopenharmony_ci		"r" ((USItype)(bh)), \
74362306a36Sopenharmony_ci		"%r" ((USItype)(al)), \
74462306a36Sopenharmony_ci		"rI" ((USItype)(bl))); \
74562306a36Sopenharmony_ci} while (0)
74662306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
74762306a36Sopenharmony_cido { \
74862306a36Sopenharmony_ci	if (__builtin_constant_p(ah) && (ah) == 0) \
74962306a36Sopenharmony_ci		__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \
75062306a36Sopenharmony_ci		: "=r" (sh), \
75162306a36Sopenharmony_ci		"=&r" (sl) \
75262306a36Sopenharmony_ci		: "r" ((USItype)(bh)), \
75362306a36Sopenharmony_ci		"rI" ((USItype)(al)), \
75462306a36Sopenharmony_ci		"r" ((USItype)(bl))); \
75562306a36Sopenharmony_ci	else if (__builtin_constant_p(ah) && (ah) == ~(USItype) 0) \
75662306a36Sopenharmony_ci		__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \
75762306a36Sopenharmony_ci		: "=r" (sh), \
75862306a36Sopenharmony_ci		"=&r" (sl) \
75962306a36Sopenharmony_ci		: "r" ((USItype)(bh)), \
76062306a36Sopenharmony_ci		"rI" ((USItype)(al)), \
76162306a36Sopenharmony_ci		"r" ((USItype)(bl))); \
76262306a36Sopenharmony_ci	else if (__builtin_constant_p(bh) && (bh) == 0) \
76362306a36Sopenharmony_ci		__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \
76462306a36Sopenharmony_ci		: "=r" (sh), \
76562306a36Sopenharmony_ci		"=&r" (sl) \
76662306a36Sopenharmony_ci		: "r" ((USItype)(ah)), \
76762306a36Sopenharmony_ci		"rI" ((USItype)(al)), \
76862306a36Sopenharmony_ci		"r" ((USItype)(bl))); \
76962306a36Sopenharmony_ci	else if (__builtin_constant_p(bh) && (bh) == ~(USItype) 0) \
77062306a36Sopenharmony_ci		__asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \
77162306a36Sopenharmony_ci		: "=r" (sh), \
77262306a36Sopenharmony_ci		"=&r" (sl) \
77362306a36Sopenharmony_ci		: "r" ((USItype)(ah)), \
77462306a36Sopenharmony_ci		"rI" ((USItype)(al)), \
77562306a36Sopenharmony_ci		"r" ((USItype)(bl))); \
77662306a36Sopenharmony_ci	else \
77762306a36Sopenharmony_ci		__asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \
77862306a36Sopenharmony_ci		: "=r" (sh), \
77962306a36Sopenharmony_ci		"=&r" (sl) \
78062306a36Sopenharmony_ci		: "r" ((USItype)(ah)), \
78162306a36Sopenharmony_ci		"r" ((USItype)(bh)), \
78262306a36Sopenharmony_ci		"rI" ((USItype)(al)), \
78362306a36Sopenharmony_ci		"r" ((USItype)(bl))); \
78462306a36Sopenharmony_ci} while (0)
78562306a36Sopenharmony_ci#if defined(_ARCH_PPC)
78662306a36Sopenharmony_ci#define umul_ppmm(ph, pl, m0, m1) \
78762306a36Sopenharmony_cido { \
78862306a36Sopenharmony_ci	USItype __m0 = (m0), __m1 = (m1); \
78962306a36Sopenharmony_ci	__asm__ ("mulhwu %0,%1,%2" \
79062306a36Sopenharmony_ci	: "=r" (ph) \
79162306a36Sopenharmony_ci	: "%r" (__m0), \
79262306a36Sopenharmony_ci	"r" (__m1)); \
79362306a36Sopenharmony_ci	(pl) = __m0 * __m1; \
79462306a36Sopenharmony_ci} while (0)
79562306a36Sopenharmony_ci#define UMUL_TIME 15
79662306a36Sopenharmony_ci#define smul_ppmm(ph, pl, m0, m1) \
79762306a36Sopenharmony_cido { \
79862306a36Sopenharmony_ci	SItype __m0 = (m0), __m1 = (m1); \
79962306a36Sopenharmony_ci	__asm__ ("mulhw %0,%1,%2" \
80062306a36Sopenharmony_ci	: "=r" ((SItype) ph) \
80162306a36Sopenharmony_ci	: "%r" (__m0), \
80262306a36Sopenharmony_ci	"r" (__m1)); \
80362306a36Sopenharmony_ci	(pl) = __m0 * __m1; \
80462306a36Sopenharmony_ci} while (0)
80562306a36Sopenharmony_ci#define SMUL_TIME 14
80662306a36Sopenharmony_ci#define UDIV_TIME 120
80762306a36Sopenharmony_ci#else
80862306a36Sopenharmony_ci#define umul_ppmm(xh, xl, m0, m1) \
80962306a36Sopenharmony_cido { \
81062306a36Sopenharmony_ci	USItype __m0 = (m0), __m1 = (m1); \
81162306a36Sopenharmony_ci	__asm__ ("mul %0,%2,%3" \
81262306a36Sopenharmony_ci	: "=r" ((USItype)(xh)), \
81362306a36Sopenharmony_ci	"=q" ((USItype)(xl)) \
81462306a36Sopenharmony_ci	: "r" (__m0), \
81562306a36Sopenharmony_ci	"r" (__m1)); \
81662306a36Sopenharmony_ci	(xh) += ((((SItype) __m0 >> 31) & __m1) \
81762306a36Sopenharmony_ci	+ (((SItype) __m1 >> 31) & __m0)); \
81862306a36Sopenharmony_ci} while (0)
81962306a36Sopenharmony_ci#define UMUL_TIME 8
82062306a36Sopenharmony_ci#define smul_ppmm(xh, xl, m0, m1) \
82162306a36Sopenharmony_ci	__asm__ ("mul %0,%2,%3" \
82262306a36Sopenharmony_ci	: "=r" ((SItype)(xh)), \
82362306a36Sopenharmony_ci	"=q" ((SItype)(xl)) \
82462306a36Sopenharmony_ci	: "r" (m0), \
82562306a36Sopenharmony_ci	"r" (m1))
82662306a36Sopenharmony_ci#define SMUL_TIME 4
82762306a36Sopenharmony_ci#define sdiv_qrnnd(q, r, nh, nl, d) \
82862306a36Sopenharmony_ci	__asm__ ("div %0,%2,%4" \
82962306a36Sopenharmony_ci	: "=r" ((SItype)(q)), "=q" ((SItype)(r)) \
83062306a36Sopenharmony_ci	: "r" ((SItype)(nh)), "1" ((SItype)(nl)), "r" ((SItype)(d)))
83162306a36Sopenharmony_ci#define UDIV_TIME 100
83262306a36Sopenharmony_ci#endif
83362306a36Sopenharmony_ci#endif /* Power architecture variants.  */
83462306a36Sopenharmony_ci
83562306a36Sopenharmony_ci/***************************************
83662306a36Sopenharmony_ci	**************  PYR  ******************
83762306a36Sopenharmony_ci	***************************************/
83862306a36Sopenharmony_ci#if defined(__pyr__) && W_TYPE_SIZE == 32
83962306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
84062306a36Sopenharmony_ci	__asm__ ("addw        %5,%1\n" \
84162306a36Sopenharmony_ci	"addwc	%3,%0" \
84262306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
84362306a36Sopenharmony_ci	"=&r" ((USItype)(sl)) \
84462306a36Sopenharmony_ci	: "%0" ((USItype)(ah)), \
84562306a36Sopenharmony_ci	"g" ((USItype)(bh)), \
84662306a36Sopenharmony_ci	"%1" ((USItype)(al)), \
84762306a36Sopenharmony_ci	"g" ((USItype)(bl)))
84862306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
84962306a36Sopenharmony_ci	__asm__ ("subw        %5,%1\n" \
85062306a36Sopenharmony_ci	"subwb	%3,%0" \
85162306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
85262306a36Sopenharmony_ci	"=&r" ((USItype)(sl)) \
85362306a36Sopenharmony_ci	: "0" ((USItype)(ah)), \
85462306a36Sopenharmony_ci	"g" ((USItype)(bh)), \
85562306a36Sopenharmony_ci	"1" ((USItype)(al)), \
85662306a36Sopenharmony_ci	"g" ((USItype)(bl)))
85762306a36Sopenharmony_ci	/* This insn works on Pyramids with AP, XP, or MI CPUs, but not with SP.  */
85862306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v) \
85962306a36Sopenharmony_ci	({union {UDItype __ll; \
86062306a36Sopenharmony_ci	struct {USItype __h, __l; } __i; \
86162306a36Sopenharmony_ci	} __xx; \
86262306a36Sopenharmony_ci	__asm__ ("movw %1,%R0\n" \
86362306a36Sopenharmony_ci	"uemul %2,%0" \
86462306a36Sopenharmony_ci	: "=&r" (__xx.__ll) \
86562306a36Sopenharmony_ci	: "g" ((USItype) (u)), \
86662306a36Sopenharmony_ci	"g" ((USItype)(v))); \
86762306a36Sopenharmony_ci	(w1) = __xx.__i.__h; (w0) = __xx.__i.__l; })
86862306a36Sopenharmony_ci#endif /* __pyr__ */
86962306a36Sopenharmony_ci
87062306a36Sopenharmony_ci/***************************************
87162306a36Sopenharmony_ci	**************  RT/ROMP  **************
87262306a36Sopenharmony_ci	***************************************/
87362306a36Sopenharmony_ci#if defined(__ibm032__) /* RT/ROMP */	&& W_TYPE_SIZE == 32
87462306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
87562306a36Sopenharmony_ci	__asm__ ("a %1,%5\n" \
87662306a36Sopenharmony_ci	"ae %0,%3" \
87762306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
87862306a36Sopenharmony_ci	"=&r" ((USItype)(sl)) \
87962306a36Sopenharmony_ci	: "%0" ((USItype)(ah)), \
88062306a36Sopenharmony_ci	"r" ((USItype)(bh)), \
88162306a36Sopenharmony_ci	"%1" ((USItype)(al)), \
88262306a36Sopenharmony_ci	"r" ((USItype)(bl)))
88362306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
88462306a36Sopenharmony_ci	__asm__ ("s %1,%5\n" \
88562306a36Sopenharmony_ci	"se %0,%3" \
88662306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
88762306a36Sopenharmony_ci	"=&r" ((USItype)(sl)) \
88862306a36Sopenharmony_ci	: "0" ((USItype)(ah)), \
88962306a36Sopenharmony_ci	"r" ((USItype)(bh)), \
89062306a36Sopenharmony_ci	"1" ((USItype)(al)), \
89162306a36Sopenharmony_ci	"r" ((USItype)(bl)))
89262306a36Sopenharmony_ci#define umul_ppmm(ph, pl, m0, m1) \
89362306a36Sopenharmony_cido { \
89462306a36Sopenharmony_ci	USItype __m0 = (m0), __m1 = (m1); \
89562306a36Sopenharmony_ci	__asm__ ( \
89662306a36Sopenharmony_ci	"s       r2,r2\n" \
89762306a36Sopenharmony_ci	"mts	r10,%2\n" \
89862306a36Sopenharmony_ci	"m	r2,%3\n" \
89962306a36Sopenharmony_ci	"m	r2,%3\n" \
90062306a36Sopenharmony_ci	"m	r2,%3\n" \
90162306a36Sopenharmony_ci	"m	r2,%3\n" \
90262306a36Sopenharmony_ci	"m	r2,%3\n" \
90362306a36Sopenharmony_ci	"m	r2,%3\n" \
90462306a36Sopenharmony_ci	"m	r2,%3\n" \
90562306a36Sopenharmony_ci	"m	r2,%3\n" \
90662306a36Sopenharmony_ci	"m	r2,%3\n" \
90762306a36Sopenharmony_ci	"m	r2,%3\n" \
90862306a36Sopenharmony_ci	"m	r2,%3\n" \
90962306a36Sopenharmony_ci	"m	r2,%3\n" \
91062306a36Sopenharmony_ci	"m	r2,%3\n" \
91162306a36Sopenharmony_ci	"m	r2,%3\n" \
91262306a36Sopenharmony_ci	"m	r2,%3\n" \
91362306a36Sopenharmony_ci	"m	r2,%3\n" \
91462306a36Sopenharmony_ci	"cas	%0,r2,r0\n" \
91562306a36Sopenharmony_ci	"mfs	r10,%1" \
91662306a36Sopenharmony_ci	: "=r" ((USItype)(ph)), \
91762306a36Sopenharmony_ci	"=r" ((USItype)(pl)) \
91862306a36Sopenharmony_ci	: "%r" (__m0), \
91962306a36Sopenharmony_ci	"r" (__m1) \
92062306a36Sopenharmony_ci	: "r2"); \
92162306a36Sopenharmony_ci	(ph) += ((((SItype) __m0 >> 31) & __m1) \
92262306a36Sopenharmony_ci	+ (((SItype) __m1 >> 31) & __m0)); \
92362306a36Sopenharmony_ci} while (0)
92462306a36Sopenharmony_ci#define UMUL_TIME 20
92562306a36Sopenharmony_ci#define UDIV_TIME 200
92662306a36Sopenharmony_ci#endif /* RT/ROMP */
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_ci/***************************************
92962306a36Sopenharmony_ci	**************  SH2  ******************
93062306a36Sopenharmony_ci	***************************************/
93162306a36Sopenharmony_ci#if (defined(__sh2__) || defined(__sh3__) || defined(__SH4__)) \
93262306a36Sopenharmony_ci	&& W_TYPE_SIZE == 32
93362306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v) \
93462306a36Sopenharmony_ci	__asm__ ( \
93562306a36Sopenharmony_ci	"dmulu.l %2,%3\n" \
93662306a36Sopenharmony_ci	"sts	macl,%1\n" \
93762306a36Sopenharmony_ci	"sts	mach,%0" \
93862306a36Sopenharmony_ci	: "=r" ((USItype)(w1)), \
93962306a36Sopenharmony_ci	"=r" ((USItype)(w0)) \
94062306a36Sopenharmony_ci	: "r" ((USItype)(u)), \
94162306a36Sopenharmony_ci	"r" ((USItype)(v)) \
94262306a36Sopenharmony_ci	: "macl", "mach")
94362306a36Sopenharmony_ci#define UMUL_TIME 5
94462306a36Sopenharmony_ci#endif
94562306a36Sopenharmony_ci
94662306a36Sopenharmony_ci/***************************************
94762306a36Sopenharmony_ci	**************  SPARC	****************
94862306a36Sopenharmony_ci	***************************************/
94962306a36Sopenharmony_ci#if defined(__sparc__) && W_TYPE_SIZE == 32
95062306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
95162306a36Sopenharmony_ci	__asm__ ("addcc %r4,%5,%1\n" \
95262306a36Sopenharmony_ci	"addx %r2,%3,%0" \
95362306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
95462306a36Sopenharmony_ci	"=&r" ((USItype)(sl)) \
95562306a36Sopenharmony_ci	: "%rJ" ((USItype)(ah)), \
95662306a36Sopenharmony_ci	"rI" ((USItype)(bh)), \
95762306a36Sopenharmony_ci	"%rJ" ((USItype)(al)), \
95862306a36Sopenharmony_ci	"rI" ((USItype)(bl)) \
95962306a36Sopenharmony_ci	__CLOBBER_CC)
96062306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
96162306a36Sopenharmony_ci	__asm__ ("subcc %r4,%5,%1\n" \
96262306a36Sopenharmony_ci	"subx %r2,%3,%0" \
96362306a36Sopenharmony_ci	: "=r" ((USItype)(sh)), \
96462306a36Sopenharmony_ci	"=&r" ((USItype)(sl)) \
96562306a36Sopenharmony_ci	: "rJ" ((USItype)(ah)), \
96662306a36Sopenharmony_ci	"rI" ((USItype)(bh)), \
96762306a36Sopenharmony_ci	"rJ" ((USItype)(al)), \
96862306a36Sopenharmony_ci	"rI" ((USItype)(bl)) \
96962306a36Sopenharmony_ci	__CLOBBER_CC)
97062306a36Sopenharmony_ci#if defined(__sparc_v8__)
97162306a36Sopenharmony_ci/* Don't match immediate range because, 1) it is not often useful,
97262306a36Sopenharmony_ci	2) the 'I' flag thinks of the range as a 13 bit signed interval,
97362306a36Sopenharmony_ci	while we want to match a 13 bit interval, sign extended to 32 bits,
97462306a36Sopenharmony_ci	but INTERPRETED AS UNSIGNED.  */
97562306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v) \
97662306a36Sopenharmony_ci	__asm__ ("umul %2,%3,%1;rd %%y,%0" \
97762306a36Sopenharmony_ci	: "=r" ((USItype)(w1)), \
97862306a36Sopenharmony_ci	"=r" ((USItype)(w0)) \
97962306a36Sopenharmony_ci	: "r" ((USItype)(u)), \
98062306a36Sopenharmony_ci	"r" ((USItype)(v)))
98162306a36Sopenharmony_ci#define UMUL_TIME 5
98262306a36Sopenharmony_ci#ifndef SUPERSPARC		/* SuperSPARC's udiv only handles 53 bit dividends */
98362306a36Sopenharmony_ci#define udiv_qrnnd(q, r, n1, n0, d) \
98462306a36Sopenharmony_cido { \
98562306a36Sopenharmony_ci	USItype __q; \
98662306a36Sopenharmony_ci	__asm__ ("mov %1,%%y;nop;nop;nop;udiv %2,%3,%0" \
98762306a36Sopenharmony_ci	: "=r" ((USItype)(__q)) \
98862306a36Sopenharmony_ci	: "r" ((USItype)(n1)), \
98962306a36Sopenharmony_ci	"r" ((USItype)(n0)), \
99062306a36Sopenharmony_ci	"r" ((USItype)(d))); \
99162306a36Sopenharmony_ci	(r) = (n0) - __q * (d); \
99262306a36Sopenharmony_ci	(q) = __q; \
99362306a36Sopenharmony_ci} while (0)
99462306a36Sopenharmony_ci#define UDIV_TIME 25
99562306a36Sopenharmony_ci#endif /* SUPERSPARC */
99662306a36Sopenharmony_ci#else /* ! __sparc_v8__ */
99762306a36Sopenharmony_ci#if defined(__sparclite__)
99862306a36Sopenharmony_ci/* This has hardware multiply but not divide.  It also has two additional
99962306a36Sopenharmony_ci	instructions scan (ffs from high bit) and divscc.  */
100062306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v) \
100162306a36Sopenharmony_ci	__asm__ ("umul %2,%3,%1;rd %%y,%0" \
100262306a36Sopenharmony_ci	: "=r" ((USItype)(w1)), \
100362306a36Sopenharmony_ci	"=r" ((USItype)(w0)) \
100462306a36Sopenharmony_ci	: "r" ((USItype)(u)), \
100562306a36Sopenharmony_ci	"r" ((USItype)(v)))
100662306a36Sopenharmony_ci#define UMUL_TIME 5
100762306a36Sopenharmony_ci#define udiv_qrnnd(q, r, n1, n0, d) \
100862306a36Sopenharmony_ci	__asm__ ("! Inlined udiv_qrnnd\n" \
100962306a36Sopenharmony_ci	"wr	%%g0,%2,%%y	! Not a delayed write for sparclite\n" \
101062306a36Sopenharmony_ci	"tst	%%g0\n" \
101162306a36Sopenharmony_ci	"divscc	%3,%4,%%g1\n" \
101262306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
101362306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
101462306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
101562306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
101662306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
101762306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
101862306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
101962306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
102062306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
102162306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
102262306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
102362306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
102462306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
102562306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
102662306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
102762306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
102862306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
102962306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
103062306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
103162306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
103262306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
103362306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
103462306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
103562306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
103662306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
103762306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
103862306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
103962306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
104062306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
104162306a36Sopenharmony_ci	"divscc	%%g1,%4,%%g1\n" \
104262306a36Sopenharmony_ci	"divscc	%%g1,%4,%0\n" \
104362306a36Sopenharmony_ci	"rd	%%y,%1\n" \
104462306a36Sopenharmony_ci	"bl,a 1f\n" \
104562306a36Sopenharmony_ci	"add	%1,%4,%1\n" \
104662306a36Sopenharmony_ci	"1:	! End of inline udiv_qrnnd" \
104762306a36Sopenharmony_ci	: "=r" ((USItype)(q)), \
104862306a36Sopenharmony_ci	"=r" ((USItype)(r)) \
104962306a36Sopenharmony_ci	: "r" ((USItype)(n1)), \
105062306a36Sopenharmony_ci	"r" ((USItype)(n0)), \
105162306a36Sopenharmony_ci	"rI" ((USItype)(d)) \
105262306a36Sopenharmony_ci	: "%g1" __AND_CLOBBER_CC)
105362306a36Sopenharmony_ci#define UDIV_TIME 37
105462306a36Sopenharmony_ci#endif /* __sparclite__ */
105562306a36Sopenharmony_ci#endif /* __sparc_v8__ */
105662306a36Sopenharmony_ci	/* Default to sparc v7 versions of umul_ppmm and udiv_qrnnd.  */
105762306a36Sopenharmony_ci#ifndef umul_ppmm
105862306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v) \
105962306a36Sopenharmony_ci	__asm__ ("! Inlined umul_ppmm\n" \
106062306a36Sopenharmony_ci	"wr	%%g0,%2,%%y	! SPARC has 0-3 delay insn after a wr\n" \
106162306a36Sopenharmony_ci	"sra	%3,31,%%g2	! Don't move this insn\n" \
106262306a36Sopenharmony_ci	"and	%2,%%g2,%%g2	! Don't move this insn\n" \
106362306a36Sopenharmony_ci	"andcc	%%g0,0,%%g1	! Don't move this insn\n" \
106462306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
106562306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
106662306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
106762306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
106862306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
106962306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
107062306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
107162306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
107262306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
107362306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
107462306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
107562306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
107662306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
107762306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
107862306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
107962306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
108062306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
108162306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
108262306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
108362306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
108462306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
108562306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
108662306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
108762306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
108862306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
108962306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
109062306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
109162306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
109262306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
109362306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
109462306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
109562306a36Sopenharmony_ci	"mulscc	%%g1,%3,%%g1\n" \
109662306a36Sopenharmony_ci	"mulscc	%%g1,0,%%g1\n" \
109762306a36Sopenharmony_ci	"add	%%g1,%%g2,%0\n" \
109862306a36Sopenharmony_ci	"rd	%%y,%1" \
109962306a36Sopenharmony_ci	: "=r" ((USItype)(w1)), \
110062306a36Sopenharmony_ci	"=r" ((USItype)(w0)) \
110162306a36Sopenharmony_ci	: "%rI" ((USItype)(u)), \
110262306a36Sopenharmony_ci	"r" ((USItype)(v)) \
110362306a36Sopenharmony_ci	: "%g1", "%g2" __AND_CLOBBER_CC)
110462306a36Sopenharmony_ci#define UMUL_TIME 39		/* 39 instructions */
110562306a36Sopenharmony_ci/* It's quite necessary to add this much assembler for the sparc.
110662306a36Sopenharmony_ci   The default udiv_qrnnd (in C) is more than 10 times slower!  */
110762306a36Sopenharmony_ci#define udiv_qrnnd(q, r, n1, n0, d) \
110862306a36Sopenharmony_ci  __asm__ ("! Inlined udiv_qrnnd\n\t"					\
110962306a36Sopenharmony_ci	   "mov	32,%%g1\n\t"						\
111062306a36Sopenharmony_ci	   "subcc	%1,%2,%%g0\n\t"					\
111162306a36Sopenharmony_ci	   "1:	bcs	5f\n\t"						\
111262306a36Sopenharmony_ci	   "addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb\n\t"	\
111362306a36Sopenharmony_ci	   "sub	%1,%2,%1	! this kills msb of n\n\t"		\
111462306a36Sopenharmony_ci	   "addx	%1,%1,%1	! so this can't give carry\n\t"	\
111562306a36Sopenharmony_ci	   "subcc	%%g1,1,%%g1\n\t"				\
111662306a36Sopenharmony_ci	   "2:	bne	1b\n\t"						\
111762306a36Sopenharmony_ci	   "subcc	%1,%2,%%g0\n\t"					\
111862306a36Sopenharmony_ci	   "bcs	3f\n\t"							\
111962306a36Sopenharmony_ci	   "addxcc %0,%0,%0	! shift n1n0 and a q-bit in lsb\n\t"	\
112062306a36Sopenharmony_ci	   "b		3f\n\t"						\
112162306a36Sopenharmony_ci	   "sub	%1,%2,%1	! this kills msb of n\n\t"		\
112262306a36Sopenharmony_ci	   "4:	sub	%1,%2,%1\n\t"					\
112362306a36Sopenharmony_ci	   "5:	addxcc	%1,%1,%1\n\t"					\
112462306a36Sopenharmony_ci	   "bcc	2b\n\t"							\
112562306a36Sopenharmony_ci	   "subcc	%%g1,1,%%g1\n\t"				\
112662306a36Sopenharmony_ci	   "! Got carry from n.  Subtract next step to cancel this carry.\n\t" \
112762306a36Sopenharmony_ci	   "bne	4b\n\t"							\
112862306a36Sopenharmony_ci	   "addcc	%0,%0,%0	! shift n1n0 and a 0-bit in lsb\n\t" \
112962306a36Sopenharmony_ci	   "sub	%1,%2,%1\n\t"						\
113062306a36Sopenharmony_ci	   "3:	xnor	%0,0,%0\n\t"					\
113162306a36Sopenharmony_ci	   "! End of inline udiv_qrnnd\n"				\
113262306a36Sopenharmony_ci	   : "=&r" ((USItype)(q)),					\
113362306a36Sopenharmony_ci	     "=&r" ((USItype)(r))					\
113462306a36Sopenharmony_ci	   : "r" ((USItype)(d)),					\
113562306a36Sopenharmony_ci	     "1" ((USItype)(n1)),					\
113662306a36Sopenharmony_ci	     "0" ((USItype)(n0)) : "%g1", "cc")
113762306a36Sopenharmony_ci#define UDIV_TIME (3+7*32)      /* 7 instructions/iteration. 32 iterations.  */
113862306a36Sopenharmony_ci#endif
113962306a36Sopenharmony_ci#endif /* __sparc__ */
114062306a36Sopenharmony_ci
114162306a36Sopenharmony_ci/***************************************
114262306a36Sopenharmony_ci	**************  VAX  ******************
114362306a36Sopenharmony_ci	***************************************/
114462306a36Sopenharmony_ci#if defined(__vax__) && W_TYPE_SIZE == 32
114562306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
114662306a36Sopenharmony_ci	__asm__ ("addl2 %5,%1\n" \
114762306a36Sopenharmony_ci	"adwc %3,%0" \
114862306a36Sopenharmony_ci	: "=g" ((USItype)(sh)), \
114962306a36Sopenharmony_ci	"=&g" ((USItype)(sl)) \
115062306a36Sopenharmony_ci	: "%0" ((USItype)(ah)), \
115162306a36Sopenharmony_ci	"g" ((USItype)(bh)), \
115262306a36Sopenharmony_ci	"%1" ((USItype)(al)), \
115362306a36Sopenharmony_ci	"g" ((USItype)(bl)))
115462306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
115562306a36Sopenharmony_ci	__asm__ ("subl2 %5,%1\n" \
115662306a36Sopenharmony_ci	"sbwc %3,%0" \
115762306a36Sopenharmony_ci	: "=g" ((USItype)(sh)), \
115862306a36Sopenharmony_ci	"=&g" ((USItype)(sl)) \
115962306a36Sopenharmony_ci	: "0" ((USItype)(ah)), \
116062306a36Sopenharmony_ci	"g" ((USItype)(bh)), \
116162306a36Sopenharmony_ci	"1" ((USItype)(al)), \
116262306a36Sopenharmony_ci	"g" ((USItype)(bl)))
116362306a36Sopenharmony_ci#define umul_ppmm(xh, xl, m0, m1) \
116462306a36Sopenharmony_cido { \
116562306a36Sopenharmony_ci	union {UDItype __ll; \
116662306a36Sopenharmony_ci	struct {USItype __l, __h; } __i; \
116762306a36Sopenharmony_ci	} __xx; \
116862306a36Sopenharmony_ci	USItype __m0 = (m0), __m1 = (m1); \
116962306a36Sopenharmony_ci	__asm__ ("emul %1,%2,$0,%0" \
117062306a36Sopenharmony_ci	: "=g" (__xx.__ll) \
117162306a36Sopenharmony_ci	: "g" (__m0), \
117262306a36Sopenharmony_ci	"g" (__m1)); \
117362306a36Sopenharmony_ci	(xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \
117462306a36Sopenharmony_ci	(xh) += ((((SItype) __m0 >> 31) & __m1) \
117562306a36Sopenharmony_ci	+ (((SItype) __m1 >> 31) & __m0)); \
117662306a36Sopenharmony_ci} while (0)
117762306a36Sopenharmony_ci#define sdiv_qrnnd(q, r, n1, n0, d) \
117862306a36Sopenharmony_cido { \
117962306a36Sopenharmony_ci	union {DItype __ll; \
118062306a36Sopenharmony_ci	struct {SItype __l, __h; } __i; \
118162306a36Sopenharmony_ci	} __xx; \
118262306a36Sopenharmony_ci	__xx.__i.__h = n1; __xx.__i.__l = n0; \
118362306a36Sopenharmony_ci	__asm__ ("ediv %3,%2,%0,%1" \
118462306a36Sopenharmony_ci	: "=g" (q), "=g" (r) \
118562306a36Sopenharmony_ci	: "g" (__xx.__ll), "g" (d)); \
118662306a36Sopenharmony_ci} while (0)
118762306a36Sopenharmony_ci#endif /* __vax__ */
118862306a36Sopenharmony_ci
118962306a36Sopenharmony_ci/***************************************
119062306a36Sopenharmony_ci	**************  Z8000	****************
119162306a36Sopenharmony_ci	***************************************/
119262306a36Sopenharmony_ci#if defined(__z8000__) && W_TYPE_SIZE == 16
119362306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
119462306a36Sopenharmony_ci	__asm__ ("add %H1,%H5\n\tadc  %H0,%H3" \
119562306a36Sopenharmony_ci	: "=r" ((unsigned int)(sh)), \
119662306a36Sopenharmony_ci	"=&r" ((unsigned int)(sl)) \
119762306a36Sopenharmony_ci	: "%0" ((unsigned int)(ah)), \
119862306a36Sopenharmony_ci	"r" ((unsigned int)(bh)), \
119962306a36Sopenharmony_ci	"%1" ((unsigned int)(al)), \
120062306a36Sopenharmony_ci	"rQR" ((unsigned int)(bl)))
120162306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
120262306a36Sopenharmony_ci	__asm__ ("sub %H1,%H5\n\tsbc  %H0,%H3" \
120362306a36Sopenharmony_ci	: "=r" ((unsigned int)(sh)), \
120462306a36Sopenharmony_ci	"=&r" ((unsigned int)(sl)) \
120562306a36Sopenharmony_ci	: "0" ((unsigned int)(ah)), \
120662306a36Sopenharmony_ci	"r" ((unsigned int)(bh)), \
120762306a36Sopenharmony_ci	"1" ((unsigned int)(al)), \
120862306a36Sopenharmony_ci	"rQR" ((unsigned int)(bl)))
120962306a36Sopenharmony_ci#define umul_ppmm(xh, xl, m0, m1) \
121062306a36Sopenharmony_cido { \
121162306a36Sopenharmony_ci	union {long int __ll; \
121262306a36Sopenharmony_ci	struct {unsigned int __h, __l; } __i; \
121362306a36Sopenharmony_ci	} __xx; \
121462306a36Sopenharmony_ci	unsigned int __m0 = (m0), __m1 = (m1); \
121562306a36Sopenharmony_ci	__asm__ ("mult      %S0,%H3" \
121662306a36Sopenharmony_ci	: "=r" (__xx.__i.__h), \
121762306a36Sopenharmony_ci	"=r" (__xx.__i.__l) \
121862306a36Sopenharmony_ci	: "%1" (__m0), \
121962306a36Sopenharmony_ci	"rQR" (__m1)); \
122062306a36Sopenharmony_ci	(xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \
122162306a36Sopenharmony_ci	(xh) += ((((signed int) __m0 >> 15) & __m1) \
122262306a36Sopenharmony_ci	+ (((signed int) __m1 >> 15) & __m0)); \
122362306a36Sopenharmony_ci} while (0)
122462306a36Sopenharmony_ci#endif /* __z8000__ */
122562306a36Sopenharmony_ci
122662306a36Sopenharmony_ci#endif /* __GNUC__ */
122762306a36Sopenharmony_ci
122862306a36Sopenharmony_ci/***************************************
122962306a36Sopenharmony_ci	***********  Generic Versions	********
123062306a36Sopenharmony_ci	***************************************/
123162306a36Sopenharmony_ci#if !defined(umul_ppmm) && defined(__umulsidi3)
123262306a36Sopenharmony_ci#define umul_ppmm(ph, pl, m0, m1) \
123362306a36Sopenharmony_ci{ \
123462306a36Sopenharmony_ci	UDWtype __ll = __umulsidi3(m0, m1); \
123562306a36Sopenharmony_ci	ph = (UWtype) (__ll >> W_TYPE_SIZE); \
123662306a36Sopenharmony_ci	pl = (UWtype) __ll; \
123762306a36Sopenharmony_ci}
123862306a36Sopenharmony_ci#endif
123962306a36Sopenharmony_ci
124062306a36Sopenharmony_ci#if !defined(__umulsidi3)
124162306a36Sopenharmony_ci#define __umulsidi3(u, v) \
124262306a36Sopenharmony_ci	({UWtype __hi, __lo; \
124362306a36Sopenharmony_ci	umul_ppmm(__hi, __lo, u, v); \
124462306a36Sopenharmony_ci	((UDWtype) __hi << W_TYPE_SIZE) | __lo; })
124562306a36Sopenharmony_ci#endif
124662306a36Sopenharmony_ci
124762306a36Sopenharmony_ci	/* If this machine has no inline assembler, use C macros.  */
124862306a36Sopenharmony_ci
124962306a36Sopenharmony_ci#if !defined(add_ssaaaa)
125062306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
125162306a36Sopenharmony_cido { \
125262306a36Sopenharmony_ci	UWtype __x; \
125362306a36Sopenharmony_ci	__x = (al) + (bl); \
125462306a36Sopenharmony_ci	(sh) = (ah) + (bh) + (__x < (al)); \
125562306a36Sopenharmony_ci	(sl) = __x; \
125662306a36Sopenharmony_ci} while (0)
125762306a36Sopenharmony_ci#endif
125862306a36Sopenharmony_ci
125962306a36Sopenharmony_ci#if !defined(sub_ddmmss)
126062306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
126162306a36Sopenharmony_cido { \
126262306a36Sopenharmony_ci	UWtype __x; \
126362306a36Sopenharmony_ci	__x = (al) - (bl); \
126462306a36Sopenharmony_ci	(sh) = (ah) - (bh) - (__x > (al)); \
126562306a36Sopenharmony_ci	(sl) = __x; \
126662306a36Sopenharmony_ci} while (0)
126762306a36Sopenharmony_ci#endif
126862306a36Sopenharmony_ci
126962306a36Sopenharmony_ci#if !defined(umul_ppmm)
127062306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v) \
127162306a36Sopenharmony_cido { \
127262306a36Sopenharmony_ci	UWtype __x0, __x1, __x2, __x3; \
127362306a36Sopenharmony_ci	UHWtype __ul, __vl, __uh, __vh; \
127462306a36Sopenharmony_ci	UWtype __u = (u), __v = (v); \
127562306a36Sopenharmony_ci	\
127662306a36Sopenharmony_ci	__ul = __ll_lowpart(__u); \
127762306a36Sopenharmony_ci	__uh = __ll_highpart(__u); \
127862306a36Sopenharmony_ci	__vl = __ll_lowpart(__v); \
127962306a36Sopenharmony_ci	__vh = __ll_highpart(__v); \
128062306a36Sopenharmony_ci	\
128162306a36Sopenharmony_ci	__x0 = (UWtype) __ul * __vl; \
128262306a36Sopenharmony_ci	__x1 = (UWtype) __ul * __vh; \
128362306a36Sopenharmony_ci	__x2 = (UWtype) __uh * __vl; \
128462306a36Sopenharmony_ci	__x3 = (UWtype) __uh * __vh; \
128562306a36Sopenharmony_ci	\
128662306a36Sopenharmony_ci	__x1 += __ll_highpart(__x0);/* this can't give carry */ \
128762306a36Sopenharmony_ci	__x1 += __x2;		/* but this indeed can */ \
128862306a36Sopenharmony_ci	if (__x1 < __x2)		/* did we get it? */ \
128962306a36Sopenharmony_ci	__x3 += __ll_B;		/* yes, add it in the proper pos. */ \
129062306a36Sopenharmony_ci	\
129162306a36Sopenharmony_ci	(w1) = __x3 + __ll_highpart(__x1); \
129262306a36Sopenharmony_ci	(w0) = (__ll_lowpart(__x1) << W_TYPE_SIZE/2) + __ll_lowpart(__x0); \
129362306a36Sopenharmony_ci} while (0)
129462306a36Sopenharmony_ci#endif
129562306a36Sopenharmony_ci
129662306a36Sopenharmony_ci#if !defined(umul_ppmm)
129762306a36Sopenharmony_ci#define smul_ppmm(w1, w0, u, v) \
129862306a36Sopenharmony_cido { \
129962306a36Sopenharmony_ci	UWtype __w1; \
130062306a36Sopenharmony_ci	UWtype __m0 = (u), __m1 = (v); \
130162306a36Sopenharmony_ci	umul_ppmm(__w1, w0, __m0, __m1); \
130262306a36Sopenharmony_ci	(w1) = __w1 - (-(__m0 >> (W_TYPE_SIZE - 1)) & __m1) \
130362306a36Sopenharmony_ci	- (-(__m1 >> (W_TYPE_SIZE - 1)) & __m0); \
130462306a36Sopenharmony_ci} while (0)
130562306a36Sopenharmony_ci#endif
130662306a36Sopenharmony_ci
130762306a36Sopenharmony_ci	/* Define this unconditionally, so it can be used for debugging.  */
130862306a36Sopenharmony_ci#define __udiv_qrnnd_c(q, r, n1, n0, d) \
130962306a36Sopenharmony_cido { \
131062306a36Sopenharmony_ci	UWtype __d1, __d0, __q1, __q0, __r1, __r0, __m; \
131162306a36Sopenharmony_ci	__d1 = __ll_highpart(d); \
131262306a36Sopenharmony_ci	__d0 = __ll_lowpart(d); \
131362306a36Sopenharmony_ci	\
131462306a36Sopenharmony_ci	__r1 = (n1) % __d1; \
131562306a36Sopenharmony_ci	__q1 = (n1) / __d1; \
131662306a36Sopenharmony_ci	__m = (UWtype) __q1 * __d0; \
131762306a36Sopenharmony_ci	__r1 = __r1 * __ll_B | __ll_highpart(n0); \
131862306a36Sopenharmony_ci	if (__r1 < __m) { \
131962306a36Sopenharmony_ci		__q1--, __r1 += (d); \
132062306a36Sopenharmony_ci		if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */ \
132162306a36Sopenharmony_ci		if (__r1 < __m) \
132262306a36Sopenharmony_ci			__q1--, __r1 += (d); \
132362306a36Sopenharmony_ci	} \
132462306a36Sopenharmony_ci	__r1 -= __m; \
132562306a36Sopenharmony_ci	\
132662306a36Sopenharmony_ci	__r0 = __r1 % __d1; \
132762306a36Sopenharmony_ci	__q0 = __r1 / __d1; \
132862306a36Sopenharmony_ci	__m = (UWtype) __q0 * __d0; \
132962306a36Sopenharmony_ci	__r0 = __r0 * __ll_B | __ll_lowpart(n0); \
133062306a36Sopenharmony_ci	if (__r0 < __m) { \
133162306a36Sopenharmony_ci		__q0--, __r0 += (d); \
133262306a36Sopenharmony_ci		if (__r0 >= (d)) \
133362306a36Sopenharmony_ci			if (__r0 < __m) \
133462306a36Sopenharmony_ci				__q0--, __r0 += (d); \
133562306a36Sopenharmony_ci	} \
133662306a36Sopenharmony_ci	__r0 -= __m; \
133762306a36Sopenharmony_ci	\
133862306a36Sopenharmony_ci	(q) = (UWtype) __q1 * __ll_B | __q0; \
133962306a36Sopenharmony_ci	(r) = __r0; \
134062306a36Sopenharmony_ci} while (0)
134162306a36Sopenharmony_ci
134262306a36Sopenharmony_ci/* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through
134362306a36Sopenharmony_ci	__udiv_w_sdiv (defined in libgcc or elsewhere).  */
134462306a36Sopenharmony_ci#if !defined(udiv_qrnnd) && defined(sdiv_qrnnd)
134562306a36Sopenharmony_ci#define udiv_qrnnd(q, r, nh, nl, d) \
134662306a36Sopenharmony_cido { \
134762306a36Sopenharmony_ci	UWtype __r; \
134862306a36Sopenharmony_ci	(q) = __MPN(udiv_w_sdiv) (&__r, nh, nl, d); \
134962306a36Sopenharmony_ci	(r) = __r; \
135062306a36Sopenharmony_ci} while (0)
135162306a36Sopenharmony_ci#endif
135262306a36Sopenharmony_ci
135362306a36Sopenharmony_ci	/* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c.  */
135462306a36Sopenharmony_ci#if !defined(udiv_qrnnd)
135562306a36Sopenharmony_ci#define UDIV_NEEDS_NORMALIZATION 1
135662306a36Sopenharmony_ci#define udiv_qrnnd __udiv_qrnnd_c
135762306a36Sopenharmony_ci#endif
135862306a36Sopenharmony_ci
135962306a36Sopenharmony_ci#ifndef UDIV_NEEDS_NORMALIZATION
136062306a36Sopenharmony_ci#define UDIV_NEEDS_NORMALIZATION 0
136162306a36Sopenharmony_ci#endif
1362