Skip to content

Commit e7fdaf3

Browse files
committed
riscv(ffi): simplify float-int tuple fixup code
Note: aligned or packed struct fixup is still broken!
1 parent 24e933e commit e7fdaf3

File tree

1 file changed

+16
-78
lines changed

1 file changed

+16
-78
lines changed

src/lj_ccall.c

Lines changed: 16 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)