[vm/test] Support loading from pool in 32 bit assembler tests

TEST=vm/cc/LoadWordFromBoxOrSmi

Closes: https://github.com/dart-lang/sdk/issues/53622
Change-Id: If882878851b5a29e1ed334db0d544120db8a4534
Cq-Include-Trybots: luci.dart.try:vm-linux-release-simarm64-try,vm-linux-release-simarm-try,vm-aot-linux-release-simarm_x64-try,vm-aot-linux-release-simarm64-try,vm-aot-linux-debug-simarm_x64-try,vm-linux-debug-simriscv64-try,vm-aot-linux-debug-simriscv64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/328240
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
This commit is contained in:
Daco Harkes 2023-09-27 18:18:47 +00:00 committed by Commit Queue
parent 2d0bebfb22
commit 29aae7608c
3 changed files with 55 additions and 13 deletions

View file

@ -3921,6 +3921,17 @@ ASSEMBLER_TEST_RUN(RangeCheckWithTempReturnValue, test) {
EXPECT_EQ(kMintCid, result);
}
static void EnterTestFrame(Assembler* assembler) {
__ EnterFrame(1 << THR | 1 << PP | 1 << CODE_REG, 0);
__ MoveRegister(CODE_REG, R0);
__ MoveRegister(THR, R1);
__ LoadPoolPointer(PP);
}
static void LeaveTestFrame(Assembler* assembler) {
__ LeaveFrame(1 << THR | 1 << PP | 1 << CODE_REG);
}
#define LOAD_FROM_BOX_TEST(VALUE, SAME_REGISTER) \
ASSEMBLER_TEST_GENERATE(LoadWordFromBoxOrSmi##VALUE##SAME_REGISTER, \
assembler) { \
@ -3930,25 +3941,32 @@ ASSEMBLER_TEST_RUN(RangeCheckWithTempReturnValue, test) {
same_register ? src : CallingConventions::ArgumentRegisters[1]; \
const intptr_t value = VALUE; \
\
EnterTestFrame(assembler); \
\
__ LoadObject(src, Integer::ZoneHandle(Integer::New(value, Heap::kOld))); \
__ LoadWordFromBoxOrSmi(dst, src); \
__ MoveRegister(CallingConventions::kReturnReg, dst); \
\
LeaveTestFrame(assembler); \
\
__ Ret(); \
} \
\
ASSEMBLER_TEST_RUN(LoadWordFromBoxOrSmi##VALUE##SAME_REGISTER, test) { \
const intptr_t res = test->Invoke<intptr_t, intptr_t>(0x0); \
EXPECT_EQ(static_cast<intptr_t>(VALUE), res); \
const int64_t res = test->InvokeWithCodeAndThread<int64_t>(); \
EXPECT_EQ(static_cast<intptr_t>(VALUE), static_cast<intptr_t>(res)); \
}
LOAD_FROM_BOX_TEST(0, true)
LOAD_FROM_BOX_TEST(0, false)
LOAD_FROM_BOX_TEST(1, true)
LOAD_FROM_BOX_TEST(1, false)
LOAD_FROM_BOX_TEST(0x7FFFFFFF, true)
LOAD_FROM_BOX_TEST(0x7FFFFFFF, false)
LOAD_FROM_BOX_TEST(0x80000000, true)
LOAD_FROM_BOX_TEST(0x80000000, false)
LOAD_FROM_BOX_TEST(0xFFFFFFFF, true)
LOAD_FROM_BOX_TEST(0xFFFFFFFF, false)
// TODO(https://dartbug.com/53622): Add tests with Mints.
} // namespace compiler
} // namespace dart

View file

@ -7711,6 +7711,24 @@ ASSEMBLER_TEST_RUN(RangeCheckWithTempReturnValue, test) {
EXPECT_EQ(kMintCid, result);
}
static void EnterTestFrame(Assembler* assembler) {
__ EnterFrame(0);
__ PushRegister(CODE_REG);
__ PushRegister(THR);
__ PushRegister(PP);
__ MoveRegister(CODE_REG, A0);
__ MoveRegister(THR, A1);
__ LoadPoolPointer(PP);
}
static void LeaveTestFrame(Assembler* assembler) {
__ PopRegister(PP);
__ PopRegister(THR);
__ PopRegister(CODE_REG);
__ LeaveFrame();
}
#define LOAD_FROM_BOX_TEST(VALUE, SAME_REGISTER) \
ASSEMBLER_TEST_GENERATE(LoadWordFromBoxOrSmi##VALUE##SAME_REGISTER, \
assembler) { \
@ -7720,16 +7738,20 @@ ASSEMBLER_TEST_RUN(RangeCheckWithTempReturnValue, test) {
same_register ? src : CallingConventions::ArgumentRegisters[1]; \
const intptr_t value = VALUE; \
\
EnterTestFrame(assembler); \
\
__ LoadObject(src, Integer::ZoneHandle(Integer::New(value, Heap::kOld))); \
__ LoadWordFromBoxOrSmi(dst, src); \
__ MoveRegister(CallingConventions::kReturnReg, dst); \
\
LeaveTestFrame(assembler); \
\
__ Ret(); \
} \
\
ASSEMBLER_TEST_RUN(LoadWordFromBoxOrSmi##VALUE##SAME_REGISTER, test) { \
const intptr_t res = test->Invoke<intptr_t, intptr_t>(0x0); \
EXPECT_EQ(static_cast<intptr_t>(VALUE), res); \
const int64_t res = test->InvokeWithCodeAndThread<int64_t>(); \
EXPECT_EQ(static_cast<intptr_t>(VALUE), static_cast<intptr_t>(res)); \
}
LOAD_FROM_BOX_TEST(0, true)
@ -7737,13 +7759,20 @@ LOAD_FROM_BOX_TEST(0, false)
LOAD_FROM_BOX_TEST(1, true)
LOAD_FROM_BOX_TEST(1, false)
#if defined(TARGET_ARCH_RISCV32)
LOAD_FROM_BOX_TEST(0x7FFFFFFF, true)
LOAD_FROM_BOX_TEST(0x7FFFFFFF, false)
LOAD_FROM_BOX_TEST(0x80000000, true)
LOAD_FROM_BOX_TEST(0x80000000, false)
LOAD_FROM_BOX_TEST(0xFFFFFFFF, true)
LOAD_FROM_BOX_TEST(0xFFFFFFFF, false)
#else
LOAD_FROM_BOX_TEST(0x7FFFFFFFFFFFFFFF, true)
LOAD_FROM_BOX_TEST(0x7FFFFFFFFFFFFFFF, false)
LOAD_FROM_BOX_TEST(0x8000000000000000, true)
LOAD_FROM_BOX_TEST(0x8000000000000000, false)
LOAD_FROM_BOX_TEST(0xFFFFFFFFFFFFFFFF, true)
LOAD_FROM_BOX_TEST(0xFFFFFFFFFFFFFFFF, false)
#endif
// TODO(https://dartbug.com/53622): Add tests with Mints.
} // namespace compiler
} // namespace dart

View file

@ -533,13 +533,9 @@ class AssemblerTest {
// ArgNType is the type of the Nth argument.
#if defined(USING_SIMULATOR)
#if defined(ARCH_IS_64_BIT)
// TODO(fschneider): Make InvokeWithCodeAndThread<> more general and work on
// 32-bit.
// Since Simulator::Call always return a int64_t, bit_cast does not work
// on 32-bit platforms when returning an int32_t. Since template functions
// don't support partial specialization, we'd need to introduce a helper
// class to support 32-bit return types.
// on 32-bit platforms when returning an int32_t. Use static cast on the
// call site in 32-bit to get rid of the upper bits if needed.
template <typename ResultType>
ResultType InvokeWithCodeAndThread() {
const bool fp_return = is_double<ResultType>::value;
@ -563,7 +559,6 @@ class AssemblerTest {
reinterpret_cast<intptr_t>(thread), reinterpret_cast<intptr_t>(arg1), 0,
fp_return, fp_args));
}
#endif // ARCH_IS_64_BIT
template <typename ResultType, typename Arg1Type>
ResultType Invoke(Arg1Type arg1) {