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