Thanks, now both linux64 and linux32 pass gdll_df.
I heard there is (or will be) little-endian linux ppc64,
will passing float parameters still work there?
Пт, 23 сен 2016, Xiao-Yong Jin написал(а):
> Solved. It's not the issue in my patch. It is the hardwired NCDARGS 32.
> Under a 32bit system, it means only 16 D values, for which the code doesn't
> check properly, and nothing actually gets called because SWITCHCALL doesn't
> handle cnt more than 32. One could trigger this bug without my patch just by
> passing 26 D values too.
>
> The following patch increases NCDARGS to 64, and check dv-data after the type
> handling. Should keep j32 happy unless more than 32 D passed.
>
> diff --git a/jsrc/x15.c b/jsrc/x15.c
> index d0472bb..1c95e62 100644
> --- a/jsrc/x15.c
> +++ b/jsrc/x15.c
> @@ -126,7 +126,7 @@ typedef float (_cdecl *ALTCALLF)();
> #define DEPARM 6
> #define DELIMIT 7 /* too many float/double args */
>
> -#define NCDARGS 32 /* hardwired max number of arguments */
> +#define NCDARGS 64 /* hardwired max number of arguments */
> #define NLIBS 100 /* max number of libraries */
>
> #define NLEFTARG (2*NPATH+4+3*(1+NCDARGS))
> @@ -320,6 +320,214 @@ static void double_trick(double*v, I n){I i=0;
> d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31]);break; \
> + case 33: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32]);break; \
> + case 34: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33]);break; \
> + case 35: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34]);break; \
> + case 36: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35]);break; \
> + case 37: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36]);break; \
> + case 38: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37]);break; \
> + case 39: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38]);break; \
> + case 40: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39]);break; \
> + case 41: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40]);break; \
> + case 42: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41]);break; \
> + case 43: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42]);break; \
> + case 44: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43]);break; \
> + case 45: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44]);break; \
> + case 46: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45]);break; \
> + case 47: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46]);break; \
> + case 48: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47]);break; \
> + case 49: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48]);break; \
> + case 50: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49]);break; \
> + case 51: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50]);break; \
> + case 52: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50],d[51]);break; \
> + case 53: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50],d[51],d[52]);break; \
> + case 54: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50],d[51],d[52],d[53]);break; \
> + case 55: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50],d[51],d[52],d[53],d[54]);break; \
> + case 56: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50],d[51],d[52],d[53],d[54],d[55]);break; \
> + case 57: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50],d[51],d[52],d[53],d[54],d[55], \
> + d[56]);break; \
> + case 58: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50],d[51],d[52],d[53],d[54],d[55], \
> + d[56],d[57]);break; \
> + case 59: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50],d[51],d[52],d[53],d[54],d[55], \
> + d[56],d[57],d[58]);break; \
> + case 60: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50],d[51],d[52],d[53],d[54],d[55], \
> + d[56],d[57],d[58],d[59]);break; \
> + case 61: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50],d[51],d[52],d[53],d[54],d[55], \
> + d[56],d[57],d[58],d[59],d[60]);break; \
> + case 62: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50],d[51],d[52],d[53],d[54],d[55], \
> + d[56],d[57],d[58],d[59],d[60],d[61]);break; \
> + case 63: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50],d[51],d[52],d[53],d[54],d[55], \
> + d[56],d[57],d[58],d[59],d[60],d[61],d[62]);break; \
> + case 64: r = fp(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], \
> + d[8], d[9], d[10],d[11],d[12],d[13],d[14],d[15], \
> + d[16],d[17],d[18],d[19],d[20],d[21],d[22],d[23], \
> + d[24],d[25],d[26],d[27],d[28],d[29],d[30],d[31], \
> + d[32],d[33],d[34],d[35],d[36],d[37],d[38],d[39], \
> + d[40],d[41],d[42],d[43],d[44],d[45],d[46],d[47], \
> + d[48],d[49],d[50],d[51],d[52],d[53],d[54],d[55], \
> + d[56],d[57],d[58],d[59],d[60],d[61],d[62],d[63]);break; \
> }
>
> static I stdcalli(STDCALLI fp,I*d,I cnt,DoF*dd,I dcnt){I r;
> @@ -756,6 +964,8 @@ static B jtcdexec1(J jt,CCT*cc,C*zv0,C*wu,I wk,I wt,I
> wd){A*wv=(A*)wu,x,y,*zv;B
> CDASSERT(16>=dcnt,DELIMIT);
> #elif SY_UNIX64 && defined(__x86_64__)
> if(dcnt>8&&dv-data<6)dv=data+dcnt-2; /* update dv to point to the end */
> +#elif !SY_64
> + CDASSERT(dv-data<=NCDARGS,DECOUNT); /* D needs 2 I args in 32bit system,
> check it again. */
> #endif
>
> DO(cipcount, convertdown(cipv[i],cipn[i],cipt[i]);); /* convert I to s and
> int and d to f as required */
>
> > On Sep 23, 2016, at 11:35 AM, bill lam <[email protected]> wrote:
> >
> > I rebuilt all jconsole/libj/tsdll. linux32 failed gdll_df test.
> >
> > 9 13 14 26(4 : 0"0)'abcz'
> > try.
> > (+/>yy)=>{.z=:('d1',y,' d ','d '$~2*x) dcd yy=:<"0 [ 1.3*?x#10
> > catch.
> > 7 0-:cder'' NB. failure with too many float/double args allowed
> > end.
> > )
> > 1 1 1 0
> > |assertion failure: RUN1
> > |[-66] /home/bill/jbld/test/gdll_df.ijs
> >
> > +/>yy
> > 132.6
> >> {.z
> > 87.1
> >
> > but it passed under linux64.
> >
> > Чт, 22 сен 2016, Xiao-Yong Jin написал(а):
> >> Thanks Bill for the guidance. I've looked into the ABI's for ppc64 and
> >> x86_64.
> >>
> >> Attached is a patch to fix cd for correctly passing floating point values
> >> under linux_ppc64, linux_x86_64, and darwin_x86_64.
> >>
> >> On linux ppc64, I tested with RHEL on a power7. Single precision floating
> >> point numbers are now correctly passed. The first 13 of both single and
> >> double precision numbers are passed via registers, and the rest are
> >> correctly pushed to stack with other arguments.
> >>
> >> On x86_64, I tested with both linux and darwin. The patch lifts the
> >> restriction of 8 floating point scalars. Extra single or double precision
> >> floating point numbers are correctly pushed to stack. Now you will never
> >> have to see the cd domain error "7 0 - system limit - linux64 max 8
> >> float/double scalars". We can remove this line from our dictionary.
> >>
> >> I imagine it would take minimal changes to apply to other x86_64 systems.
> >> Though I don't have the OS to test, but I'd be glad to explain and help
> >> out.
> >>
> >> Best,
> >> Xiao-Yong
> >>
> >> ----------------------------------------------------------------------
> >> For information about J forums see http://www.jsoftware.com/forums.htm
> >
> > --
> > regards,
> > ====================================================
> > GPG key 1024D/4434BAB3 2008-08-24
> > gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
> > gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
> > ----------------------------------------------------------------------
> > For information about J forums see http://www.jsoftware.com/forums.htm
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
--
regards,
====================================================
GPG key 1024D/4434BAB3 2008-08-24
gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm