int put_int64(Word at, int64_t l, int flags ARG_LD) { Word p; word r, m; int req; r = consInt(l); if ( valInt(r) == l ) { *at = r; return TRUE; } #if SIZEOF_VOIDP == 8 req = 3; #elif SIZEOF_VOIDP == 4 req = 4; #else #error "FIXME: Unsupported sizeof word" #endif if ( !hasGlobalSpace(req) ) { int rc = ensureGlobalSpace(req, flags); if ( rc != TRUE ) return rc; } p = gTop; gTop += req; #if SIZEOF_VOIDP == 8 r = consPtr(p, TAG_INTEGER|STG_GLOBAL); m = mkIndHdr(1, TAG_INTEGER); *p++ = m; *p++ = l; *p = m; #else #if SIZEOF_VOIDP == 4 r = consPtr(p, TAG_INTEGER|STG_GLOBAL); m = mkIndHdr(2, TAG_INTEGER); *p++ = m; #ifdef WORDS_BIGENDIAN *p++ = (word)(l>>32); *p++ = (word)l; #else *p++ = (word)l; *p++ = (word)(l>>32); #endif *p = m; #else #error "FIXME: Unsupported sizeof intptr_t." #endif #endif *at = r; return TRUE; }
static int globalMPZ(Word at, mpz_t mpz, int flags ARG_LD) { DEBUG(CHK_SECURE, assert(!onStackArea(global, at) && !onStackArea(local, at))); if ( mpz->_mp_alloc ) { Word p; size_t size; size_t wsz = mpz_wsize(mpz, &size); word m = mkIndHdr(wsz+1, TAG_INTEGER); if ( wsizeofInd(m) != wsz+1 ) { PL_error(NULL, 0, NULL, ERR_REPRESENTATION, ATOM_integer); return 0; } if ( !hasGlobalSpace(wsz+3) ) { int rc = ensureGlobalSpace(wsz+3, flags); if ( rc != TRUE ) return rc; } p = gTop; gTop += wsz+3; *at = consPtr(p, TAG_INTEGER|STG_GLOBAL); *p++ = m; p[wsz] = 0L; /* pad out */ p[wsz+1] = m; *p++ = (word)mpz->_mp_size; memcpy(p, mpz->_mp_d, size); } else /* already on the stack */ { Word p = (Word)mpz->_mp_d - 2; #ifndef NDEBUG size_t size; size_t wsz = mpz_wsize(mpz, &size); assert(p[0] == mkIndHdr(wsz+1, TAG_INTEGER)); #endif *at = consPtr(p, TAG_INTEGER|STG_GLOBAL); } return TRUE; }
char * loadMPZFromCharp(const char *data, Word r, Word *store) { GET_LD int size = 0; size_t limpsize; size_t wsize; int neg; mpz_t mpz; Word p; word m; size |= (data[0]&0xff)<<24; size |= (data[1]&0xff)<<16; size |= (data[2]&0xff)<<8; size |= (data[3]&0xff); size = (size << SHIFTSIGN32)>>SHIFTSIGN32; /* sign extend */ data += 4; DEBUG(1, Sdprintf("loadMPZFromCharp(): size = %d bytes\n", size)); if ( size < 0 ) { neg = TRUE; size = -size; } else neg = FALSE; limpsize = (size+sizeof(mp_limb_t)-1)/sizeof(mp_limb_t); wsize = (limpsize*sizeof(mp_limb_t)+sizeof(word)-1)/sizeof(word); p = *store; *store += (wsize+3); *r = consPtr(p, TAG_INTEGER|STG_GLOBAL); m = mkIndHdr(wsize+1, TAG_INTEGER); *p++ = m; p[wsize] = 0L; /* pad out */ p[wsize+1] = m; *p++ = (neg ? -limpsize : limpsize); mpz->_mp_size = limpsize; mpz->_mp_alloc = limpsize; mpz->_mp_d = (mp_limb_t*)p; mpz_import(mpz, size, 1, 1, 1, 0, data); assert((Word)mpz->_mp_d == p); /* check no (re-)allocation is done */ return (char *)data+size; }