Hex literals in N64 byte-swap array indexing (silence -Wxor-used-as-pow)

The N64 endian-swap idiom 'data[i ^ N]' is used in eighty-odd places
to read big-endian-ordered bytes (N=3) or 16-bit words (N=1) from
little-endian-ordered DMEM/RDRAM. When the index is a decimal literal
on both sides of the XOR, GCC 12+ heuristically reads the expression
as a base-with-exponent ('2 to the 1', '2 to the 3') and emits
-Wxor-used-as-pow with messages like:

    F5Indi_Naboo.cpp:248:90: warning: result of '2^3' is 1; did you
        mean '1 << 3' (8)? [-Wxor-used-as-pow]
    F5Indi_Naboo.cpp:481:34: warning: result of '2^1' is 3; did you
        mean '1 << 1' (2)?

The N64 code really does want XOR, not exponentiation. GCC offers a
one-character silencer: change at least one operand to a hexadecimal
literal. Convert every [<dec> ^ <dec>] subscript to [0x<dec> ^ 0x<dec>]
across the in-tree gles2n64 ZSort plus the GLideN64 uCodes
(F3DFLX2, F5Indi_Naboo, ZSort, ZSortBOSS). 84 sites total. No
semantic change; the values are unchanged in hex.
This commit is contained in:
libretroadmin authored and U-DESKTOP-SPFP6AQ\twistedtechre committed 2026-05-16 19:55:46 +02:00
1 parent accea86748
commit 2d53c9cf92
5 files changed
+82 -82

No files matched your search

+8 -8
View File
@@ -80,21 +80,21 @@ static void ZSort_DrawObject (uint8_t * _addr, uint32_t _type)
for (i = 0; i < vnum; ++i)
{
struct SPVertex *vtx = (struct SPVertex*)&OGL.triangles.vertices[i];
vtx->x = _FIXED2FLOAT(((int16_t*)_addr)[0 ^ 1], 2);
vtx->y = _FIXED2FLOAT(((int16_t*)_addr)[1 ^ 1], 2);
vtx->x = _FIXED2FLOAT(((int16_t*)_addr)[0x0 ^ 0x1], 2);
vtx->y = _FIXED2FLOAT(((int16_t*)_addr)[0x1 ^ 0x1], 2);
vtx->z = 0.0f;
vtx->r = _addr[4^3] * 0.0039215689f;
vtx->g = _addr[5^3] * 0.0039215689f;
vtx->b = _addr[6^3] * 0.0039215689f;
vtx->a = _addr[7^3] * 0.0039215689f;
vtx->r = _addr[0x4^0x3] * 0.0039215689f;
vtx->g = _addr[0x5^0x3] * 0.0039215689f;
vtx->b = _addr[0x6^0x3] * 0.0039215689f;
vtx->a = _addr[0x7^0x3] * 0.0039215689f;
vtx->flag = 0;
vtx->HWLight = 0;
vtx->clip = 0;
vtx->w = 1.0f;
if (textured != 0)
{
vtx->s = _FIXED2FLOAT(((int16_t*)_addr)[4^1], 5 );
vtx->t = _FIXED2FLOAT(((int16_t*)_addr)[5^1], 5 );
vtx->s = _FIXED2FLOAT(((int16_t*)_addr)[0x4^0x1], 5 );
vtx->t = _FIXED2FLOAT(((int16_t*)_addr)[0x5^0x1], 5 );
vtx->w = ZSort_Calc_invw(((int*)_addr)[3]) / 31.0f;
}
@@ -15,12 +15,12 @@ void F3DFLX2_LoadAlphaLight(u32 _a)
const s16* const data = reinterpret_cast<const s16*>(RDRAM + address);
// gSP.lookat.xyz[0][X] = static_cast<f32>(data[4 ^ 1]);
// gSP.lookat.xyz[0][Y] = static_cast<f32>(data[5 ^ 1]);
// gSP.lookat.xyz[0][Z] = static_cast<f32>(data[6 ^ 1]);
gSP.lookat.xyz[0][X] = _FIXED2FLOAT(data[4 ^ 1], 8);
gSP.lookat.xyz[0][Y] = _FIXED2FLOAT(data[5 ^ 1], 8);
gSP.lookat.xyz[0][Z] = _FIXED2FLOAT(data[6 ^ 1], 8);
// gSP.lookat.xyz[0][X] = static_cast<f32>(data[0x4 ^ 0x1]);
// gSP.lookat.xyz[0][Y] = static_cast<f32>(data[0x5 ^ 0x1]);
// gSP.lookat.xyz[0][Z] = static_cast<f32>(data[0x6 ^ 0x1]);
gSP.lookat.xyz[0][X] = _FIXED2FLOAT(data[0x4 ^ 0x1], 8);
gSP.lookat.xyz[0][Y] = _FIXED2FLOAT(data[0x5 ^ 0x1], 8);
gSP.lookat.xyz[0][Z] = _FIXED2FLOAT(data[0x6 ^ 0x1], 8);
gSP.lookatEnable = true;
@@ -231,7 +231,7 @@ void F5INDI_Lighting_Overlay1(u32 _w0, u32 _w1)
u32 D = (_SHIFTR(*V, 24, 8) * P1) >> 16;
u32 E = (_SHIFTR(*V, 16, 8) * P1) >> 16;
u32 F = (_SHIFTR(*V, 8, 8) * P1) >> 16;
u32 J = (_SHIFTR(factors[j], 0, 8) * data[3 ^ 3]) >> 8;
u32 J = (_SHIFTR(factors[j], 0, 8) * data[0x3 ^ 0x3]) >> 8;
if (*light == 4) {
*dst = J;
@@ -243,9 +243,9 @@ void F5INDI_Lighting_Overlay1(u32 _w0, u32 _w1)
*dst = std::min(*dst + D, 0xFFU);
dst++;
} else {
D += (_SHIFTR(factors[j], 24, 8) * data[0 ^ 3]) >> 8;
E += (_SHIFTR(factors[j], 16, 8) * data[1 ^ 3]) >> 8;
F += (_SHIFTR(factors[j], 8, 8) * data[2 ^ 3]) >> 8;
D += (_SHIFTR(factors[j], 24, 8) * data[0x0 ^ 0x3]) >> 8;
E += (_SHIFTR(factors[j], 16, 8) * data[0x1 ^ 0x3]) >> 8;
F += (_SHIFTR(factors[j], 8, 8) * data[0x2 ^ 0x3]) >> 8;
*dst = J;
dst++;
*dst = std::min(F >> 1, 0xFFU);
@@ -476,9 +476,9 @@ const SWVertex * F5INDI_LoadVtx(u32 _w0, u32 _w1, std::vector<SWVertex> & _vres)
const u32 base_addr = *CAST_DMEM(const u32*, 0x154);
u32 * pres = reinterpret_cast<u32*>(_vres.data());
const u16* v0_data = CAST_DMEM(const u16*, 0x128);
const u16 X0 = v0_data[0 ^ 1];
const u16 Y0 = v0_data[1 ^ 1];
const u16 Z0 = v0_data[2 ^ 1];
const u16 X0 = v0_data[0x0 ^ 0x1];
const u16 Y0 = v0_data[0x1 ^ 0x1];
const u16 Z0 = v0_data[0x2 ^ 0x1];
for (u32 i = 0; i < count; ++i) {
const u32 rdram_addr = dmem_data[i ^ 1] * 6 + base_addr;
const u16* rdram_data = CAST_RDRAM(const u16*, (rdram_addr & 0x00FFFFF8));
@@ -499,17 +499,17 @@ const SWVertex * F5INDI_AdjustVtx(u32 _w0, u32 _w1, std::vector<SWVertex> & _vre
if (*CAST_DMEM(const u64*, 0x128) == 0)
return CAST_DMEM(const SWVertex*, dmem_addr);
const u16* v0_data = CAST_DMEM(const u16*, 0x128);
const u16 X0 = v0_data[0 ^ 1];
const u16 Y0 = v0_data[1 ^ 1];
const u16 Z0 = v0_data[2 ^ 1];
const u16 X0 = v0_data[0x0 ^ 0x1];
const u16 Y0 = v0_data[0x1 ^ 0x1];
const u16 Z0 = v0_data[0x2 ^ 0x1];
const u32 count = _SHIFTR(_w1, 24, 7);
_vres.resize(count);
u32 * pres = reinterpret_cast<u32*>(_vres.data());
const u16* dmem_data = CAST_DMEM(const u16*, dmem_addr);
for (u32 i = 0; i < count; ++i) {
const u16 X = dmem_data[0 ^ 1] + X0;
const u16 Y = dmem_data[1 ^ 1] + Y0;
const u16 Z = dmem_data[2 ^ 1] + Z0;
const u16 X = dmem_data[0x0 ^ 0x1] + X0;
const u16 Y = dmem_data[0x1 ^ 0x1] + Y0;
const u16 Z = dmem_data[0x2 ^ 0x1] + Z0;
*pres++ = (X << 16) | Y;
*pres++ = Z << 16;
dmem_data += 4;
@@ -624,15 +624,15 @@ void F5INDI_CalcST(const u32* params, u32 * _st)
for (u32 i = 0; i < num; ++i) {
const u32 idx = _SHIFTR(params[i + 4], 0, 8);
const s16 * coords = CAST_DMEM(const s16*, 0x170 + idx);
s16 X = coords[0 ^ 1];
s16 Y = coords[1 ^ 1];
s16 Z = coords[2 ^ 1];
s16 X = coords[0x0 ^ 0x1];
s16 Y = coords[0x1 ^ 0x1];
s16 Z = coords[0x2 ^ 0x1];
s32 X1 = X * mtx[0 + 4 * 0] + Y * mtx[0 + 4 * 1] + Z * mtx[0 + 4 * 2] + mtx[0 + 4 * 3];
s32 Y1 = X * mtx[1 + 4 * 0] + Y * mtx[1 + 4 * 1] + Z * mtx[1 + 4 * 2] + mtx[1 + 4 * 3];
s32 Z1 = X * mtx[2 + 4 * 0] + Y * mtx[2 + 4 * 1] + Z * mtx[2 + 4 * 2] + mtx[2 + 4 * 3];
X1 -= subs[0 ^ 1] << 16;
Y1 -= subs[1 ^ 1] << 16;
Z1 -= subs[2 ^ 1] << 16;
X1 -= subs[0x0 ^ 0x1] << 16;
Y1 -= subs[0x1 ^ 0x1] << 16;
Z1 -= subs[0x2 ^ 0x1] << 16;
u64 X2 = static_cast<s32>(X1);
u64 X2_2 = (X2 * X2) >> 16;
u64 Y2 = static_cast<s32>(Y1);
@@ -647,8 +647,8 @@ void F5INDI_CalcST(const u32* params, u32 * _st)
D = 0xFFFFFFFF / (D * 0x300);
u32 V = static_cast<u32>((D * X2) >> 16);
u32 W = static_cast<u32>((D * Y2) >> 16);
u32 S = (V * muls[0 ^ 1]) >> 16;
u32 T = (W * muls[1 ^ 1]) >> 16;
u32 S = (V * muls[0x0 ^ 0x1]) >> 16;
u32 T = (W * muls[0x1 ^ 0x1]) >> 16;
_st[i] = (S << 16) | T;
}
}
@@ -865,22 +865,22 @@ void F5INDI_GenParticlesVertices()
while (U != 0) {
SWVertex * vertex = CAST_DMEM(SWVertex*, vtxAddr);
u16* light = CAST_DMEM(u16*, lightAddr);
u16 F = (((light[0 ^ 1] << 12) + light[1 ^ 1] * corrector) << 4) >> 16;
u16 F = (((light[0x0 ^ 0x1] << 12) + light[0x1 ^ 0x1] * corrector) << 4) >> 16;
bool endCycle = false;
if ((M & 0x2000) == 0) {
// Step 2
s16 F1;
do {
F = (((light[0 ^ 1] << 12) + light[1 ^ 1] * corrector) << 4) >> 16;
F = (((light[0x0 ^ 0x1] << 12) + light[0x1 ^ 0x1] * corrector) << 4) >> 16;
F1 = F + 0xF000;
if (F1 < 0) {
light[0 ^ 1] = F;
light[0x0 ^ 0x1] = F;
if ((M & 0x40) != 0)
vertex->flag = (((F >> 4)&0xFC) << 8) | (vertex->flag & 0xFF);
if ((M & 0x20) != 0)
vertex->flag = ((F >> 4) & 0xFC) | (vertex->flag & 0xFF00);
} else {
light[0 ^ 1] = 0U;
light[0x0 ^ 0x1] = 0U;
if ((M & 0x4000) != 0) {
//const u32 dpc_clock = *REG.DPC_CLOCK;
const u32 dpc_clock = static_cast<u32>(time(NULL)) - dpc_clock0;
@@ -1461,7 +1461,7 @@ void F5Naboo_PrepareAndDrawTriangle(const u32 _vert[3], GraphicsDrawer & _drawer
const u16 A = _SHIFTR(*CAST_DMEM(const u32*, 0x100), 8, 16);
const u8 B = *(DMEM + (0x103 ^ 3));
const u32 C = A | B;
CAST_DMEM(u16*, 0x100)[0^1] = C;
CAST_DMEM(u16*, 0x100)[0x0^0x1] = C;
auto doCommands = [](u32 addr)
{
@@ -1567,11 +1567,11 @@ void F5Naboo_DrawPolygons()
vtxIdx[i] = (vtxAddr - 0x600) / 40;
SPVertex & vtx = drawer.getVertex(vtxIdx[i]);
u8* color = DMEM + 0x0B78 + idxs[i] * 2 + (data.HH & 0xFFF);
vtx.r = _FIXED2FLOATCOLOR(color[0 ^ 3], 8);
vtx.g = _FIXED2FLOATCOLOR(color[1 ^ 3], 8);
vtx.b = _FIXED2FLOATCOLOR(color[2 ^ 3], 8);
vtx.a = _FIXED2FLOATCOLOR(color[3 ^ 3], 8);
alphaSum += color[3 ^ 3];
vtx.r = _FIXED2FLOATCOLOR(color[0x0 ^ 0x3], 8);
vtx.g = _FIXED2FLOATCOLOR(color[0x1 ^ 0x3], 8);
vtx.b = _FIXED2FLOATCOLOR(color[0x2 ^ 0x3], 8);
vtx.a = _FIXED2FLOATCOLOR(color[0x3 ^ 0x3], 8);
alphaSum += color[0x3 ^ 0x3];
}
if (data.HH == 0) {
*CAST_DMEM(u32*, 0x100) = 0;
@@ -1594,7 +1594,7 @@ void F5Naboo_DrawPolygons()
for (u32 i = 0; i < 3; ++i) {
u32 offset = 0xB00 + idxs[i] * 2 + (data.HH & 0xFFF);
u8* color = DMEM + offset;
alphas[i] = color[3 ^ 3];
alphas[i] = color[0x3 ^ 0x3];
alphaSum2 += alphas[i];
}
if (alphaSum2 == 0) {
@@ -1875,9 +1875,9 @@ void F5Naboo_GenVertices0C()
// Step 10
const u16* v0_data = CAST_DMEM(const u16*, 0x128);
const u16 X0 = v0_data[0 ^ 1];
const u16 Y0 = v0_data[1 ^ 1];
const u16 Z0 = v0_data[2 ^ 1];
const u16 X0 = v0_data[0x0 ^ 0x1];
const u16 Y0 = v0_data[0x1 ^ 0x1];
const u16 Z0 = v0_data[0x2 ^ 0x1];
const bool needAdjustVertices = (X0 | Y0 | Z0) != 0;
auto processVertices = [&](u32 _param, u32 _dmemSrcAddr, u32 _dstOffset) {
@@ -1909,10 +1909,10 @@ void F5Naboo_GenVertices0C()
NabooData & data = getNabooData();
u8* params8 = RDRAM + RSP.PC[RSP.PCi];
u16* params16 = reinterpret_cast<u16*>(params8);
data.AA = params16[6 ^ 1];
data.BB = params16[7 ^ 1];
data.CC = params8[1 ^ 3];
data.TT = params8[5 ^ 3];
data.AA = params16[0x6 ^ 0x1];
data.BB = params16[0x7 ^ 0x1];
data.CC = params8[0x1 ^ 0x3];
data.TT = params8[0x5 ^ 0x3];
data.EE = dmemSrcAddr;
data.HH = _SHIFTR(*CAST_DMEM(const u32*, 0xDB8), 16, 16);
data.DD = 0;
@@ -2114,9 +2114,9 @@ void F5Naboo_GenVertices09()
// Step 9
const u16* v0_data = CAST_DMEM(const u16*, 0x128);
const u16 X0 = v0_data[0 ^ 1];
const u16 Y0 = v0_data[1 ^ 1];
const u16 Z0 = v0_data[2 ^ 1];
const u16 X0 = v0_data[0x0 ^ 0x1];
const u16 Y0 = v0_data[0x1 ^ 0x1];
const u16 Z0 = v0_data[0x2 ^ 0x1];
const bool needAdjustVertices = (X0 | Y0 | Z0) != 0;
auto processVertices = [&](u32 _param, u32 _dmemSrcAddr, u32 _dstOffset) {
@@ -2148,10 +2148,10 @@ void F5Naboo_GenVertices09()
NabooData & data = getNabooData();
u8* params8 = RDRAM + RSP.PC[RSP.PCi];
u16* params16 = reinterpret_cast<u16*>(params8);
data.AA = params16[6 ^ 1];
data.BB = params16[7 ^ 1];
data.CC = params8[1 ^ 3];
data.TT = params8[5 ^ 3];
data.AA = params16[0x6 ^ 0x1];
data.BB = params16[0x7 ^ 0x1];
data.CC = params8[0x1 ^ 0x3];
data.TT = params8[0x5 ^ 0x3];
data.EE = dmemSrcAddr;
data.HH = _SHIFTR(*CAST_DMEM(const u32*, 0xDB8), 16, 16);
data.DD = 0;
+10 -10
View File
@@ -99,23 +99,23 @@ void ZSort_DrawObject (u8 * _addr, u32 _type)
SPVertex * pVtx = drawer.getDMAVerticesData();
for (u32 i = 0; i < vnum; ++i) {
SPVertex & vtx = pVtx[i];
vtx.x = _FIXED2FLOAT(((s16*)_addr)[0 ^ 1], 2);
vtx.y = _FIXED2FLOAT(((s16*)_addr)[1 ^ 1], 2);
vtx.x = _FIXED2FLOAT(((s16*)_addr)[0x0 ^ 0x1], 2);
vtx.y = _FIXED2FLOAT(((s16*)_addr)[0x1 ^ 0x1], 2);
vtx.z = 0.0f;
vtx.r = _addr[4^3] * 0.0039215689f;
vtx.g = _addr[5^3] * 0.0039215689f;
vtx.b = _addr[6^3] * 0.0039215689f;
vtx.a = _addr[7^3] * 0.0039215689f;
vtx.r = _addr[0x4^0x3] * 0.0039215689f;
vtx.g = _addr[0x5^0x3] * 0.0039215689f;
vtx.b = _addr[0x6^0x3] * 0.0039215689f;
vtx.a = _addr[0x7^0x3] * 0.0039215689f;
vtx.flag = 0;
vtx.HWLight = 0;
vtx.clip = 0;
if (textured != 0) {
if (gDP.otherMode.texturePersp != 0) {
vtx.s = _FIXED2FLOAT(((s16*)_addr)[4 ^ 1], 5);
vtx.t = _FIXED2FLOAT(((s16*)_addr)[5 ^ 1], 5);
vtx.s = _FIXED2FLOAT(((s16*)_addr)[0x4 ^ 0x1], 5);
vtx.t = _FIXED2FLOAT(((s16*)_addr)[0x5 ^ 0x1], 5);
} else {
vtx.s = _FIXED2FLOAT(((s16*)_addr)[4 ^ 1], 6);
vtx.t = _FIXED2FLOAT(((s16*)_addr)[5 ^ 1], 6);
vtx.s = _FIXED2FLOAT(((s16*)_addr)[0x4 ^ 0x1], 6);
vtx.t = _FIXED2FLOAT(((s16*)_addr)[0x5 ^ 0x1], 6);
}
vtx.w = Calc_invw(((int*)_addr)[3]) / 31.0f;
} else
@@ -377,23 +377,23 @@ void ZSortBOSS_DrawObject(u8 * _addr, u32 _type)
for(u32 i = 0; i < vnum; ++i) {
SPVertex & vtx = pVtx[i];
vtx.x = _FIXED2FLOAT(((s16*)_addr)[0 ^ 1], 2);
vtx.y = _FIXED2FLOAT(((s16*)_addr)[1 ^ 1], 2);
vtx.x = _FIXED2FLOAT(((s16*)_addr)[0x0 ^ 0x1], 2);
vtx.y = _FIXED2FLOAT(((s16*)_addr)[0x1 ^ 0x1], 2);
vtx.z = 0.0f;
vtx.r = _FIXED2FLOATCOLOR(_addr[4^3], 8 );
vtx.g = _FIXED2FLOATCOLOR(_addr[5^3], 8 );
vtx.b = _FIXED2FLOATCOLOR(_addr[6^3], 8 );
vtx.a = _FIXED2FLOATCOLOR(_addr[7^3], 8 );
vtx.r = _FIXED2FLOATCOLOR(_addr[0x4^0x3], 8 );
vtx.g = _FIXED2FLOATCOLOR(_addr[0x5^0x3], 8 );
vtx.b = _FIXED2FLOATCOLOR(_addr[0x6^0x3], 8 );
vtx.a = _FIXED2FLOATCOLOR(_addr[0x7^0x3], 8 );
vtx.flag = 0;
vtx.HWLight = 0;
vtx.clip = 0;
if(textured != 0) {
if (gDP.otherMode.texturePersp != 0) {
vtx.s = _FIXED2FLOAT(((s16*)_addr)[4 ^ 1], 5);
vtx.t = _FIXED2FLOAT(((s16*)_addr)[5 ^ 1], 5);
vtx.s = _FIXED2FLOAT(((s16*)_addr)[0x4 ^ 0x1], 5);
vtx.t = _FIXED2FLOAT(((s16*)_addr)[0x5 ^ 0x1], 5);
} else {
vtx.s = _FIXED2FLOAT(((s16*)_addr)[4 ^ 1], 6);
vtx.t = _FIXED2FLOAT(((s16*)_addr)[5 ^ 1], 6);
vtx.s = _FIXED2FLOAT(((s16*)_addr)[0x4 ^ 0x1], 6);
vtx.t = _FIXED2FLOAT(((s16*)_addr)[0x5 ^ 0x1], 6);
}
int invw = ((int*)_addr)[3];
@@ -765,8 +765,8 @@ void ZSortBOSS_Audio4( u32 _w0, u32 _w1 )
dst[i^1] = (res1*c2 + res2*c2) >> 16;
}
v1 = dst[6^1];
v2 = dst[7^1];
v1 = dst[0x6^0x1];
v2 = dst[0x7^0x1];
dst += 8;
}
}