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 <bbill....@gmail.com> 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