void gen_rand_array_c1o2(w128_t *array, int size) { int i, j; w128_t lung; fixed(w128_t *status = this.status) { lung = status[DSFMT_N]; do_recursion(&array[0], &status[0], &status[DSFMT_POS1], &lung); for (i = 1; i < DSFMT_N - DSFMT_POS1; i++) { do_recursion(&array[i], &status[i], &status[i + DSFMT_POS1], &lung); } for (; i < DSFMT_N; i++) { do_recursion(&array[i], &status[i], &array[i + DSFMT_POS1 - DSFMT_N], &lung); } for (; i < size - DSFMT_N; i++) { do_recursion(&array[i], &array[i - DSFMT_N], &array[i + DSFMT_POS1 - DSFMT_N], &lung); } for (j = 0; j < 2 * DSFMT_N - size; j++) { status[j] = array[j + size - DSFMT_N]; } for (; i < size; i++, j++) { do_recursion(&array[i], &array[i - DSFMT_N], &array[i + DSFMT_POS1 - DSFMT_N], &lung); status[j] = array[i]; } status[DSFMT_N] = lung; } }
static void convert_o0o1(w128_t *w) { w->u64_0 |= 1; w->u64_1 |= 1; w->d0 -= 1.0; w->d1 -= 1.0; }
static void do_recursion(w128_t *r, w128_t *a, w128_t *b, w128_t *c, w128_t *d) { w128_t x; w128_t y; lshift128(&x, a, SFMT_SL2); rshift128(&y, c, SFMT_SR2); r->u32_0 = a->u32_0 ^ x.u32_0 ^ ((b->u32_0 >> SFMT_SR1) & SFMT_MSK1) ^ y.u32_0 ^ (d->u32_0 << SFMT_SL1); r->u32_1 = a->u32_1 ^ x.u32_1 ^ ((b->u32_1 >> SFMT_SR1) & SFMT_MSK2) ^ y.u32_1 ^ (d->u32_1 << SFMT_SL1); r->u32_2 = a->u32_2 ^ x.u32_2 ^ ((b->u32_2 >> SFMT_SR1) & SFMT_MSK3) ^ y.u32_2 ^ (d->u32_2 << SFMT_SL1); r->u32_3 = a->u32_3 ^ x.u32_3 ^ ((b->u32_3 >> SFMT_SR1) & SFMT_MSK4) ^ y.u32_3 ^ (d->u32_3 << SFMT_SL1); }
static void do_recursion(w128_t *r, w128_t *a, w128_t *b, w128_t *lung) { uint64_t t0, t1, L0, L1; t0 = a->u64_0; t1 = a->u64_1; L0 = lung->u64_0; L1 = lung->u64_1; lung->u64_0 = (t0 << DSFMT_SL1) ^ (L1 >> 32) ^ (L1 << 32) ^ b->u64_0; lung->u64_1 = (t1 << DSFMT_SL1) ^ (L0 >> 32) ^ (L0 << 32) ^ b->u64_1; r->u64_0 = (lung->u64_0 >> DSFMT_SR) ^ (lung->u64_0 & DSFMT_MSK1) ^ t0; r->u64_1 = (lung->u64_1 >> DSFMT_SR) ^ (lung->u64_1 & DSFMT_MSK2) ^ t1; }
static void lshift128(w128_t *dst, w128_t *src, int shift) { uint64_t th, tl, oh, ol; th = ((uint64_t)src->u32_3 << 32) | ((uint64_t)src->u32_2); tl = ((uint64_t)src->u32_1 << 32) | ((uint64_t)src->u32_0); oh = th << (shift * 8); ol = tl << (shift * 8); oh |= tl >> (64 - shift * 8); dst->u32_1 = (uint32_t)(ol >> 32); dst->u32_0 = (uint32_t)ol; dst->u32_3 = (uint32_t)(oh >> 32); dst->u32_2 = (uint32_t)oh; }
void gen_rand_array(w128_t *array, int size) { fixed(w128_t *state = this.state) { var r1 = &state[SFMT_N - 2]; var r2 = &state[SFMT_N - 1]; int i; for (i = 0; i < SFMT_N - SFMT_POS1; i++) { do_recursion(&array[i], &state[i], &state[i + SFMT_POS1], r1, r2); r1 = r2; r2 = &array[i]; } for (; i < SFMT_N; i++) { do_recursion(&array[i], &state[i], &array[i + SFMT_POS1 - SFMT_N], r1, r2); r1 = r2; r2 = &array[i]; } for (; i < size - SFMT_N; i++) { do_recursion(&array[i], &array[i - SFMT_N], &array[i + SFMT_POS1 - SFMT_N], r1, r2); r1 = r2; r2 = &array[i]; } int j; for (j = 0; j < 2 * SFMT_N - size; j++) { state[j] = array[j + size - SFMT_N]; } for (; i < size; i++, j++) { do_recursion(&array[i], &array[i - SFMT_N], &array[i + SFMT_POS1 - SFMT_N], r1, r2); r1 = r2; r2 = &array[i]; state[j] = array[i]; } } }
static void convert_o0c1(w128_t *w) { w->d0 = 2.0 - w->d0; w->d1 = 2.0 - w->d1; }
static void convert_c0o1(w128_t *w) { w->d0 -= 1.0; w->d1 -= 1.0; }