mirror of
https://github.com/kanjitalk755/macemu.git
synced 2024-09-03 21:29:03 +00:00
fix overflows for lve[bhw]x input values and vector values on 64-bit hosts
This commit is contained in:
parent
8372abd132
commit
6416914c15
@ -18,6 +18,8 @@
|
|||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// NOTE: Results file md5sum: 3e29432abb6e21e625a2eef8cf2f0840 ($Revision$)
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -512,9 +514,11 @@ class aligned_vector_t {
|
|||||||
} vs;
|
} vs;
|
||||||
public:
|
public:
|
||||||
aligned_vector_t()
|
aligned_vector_t()
|
||||||
|
{ clear(); }
|
||||||
|
void clear()
|
||||||
{ memset(addr(), 0, sizeof(vector_t)); }
|
{ memset(addr(), 0, sizeof(vector_t)); }
|
||||||
aligned_vector_t(vector_t const & vi)
|
void copy(vector_t const & vi, int n = sizeof(vector_t))
|
||||||
{ memcpy(addr(), &vi, sizeof(vector_t)); }
|
{ clear(); memcpy(addr(), &vi, n); }
|
||||||
vector_t *addr() const
|
vector_t *addr() const
|
||||||
{ return (vector_t *)(((char *)&vs.v) + (16 - (((uintptr)&vs.v) % 16))); }
|
{ return (vector_t *)(((char *)&vs.v) + (16 - (((uintptr)&vs.v) % 16))); }
|
||||||
vector_t const & value() const
|
vector_t const & value() const
|
||||||
@ -1603,6 +1607,7 @@ void powerpc_test_cpu::test_one_vector(uint32 *code, vector_test_t const & vt, u
|
|||||||
static vector_helper_t native_vSCR;
|
static vector_helper_t native_vSCR;
|
||||||
memset(&native_vSCR, 0, sizeof(native_vSCR));
|
memset(&native_vSCR, 0, sizeof(native_vSCR));
|
||||||
static aligned_vector_t dummy_vector;
|
static aligned_vector_t dummy_vector;
|
||||||
|
dummy_vector.clear();
|
||||||
if (!rAp) rAp = (uint8 *)dummy_vector.addr();
|
if (!rAp) rAp = (uint8 *)dummy_vector.addr();
|
||||||
if (!rBp) rBp = (uint8 *)dummy_vector.addr();
|
if (!rBp) rBp = (uint8 *)dummy_vector.addr();
|
||||||
if (!rCp) rCp = (uint8 *)dummy_vector.addr();
|
if (!rCp) rCp = (uint8 *)dummy_vector.addr();
|
||||||
@ -1633,9 +1638,9 @@ void powerpc_test_cpu::test_one_vector(uint32 *code, vector_test_t const & vt, u
|
|||||||
|
|
||||||
// Invoke emulated code
|
// Invoke emulated code
|
||||||
static aligned_vector_t emul_vD;
|
static aligned_vector_t emul_vD;
|
||||||
memset(emul_vD.addr(), 0, sizeof(vector_t));
|
emul_vD.clear();
|
||||||
static aligned_vector_t emul_vSCR;
|
static aligned_vector_t emul_vSCR;
|
||||||
memset(emul_vSCR.addr(), 0, sizeof(vector_t));
|
emul_vSCR.clear();
|
||||||
emul_set_cr(init_cr);
|
emul_set_cr(init_cr);
|
||||||
set_gpr(RD, (uintptr)emul_vD.addr());
|
set_gpr(RD, (uintptr)emul_vD.addr());
|
||||||
set_gpr(RA, (uintptr)rAp);
|
set_gpr(RA, (uintptr)rAp);
|
||||||
@ -1799,19 +1804,25 @@ void powerpc_test_cpu::test_vector_load(void)
|
|||||||
printf("Testing %s\n", vt.name);
|
printf("Testing %s\n", vt.name);
|
||||||
const int n_vector_values = sizeof(vector_values)/sizeof(vector_values[0]);
|
const int n_vector_values = sizeof(vector_values)/sizeof(vector_values[0]);
|
||||||
for (int j = 0; j < n_vector_values; j++) {
|
for (int j = 0; j < n_vector_values; j++) {
|
||||||
aligned_vector_t av(vector_values[j].v);
|
static aligned_vector_t av;
|
||||||
switch (vt.type) {
|
switch (vt.type) {
|
||||||
case 'b':
|
case 'b':
|
||||||
for (int k = 0; k < 16; k++)
|
for (int k = 0; k < 16; k++) {
|
||||||
test_one_vector(code, vt, ((uint8 *)av.addr()) + 1 * k);
|
av.copy(*(vector_t *)((uint8 *)(&vector_values[j].v) + 1 * k), 16 - 1 * k);
|
||||||
|
test_one_vector(code, vt, av.addr());
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
for (int k = 0; k < 8; k++)
|
for (int k = 0; k < 8; k++) {
|
||||||
test_one_vector(code, vt, ((uint8 *)av.addr()) + 2 * k);
|
av.copy(*(vector_t *)((uint8 *)(&vector_values[j].v) + 2 * k), 16 - 2 * k);
|
||||||
|
test_one_vector(code, vt, av.addr());
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'w':
|
case 'w':
|
||||||
for (int k = 0; k < 4; k++)
|
for (int k = 0; k < 4; k++) {
|
||||||
test_one_vector(code, vt, ((uint8 *)av.addr()) + 4 * k);
|
av.copy(*(vector_t *)((uint8 *)(&vector_values[j].v) + 4 * k), 16 - 4 * k);
|
||||||
|
test_one_vector(code, vt, av.addr());
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2033,13 +2044,14 @@ void powerpc_test_cpu::test_vector_arith(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
printf("Testing %s\n", vt.name);
|
printf("Testing %s\n", vt.name);
|
||||||
|
static aligned_vector_t avi, avj, avk;
|
||||||
if (vt.operands[1] == vA && vt.operands[2] == vB && vt.operands[3] == vC) {
|
if (vt.operands[1] == vA && vt.operands[2] == vB && vt.operands[3] == vC) {
|
||||||
for (int i = 0; i < n_vector_values; i++) {
|
for (int i = 0; i < n_vector_values; i++) {
|
||||||
aligned_vector_t avi(vvp[i].v);
|
avi.copy(vvp[i].v);
|
||||||
for (int j = 0; j < n_vector_values; j++) {
|
for (int j = 0; j < n_vector_values; j++) {
|
||||||
aligned_vector_t avj(vvp[j].v);
|
avj.copy(vvp[j].v);
|
||||||
for (int k = 0; k < n_vector_values; k++) {
|
for (int k = 0; k < n_vector_values; k++) {
|
||||||
aligned_vector_t avk(vvp[k].v);
|
avk.copy(vvp[k].v);
|
||||||
test_one_vector(code, vt, avi.addr(), avj.addr(), avk.addr());
|
test_one_vector(code, vt, avi.addr(), avj.addr(), avk.addr());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2050,9 +2062,9 @@ void powerpc_test_cpu::test_vector_arith(void)
|
|||||||
vSH_field::insert(vt.opcode, i);
|
vSH_field::insert(vt.opcode, i);
|
||||||
code[i_opcode] = vt.opcode;
|
code[i_opcode] = vt.opcode;
|
||||||
flush_icache_range(code, sizeof(code));
|
flush_icache_range(code, sizeof(code));
|
||||||
aligned_vector_t avi(vvp[i].v);
|
avi.copy(vvp[i].v);
|
||||||
for (int j = 0; j < n_vector_values; j++) {
|
for (int j = 0; j < n_vector_values; j++) {
|
||||||
aligned_vector_t avj(vvp[j].v);
|
avj.copy(vvp[j].v);
|
||||||
for (int k = 0; k < n_vector_values; k++)
|
for (int k = 0; k < n_vector_values; k++)
|
||||||
test_one_vector(code, vt, avi.addr(), avj.addr());
|
test_one_vector(code, vt, avi.addr(), avj.addr());
|
||||||
}
|
}
|
||||||
@ -2060,13 +2072,13 @@ void powerpc_test_cpu::test_vector_arith(void)
|
|||||||
}
|
}
|
||||||
else if (vt.operands[1] == vA && vt.operands[2] == vB) {
|
else if (vt.operands[1] == vA && vt.operands[2] == vB) {
|
||||||
for (int i = 0; i < n_vector_values; i++) {
|
for (int i = 0; i < n_vector_values; i++) {
|
||||||
aligned_vector_t avi(vvp[i].v);
|
avi.copy(vvp[i].v);
|
||||||
for (int j = 0; j < n_vector_values; j++) {
|
for (int j = 0; j < n_vector_values; j++) {
|
||||||
if (op_type == 'B') {
|
if (op_type == 'B') {
|
||||||
if (!vector_all_eq('b', vvp[j].v))
|
if (!vector_all_eq('b', vvp[j].v))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
aligned_vector_t avj(vvp[j].v);
|
avj.copy(vvp[j].v);
|
||||||
test_one_vector(code, vt, avi.addr(), avj.addr());
|
test_one_vector(code, vt, avi.addr(), avj.addr());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2077,7 +2089,7 @@ void powerpc_test_cpu::test_vector_arith(void)
|
|||||||
code[i_opcode] = vt.opcode;
|
code[i_opcode] = vt.opcode;
|
||||||
flush_icache_range(code, sizeof(code));
|
flush_icache_range(code, sizeof(code));
|
||||||
for (int j = 0; j < n_vector_values; j++) {
|
for (int j = 0; j < n_vector_values; j++) {
|
||||||
aligned_vector_t avj(vvp[j].v);
|
avj.copy(vvp[j].v);
|
||||||
test_one_vector(code, vt, NULL, avj.addr());
|
test_one_vector(code, vt, NULL, avj.addr());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2092,7 +2104,7 @@ void powerpc_test_cpu::test_vector_arith(void)
|
|||||||
}
|
}
|
||||||
else if (vt.operands[1] == __ && vt.operands[2] == vB) {
|
else if (vt.operands[1] == __ && vt.operands[2] == vB) {
|
||||||
for (int i = 0; i < n_vector_values; i++) {
|
for (int i = 0; i < n_vector_values; i++) {
|
||||||
aligned_vector_t avi(vvp[i].v);
|
avi.copy(vvp[i].v);
|
||||||
test_one_vector(code, vt, NULL, avi.addr());
|
test_one_vector(code, vt, NULL, avi.addr());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user