mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 02:47:36 +00:00
[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:
parent
2d0bebfb22
commit
29aae7608c
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue