71 __asm__ __volatile__ ("movaps %4, %%xmm4 \n\t" \
72 "movaps %%xmm2, %%xmm3 \n\t" \
73 "subps %2, %%xmm4 \n\t" \
74 "movaps %%xmm1, %%xmm5 \n\t" \
75 "cmpps $0x6, %%xmm4, %%xmm2 \n\t" \
76 "andps %%xmm2, %%xmm5 \n\t" \
77 "subps %%xmm3, %%xmm4 \n\t" \
78 "andps %%xmm0, %%xmm2 \n\t" \
79 "addps %%xmm4, %%xmm5 \n\t" \
80 "movaps %%xmm5, %0 \n\t" \
81 "movaps %5, %%xmm6 \n\t" \
82 "movaps %%xmm2, %%xmm3 \n\t" \
83 "subps %3, %%xmm6 \n\t" \
84 "movaps %%xmm1, %%xmm7 \n\t" \
85 "cmpps $0x6, %%xmm6, %%xmm2 \n\t" \
86 "andps %%xmm2, %%xmm7 \n\t" \
87 "subps %%xmm3, %%xmm6 \n\t" \
88 "andps %%xmm0, %%xmm2 \n\t" \
89 "addps %%xmm6, %%xmm7 \n\t" \
100 "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7")
103 static void error(
int no)
108 printf(
"Error in subroutine rlxd_init\n");
109 printf(
"Bad choice of luxury level (should be 1 or 2)\n");
112 printf(
"Error in subroutine rlxd_init\n");
113 printf(
"Bad choice of seed (should be between 1 and 2^31-1)\n");
116 printf(
"Error in rlxd_get\n");
117 printf(
"Undefined state (ranlxd is not initialized\n");
120 printf(
"Error in rlxd_reset\n");
121 printf(
"Unexpected input data\n");
124 printf(
"Program aborted\n");
140 __asm__ __volatile__ (
"movaps %0, %%xmm0 \n\t"
141 "movaps %1, %%xmm1 \n\t"
149 "xmm0",
"xmm1",
"xmm2");
162 __asm__ __volatile__ (
"movaps %%xmm2, %0"
187 b=(float)(ldexp(1.0,-24));
205 int ibit,jbit,xbit[31];
225 if ((seed<=0)||(i!=0))
242 xbit[ibit]=(xbit[ibit]+xbit[jbit])%2;
250 x.num[4*k+
i]=(float)(ldexp((
double)(ix),-24));
280 r[k]=(double)(
x.num[is+4])+(double)(one_bit.
c1*
x.num[is]);
299 base=(float)(ldexp(1.0,24));
303 state[k+1]=(
int)(base*
x.num[k]);
305 state[97]=(int)(base*carry.
c1);
306 state[98]=(int)(base*carry.
c2);
307 state[99]=(int)(base*carry.
c3);
308 state[100]=(int)(base*carry.
c4);
328 if ((state[k+1]<0)||(state[k+1]>=167777216))
331 x.num[k]=(float)(ldexp((
double)(state[k+1]),-24));
334 if (((state[97]!=0)&&(state[97]!=1))||
335 ((state[98]!=0)&&(state[98]!=1))||
336 ((state[99]!=0)&&(state[99]!=1))||
337 ((state[100]!=0)&&(state[100]!=1)))
340 carry.
c1=(float)(ldexp((
double)(state[97]),-24));
341 carry.
c2=(float)(ldexp((
double)(state[98]),-24));
342 carry.
c3=(float)(ldexp((
double)(state[99]),-24));
343 carry.
c4=(float)(ldexp((
double)(state[100]),-24));
353 if (((
pr!=202)&&(
pr!=397))||
354 (ir<0)||(ir>11)||(jr<0)||(jr>11)||(jr!=((ir+7)%12))||
361 #define BASE 0x1000000
362 #define MASK 0xffffff
384 #define STEP(pi,pj) \
385 d=(*pj).c1.c1-(*pi).c1.c1-carry.c1; \
386 (*pi).c2.c1+=(d<0); \
388 (*pi).c1.c1=d&MASK; \
389 d=(*pj).c1.c2-(*pi).c1.c2-carry.c2; \
390 (*pi).c2.c2+=(d<0); \
392 (*pi).c1.c2=d&MASK; \
393 d=(*pj).c1.c3-(*pi).c1.c3-carry.c3; \
394 (*pi).c2.c3+=(d<0); \
396 (*pi).c1.c3=d&MASK; \
397 d=(*pj).c1.c4-(*pi).c1.c4-carry.c4; \
398 (*pi).c2.c4+=(d<0); \
400 (*pi).c1.c4=d&MASK; \
401 d=(*pj).c2.c1-(*pi).c2.c1; \
404 (*pi).c2.c1=d&MASK; \
405 d=(*pj).c2.c2-(*pi).c2.c2; \
408 (*pi).c2.c2=d&MASK; \
409 d=(*pj).c2.c3-(*pi).c2.c3; \
412 (*pi).c2.c3=d&MASK; \
413 d=(*pj).c2.c4-(*pi).c2.c4; \
424 printf(
"Error in rlxd_init\n");
425 printf(
"Arithmetic on this machine is not suitable for ranlxd\n");
428 printf(
"Error in subroutine rlxd_init\n");
429 printf(
"Bad choice of luxury level (should be 1 or 2)\n");
432 printf(
"Error in subroutine rlxd_init\n");
433 printf(
"Bad choice of seed (should be between 1 and 2^31-1)\n");
436 printf(
"Error in rlxd_get\n");
437 printf(
"Undefined state (ranlxd is not initialized)\n");
440 printf(
"Error in rlxd_reset\n");
441 printf(
"Arithmetic on this machine is not suitable for ranlxd\n");
444 printf(
"Error in rlxd_reset\n");
445 printf(
"Unexpected input data\n");
448 printf(
"Program aborted\n");
490 one_bit=ldexp(1.0,-24);
504 int ibit,jbit,xbit[31];
507 if ((INT_MAX<2147483647)||(FLT_RADIX!=2)||(FLT_MANT_DIG<24)||
528 if ((seed<=0)||(i!=0))
545 xbit[ibit]=(xbit[ibit]+xbit[jbit])%2;
583 r[k]=one_bit*((double)(
x.num[is+4])+one_bit*(double)(
x.num[is]));
622 if ((INT_MAX<2147483647)||(FLT_RADIX!=2)||(FLT_MANT_DIG<24)||
633 if ((state[k+1]<0)||(state[k+1]>=167777216))
639 if (((state[97]!=0)&&(state[97]!=1))||
640 ((state[98]!=0)&&(state[98]!=1))||
641 ((state[99]!=0)&&(state[99]!=1))||
642 ((state[100]!=0)&&(state[100]!=1)))
658 if (((
pr!=202)&&(
pr!=397))||
659 (ir<0)||(ir>11)||(jr<0)||(jr>11)||(jr!=((ir+7)%12))||
printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime)
void rlxd_get(int state[])
static void error(int no)
void ranlxd(double r[], int n)
static void define_constants(void)
void rlxd_reset(int state[])
void rlxd_init(int level, int seed)