void FPURegCache::SimpleRegsV(const u8 *v, MatrixSize msz, int flags) { const int n = GetMatrixSide(msz); // TODO: Could be more optimal (in case of Discard or etc.) for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { SimpleRegV(v[j * 4 + i], flags); } } }
void TestGetMatrix(int matrix, MatrixSize sz) { ILOG("Testing matrix %s", GetMatrixNotation(matrix, sz)); u8 fullMatrix[16]; u8 cols[4]; u8 rows[4]; GetMatrixColumns(matrix, sz, cols); GetMatrixRows(matrix, sz, rows); GetMatrixRegs(fullMatrix, sz, matrix); int n = GetMatrixSide(sz); VectorSize vsz = GetVectorSize(sz); for (int i = 0; i < n; i++) { // int colName = GetColumnName(matrix, sz, i, 0); // int rowName = GetRowName(matrix, sz, i, 0); int colName = cols[i]; int rowName = rows[i]; ILOG("Column %i: %s", i, GetVectorNotation(colName, vsz)); ILOG("Row %i: %s", i, GetVectorNotation(rowName, vsz)); u8 colRegs[4]; u8 rowRegs[4]; GetVectorRegs(colRegs, vsz, colName); GetVectorRegs(rowRegs, vsz, rowName); // Check that the individual regs are the expected ones. std::stringstream a, b, c, d; for (int j = 0; j < n; j++) { a.clear(); b.clear(); a << (int)fullMatrix[i * 4 + j] << " "; b << (int)colRegs[j] << " "; c.clear(); d.clear(); c << (int)fullMatrix[j * 4 + i] << " "; d << (int)rowRegs[j] << " "; } ILOG("Col: %s vs %s", a.str().c_str(), b.str().c_str()); if (a.str() != b.str()) ILOG("WRONG!"); ILOG("Row: %s vs %s", c.str().c_str(), d.str().c_str()); if (c.str() != d.str()) ILOG("WRONG!"); } }
bool TestMatrixTranspose() { MatrixSize sz = M_4x4; int matrix = 0; // M000 u8 cols[4]; u8 rows[4]; GetMatrixColumns(matrix, sz, cols); GetMatrixRows(matrix, sz, rows); int transposed = Xpose(matrix); u8 x_cols[4]; u8 x_rows[4]; GetMatrixColumns(transposed, sz, x_cols); GetMatrixRows(transposed, sz, x_rows); for (int i = 0; i < GetMatrixSide(sz); i++) { EXPECT_EQ_INT(cols[i], x_rows[i]); EXPECT_EQ_INT(x_cols[i], rows[i]); } return true; }