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