📄 longlong.h
字号:
} while (0)#define count_leading_zeros(count, x) \ __asm__ ("{cntlz|cntlzw} %0,%1" : "=r" (count) : "r" (x))#define COUNT_LEADING_ZEROS_0 32#if defined (_ARCH_PPC) || defined (__powerpc__) || defined (__POWERPC__) \ || defined (__ppc__) || defined (PPC) || defined (__vxworks__)#define umul_ppmm(ph, pl, m0, m1) \ do { \ USItype __m0 = (m0), __m1 = (m1); \ __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ (pl) = __m0 * __m1; \ } while (0)#define UMUL_TIME 15#define smul_ppmm(ph, pl, m0, m1) \ do { \ SItype __m0 = (m0), __m1 = (m1); \ __asm__ ("mulhw %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ (pl) = __m0 * __m1; \ } while (0)#define SMUL_TIME 14#define UDIV_TIME 120#elif defined (_ARCH_PWR)#define UMUL_TIME 8#define smul_ppmm(xh, xl, m0, m1) \ __asm__ ("mul %0,%2,%3" : "=r" (xh), "=q" (xl) : "r" (m0), "r" (m1))#define SMUL_TIME 4#define sdiv_qrnnd(q, r, nh, nl, d) \ __asm__ ("div %0,%2,%4" : "=r" (q), "=q" (r) : "r" (nh), "1" (nl), "r" (d))#define UDIV_TIME 100#endif#endif /* 32-bit POWER architecture variants. *//* We should test _IBMR2 here when we add assembly support for the system vendor compilers. */#if (defined (_ARCH_PPC64) || defined (__powerpc64__)) && W_TYPE_SIZE == 64#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ do { \ if (__builtin_constant_p (bh) && (bh) == 0) \ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ else \ __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3" \ : "=r" (sh), "=&r" (sl) \ : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \ } while (0)#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ do { \ if (__builtin_constant_p (ah) && (ah) == 0) \ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ else if (__builtin_constant_p (ah) && (ah) == ~(UDItype) 0) \ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ else if (__builtin_constant_p (bh) && (bh) == 0) \ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2" \ : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ else \ __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2" \ : "=r" (sh), "=&r" (sl) \ : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \ } while (0)#define count_leading_zeros(count, x) \ __asm__ ("cntlzd %0,%1" : "=r" (count) : "r" (x))#define COUNT_LEADING_ZEROS_0 64#define umul_ppmm(ph, pl, m0, m1) \ do { \ UDItype __m0 = (m0), __m1 = (m1); \ __asm__ ("mulhdu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ (pl) = __m0 * __m1; \ } while (0)#define UMUL_TIME 15#define smul_ppmm(ph, pl, m0, m1) \ do { \ DItype __m0 = (m0), __m1 = (m1); \ __asm__ ("mulhd %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ (pl) = __m0 * __m1; \ } while (0)#define SMUL_TIME 14 /* ??? */#define UDIV_TIME 120 /* ??? */#endif /* 64-bit PowerPC. */#if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("a %1,%5\n\tae %0,%3" \ : "=r" ((USItype) (sh)), \ "=&r" ((USItype) (sl)) \ : "%0" ((USItype) (ah)), \ "r" ((USItype) (bh)), \ "%1" ((USItype) (al)), \ "r" ((USItype) (bl)))#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("s %1,%5\n\tse %0,%3" \ : "=r" ((USItype) (sh)), \ "=&r" ((USItype) (sl)) \ : "0" ((USItype) (ah)), \ "r" ((USItype) (bh)), \ "1" ((USItype) (al)), \ "r" ((USItype) (bl)))#define umul_ppmm(ph, pl, m0, m1) \ do { \ USItype __m0 = (m0), __m1 = (m1); \ __asm__ ( \ "s r2,r2\n" \" mts r10,%2\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" m r2,%3\n" \" cas %0,r2,r0\n" \" mfs r10,%1" \ : "=r" ((USItype) (ph)), \ "=r" ((USItype) (pl)) \ : "%r" (__m0), \ "r" (__m1) \ : "r2"); \ (ph) += ((((SItype) __m0 >> 31) & __m1) \ + (((SItype) __m1 >> 31) & __m0)); \ } while (0)#define UMUL_TIME 20#define UDIV_TIME 200#define count_leading_zeros(count, x) \ do { \ if ((x) >= 0x10000) \ __asm__ ("clz %0,%1" \ : "=r" ((USItype) (count)) \ : "r" ((USItype) (x) >> 16)); \ else \ { \ __asm__ ("clz %0,%1" \ : "=r" ((USItype) (count)) \ : "r" ((USItype) (x))); \ (count) += 16; \ } \ } while (0)#endif#if defined (__sh2__) && W_TYPE_SIZE == 32#define umul_ppmm(w1, w0, u, v) \ __asm__ ( \ "dmulu.l %2,%3\n\tsts macl,%1\n\tsts mach,%0" \ : "=r" ((USItype)(w1)), \ "=r" ((USItype)(w0)) \ : "r" ((USItype)(u)), \ "r" ((USItype)(v)) \ : "macl", "mach")#define UMUL_TIME 5#endif#if defined (__SH5__) && __SHMEDIA__ && W_TYPE_SIZE == 32#define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v)#define count_leading_zeros(count, x) \ do \ { \ UDItype x_ = (USItype)(x); \ SItype c_; \ \ __asm__ ("nsb %1, %0" : "=r" (c_) : "r" (x_)); \ (count) = c_ - 31; \ } \ while (0)#define COUNT_LEADING_ZEROS_0 32#endif#if defined (__sparc__) && !defined (__arch64__) && !defined (__sparcv9) \ && W_TYPE_SIZE == 32#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ __asm__ ("addcc %r4,%5,%1\n\taddx %r2,%3,%0" \ : "=r" ((USItype) (sh)), \ "=&r" ((USItype) (sl)) \ : "%rJ" ((USItype) (ah)), \ "rI" ((USItype) (bh)), \ "%rJ" ((USItype) (al)), \ "rI" ((USItype) (bl)) \ __CLOBBER_CC)#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ __asm__ ("subcc %r4,%5,%1\n\tsubx %r2,%3,%0" \ : "=r" ((USItype) (sh)), \ "=&r" ((USItype) (sl)) \ : "rJ" ((USItype) (ah)), \ "rI" ((USItype) (bh)), \ "rJ" ((USItype) (al)), \ "rI" ((USItype) (bl)) \ __CLOBBER_CC)#if defined (__sparc_v8__)#define umul_ppmm(w1, w0, u, v) \ __asm__ ("umul %2,%3,%1;rd %%y,%0" \ : "=r" ((USItype) (w1)), \ "=r" ((USItype) (w0)) \ : "r" ((USItype) (u)), \ "r" ((USItype) (v)))#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \ __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\ : "=&r" ((USItype) (__q)), \ "=&r" ((USItype) (__r)) \ : "r" ((USItype) (__n1)), \ "r" ((USItype) (__n0)), \ "r" ((USItype) (__d)))#else#if defined (__sparclite__)/* This has hardware multiply but not divide. It also has two additional instructions scan (ffs from high bit) and divscc. */#define umul_ppmm(w1, w0, u, v) \ __asm__ ("umul %2,%3,%1;rd %%y,%0" \ : "=r" ((USItype) (w1)), \ "=r" ((USItype) (w0)) \ : "r" ((USItype) (u)), \ "r" ((USItype) (v)))#define udiv_qrnnd(q, r, n1, n0, d) \ __asm__ ("! Inlined udiv_qrnnd\n" \" wr %%g0,%2,%%y ! Not a delayed write for sparclite\n" \" tst %%g0\n" \" divscc %3,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%%g1\n" \" divscc %%g1,%4,%0\n" \" rd %%y,%1\n" \" bl,a 1f\n" \" add %1,%4,%1\n" \"1: ! End of inline udiv_qrnnd" \ : "=r" ((USItype) (q)), \ "=r" ((USItype) (r)) \ : "r" ((USItype) (n1)), \ "r" ((USItype) (n0)), \ "rI" ((USItype) (d)) \ : "g1" __AND_CLOBBER_CC)#define UDIV_TIME 37#define count_leading_zeros(count, x) \ do { \ __asm__ ("scan %1,1,%0" \ : "=r" ((USItype) (count)) \ : "r" ((USItype) (x))); \ } while (0)/* Early sparclites return 63 for an argument of 0, but they warn that future implementations might change this. Therefore, leave COUNT_LEADING_ZEROS_0 undefined. */#else/* SPARC without integer multiplication and divide instructions. (i.e. at least Sun4/20,40,60,65,75,110,260,280,330,360,380,470,490) */#define umul_ppmm(w1, w0, u, v) \ __asm__ ("! Inlined umul_ppmm\n" \" wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr\n"\" sra %3,31,%%o5 ! Don't move this insn\n" \" and %2,%%o5,%%o5 ! Don't move this insn\n" \" andcc %%g0,0,%%g1 ! Don't move this insn\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,%3,%%g1\n" \" mulscc %%g1,0,%%g1\n" \" add %%g1,%%o5,%0\n" \" rd %%y,%1" \ : "=r" ((USItype) (w1)), \ "=r" ((USItype) (w0)) \ : "%rI" ((USItype) (u)), \ "r" ((USItype) (v)) \ : "g1", "o5" __AND_CLOBBER_CC)#define UMUL_TIME 39 /* 39 instructions *//* It's quite necessary to add this much assembler for the sparc. The default udiv_qrnnd (in C) is more than 10 times slower! */#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -