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 rlxs_init\n");
109 printf(
"Bad choice of luxury level (should be 0,1 or 2)\n");
112 printf(
"Error in subroutine rlxs_init\n");
113 printf(
"Bad choice of seed (should be between 1 and 2^31-1)\n");
116 printf(
"Error in rlxs_get\n");
117 printf(
"Undefined state (ranlxs is not initialized\n");
120 printf(
"Error in rlxs_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));
201 int ibit,jbit,xbit[31];
223 if ((seed<=0)||(i!=0))
240 xbit[ibit]=(xbit[ibit]+xbit[jbit])%2;
248 x.num[4*k+
i]=(float)(ldexp((
double)(ix),-24));
297 base=(float)(ldexp(1.0,24));
301 state[k+1]=(
int)(base*
x.num[k]);
303 state[97]=(int)(base*carry.
c1);
304 state[98]=(int)(base*carry.
c2);
305 state[99]=(int)(base*carry.
c3);
306 state[100]=(int)(base*carry.
c4);
326 if ((state[k+1]<0)||(state[k+1]>=167777216))
329 x.num[k]=(float)(ldexp((
double)(state[k+1]),-24));
332 if (((state[97]!=0)&&(state[97]!=1))||
333 ((state[98]!=0)&&(state[98]!=1))||
334 ((state[99]!=0)&&(state[99]!=1))||
335 ((state[100]!=0)&&(state[100]!=1)))
338 carry.
c1=(float)(ldexp((
double)(state[97]),-24));
339 carry.
c2=(float)(ldexp((
double)(state[98]),-24));
340 carry.
c3=(float)(ldexp((
double)(state[99]),-24));
341 carry.
c4=(float)(ldexp((
double)(state[100]),-24));
351 if (((
pr!=109)&&(
pr!=202)&&(
pr!=397))||
352 (ir<0)||(ir>11)||(jr<0)||(jr>11)||(jr!=((ir+7)%12))||
359 #define BASE 0x1000000
360 #define MASK 0xffffff
382 #define STEP(pi,pj) \
383 d=(*pj).c1.c1-(*pi).c1.c1-carry.c1; \
384 (*pi).c2.c1+=(d<0); \
386 (*pi).c1.c1=d&MASK; \
387 d=(*pj).c1.c2-(*pi).c1.c2-carry.c2; \
388 (*pi).c2.c2+=(d<0); \
390 (*pi).c1.c2=d&MASK; \
391 d=(*pj).c1.c3-(*pi).c1.c3-carry.c3; \
392 (*pi).c2.c3+=(d<0); \
394 (*pi).c1.c3=d&MASK; \
395 d=(*pj).c1.c4-(*pi).c1.c4-carry.c4; \
396 (*pi).c2.c4+=(d<0); \
398 (*pi).c1.c4=d&MASK; \
399 d=(*pj).c2.c1-(*pi).c2.c1; \
402 (*pi).c2.c1=d&MASK; \
403 d=(*pj).c2.c2-(*pi).c2.c2; \
406 (*pi).c2.c2=d&MASK; \
407 d=(*pj).c2.c3-(*pi).c2.c3; \
410 (*pi).c2.c3=d&MASK; \
411 d=(*pj).c2.c4-(*pi).c2.c4; \
422 printf(
"Error in rlxs_init\n");
423 printf(
"Arithmetic on this machine is not suitable for ranlxs\n");
426 printf(
"Error in subroutine rlxs_init\n");
427 printf(
"Bad choice of luxury level (should be 0,1 or 2)\n");
430 printf(
"Error in subroutine rlxs_init\n");
431 printf(
"Bad choice of seed (should be between 1 and 2^31-1)\n");
434 printf(
"Error in rlxs_get\n");
435 printf(
"Undefined state (ranlxs is not initialized)\n");
438 printf(
"Error in rlxs_reset\n");
439 printf(
"Arithmetic on this machine is not suitable for ranlxs\n");
442 printf(
"Error in rlxs_reset\n");
443 printf(
"Unexpected input data\n");
446 printf(
"Program aborted\n");
488 one_bit=(float)(ldexp(1.0,-24));
498 int ibit,jbit,xbit[31];
501 if ((INT_MAX<2147483647)||(FLT_RADIX!=2)||(FLT_MANT_DIG<24))
523 if ((seed<=0)||(i!=0))
540 xbit[ibit]=(xbit[ibit]+xbit[jbit])%2;
578 r[k]=one_bit*(float)(
x.num[is]);
617 if ((INT_MAX<2147483647)||(FLT_RADIX!=2)||(FLT_MANT_DIG<24))
627 if ((state[k+1]<0)||(state[k+1]>=167777216))
633 if (((state[97]!=0)&&(state[97]!=1))||
634 ((state[98]!=0)&&(state[98]!=1))||
635 ((state[99]!=0)&&(state[99]!=1))||
636 ((state[100]!=0)&&(state[100]!=1)))
652 if (((
pr!=109)&&(
pr!=202)&&(
pr!=397))||
653 (ir<0)||(ir>11)||(jr<0)||(jr>11)||(jr!=((ir+7)%12))||
printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime)
void rlxs_get(int state[])
void rlxs_reset(int state[])
static void define_constants(void)
void ranlxs(float r[], int n)
static void error(int no)
void rlxs_init(int level, int seed)