Chromium Code Reviews| Index: runtime/vm/simulator_dbc.cc |
| diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc |
| index 8623a643e1db258ea960f2d3abdb5679f76cd1d7..fab3a10e2d3ae5ae43612ddd6575b38db2752c58 100644 |
| --- a/runtime/vm/simulator_dbc.cc |
| +++ b/runtime/vm/simulator_dbc.cc |
| @@ -106,11 +106,13 @@ DART_FORCE_INLINE static RawObject** FrameArguments(RawObject** FP, |
| class SimulatorHelpers { |
| public: |
| DART_FORCE_INLINE static RawSmi* GetClassIdAsSmi(RawObject* obj) { |
| - return Smi::New(obj->IsHeapObject() ? obj->GetClassId() : kSmiCid); |
| + return Smi::New(obj->IsHeapObject() ? obj->GetClassId() |
| + : static_cast<intptr_t>(kSmiCid)); |
| } |
| DART_FORCE_INLINE static intptr_t GetClassId(RawObject* obj) { |
| - return obj->IsHeapObject() ? obj->GetClassId() : kSmiCid; |
| + return obj->IsHeapObject() ? obj->GetClassId() |
| + : static_cast<intptr_t>(kSmiCid); |
| } |
| DART_FORCE_INLINE static void IncrementUsageCounter(RawICData* icdata) { |
| @@ -338,27 +340,11 @@ void Simulator::Exit(Thread* thread, |
| } |
| -#if defined(__has_builtin) |
|
Vyacheslav Egorov (Google)
2016/04/22 06:22:04
Where did this go?
Inline assembly is just a fall
zra
2016/04/22 19:40:49
I found the problem with the intrinsics. Their use
Vyacheslav Egorov (Google)
2016/04/23 18:58:35
Good catch! Alternative would be to just rewrite S
zra
2016/04/25 15:42:56
Assuming the intrinsic does a branch to decide the
|
| -#if __has_builtin(__builtin_smul_overflow) |
| -#define HAS_MUL_OVERFLOW |
| -#endif |
| -#if __has_builtin(__builtin_sadd_overflow) |
| -#define HAS_ADD_OVERFLOW |
| -#endif |
| -#if __has_builtin(__builtin_ssub_overflow) |
| -#define HAS_SUB_OVERFLOW |
| -#endif |
| -#endif |
| - |
| - |
| -DART_FORCE_INLINE static bool SignedAddWithOverflow(int32_t lhs, |
| - int32_t rhs, |
| +DART_FORCE_INLINE static bool SignedAddWithOverflow(intptr_t lhs, |
| + intptr_t rhs, |
| intptr_t* out) { |
| int32_t res = 1; |
|
Vyacheslav Egorov (Google)
2016/04/22 06:22:04
if you make this intptr_t then both ARM and ARM64
zra
2016/04/22 19:40:49
Done.
|
| -#if defined(HAS_ADD_OVERFLOW) |
| - res = static_cast<int32_t>(__builtin_sadd_overflow( |
| - lhs, rhs, reinterpret_cast<int32_t*>(out))); |
| -#elif defined(__i386__) |
| +#if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64) |
| asm volatile( |
| "add %2, %1\n" |
|
Ivan Posva
2016/04/21 23:35:15
Shouldn't this be at least an addq for HOST_ARCH_X
zra
2016/04/22 19:40:49
The correct ops for the types of the provided oper
|
| "jo 1f;\n" |
| @@ -368,7 +354,7 @@ DART_FORCE_INLINE static bool SignedAddWithOverflow(int32_t lhs, |
| : "+r"(res), "+r"(lhs) |
| : "r"(rhs), "r"(out) |
| : "cc"); |
| -#elif defined(__arm__) |
| +#elif defined(HOST_ARCH_ARM) |
| asm volatile( |
| "adds %1, %1, %2;\n" |
| "bvs 1f;\n" |
| @@ -378,6 +364,16 @@ DART_FORCE_INLINE static bool SignedAddWithOverflow(int32_t lhs, |
| : "+r"(res), "+r"(lhs) |
| : "r"(rhs), "r"(out) |
| : "cc", "r12"); |
| +#elif defined(HOST_ARCH_ARM64) |
| + asm volatile( |
| + "adds %1, %1, %2;\n" |
| + "bvs 1f;\n" |
| + "mov %w0, #0;\n" |
| + "str %1, [%3, #0]\n" |
| + "1:" |
| + : "+r"(res), "+r"(lhs) |
| + : "r"(rhs), "r"(out) |
| + : "cc"); |
| #else |
| #error "Unsupported platform" |
| #endif |
| @@ -385,14 +381,11 @@ DART_FORCE_INLINE static bool SignedAddWithOverflow(int32_t lhs, |
| } |
| -DART_FORCE_INLINE static bool SignedSubWithOverflow(int32_t lhs, |
| - int32_t rhs, |
| +DART_FORCE_INLINE static bool SignedSubWithOverflow(intptr_t lhs, |
| + intptr_t rhs, |
| intptr_t* out) { |
| int32_t res = 1; |
| -#if defined(HAS_SUB_OVERFLOW) |
| - res = static_cast<int32_t>(__builtin_ssub_overflow( |
| - lhs, rhs, reinterpret_cast<int32_t*>(out))); |
| -#elif defined(__i386__) |
| +#if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64) |
|
Ivan Posva
2016/04/21 23:35:15
dittoq
zra
2016/04/22 19:40:49
Acknowledged.
|
| asm volatile( |
| "sub %2, %1\n" |
| "jo 1f;\n" |
| @@ -402,7 +395,7 @@ DART_FORCE_INLINE static bool SignedSubWithOverflow(int32_t lhs, |
| : "+r"(res), "+r"(lhs) |
| : "r"(rhs), "r"(out) |
| : "cc"); |
| -#elif defined(__arm__) |
| +#elif defined(HOST_ARCH_ARM) |
| asm volatile( |
| "subs %1, %1, %2;\n" |
| "bvs 1f;\n" |
| @@ -412,6 +405,16 @@ DART_FORCE_INLINE static bool SignedSubWithOverflow(int32_t lhs, |
| : "+r"(res), "+r"(lhs) |
| : "r"(rhs), "r"(out) |
| : "cc", "r12"); |
| +#elif defined(HOST_ARCH_ARM64) |
| + asm volatile( |
| + "subs %1, %1, %2;\n" |
| + "bvs 1f;\n" |
| + "mov %w0, #0;\n" |
| + "str %1, [%3, #0]\n" |
| + "1:" |
| + : "+r"(res), "+r"(lhs) |
| + : "r"(rhs), "r"(out) |
| + : "cc"); |
| #else |
| #error "Unsupported platform" |
| #endif |
| @@ -419,14 +422,11 @@ DART_FORCE_INLINE static bool SignedSubWithOverflow(int32_t lhs, |
| } |
| -DART_FORCE_INLINE static bool SignedMulWithOverflow(int32_t lhs, |
| - int32_t rhs, |
| +DART_FORCE_INLINE static bool SignedMulWithOverflow(intptr_t lhs, |
| + intptr_t rhs, |
| intptr_t* out) { |
| int32_t res = 1; |
| -#if defined(HAS_MUL_OVERFLOW) |
| - res = static_cast<int32_t>(__builtin_smul_overflow( |
| - lhs, rhs, reinterpret_cast<int32_t*>(out))); |
| -#elif defined(__i386__) |
| +#if defined(HOST_ARCH_IA32) || defined(HOST_ARCH_X64) |
|
Ivan Posva
2016/04/21 23:35:15
dittoq
zra
2016/04/22 19:40:49
Acknowledged.
|
| asm volatile( |
| "imul %2, %1\n" |
| "jo 1f;\n" |
| @@ -436,7 +436,7 @@ DART_FORCE_INLINE static bool SignedMulWithOverflow(int32_t lhs, |
| : "+r"(res), "+r"(lhs) |
| : "r"(rhs), "r"(out) |
| : "cc"); |
| -#elif defined(__arm__) |
| +#elif defined(HOST_ARCH_ARM) |
| asm volatile( |
| "smull %1, ip, %1, %2;\n" |
| "cmp ip, %1, ASR #31;\n" |
| @@ -447,6 +447,19 @@ DART_FORCE_INLINE static bool SignedMulWithOverflow(int32_t lhs, |
| : "+r"(res), "+r"(lhs) |
| : "r"(rhs), "r"(out) |
| : "cc", "r12"); |
| +#elif defined(HOST_ARCH_ARM64) |
| + int64_t prod_lo; |
| + asm volatile( |
| + "mul %1, %2, %3\n" |
| + "smulh %2, %2, %3\n" |
| + "cmp %2, %1, ASR #63;\n" |
| + "bne 1f;\n" |
| + "mov %w0, #0;\n" |
| + "str %1, [%4, #0]\n" |
| + "1:" |
| + : "+r"(res), "+r"(prod_lo), "+r"(lhs) |
| + : "r"(rhs), "r"(out) |
| + : "cc"); |
| #else |
| #error "Unsupported platform" |
| #endif |