// Used by soft float. // Single-precision FP arithmetics. extern"C"float fmodf(float a, float b); // REM_FLOAT[_2ADDR] // Double-precision FP arithmetics. extern"C"double fmod(double a, double b); // REM_DOUBLE[_2ADDR]
// Used by hard float. extern"C"float art_quick_fmodf(float a, float b); // REM_FLOAT[_2ADDR] extern"C"double art_quick_fmod(double a, double b); // REM_DOUBLE[_2ADDR]
if (gUseReadBarrier && kUseBakerReadBarrier) { // For the alignment check, strip the Thumb mode bit.
DCHECK_ALIGNED(reinterpret_cast<intptr_t>(art_quick_read_barrier_mark_introspection) - 1u, 256u); // Check the field narrow entrypoint offset from the introspection entrypoint.
intptr_t narrow_diff = reinterpret_cast<intptr_t>(art_quick_read_barrier_mark_introspection_narrow) - reinterpret_cast<intptr_t>(art_quick_read_barrier_mark_introspection);
DCHECK_EQ(BAKER_MARK_INTROSPECTION_FIELD_LDR_NARROW_ENTRYPOINT_OFFSET, narrow_diff); // Check array switch cases offsets from the introspection entrypoint.
intptr_t array_diff = reinterpret_cast<intptr_t>(art_quick_read_barrier_mark_introspection_arrays) - reinterpret_cast<intptr_t>(art_quick_read_barrier_mark_introspection);
DCHECK_EQ(BAKER_MARK_INTROSPECTION_ARRAY_SWITCH_OFFSET, array_diff); // Check the GC root entrypoint offsets from the introspection entrypoint.
intptr_t gc_roots_wide_diff = reinterpret_cast<intptr_t>(art_quick_read_barrier_mark_introspection_gc_roots_wide) - reinterpret_cast<intptr_t>(art_quick_read_barrier_mark_introspection);
DCHECK_EQ(BAKER_MARK_INTROSPECTION_GC_ROOT_LDR_WIDE_ENTRYPOINT_OFFSET, gc_roots_wide_diff);
intptr_t gc_roots_narrow_diff = reinterpret_cast<intptr_t>(art_quick_read_barrier_mark_introspection_gc_roots_narrow) - reinterpret_cast<intptr_t>(art_quick_read_barrier_mark_introspection);
DCHECK_EQ(BAKER_MARK_INTROSPECTION_GC_ROOT_LDR_NARROW_ENTRYPOINT_OFFSET, gc_roots_narrow_diff);
intptr_t intrinsic_cas_diff = reinterpret_cast<intptr_t>(art_quick_read_barrier_mark_introspection_intrinsic_cas) - reinterpret_cast<intptr_t>(art_quick_read_barrier_mark_introspection);
DCHECK_EQ(BAKER_MARK_INTROSPECTION_INTRINSIC_CAS_ENTRYPOINT_OFFSET, intrinsic_cas_diff); // The register 12, i.e. IP, is reserved, so there is no art_quick_read_barrier_mark_reg12. // We're using the entry to hold a pointer to the introspection entrypoint instead.
qpoints->SetReadBarrierMarkReg12(
is_active ? art_quick_read_barrier_mark_introspection : nullptr);
}
}
// Math
qpoints->SetIdivmod(__aeabi_idivmod);
qpoints->SetLdiv(__aeabi_ldivmod);
qpoints->SetLmod(__aeabi_ldivmod); // result returned in r2:r3
qpoints->SetLmul(art_quick_mul_long);
qpoints->SetShlLong(art_quick_shl_long);
qpoints->SetShrLong(art_quick_shr_long);
qpoints->SetUshrLong(art_quick_ushr_long);
qpoints->SetFmod(art_quick_fmod);
qpoints->SetFmodf(art_quick_fmodf);
qpoints->SetD2l(art_quick_d2l);
qpoints->SetF2l(art_quick_f2l);
qpoints->SetL2f(art_quick_l2f);
// Intrinsics
qpoints->SetIndexOf(art_quick_indexof); // The ARM StringCompareTo intrinsic does not call the runtime.
qpoints->SetStringCompareTo(nullptr);
qpoints->SetMemcpy(memcpy);
// Read barrier.
UpdateReadBarrierEntrypoints(qpoints, /*is_active=*/ false);
qpoints->SetReadBarrierMarkReg12(nullptr); // Cannot use register 12 (IP) to pass arguments.
qpoints->SetReadBarrierMarkReg13(nullptr); // Cannot use register 13 (SP) to pass arguments.
qpoints->SetReadBarrierMarkReg14(nullptr); // Cannot use register 14 (LR) to pass arguments.
qpoints->SetReadBarrierMarkReg15(nullptr); // Cannot use register 15 (PC) to pass arguments. // ARM has only 16 core registers.
qpoints->SetReadBarrierMarkReg16(nullptr);
qpoints->SetReadBarrierMarkReg17(nullptr);
qpoints->SetReadBarrierMarkReg18(nullptr);
qpoints->SetReadBarrierMarkReg19(nullptr);
qpoints->SetReadBarrierMarkReg20(nullptr);
qpoints->SetReadBarrierMarkReg21(nullptr);
qpoints->SetReadBarrierMarkReg22(nullptr);
qpoints->SetReadBarrierMarkReg23(nullptr);
qpoints->SetReadBarrierMarkReg24(nullptr);
qpoints->SetReadBarrierMarkReg25(nullptr);
qpoints->SetReadBarrierMarkReg26(nullptr);
qpoints->SetReadBarrierMarkReg27(nullptr);
qpoints->SetReadBarrierMarkReg28(nullptr);
qpoints->SetReadBarrierMarkReg29(nullptr);
qpoints->SetReadBarrierSlow(artReadBarrierSlow);
qpoints->SetReadBarrierForRootSlow(artReadBarrierForRootSlow);
}
void UpdateLowOverheadTraceEntrypoints([[maybe_unused]] QuickEntryPoints* qpoints,
[[maybe_unused]] LowOverheadTraceType trace_type) { // This is a nop on this architecture. Low overhead tracing is only implemented for ARM64.
}
uintptr_t GetNopUprobeMethodEntryHookAddress() { // This is invalid on this architecture. Uprobe support is only implemented for ARM64. returnreinterpret_cast<uintptr_t>(nullptr);
}
} // namespace art
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-29)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.