#include "ArmEmitterTest.h"
#include "Common/ArmEmitter.h"
#include "Common/CPUDetect.h"
static bool functionWasCalled;
using namespace ArmGen;
class TestCode : public ArmGen::ARMXCodeBlock {
public:
TestCode();
void Generate();
const u8 *testCodePtr;
const u8 *testCodePtr2;
};
TestCode::TestCode()
{
AllocCodeSpace(0x10000);
}
static float abc[256] = {1.0f, 2.0f, 0.0f};
static float a[4] = {1.0f, 2.0f, 3.0f, 4.5f};
static float b[4] = {1.0f, 1.0f, 1.0f, 0.5f};
static float c[4] = {0.0f, 0.0f, 0.0f, 0.0f};
static u32 x[4] = {0x04030201, 0x08070605, 0x0, 0x0};
static u32 y[4] = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
static u32 z[4] = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
void TestCode::Generate()
{
testCodePtr = this->GetCodePtr();
PUSH(2, R11, R_LR);
MOVP2R(R0, x);
MOVP2R(R1, y);
MOVP2R(R2, z);
MOVP2R(R3, c);
VLD1(I_32, D0, R0, 1);
VMOVL(I_8 | I_UNSIGNED, Q1, D0);
VMOVL(I_16 | I_UNSIGNED, Q2, D2);
VCVT(F_32 | I_SIGNED, Q3, Q2);
VST1(I_32, D2, R1, 2);
VST1(I_32, D4, R2, 2);
VST1(I_32, D6, R3, 2);
PLD(R1, 32);
u32 word = *(u32 *)(GetCodePtr() - 4);
INFO_LOG(Log::System, "Instruction Word: %08x", word);
POP(2, R11, R_PC);
FlushLitPool();
FlushIcache();
}
u32 CallPtr(const void *ptr)
{
return ((u32(*)())ptr)();
}
extern void DisassembleArm(const u8 *data, int size);
void ArmEmitterTest()
{
return;
if (!cpu_info.bNEON)
return;
for (int i = 0; i < 6; i++) {
INFO_LOG(Log::System, "--------------------------");
}
INFO_LOG(Log::System, "--------------------------");
INFO_LOG(Log::System, "Running ARM emitter test!");
INFO_LOG(Log::System, "--------------------------");
TestCode gen;
gen.ReserveCodeSpace(0x1000);
const u8 *codeStart = gen.GetCodePtr();
gen.Generate();
u32 retval = CallPtr(gen.testCodePtr);
INFO_LOG(Log::System, "x: %08x %08x %08x %08x", x[0], x[1], x[2], x[3]);
INFO_LOG(Log::System, "y: %08x %08x %08x %08x", y[0], y[1], y[2], y[3]);
INFO_LOG(Log::System, "z: %08x %08x %08x %08x", z[0], z[1], z[2], z[3]);
INFO_LOG(Log::System, "c: %f %f %f %f", c[0], c[1], c[2], c[3]);
for (int i = 0; i < 6; i++) {
INFO_LOG(Log::System, "--------------------------");
}
}