Cell: Fix off-by-one error in spu_dcache_fetch_unaligned

An off-by-one error caused an extra qword to be fetched under certain
alignment / size combinations.
This commit is contained in:
Ian Romanick 2008-02-20 14:45:08 -08:00
parent 7c74037852
commit 2d1f086c12
2 changed files with 6 additions and 6 deletions

View File

@ -22,6 +22,7 @@
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "cell/common.h"
#include "spu_main.h"
#include "spu_dcache.h"
@ -50,8 +51,8 @@ spu_dcache_fetch_unaligned(qword *dst, unsigned ea, unsigned size)
{
const int shift = ea & 0x0f;
const unsigned aligned_start_ea = ea & ~0x0f;
const unsigned aligned_end_ea = (ea + size) & ~0x0f;
const unsigned num_entries = ((aligned_end_ea - aligned_start_ea) / 16) + 1;
const unsigned aligned_end_ea = ROUNDUP16(ea + size);
const unsigned num_entries = (aligned_end_ea - aligned_start_ea) / 16;
unsigned i;

View File

@ -73,6 +73,7 @@
#include "spu_main.h"
#include "spu_vertex_shader.h"
#include "spu_dcache.h"
#include "cell/common.h"
#define TILE_TOP_LEFT 0
#define TILE_TOP_RIGHT 1
@ -1900,8 +1901,7 @@ spu_exec_machine_run( struct spu_exec_machine *mach )
for (i = 0; i < mach->NumDeclarations; i++) {
union {
struct tgsi_full_declaration decl;
qword buffer[2 * ((sizeof(struct tgsi_full_declaration) + 31)
/ 32)];
qword buffer[ROUNDUP16(sizeof(struct tgsi_full_declaration)) / 16];
} d ALIGN16_ATTRIB;
unsigned ea = (unsigned) (mach->Declarations + pc);
@ -1915,8 +1915,7 @@ spu_exec_machine_run( struct spu_exec_machine *mach )
while (pc != -1) {
union {
struct tgsi_full_instruction inst;
qword buffer[2 * ((sizeof(struct tgsi_full_instruction) + 31)
/ 32)];
qword buffer[ROUNDUP16(sizeof(struct tgsi_full_instruction)) / 16];
} i ALIGN16_ATTRIB;
unsigned ea = (unsigned) (mach->Instructions + pc);