📄 jri_md.h
字号:
#define _jlong_lo16(a) ((a) & JRI_BITMASK(16))#define _jlong_hi16(a) ((a) >> 16)/* * Multiply 32-bit operands a and b to get 64-bit result r. * Use polynomial expansion based on primitive field element (1 << 16). */#define jlong_MUL32(r, a, b) { \ juint _a1, _a0, _b1, _b0, _y0, _y1, _y2, _y3; \ _a1 = _jlong_hi16(a), _a0 = _jlong_lo16(a); \ _b1 = _jlong_hi16(b), _b0 = _jlong_lo16(b); \ _y0 = _a0 * _b0; \ _y1 = _a0 * _b1; \ _y2 = _a1 * _b0; \ _y3 = _a1 * _b1; \ _y1 += _jlong_hi16(_y0); /* can't carry */ \ _y1 += _y2; /* might carry */ \ if (_y1 < _y2) _y3 += 1 << 16; /* propagate */ \ (r).lo = (_jlong_lo16(_y1) << 16) + _jlong_lo16(_y0); \ (r).hi = _y3 + _jlong_hi16(_y1); \}/* * Divide 64-bit unsigned operand a by 64-bit unsigned operand b, setting *qp * to the 64-bit unsigned quotient, and *rp to the 64-bit unsigned remainder. * Minimize effort if one of qp and rp is null. */#define jlong_UDIVMOD(qp, rp, a, b) jlong_udivmod(qp, rp, a, b)extern JRI_PUBLIC_API(void)jlong_udivmod(julong *qp, julong *rp, julong a, julong b);#define jlong_DIV(r, a, b) { \ jlong _a, _b; \ juint _negative = (int32)(a).hi < 0; \ if (_negative) { \ jlong_NEG(_a, a); \ } else { \ _a = a; \ } \ if ((int32)(b).hi < 0) { \ _negative ^= 1; \ jlong_NEG(_b, b); \ } else { \ _b = b; \ } \ jlong_UDIVMOD(&(r), 0, _a, _b); \ if (_negative) \ jlong_NEG(r, r); \}#define jlong_MOD(r, a, b) { \ jlong _a, _b; \ juint _negative = (int32)(a).hi < 0; \ if (_negative) { \ jlong_NEG(_a, a); \ } else { \ _a = a; \ } \ if ((int32)(b).hi < 0) { \ jlong_NEG(_b, b); \ } else { \ _b = b; \ } \ jlong_UDIVMOD(0, &(r), _a, _b); \ if (_negative) \ jlong_NEG(r, r); \}/* * NB: b is a juint, not jlong or julong, for the shift ops. */#define jlong_SHL(r, a, b) { \ if (b) { \ jlong _a; \ _a = a; \ if ((b) < 32) { \ (r).lo = _a.lo << (b); \ (r).hi = (_a.hi << (b)) | (_a.lo >> (32 - (b))); \ } else { \ (r).lo = 0; \ (r).hi = _a.lo << ((b) & 31); \ } \ } else { \ (r) = (a); \ } \}/* a is an int32, b is int32, r is jlong */#define jlong_ISHL(r, a, b) { \ if (b) { \ jlong _a; \ _a.lo = (a); \ _a.hi = 0; \ if ((b) < 32) { \ (r).lo = (a) << (b); \ (r).hi = ((a) >> (32 - (b))); \ } else { \ (r).lo = 0; \ (r).hi = (a) << ((b) & 31); \ } \ } else { \ (r).lo = (a); \ (r).hi = 0; \ } \}#define jlong_SHR(r, a, b) { \ if (b) { \ jlong _a; \ _a = a; \ if ((b) < 32) { \ (r).lo = (_a.hi << (32 - (b))) | (_a.lo >> (b)); \ (r).hi = (int32)_a.hi >> (b); \ } else { \ (r).lo = (int32)_a.hi >> ((b) & 31); \ (r).hi = (int32)_a.hi >> 31; \ } \ } else { \ (r) = (a); \ } \}#define jlong_USHR(r, a, b) { \ if (b) { \ jlong _a; \ _a = a; \ if ((b) < 32) { \ (r).lo = (_a.hi << (32 - (b))) | (_a.lo >> (b)); \ (r).hi = _a.hi >> (b); \ } else { \ (r).lo = _a.hi >> ((b) & 31); \ (r).hi = 0; \ } \ } else { \ (r) = (a); \ } \}#define jlong_L2I(i, l) ((i) = (l).lo)#define jlong_L2UI(ui, l) ((ui) = (l).lo)#define jlong_L2F(f, l) { double _d; jlong_L2D(_d, l); (f) = (float) _d; }#define jlong_L2D(d, l) { \ int32 _negative; \ jlong _absval; \ \ _negative = (l).hi >> 31; \ if (_negative) { \ jlong_NEG(_absval, l); \ } else { \ _absval = l; \ } \ (d) = (double)_absval.hi * 4.294967296e9 + _absval.lo; \ if (_negative) \ (d) = -(d); \}#define jlong_I2L(l, i) ((l).hi = (i) >> 31, (l).lo = (i))#define jlong_UI2L(l, ui) ((l).hi = 0, (l).lo = (ui))#define jlong_F2L(l, f) { double _d = (double) f; jlong_D2L(l, _d); }#define jlong_D2L(l, d) { \ int _negative; \ double _absval, _d_hi; \ jlong _lo_d; \ \ _negative = ((d) < 0); \ _absval = _negative ? -(d) : (d); \ \ (l).hi = (juint)(_absval / 4.294967296e9); \ (l).lo = 0; \ jlong_L2D(_d_hi, l); \ _absval -= _d_hi; \ _lo_d.hi = 0; \ if (_absval < 0) { \ _lo_d.lo = (juint) -_absval; \ jlong_SUB(l, l, _lo_d); \ } else { \ _lo_d.lo = (juint) _absval; \ jlong_ADD(l, l, _lo_d); \ } \ \ if (_negative) \ jlong_NEG(l, l); \}#endif /* !HAVE_LONG_LONG *//******************************************************************************//*** JDK Stuff -- This stuff is still needed while we're using the JDK** dynamic linking strategy to call native methods.*/typedef union JRI_JDK_stack_item { /* Non pointer items */ jint i; jfloat f; jint o; /* Pointer items */ void *h; void *p; unsigned char *addr;#ifdef IS_64 double d; long l; /* == 64bits! */#endif} JRI_JDK_stack_item;typedef union JRI_JDK_Java8Str { jint x[2]; jdouble d; jlong l; void *p; float f;} JRI_JDK_Java8;#ifdef HAVE_ALIGNED_LONGLONGS#define JRI_GET_INT64(_t,_addr) ( ((_t).x[0] = ((jint*)(_addr))[0]), \ ((_t).x[1] = ((jint*)(_addr))[1]), \ (_t).l )#define JRI_SET_INT64(_t, _addr, _v) ( (_t).l = (_v), \ ((jint*)(_addr))[0] = (_t).x[0], \ ((jint*)(_addr))[1] = (_t).x[1] )#else#define JRI_GET_INT64(_t,_addr) (*(jlong*)(_addr))#define JRI_SET_INT64(_t, _addr, _v) (*(jlong*)(_addr) = (_v))#endif/* If double's must be aligned on doubleword boundaries then define this */#ifdef HAVE_ALIGNED_DOUBLES#define JRI_GET_DOUBLE(_t,_addr) ( ((_t).x[0] = ((jint*)(_addr))[0]), \ ((_t).x[1] = ((jint*)(_addr))[1]), \ (_t).d )#define JRI_SET_DOUBLE(_t, _addr, _v) ( (_t).d = (_v), \ ((jint*)(_addr))[0] = (_t).x[0], \ ((jint*)(_addr))[1] = (_t).x[1] )#else#define JRI_GET_DOUBLE(_t,_addr) (*(jdouble*)(_addr))#define JRI_SET_DOUBLE(_t, _addr, _v) (*(jdouble*)(_addr) = (_v))#endif/******************************************************************************/#ifdef __cplusplus}#endif#endif /* JRI_MD_H *//******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -