aboutsummaryrefslogtreecommitdiff
path: root/test/aarch64
diff options
context:
space:
mode:
authorJacob Bramley <jacob.bramley@arm.com>2018-08-30 12:09:34 +0100
committerJacob Bramley <jacob.bramley@arm.com>2018-08-30 18:10:58 +0100
commit0f71a76d3846475b4ebd441a11bd3238479a2c61 (patch)
tree570ee01967a1e9f39a3c1113692f1b3a92704296 /test/aarch64
parent59aee848df95d80b37de8819a69defacb11be0e9 (diff)
downloadvixl-0f71a76d3846475b4ebd441a11bd3238479a2c61.tar.gz
Fix and re-enable test-examples.
These tests have been disabled for a long time, apparently by accident. This patch restores them, and applies fixes necessary to get them working. Notably: - Fix the simulated-runtime-calls example, and correct an ifdef to ensure that it builds. - Enable --trace-* options for test-examples, to match the behaviour of other tests. Change-Id: Iab0034f19ce935ba7237f8546f9c43f8cec13312
Diffstat (limited to 'test/aarch64')
-rw-r--r--test/aarch64/examples/test-examples.cc197
1 files changed, 103 insertions, 94 deletions
diff --git a/test/aarch64/examples/test-examples.cc b/test/aarch64/examples/test-examples.cc
index 1a867988..24ad3ba8 100644
--- a/test/aarch64/examples/test-examples.cc
+++ b/test/aarch64/examples/test-examples.cc
@@ -24,10 +24,11 @@
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include "../test-runner.h"
#include "custom-disassembler.h"
#include "examples.h"
#include "non-const-visitor.h"
+#include "test-runner.h"
+#include "test-utils.h"
#include "../test-utils-aarch64.h"
#include "aarch64/macro-assembler-aarch64.h"
@@ -44,8 +45,6 @@ TEST(custom_disassembler) { TestCustomDisassembler(); }
// The tests below only work with the simulator.
#ifdef VIXL_INCLUDE_SIMULATOR_AARCH64
-#define __ masm->
-
uint64_t FactorialC(uint64_t n) {
uint64_t result = 1;
@@ -98,91 +97,97 @@ uint32_t SumArrayC(uint8_t* array, uint32_t size) {
}
-void GenerateTestWrapper(MacroAssembler* masm, RegisterDump* regs) {
- __ Push(xzr, lr);
- __ Blr(x15);
- regs->Dump(masm);
- __ Pop(lr, xzr);
- __ Ret();
-}
-
+#define TEST_FUNCTION(Func) \
+ do { \
+ /* Record callee-saved registers, so we can check them after the test. */ \
+ int64_t saved_xregs[13]; \
+ saved_xregs[0] = simulator.ReadXRegister(19); \
+ saved_xregs[1] = simulator.ReadXRegister(20); \
+ saved_xregs[2] = simulator.ReadXRegister(21); \
+ saved_xregs[3] = simulator.ReadXRegister(22); \
+ saved_xregs[4] = simulator.ReadXRegister(23); \
+ saved_xregs[5] = simulator.ReadXRegister(24); \
+ saved_xregs[6] = simulator.ReadXRegister(25); \
+ saved_xregs[7] = simulator.ReadXRegister(26); \
+ saved_xregs[8] = simulator.ReadXRegister(27); \
+ saved_xregs[9] = simulator.ReadXRegister(28); \
+ saved_xregs[10] = simulator.ReadXRegister(29); \
+ saved_xregs[11] = simulator.ReadXRegister(30); \
+ saved_xregs[12] = simulator.ReadXRegister(31); \
+ \
+ uint64_t saved_dregs[8]; \
+ saved_dregs[0] = simulator.ReadDRegisterBits(8); \
+ saved_dregs[1] = simulator.ReadDRegisterBits(9); \
+ saved_dregs[2] = simulator.ReadDRegisterBits(10); \
+ saved_dregs[3] = simulator.ReadDRegisterBits(11); \
+ saved_dregs[4] = simulator.ReadDRegisterBits(12); \
+ saved_dregs[5] = simulator.ReadDRegisterBits(13); \
+ saved_dregs[6] = simulator.ReadDRegisterBits(14); \
+ saved_dregs[7] = simulator.ReadDRegisterBits(15); \
+ \
+ simulator.WriteXRegister(test_function_reg.GetCode(), \
+ masm.GetLabelAddress<uint64_t>(&Func)); \
+ simulator.RunFrom(masm.GetLabelAddress<Instruction*>(&test)); \
+ \
+ /* Check that callee-saved regsiters are preserved. */ \
+ VIXL_CHECK(saved_xregs[0] == simulator.ReadXRegister(19)); \
+ VIXL_CHECK(saved_xregs[1] == simulator.ReadXRegister(20)); \
+ VIXL_CHECK(saved_xregs[2] == simulator.ReadXRegister(21)); \
+ VIXL_CHECK(saved_xregs[3] == simulator.ReadXRegister(22)); \
+ VIXL_CHECK(saved_xregs[4] == simulator.ReadXRegister(23)); \
+ VIXL_CHECK(saved_xregs[5] == simulator.ReadXRegister(24)); \
+ VIXL_CHECK(saved_xregs[6] == simulator.ReadXRegister(25)); \
+ VIXL_CHECK(saved_xregs[7] == simulator.ReadXRegister(26)); \
+ VIXL_CHECK(saved_xregs[8] == simulator.ReadXRegister(27)); \
+ VIXL_CHECK(saved_xregs[9] == simulator.ReadXRegister(28)); \
+ VIXL_CHECK(saved_xregs[10] == simulator.ReadXRegister(29)); \
+ VIXL_CHECK(saved_xregs[11] == simulator.ReadXRegister(30)); \
+ VIXL_CHECK(saved_xregs[12] == simulator.ReadXRegister(31)); \
+ \
+ VIXL_CHECK(saved_dregs[0] == simulator.ReadDRegisterBits(8)); \
+ VIXL_CHECK(saved_dregs[1] == simulator.ReadDRegisterBits(9)); \
+ VIXL_CHECK(saved_dregs[2] == simulator.ReadDRegisterBits(10)); \
+ VIXL_CHECK(saved_dregs[3] == simulator.ReadDRegisterBits(11)); \
+ VIXL_CHECK(saved_dregs[4] == simulator.ReadDRegisterBits(12)); \
+ VIXL_CHECK(saved_dregs[5] == simulator.ReadDRegisterBits(13)); \
+ VIXL_CHECK(saved_dregs[6] == simulator.ReadDRegisterBits(14)); \
+ VIXL_CHECK(saved_dregs[7] == simulator.ReadDRegisterBits(15)); \
+ \
+ } while (0)
-#define TEST_FUNCTION(Func) \
- do { \
- int64_t saved_xregs[13]; \
- saved_xregs[0] = simulator.ReadXRegister(19); \
- saved_xregs[1] = simulator.ReadXRegister(20); \
- saved_xregs[2] = simulator.ReadXRegister(21); \
- saved_xregs[3] = simulator.ReadXRegister(22); \
- saved_xregs[4] = simulator.ReadXRegister(23); \
- saved_xregs[5] = simulator.ReadXRegister(24); \
- saved_xregs[6] = simulator.ReadXRegister(25); \
- saved_xregs[7] = simulator.ReadXRegister(26); \
- saved_xregs[8] = simulator.ReadXRegister(27); \
- saved_xregs[9] = simulator.ReadXRegister(28); \
- saved_xregs[10] = simulator.ReadXRegister(29); \
- saved_xregs[11] = simulator.ReadXRegister(30); \
- saved_xregs[12] = simulator.ReadXRegister(31); \
- \
- uint64_t saved_dregs[8]; \
- saved_dregs[0] = simulator.ReadDRegisterBits(8); \
- saved_dregs[1] = simulator.ReadDRegisterBits(9); \
- saved_dregs[2] = simulator.ReadDRegisterBits(10); \
- saved_dregs[3] = simulator.ReadDRegisterBits(11); \
- saved_dregs[4] = simulator.ReadDRegisterBits(12); \
- saved_dregs[5] = simulator.ReadDRegisterBits(13); \
- saved_dregs[6] = simulator.ReadDRegisterBits(14); \
- saved_dregs[7] = simulator.ReadDRegisterBits(15); \
- \
- simulator.WriteXRegister(15, masm.GetLabelAddress<uint64_t>(&Func)); \
- simulator.RunFrom(masm.GetLabelAddress<Instruction*>(&test)); \
- \
- VIXL_CHECK(saved_xregs[0] == simulator.ReadXRegister(19)); \
- VIXL_CHECK(saved_xregs[1] == simulator.ReadXRegister(20)); \
- VIXL_CHECK(saved_xregs[2] == simulator.ReadXRegister(21)); \
- VIXL_CHECK(saved_xregs[3] == simulator.ReadXRegister(22)); \
- VIXL_CHECK(saved_xregs[4] == simulator.ReadXRegister(23)); \
- VIXL_CHECK(saved_xregs[5] == simulator.ReadXRegister(24)); \
- VIXL_CHECK(saved_xregs[6] == simulator.ReadXRegister(25)); \
- VIXL_CHECK(saved_xregs[7] == simulator.ReadXRegister(26)); \
- VIXL_CHECK(saved_xregs[8] == simulator.ReadXRegister(27)); \
- VIXL_CHECK(saved_xregs[9] == simulator.ReadXRegister(28)); \
- VIXL_CHECK(saved_xregs[10] == simulator.ReadXRegister(29)); \
- VIXL_CHECK(saved_xregs[11] == simulator.ReadXRegister(30)); \
- VIXL_CHECK(saved_xregs[12] == simulator.ReadXRegister(31)); \
+#define START() \
+ MacroAssembler masm; \
+ Decoder decoder; \
+ Simulator simulator(&decoder); \
+ simulator.SetColouredTrace(Test::coloured_trace()); \
+ RegisterDump regs; \
\
- VIXL_CHECK(saved_dregs[0] == simulator.ReadDRegisterBits(8)); \
- VIXL_CHECK(saved_dregs[1] == simulator.ReadDRegisterBits(9)); \
- VIXL_CHECK(saved_dregs[2] == simulator.ReadDRegisterBits(10)); \
- VIXL_CHECK(saved_dregs[3] == simulator.ReadDRegisterBits(11)); \
- VIXL_CHECK(saved_dregs[4] == simulator.ReadDRegisterBits(12)); \
- VIXL_CHECK(saved_dregs[5] == simulator.ReadDRegisterBits(13)); \
- VIXL_CHECK(saved_dregs[6] == simulator.ReadDRegisterBits(14)); \
- VIXL_CHECK(saved_dregs[7] == simulator.ReadDRegisterBits(15)); \
+ Register test_function_reg = x15; \
\
- } while (0)
-
-#define START() \
- MacroAssembler masm; \
- Decoder decoder; \
- Simulator simulator(&decoder); \
- simulator.SetColouredTrace(Test::coloured_trace()); \
- PrintDisassembler* pdis = NULL; \
- Instrument* inst = NULL; \
- if (Test::trace_sim()) { \
- pdis = new PrintDisassembler(stdout); \
- decoder.PrependVisitor(pdis); \
- } \
- if (Test::instruction_stats()) { \
- inst = new Instrument("vixl_stats.csv", 10); \
- inst->Enable(); \
- decoder.AppendVisitor(inst); \
- } \
- RegisterDump regs; \
- \
- Label test; \
- masm.Bind(&test); \
- GenerateTestWrapper(&masm, &regs); \
+ Label test; \
+ masm.Bind(&test); \
+ { \
+ int trace_parameters = 0; \
+ if (Test::trace_reg()) trace_parameters |= LOG_STATE; \
+ if (Test::trace_write()) trace_parameters |= LOG_WRITE; \
+ if (Test::trace_sim()) trace_parameters |= LOG_DISASM; \
+ if (Test::trace_branch()) trace_parameters |= LOG_BRANCH; \
+ if (trace_parameters != 0) { \
+ masm.Trace(static_cast<TraceParameters>(trace_parameters), \
+ TRACE_ENABLE); \
+ } \
+ } \
+ if (Test::instruction_stats()) { \
+ masm.EnableInstrumentation(); \
+ } \
+ masm.Blr(test_function_reg); \
+ if (Test::instruction_stats()) { \
+ masm.DisableInstrumentation(); \
+ } \
+ masm.Trace(LOG_ALL, TRACE_DISABLE); \
+ regs.Dump(&masm); \
+ masm.Mov(lr, reinterpret_cast<uint64_t>(Simulator::kEndOfSimAddress)); \
+ masm.Ret(); \
masm.FinalizeCode()
@@ -588,17 +593,19 @@ TEST(literal_example) {
}
+#ifdef VIXL_HAS_SIMULATED_RUNTIME_CALL_SUPPORT
+
// This is an approximation of the result that works for the ranges tested
// below.
-#define RUNTIME_CALLS_EXPECTED(A, B) ((A + B) << 2)
-
-#define RUNTIME_CALLS_DOTEST(A, B, R) \
- do { \
- simulator.ResetState(); \
- simulator.WriteWRegister(0, A); \
- simulator.WriteWRegister(1, B); \
- TEST_FUNCTION(start); \
- VIXL_CHECK(regs.wreg<int32_t>(0) == RUNTIME_CALLS_EXPECTED(A, B)); \
+#define RUNTIME_CALLS_EXPECTED(A, B) ((A + B) * 4)
+
+#define RUNTIME_CALLS_DOTEST(A, B) \
+ do { \
+ simulator.ResetState(); \
+ simulator.WriteWRegister(0, A); \
+ simulator.WriteWRegister(1, B); \
+ TEST_FUNCTION(start); \
+ VIXL_CHECK(regs.wreg(0) == RUNTIME_CALLS_EXPECTED(A, B)); \
} while (0)
TEST(runtime_calls) {
@@ -614,4 +621,6 @@ TEST(runtime_calls) {
RUNTIME_CALLS_DOTEST(123, 456);
}
+#endif // VIXL_HAS_SIMULATED_RUNTIME_CALL_SUPPORT
+
#endif // VIXL_INCLUDE_SIMULATOR_AARCH64