mirror of
https://github.com/hrydgard/ppsspp.git
synced 2024-10-07 19:03:29 +00:00
Add "Arm64EmitterTest" which can run on startup to play around with instructions.
This commit is contained in:
parent
6cb107d6fc
commit
db0fd1042f
@ -60,8 +60,8 @@ static const ARM64Reg neonScratchRegQ = Q1;
|
||||
// S8-S15 are used during matrix generation
|
||||
|
||||
// These only live through the matrix multiplication
|
||||
static const ARM64Reg src[3] = { S8, S9, S10 }; // skin source
|
||||
static const ARM64Reg acc[3] = { S11, S12, S13 }; // skin accumulator
|
||||
static const ARM64Reg src[3] = { S16, S17, S18 }; // skin source
|
||||
static const ARM64Reg acc[3] = { S19, S20, S21 }; // skin accumulator
|
||||
|
||||
static const ARM64Reg srcNEON = Q2;
|
||||
static const ARM64Reg accNEON = Q3;
|
||||
@ -139,9 +139,14 @@ static const JitLookup jitLookup[] = {
|
||||
|
||||
JittedVertexDecoder VertexDecoderJitCache::Compile(const VertexDecoder &dec) {
|
||||
dec_ = &dec;
|
||||
|
||||
const u32 ALL_CALLEE_SAVED = 0x7FF80000;
|
||||
BitSet32 regs_to_save(ALL_CALLEE_SAVED);
|
||||
|
||||
const u8 *start = AlignCode16();
|
||||
|
||||
WARN_LOG(HLE, "VertexDecoderJitCache::Compile");
|
||||
ABI_PushRegisters(regs_to_save);
|
||||
// TODO: Also push D8-D15, the fp registers we need to save.
|
||||
|
||||
bool prescaleStep = false;
|
||||
bool skinning = false;
|
||||
@ -195,7 +200,8 @@ JittedVertexDecoder VertexDecoderJitCache::Compile(const VertexDecoder &dec) {
|
||||
SetJumpTarget(skip);
|
||||
}
|
||||
|
||||
// POP(6, R4, R5, R6, R7, R8, R_PC);
|
||||
ABI_PopRegisters(regs_to_save);
|
||||
|
||||
RET();
|
||||
|
||||
FlushIcache();
|
||||
|
@ -105,6 +105,8 @@ static UI::Theme ui_theme;
|
||||
|
||||
#ifdef ARM
|
||||
#include "../../android/jni/ArmEmitterTest.h"
|
||||
#elif defined(ARM64)
|
||||
#include "../../android/jni/Arm64EmitterTest.h"
|
||||
#endif
|
||||
|
||||
#ifdef IOS
|
||||
@ -256,6 +258,8 @@ void NativeGetAppInfo(std::string *app_dir_name, std::string *app_nice_name, boo
|
||||
|
||||
#if defined(ARM) && defined(ANDROID)
|
||||
ArmEmitterTest();
|
||||
#elif defined(ARM64) && defined(ANDROID)
|
||||
Arm64EmitterTest();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -283,6 +283,12 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\android\jni\Arm64EmitterTest.cpp">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\android\jni\TestRunner.cpp" />
|
||||
<ClCompile Include="..\native\ext\glew\glew.c">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
|
||||
@ -349,7 +355,8 @@
|
||||
<ClCompile Include="XinputDevice.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\android\jni\ARMEmitterTest.h" />
|
||||
<ClInclude Include="..\android\jni\ArmEmitterTest.h" />
|
||||
<ClInclude Include="..\android\jni\Arm64EmitterTest.h" />
|
||||
<ClInclude Include="..\android\jni\TestRunner.h" />
|
||||
<ClInclude Include="..\ios\ViewController.h" />
|
||||
<ClInclude Include="ControlMapping.h" />
|
||||
|
@ -98,6 +98,9 @@
|
||||
<ClCompile Include="..\android\jni\ArmEmitterTest.cpp">
|
||||
<Filter>Other Platforms</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\android\jni\Arm64EmitterTest.cpp">
|
||||
<Filter>Other Platforms</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\android\jni\TestRunner.cpp">
|
||||
<Filter>Other Platforms</Filter>
|
||||
</ClCompile>
|
||||
@ -218,7 +221,10 @@
|
||||
<Filter>Windows\Input</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="stdafx.h" />
|
||||
<ClInclude Include="..\android\jni\ARMEmitterTest.h">
|
||||
<ClInclude Include="..\android\jni\ArmEmitterTest.h">
|
||||
<Filter>Other Platforms</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\android\jni\Arm64EmitterTest.h">
|
||||
<Filter>Other Platforms</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\android\jni\TestRunner.h">
|
||||
|
@ -92,7 +92,8 @@ ARCH_FILES := \
|
||||
$(SRC)/Core/MIPS/ARM64/Arm64RegCache.cpp \
|
||||
$(SRC)/Core/MIPS/ARM64/Arm64RegCacheFPU.cpp \
|
||||
$(SRC)/Core/Util/DisArm64.cpp \
|
||||
$(SRC)/GPU/Common/VertexDecoderArm64.cpp
|
||||
$(SRC)/GPU/Common/VertexDecoderArm64.cpp \
|
||||
Arm64EmitterTest.cpp
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_ARCH_ABI),armeabi)
|
||||
|
@ -2,6 +2,6 @@ APP_STL := gnustl_static
|
||||
APP_PLATFORM := android-9
|
||||
#APP_ABI := armeabi-v7a x86
|
||||
#APP_ABI := armeabi-v7a
|
||||
APP_ABI := arm64-v8a
|
||||
APP_ABI := arm64-v8a armeabi-v7a
|
||||
APP_GNUSTL_CPP_FEATURES :=
|
||||
# NDK_TOOLCHAIN_VERSION := 4.9
|
||||
|
88
android/jni/Arm64EmitterTest.cpp
Normal file
88
android/jni/Arm64EmitterTest.cpp
Normal file
@ -0,0 +1,88 @@
|
||||
#include "base/logging.h"
|
||||
#include "Arm64EmitterTest.h"
|
||||
|
||||
#include "Common/Arm64Emitter.h"
|
||||
#include "Common/BitSet.h"
|
||||
#include "Common/CPUDetect.h"
|
||||
|
||||
static bool functionWasCalled;
|
||||
|
||||
using namespace Arm64Gen;
|
||||
|
||||
class TestCode : public Arm64Gen::ARM64CodeBlock {
|
||||
public:
|
||||
TestCode();
|
||||
void Generate();
|
||||
const u8 *testCodePtr;
|
||||
const u8 *testCodePtr2;
|
||||
ARM64FloatEmitter fp;
|
||||
};
|
||||
|
||||
TestCode::TestCode() : fp(this)
|
||||
{
|
||||
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();
|
||||
|
||||
const u32 ALL_CALLEE_SAVED = 0x7FF80000;
|
||||
BitSet32 regs_to_save(ALL_CALLEE_SAVED);
|
||||
|
||||
const u8 *start = AlignCode16();
|
||||
|
||||
ABI_PushRegisters(regs_to_save);
|
||||
|
||||
fp.SCVTF(S0, W3, 12);
|
||||
fp.SCVTF(S3, W12);
|
||||
MOVI2R(X0, 1337);
|
||||
|
||||
ABI_PopRegisters(regs_to_save);
|
||||
|
||||
RET();
|
||||
|
||||
FlushIcache();
|
||||
}
|
||||
|
||||
static u32 CallPtr(const void *ptr) {
|
||||
return ((u32(*)())ptr)();
|
||||
}
|
||||
|
||||
void Arm64EmitterTest() {
|
||||
|
||||
for (int i = 0; i < 6; i++) {
|
||||
ILOG("---------------------------");
|
||||
}
|
||||
ILOG("---------------------------");
|
||||
ILOG("Running ARM64 emitter test!");
|
||||
ILOG("---------------------------");
|
||||
|
||||
TestCode gen;
|
||||
gen.ReserveCodeSpace(0x1000);
|
||||
const u8 *codeStart = gen.GetCodePtr();
|
||||
gen.Generate();
|
||||
|
||||
u32 retval = CallPtr(gen.testCodePtr);
|
||||
ILOG("Returned %d", retval);
|
||||
// ILOG("ARM emitter test 1 passed if %f == 3.0! retval = %08x", abc[32 + 31], retval);
|
||||
/*
|
||||
ILOG("x: %08x %08x %08x %08x", x[0], x[1], x[2], x[3]);
|
||||
ILOG("y: %08x %08x %08x %08x", y[0], y[1], y[2], y[3]);
|
||||
ILOG("z: %08x %08x %08x %08x", z[0], z[1], z[2], z[3]);
|
||||
ILOG("c: %f %f %f %f", c[0], c[1], c[2], c[3]);*/
|
||||
for (int i = 0; i < 6; i++) {
|
||||
ILOG("--------------------------");
|
||||
}
|
||||
// DisassembleArm(codeStart, gen.GetCodePtr()-codeStart);
|
||||
}
|
5
android/jni/Arm64EmitterTest.h
Normal file
5
android/jni/Arm64EmitterTest.h
Normal file
@ -0,0 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
// Just a test of the ARM64 emitter, playing around with running some code without having the whole emu around.
|
||||
|
||||
void Arm64EmitterTest();
|
Loading…
Reference in New Issue
Block a user