@@ -1446,85 +1446,23 @@ static int ccall_set_args(lua_State *L, CTState *cts, CType *ct,
14461446 ((uint64_t * )dp )[0 ] = 0xffffffff00000000ul | ((uint32_t * )dp )[0 ];
14471447 break ;
14481448 }
1449- case MIX_FI : {
1450- lj_assertL (sz == 8 || sz == 16 , "invalid MIX_FI size %d" , (int )sz );
1449+ case MIX_FI : case MIX_DI : case MIX_IF : case MIX_ID : {
1450+ lj_assertL (sz == 2 * sizeof ( int32_t ) || sz == 2 * sizeof ( int64_t ) , "invalid MIX size %d" , (int )sz );
14511451 if (ngpr >= CCALL_NARG_GPR ) break ;
1452- if (sz == 8 ) {
1453- FPRArg farg = { .hi = 0xffffffffu , .lo = ((uint32_t * )dp )[0 ] };
1454- if (!isva && nfpr + 1 <= CCALL_NARG_FPR ) {
1455- cc -> fpr [nfpr ++ ] = farg ;
1456- goto fi_next ;
1457- } else if (ngpr + 1 <= CCALL_NARG_GPR ) {
1458- cc -> gpr [ngpr ++ ] = farg .u ;
1459- fi_next :
1460- ((uint32_t * )dp )[0 ] = ((uint32_t * )dp )[1 ];
1461- ((uint32_t * )dp )[1 ] = 0 ;
1462- if (ngpr + 1 <= CCALL_NARG_GPR ) {
1463- cc -> gpr [ngpr ++ ] = ((uint32_t * )dp )[0 ];
1464- ((uint32_t * )dp )[0 ] = 0 , nsp = onsp ;
1465- }
1466- }
1467- break ;
1468- } else /*if (sz == 16)*/ {
1469- ((uint64_t * )dp )[0 ] |= 0xffffffff00000000ul ;
1470- /* fallthrough */
1471- }
1472- }
1473- case MIX_DI : {
1474- lj_assertL (sz == 16 , "invalid MIX_DI size %d" , (int )sz );
1475- if (ngpr >= CCALL_NARG_GPR ) break ;
1476- if (!isva && nfpr + 1 <= CCALL_NARG_FPR ) {
1477- cc -> fpr [nfpr ++ ] = (FPRArg ){ .u = ((uint64_t * )dp )[0 ] };
1478- goto di_next ;
1479- } else if (ngpr + 1 <= CCALL_NARG_GPR ) {
1480- cc -> gpr [ngpr ++ ] = ((uint64_t * )dp )[0 ];
1481- di_next :
1482- ((uint64_t * )dp )[0 ] = ((uint64_t * )dp )[1 ];
1483- ((uint64_t * )dp )[1 ] = 0 , nsp = mnsp ;
1484- if (ngpr + 1 <= CCALL_NARG_GPR ) {
1485- cc -> gpr [ngpr ++ ] = ((uint64_t * )dp )[0 ];
1486- ((uint64_t * )dp )[0 ] = 0 , nsp = onsp ;
1487- }
1488- }
1489- break ;
1490- }
1491- case MIX_IF : {
1492- lj_assertL (sz == 8 || sz == 16 , "invalid MIX_IF size %d" , (int )sz );
1493- if (sz == 8 ) {
1494- FPRArg farg = { .hi = 0xffffffffu , .lo = ((uint32_t * )dp )[1 ] };
1495- if (ngpr + 1 <= CCALL_NARG_GPR ) {
1496- cc -> gpr [ngpr ++ ] = ((uint32_t * )dp )[0 ];
1497- ((uint32_t * )dp )[0 ] = ((uint32_t * )dp )[1 ];
1498- ((uint32_t * )dp )[1 ] = 0 ;
1499- if (!isva && nfpr + 1 <= CCALL_NARG_FPR ) {
1500- cc -> fpr [nfpr ++ ] = farg ;
1501- goto if_next ;
1502- } else if (ngpr + 1 <= CCALL_NARG_GPR ) {
1503- cc -> gpr [ngpr ++ ] = farg .u ;
1504- if_next :
1505- ((uint32_t * )dp )[0 ] = 0 , nsp = onsp ;
1506- }
1507- }
1508- break ;
1509- } else /*if (sz == 16)*/ {
1510- ((uint64_t * )dp )[1 ] |= 0xffffffff00000000ul ;
1511- /* fallthrough */
1512- }
1513- }
1514- case MIX_ID : {
1515- lj_assertL (sz == 16 , "invalid MIX_ID size %d" , (int )sz );
1516- if (ngpr + 1 <= CCALL_NARG_GPR ) {
1517- cc -> gpr [ngpr ++ ] = ((uint64_t * )dp )[0 ];
1518- ((uint64_t * )dp )[0 ] = ((uint64_t * )dp )[1 ];
1519- ((uint64_t * )dp )[1 ] = 0 , nsp = mnsp ;
1520- if (!isva && nfpr + 1 <= CCALL_NARG_FPR ) {
1521- cc -> fpr [nfpr ++ ] = (FPRArg ){ .u = ((uint64_t * )dp )[0 ] };
1522- goto id_next ;
1523- } else if (ngpr + 1 <= CCALL_NARG_GPR ) {
1524- cc -> gpr [ngpr ++ ] = ((uint64_t * )dp )[0 ];
1525- id_next :
1526- ((uint64_t * )dp )[0 ] = 0 , nsp = onsp ;
1527- }
1452+ eCCallStructMixElem es [2 ] = { mix .e1 , mix .e2 };
1453+ for (int ti = 0 ; ti < 2 ; ti ++ ) {
1454+ uint64_t val = (sz == 2 * sizeof (int32_t )) ? ((uint32_t * )dp )[ti ] : ((uint64_t * )dp )[ti ];
1455+ if (es [ti ] == MIX_ELEM_FLOAT ) val |= 0xffffffff00000000ul ;
1456+
1457+ if ((es [ti ] == MIX_ELEM_FLOAT || es [ti ] == MIX_ELEM_DOUBLE ) &&
1458+ !isva && nfpr < CCALL_NARG_FPR ) {
1459+ cc -> fpr [nfpr ++ ].u = val ;
1460+ } else if (ngpr < CCALL_NARG_GPR ) {
1461+ cc -> gpr [ngpr ++ ] = val ;
1462+ } else break ;
1463+
1464+ if (sz == 2 * sizeof (int32_t ) && ti > 0 ) { ((uint64_t * )dp )[0 ] = 0 ; nsp = onsp ; }
1465+ if (sz == 2 * sizeof (int64_t )) { ((uint64_t * )dp )[ti ] = 0 ; nsp = (ti == 0 ) ? mnsp : onsp ; }
15281466 }
15291467 break ;
15301468 }
0 commit comments