< prev index next >

src/hotspot/share/oops/accessBackend.hpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 50,59 **** --- 50,67 ---- static const bool needs_oop_compress = HasDecorator<decorators, INTERNAL_CONVERT_COMPRESSED_OOP>::value && HasDecorator<decorators, INTERNAL_RT_USE_COMPRESSED_OOPS>::value; typedef typename Conditional<needs_oop_compress, narrowOop, oop>::type type; }; + // This meta-function returns either oop or narrowOop depending on whether + // a back-end needs to consider compressed oops types or not. + template <DecoratorSet decorators> + struct ValueOopType: AllStatic { + static const bool needs_oop_compress = HasDecorator<decorators, INTERNAL_RT_USE_COMPRESSED_OOPS>::value; + typedef typename Conditional<needs_oop_compress, narrowOop, oop>::type type; + }; + namespace AccessInternal { enum BarrierType { BARRIER_STORE, BARRIER_STORE_AT, BARRIER_LOAD,
*** 62,71 **** --- 70,80 ---- BARRIER_ATOMIC_CMPXCHG_AT, BARRIER_ATOMIC_XCHG, BARRIER_ATOMIC_XCHG_AT, BARRIER_ARRAYCOPY, BARRIER_CLONE, + BARRIER_VALUE_COPY, BARRIER_RESOLVE }; template <DecoratorSet decorators, typename T> struct MustConvertCompressedOop: public IntegralConstant<bool,
*** 112,121 **** --- 121,131 ---- typedef void (*arraycopy_func_t)(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length); typedef void (*clone_func_t)(oop src, oop dst, size_t size); + typedef void (*value_copy_func_t)(void* src, void* dst, ValueKlass* md); typedef oop (*resolve_func_t)(oop obj); }; template <DecoratorSet decorators> struct AccessFunctionTypes<decorators, void> {
*** 139,148 **** --- 149,159 ---- ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_ATOMIC_CMPXCHG_AT, atomic_cmpxchg_at_func_t); ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_ATOMIC_XCHG, atomic_xchg_func_t); ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_ATOMIC_XCHG_AT, atomic_xchg_at_func_t); ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_ARRAYCOPY, arraycopy_func_t); ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_CLONE, clone_func_t); + ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_VALUE_COPY, value_copy_func_t); ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_RESOLVE, resolve_func_t); #undef ACCESS_GENERATE_ACCESS_FUNCTION template <DecoratorSet decorators, typename T, BarrierType barrier_type> typename AccessFunction<decorators, T, barrier_type>::type resolve_barrier();
*** 404,413 **** --- 415,426 ---- arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length); static void clone(oop src, oop dst, size_t size); + static void value_copy(void* src, void* dst, ValueKlass* md); + static oop resolve(oop obj) { return obj; } }; // Below is the implementation of the first 4 steps of the template pipeline: // * Step 1: Set default decorators and decay types. This step gets rid of CV qualifiers
*** 587,596 **** --- 600,621 ---- _clone_func(src, dst, size); } }; template <DecoratorSet decorators, typename T> + struct RuntimeDispatch<decorators, T, BARRIER_VALUE_COPY>: AllStatic { + typedef typename AccessFunction<decorators, T, BARRIER_VALUE_COPY>::type func_t; + static func_t _value_copy_func; + + static void value_copy_init(void* src, void* dst, ValueKlass* md); + + static inline void value_copy(void* src, void* dst, ValueKlass* md) { + _value_copy_func(src, dst, md); + } + }; + + template <DecoratorSet decorators, typename T> struct RuntimeDispatch<decorators, T, BARRIER_RESOLVE>: AllStatic { typedef typename AccessFunction<decorators, T, BARRIER_RESOLVE>::type func_t; static func_t _resolve_func; static oop resolve_init(oop obj);
*** 640,649 **** --- 665,678 ---- template <DecoratorSet decorators, typename T> typename AccessFunction<decorators, T, BARRIER_CLONE>::type RuntimeDispatch<decorators, T, BARRIER_CLONE>::_clone_func = &clone_init; template <DecoratorSet decorators, typename T> + typename AccessFunction<decorators, T, BARRIER_VALUE_COPY>::type + RuntimeDispatch<decorators, T, BARRIER_VALUE_COPY>::_value_copy_func = &value_copy_init; + + template <DecoratorSet decorators, typename T> typename AccessFunction<decorators, T, BARRIER_RESOLVE>::type RuntimeDispatch<decorators, T, BARRIER_RESOLVE>::_resolve_func = &resolve_init; // Step 3: Pre-runtime dispatching. // The PreRuntimeDispatch class is responsible for filtering the barrier strength
*** 961,970 **** --- 990,1016 ---- RuntimeDispatch<decorators, oop, BARRIER_CLONE>::clone(src, dst, size); } template <DecoratorSet decorators> inline static typename EnableIf< + HasDecorator<decorators, AS_RAW>::value>::type + value_copy(void* src, void* dst, ValueKlass* md) { + typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw; + Raw::value_copy(src, dst, md); + } + + template <DecoratorSet decorators> + inline static typename EnableIf< + !HasDecorator<decorators, AS_RAW>::value>::type + value_copy(void* src, void* dst, ValueKlass* md) { + const DecoratorSet expanded_decorators = decorators; + RuntimeDispatch<expanded_decorators, void*, BARRIER_VALUE_COPY>::value_copy(src, dst, md); + } + + + template <DecoratorSet decorators> + inline static typename EnableIf< HasDecorator<decorators, INTERNAL_BT_TO_SPACE_INVARIANT>::value, oop>::type resolve(oop obj) { typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw; return Raw::resolve(obj); }
*** 1266,1275 **** --- 1312,1327 ---- const DecoratorSet expanded_decorators = DecoratorFixup<decorators>::value; PreRuntimeDispatch::clone<expanded_decorators>(src, dst, size); } template <DecoratorSet decorators> + inline void value_copy(void* src, void* dst, ValueKlass* md) { + const DecoratorSet expanded_decorators = DecoratorFixup<decorators>::value; + PreRuntimeDispatch::value_copy<expanded_decorators>(src, dst, md); + } + + template <DecoratorSet decorators> inline oop resolve(oop obj) { const DecoratorSet expanded_decorators = DecoratorFixup<decorators>::value; return PreRuntimeDispatch::resolve<expanded_decorators>(obj); }
< prev index next >