diff options
Diffstat (limited to 'compiler/llvm/intrinsic_func_list.def')
-rw-r--r-- | compiler/llvm/intrinsic_func_list.def | 1803 |
1 files changed, 1803 insertions, 0 deletions
diff --git a/compiler/llvm/intrinsic_func_list.def b/compiler/llvm/intrinsic_func_list.def new file mode 100644 index 0000000..92537ba --- /dev/null +++ b/compiler/llvm/intrinsic_func_list.def @@ -0,0 +1,1803 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// DEF_INTRINSICS_FUNC(ID, NAME, ATTR, RET_TYPE, +// ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE) +#ifndef DEF_INTRINSICS_FUNC +# error "missing DEF_INTRINSICS_FUNC definition!" +#endif + +#define _EVAL_DEF_INTRINSICS_FUNC(ID, NAME, ATTR, RET_TYPE, ...) \ + DEF_INTRINSICS_FUNC(ID, NAME, ATTR, RET_TYPE, __VA_ARGS__) + +#define _EXPAND_ARG0() kNone, kNone, kNone, kNone, kNone +#define _EXPAND_ARG1(ARG1) ARG1, kNone, kNone, kNone, kNone +#define _EXPAND_ARG2(ARG1, ARG2) ARG1, ARG2, kNone, kNone, kNone +#define _EXPAND_ARG3(ARG1, ARG2, ARG3) ARG1, ARG2, ARG3, kNone, kNone +#define _EXPAND_ARG4(ARG1, ARG2, ARG3, ARG4) ARG1, ARG2, ARG3, ARG4, kNone +#define _EXPAND_ARG5(ARG1, ARG2, ARG3, ARG4, ARG5) \ + ARG1, ARG2, ARG3, ARG4, ARG5 + +#define _JTYPE(TYPE, SPACE) _JTYPE_OF_ ## TYPE ## _UNDER_ ## SPACE + +// Note: These should be consistent with the type return from +// IRBuilder::GetJType([type], kArray). +#define _JTYPE_OF_kInt1Ty_UNDER_kArray kInt8Ty +#define _JTYPE_OF_kInt8Ty_UNDER_kArray kInt8Ty +#define _JTYPE_OF_kInt16Ty_UNDER_kArray kInt16Ty +#define _JTYPE_OF_kInt32Ty_UNDER_kArray kInt32Ty +#define _JTYPE_OF_kInt64Ty_UNDER_kArray kInt64Ty +#define _JTYPE_OF_kJavaObjectTy_UNDER_kArray kJavaObjectTy + +// Note: These should be consistent with the type return from +// IRBuilder::GetJType([type], kField). +#define _JTYPE_OF_kInt1Ty_UNDER_kField kInt32Ty +#define _JTYPE_OF_kInt8Ty_UNDER_kField kInt32Ty +#define _JTYPE_OF_kInt16Ty_UNDER_kField kInt32Ty +#define _JTYPE_OF_kInt32Ty_UNDER_kField kInt32Ty +#define _JTYPE_OF_kInt64Ty_UNDER_kField kInt64Ty +#define _JTYPE_OF_kJavaObjectTy_UNDER_kField kJavaObjectTy + +//---------------------------------------------------------------------------- +// Thread +//---------------------------------------------------------------------------- + +// Thread* art_portable_get_current_thread() +_EVAL_DEF_INTRINSICS_FUNC(GetCurrentThread, + art_portable_get_current_thread, + kAttrReadNone | kAttrNoThrow, + kJavaThreadTy, + _EXPAND_ARG0()) + +// void art_portable_test_suspend(Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(TestSuspend, + art_portable_test_suspend, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG1(kJavaThreadTy)) + +// void art_portable_check_suspend() /* Expands to GetCurrentThread/TestSuspend */ +_EVAL_DEF_INTRINSICS_FUNC(CheckSuspend, + art_portable_check_suspend, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG0()) + +// void art_portable_mark_gc_card(Object* new_value, Object* object) +_EVAL_DEF_INTRINSICS_FUNC(MarkGCCard, + art_portable_mark_gc_card, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kJavaObjectTy, kJavaObjectTy)) + +//---------------------------------------------------------------------------- +// Exception +//---------------------------------------------------------------------------- + +// Should not expand - introduces the catch targets for a potentially +// throwing instruction. The result is a switch key and this +// instruction will be followed by a switch statement. The catch +// targets will be enumerated as cases of the switch, with the fallthrough +// designating the block containing the potentially throwing instruction. +// bool art_portable_catch_targets(int dex_pc) +_EVAL_DEF_INTRINSICS_FUNC(CatchTargets, + art_portable_catch_targets, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kInt32ConstantTy)) + +// void art_portable_throw_exception(JavaObject* exception) +_EVAL_DEF_INTRINSICS_FUNC(ThrowException, + art_portable_throw_exception, + kAttrDoThrow, + kVoidTy, + _EXPAND_ARG1(kJavaObjectTy)) + +// void art_portable_hl_throw_exception(JavaObject* exception) +_EVAL_DEF_INTRINSICS_FUNC(HLThrowException, + art_portable_hl_throw_exception, + kAttrDoThrow, + kVoidTy, + _EXPAND_ARG1(kJavaObjectTy)) + +// JavaObject* art_portable_get_current_exception() +_EVAL_DEF_INTRINSICS_FUNC(GetException, + art_portable_get_current_exception, + kAttrReadOnly | kAttrNoThrow, + kJavaObjectTy, + _EXPAND_ARG0()) + +// bool art_portable_is_exception_pending() +_EVAL_DEF_INTRINSICS_FUNC(IsExceptionPending, + art_portable_is_exception_pending, + kAttrReadOnly | kAttrNoThrow, + kInt1Ty, + _EXPAND_ARG0()) + +// int art_portable_find_catch_block(Method* method, int try_item_offset) +_EVAL_DEF_INTRINSICS_FUNC(FindCatchBlock, + art_portable_find_catch_block, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG2(kJavaMethodTy, kInt32ConstantTy)) + +// void art_portable_throw_div_zero() +_EVAL_DEF_INTRINSICS_FUNC(ThrowDivZeroException, + art_portable_throw_div_zero, + kAttrDoThrow, + kVoidTy, + _EXPAND_ARG0()) + +// void art_portable_throw_null_pointer_exception(uint32_t dex_pc) +_EVAL_DEF_INTRINSICS_FUNC(ThrowNullPointerException, + art_portable_throw_null_pointer_exception, + kAttrDoThrow, + kVoidTy, + _EXPAND_ARG1(kInt32ConstantTy)) + +// void art_portable_throw_array_bounds(int index, int array_len) +_EVAL_DEF_INTRINSICS_FUNC(ThrowIndexOutOfBounds, + art_portable_throw_array_bounds, + kAttrDoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32Ty, kInt32Ty)) + +//---------------------------------------------------------------------------- +// ConstString +//---------------------------------------------------------------------------- + +// JavaObject* art_portable_const_string(uint32_t string_idx) +_EVAL_DEF_INTRINSICS_FUNC(ConstString, + art_portable_const_string, + kAttrReadOnly | kAttrNoThrow, + kJavaObjectTy, + _EXPAND_ARG1(kInt32ConstantTy)) + +// JavaObject* art_portable_load_string_from_dex_cache(Method* method, uint32_t string_idx) +_EVAL_DEF_INTRINSICS_FUNC(LoadStringFromDexCache, + art_portable_load_string_from_dex_cache, + kAttrReadOnly | kAttrNoThrow, + kJavaObjectTy, + _EXPAND_ARG1(kInt32ConstantTy)) + +// JavaObject* art_portable_resolve_string(Method* method, uint32_t string_idx) +_EVAL_DEF_INTRINSICS_FUNC(ResolveString, + art_portable_resolve_string, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG2(kJavaMethodTy, kInt32ConstantTy)) + +//---------------------------------------------------------------------------- +// ConstClass +//---------------------------------------------------------------------------- + +// JavaObject* art_portable_const_class(uint32_t type_idx) +_EVAL_DEF_INTRINSICS_FUNC(ConstClass, + art_portable_const_class, + kAttrReadOnly | kAttrNoThrow, + kJavaObjectTy, + _EXPAND_ARG1(kInt32ConstantTy)) + +// JavaObject* art_portable_initialize_type_and_verify_access(uint32_t type_idx, +// Method* referrer, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(InitializeTypeAndVerifyAccess, + art_portable_initialize_type_and_verify_access, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaThreadTy)) + +// JavaObject* art_portable_load_type_from_dex_cache(uint32_t type_idx) +_EVAL_DEF_INTRINSICS_FUNC(LoadTypeFromDexCache, + art_portable_load_type_from_dex_cache, + kAttrReadOnly | kAttrNoThrow, + kJavaObjectTy, + _EXPAND_ARG1(kInt32ConstantTy)) + +// JavaObject* art_portable_initialize_type(uint32_t type_idx, +// Method* referrer, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(InitializeType, + art_portable_initialize_type, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaThreadTy)) + +//---------------------------------------------------------------------------- +// Lock +//---------------------------------------------------------------------------- + +// void art_portable_lock_object(JavaObject* obj, Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(LockObject, + art_portable_lock_object, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kJavaObjectTy, kJavaThreadTy)) + +// void art_portable_unlock_object(JavaObject* obj, Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(UnlockObject, + art_portable_unlock_object, + kAttrNone, + kVoidTy, + _EXPAND_ARG2(kJavaObjectTy, kJavaThreadTy)) + +//---------------------------------------------------------------------------- +// Cast +//---------------------------------------------------------------------------- + +// void art_portable_check_cast(JavaObject* dest_type, JavaObject* src_type) +_EVAL_DEF_INTRINSICS_FUNC(CheckCast, + art_portable_check_cast, + kAttrNone, + kVoidTy, + _EXPAND_ARG2(kJavaObjectTy, kJavaObjectTy)) + +// void art_portable_hl_check_cast(uint32_t type_idx, JavaObject* obj) +_EVAL_DEF_INTRINSICS_FUNC(HLCheckCast, + art_portable_hl_check_cast, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32ConstantTy, kJavaObjectTy)) + +// int art_portable_is_assignable(JavaObject* dest_type, JavaObject* src_type) +_EVAL_DEF_INTRINSICS_FUNC(IsAssignable, + art_portable_is_assignable, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG2(kJavaObjectTy, kJavaObjectTy)) + +//---------------------------------------------------------------------------- +// Allocation +//---------------------------------------------------------------------------- + +// JavaObject* art_portable_alloc_object(uint32_t type_idx, +// Method* referrer, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(AllocObject, + art_portable_alloc_object, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaThreadTy)) + +// JavaObject* art_portable_alloc_object_with_access_check(uint32_t type_idx, +// Method* referrer, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(AllocObjectWithAccessCheck, + art_portable_alloc_object_with_access_check, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaThreadTy)) + +//---------------------------------------------------------------------------- +// Instance +//---------------------------------------------------------------------------- + +// JavaObject* art_portable_new_instance(uint32_t type_idx) +_EVAL_DEF_INTRINSICS_FUNC(NewInstance, + art_portable_new_instance, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG1(kInt32Ty)) + +// bool art_portable_instance_of(uint32_t type_idx, JavaObject* ref) +_EVAL_DEF_INTRINSICS_FUNC(InstanceOf, + art_portable_instance_of, + kAttrNone, + kInt32Ty, + _EXPAND_ARG2(kInt32Ty, kJavaObjectTy)) + +//---------------------------------------------------------------------------- +// Array +//---------------------------------------------------------------------------- + +// JavaObject* art_portable_new_array(uint32_t type_idx, uint32_t array_size) +_EVAL_DEF_INTRINSICS_FUNC(NewArray, + art_portable_new_array, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG2(kInt32ConstantTy, kInt32Ty)) + +// uint32_t art_portable_opt_array_length(int32_t opt_flags, JavaObject* array) +_EVAL_DEF_INTRINSICS_FUNC(OptArrayLength, + art_portable_opt_array_length, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG2(kInt32Ty, kJavaObjectTy)) + +// uint32_t art_portable_array_length(JavaObject* array) +_EVAL_DEF_INTRINSICS_FUNC(ArrayLength, + art_portable_array_length, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kJavaObjectTy)) + +// JavaObject* art_portable_alloc_array(uint32_t type_idx, +// Method* referrer, +// uint32_t length, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(AllocArray, + art_portable_alloc_array, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kInt32Ty, kJavaThreadTy)) + +// JavaObject* art_portable_alloc_array_with_access_check(uint32_t type_idx, +// Method* referrer, +// uint32_t length, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(AllocArrayWithAccessCheck, + art_portable_alloc_array_with_access_check, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kInt32Ty, kJavaThreadTy)) + +// JavaObject* art_portable_check_and_alloc_array(uint32_t type_idx, +// Method* referrer, +// uint32_t length, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(CheckAndAllocArray, + art_portable_check_and_alloc_array, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kInt32ConstantTy, kJavaThreadTy)) + +// JavaObject* art_portable_check_and_alloc_array_with_access_check(uint32_t type_idx, +// Method* referrer, +// uint32_t length, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(CheckAndAllocArrayWithAccessCheck, + art_portable_check_and_alloc_array_with_access_check, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kInt32ConstantTy, kJavaThreadTy)) + +// art_portable_aget_* and art_portable_aput_* never generate exception since the +// necessary checking on arguments (e.g., array and index) has already done +// before invocation of these intrinsics. +// +// [type] void art_portable_aget_[type](JavaObject* array, uint32_t index) +_EVAL_DEF_INTRINSICS_FUNC(ArrayGet, + art_portable_aget, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt32Ty, kArray), + _EXPAND_ARG2(kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(ArrayGetWide, + art_portable_aget_wide, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt64Ty, kArray), + _EXPAND_ARG2(kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(ArrayGetObject, + art_portable_aget_object, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kJavaObjectTy, kArray), + _EXPAND_ARG2(kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(ArrayGetBoolean, + art_portable_aget_boolean, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt1Ty, kArray), + _EXPAND_ARG2(kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(ArrayGetByte, + art_portable_aget_byte, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt8Ty, kArray), + _EXPAND_ARG2(kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(ArrayGetChar, + art_portable_aget_char, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt16Ty, kArray), + _EXPAND_ARG2(kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(ArrayGetShort, + art_portable_aget_short, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt16Ty, kArray), + _EXPAND_ARG2(kJavaObjectTy, kInt32Ty)) + +// void art_portable_aput_[type]([type] value, JavaObject* array, uint32_t index) +_EVAL_DEF_INTRINSICS_FUNC(ArrayPut, + art_portable_aput, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG3(_JTYPE(kInt32Ty, kArray), kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(ArrayPutWide, + art_portable_aput_wide, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG3(_JTYPE(kInt64Ty, kArray), kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(ArrayPutObject, + art_portable_aput_object, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG3(_JTYPE(kJavaObjectTy, kArray), kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(ArrayPutBoolean, + art_portable_aput_boolean, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG3(_JTYPE(kInt1Ty, kArray), kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(ArrayPutByte, + art_portable_aput_byte, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG3(_JTYPE(kInt8Ty, kArray), kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(ArrayPutChar, + art_portable_aput_char, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG3(_JTYPE(kInt16Ty, kArray), kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(ArrayPutShort, + art_portable_aput_short, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG3(_JTYPE(kInt16Ty, kArray), kJavaObjectTy, kInt32Ty)) + +// void art_portable_check_put_array_element(JavaObject* value, JavaObject* array) +_EVAL_DEF_INTRINSICS_FUNC(CheckPutArrayElement, + art_portable_check_put_array_element, + kAttrNone, + kVoidTy, + _EXPAND_ARG2(kJavaObjectTy, kJavaObjectTy)) + +// void art_portable_filled_new_array(Array* array, +// uint32_t elem_jty, ...) +_EVAL_DEF_INTRINSICS_FUNC(FilledNewArray, + art_portable_filled_new_array, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kVarArgTy)) + +// void art_portable_fill_array_data(Method* referrer, +// uint32_t dex_pc, +// Array* array, +// uint32_t payload_offset) +_EVAL_DEF_INTRINSICS_FUNC(FillArrayData, + art_portable_fill_array_data, + kAttrNone, + kVoidTy, + _EXPAND_ARG4(kJavaMethodTy, kInt32ConstantTy, kJavaObjectTy, kInt32ConstantTy)) + +// void art_portable_hl_fill_array_data(int32_t offset, JavaObject* array) +_EVAL_DEF_INTRINSICS_FUNC(HLFillArrayData, + art_portable_hl_fill_array_data, + kAttrNone, + kVoidTy, + _EXPAND_ARG2(kInt32ConstantTy, kJavaObjectTy)) + +//---------------------------------------------------------------------------- +// Instance Field +//---------------------------------------------------------------------------- + +// [type] art_portable_iget_[type](uint32_t field_idx, +// Method* referrer, +// JavaObject* obj) +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGet, + art_portable_iget, + kAttrNone, + _JTYPE(kInt32Ty, kField), + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy)) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetWide, + art_portable_iget_wide, + kAttrNone, + _JTYPE(kInt64Ty, kField), + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy)) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetObject, + art_portable_iget_object, + kAttrNone, + _JTYPE(kJavaObjectTy, kField), + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy)) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetBoolean, + art_portable_iget_boolean, + kAttrNone, + _JTYPE(kInt1Ty, kField), + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy)) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetByte, + art_portable_iget_byte, + kAttrNone, + _JTYPE(kInt8Ty, kField), + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy)) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetChar, + art_portable_iget_char, + kAttrNone, + _JTYPE(kInt16Ty, kField), + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy)) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetShort, + art_portable_iget_short, + kAttrNone, + _JTYPE(kInt16Ty, kField), + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy)) + +// [type] art_portable_iget_[type].fast(int field_offset, +// bool is_volatile, +// JavaObject* obj) +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetFast, + art_portable_iget.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt32Ty, kField), + _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy)) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetWideFast, + art_portable_iget_wide.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt64Ty, kField), + _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy)) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetObjectFast, + art_portable_iget_object.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kJavaObjectTy, kField), + _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy)) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetBooleanFast, + art_portable_iget_boolean.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt1Ty, kField), + _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy)) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetByteFast, + art_portable_iget_byte.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt8Ty, kField), + _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy)) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetCharFast, + art_portable_iget_char.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt16Ty, kField), + _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy)) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetShortFast, + art_portable_iget_short.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt16Ty, kField), + _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy)) + +// void art_portable_iput_[type](uint32_t field_idx, +// Method* referrer, +// JavaObject* obj, +// [type] new_value) +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPut, + art_portable_iput, + kAttrNone, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kInt32Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutWide, + art_portable_iput_wide, + kAttrNone, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kInt64Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutObject, + art_portable_iput_object, + kAttrNone, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kJavaObjectTy, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutBoolean, + art_portable_iput_boolean, + kAttrNone, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kInt1Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutByte, + art_portable_iput_byte, + kAttrNone, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kInt8Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutChar, + art_portable_iput_char, + kAttrNone, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kInt16Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutShort, + art_portable_iput_short, + kAttrNone, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kInt16Ty, kField))) + +// void art_portable_iput_[type].fast(int field_offset, +// bool is_volatile, +// JavaObject* obj, +// [type] new_value) +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutFast, + art_portable_iput.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kInt32Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutWideFast, + art_portable_iput_wide.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kInt64Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutObjectFast, + art_portable_iput_object.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kJavaObjectTy, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutBooleanFast, + art_portable_iput_boolean.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kInt1Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutByteFast, + art_portable_iput_byte.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kInt8Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutCharFast, + art_portable_iput_char.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kInt16Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutShortFast, + art_portable_iput_short.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kInt16Ty, kField))) + +//---------------------------------------------------------------------------- +// Static Field +//---------------------------------------------------------------------------- + +// [type] art_portable_sget_[type](uint32_t field_idx, Method* referrer) +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGet, + art_portable_sget, + kAttrNone, + _JTYPE(kInt32Ty, kField), + _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy)) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetWide, + art_portable_sget_wide, + kAttrNone, + _JTYPE(kInt64Ty, kField), + _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy)) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetObject, + art_portable_sget_object, + kAttrNone, + _JTYPE(kJavaObjectTy, kField), + _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy)) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetBoolean, + art_portable_sget_boolean, + kAttrNone, + _JTYPE(kInt1Ty, kField), + _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy)) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetByte, + art_portable_sget_byte, + kAttrNone, + _JTYPE(kInt8Ty, kField), + _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy)) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetChar, + art_portable_sget_char, + kAttrNone, + _JTYPE(kInt16Ty, kField), + _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy)) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetShort, + art_portable_sget_short, + kAttrNone, + _JTYPE(kInt16Ty, kField), + _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy)) + +// [type] art_portable_sget_[type].fast(JavaObject* ssb, +// int field_offset, +// bool is_volatile) +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetFast, + art_portable_sget.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt32Ty, kField), + _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy)) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetWideFast, + art_portable_sget_wide.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt64Ty, kField), + _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy)) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetObjectFast, + art_portable_sget_object.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kJavaObjectTy, kField), + _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy)) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetBooleanFast, + art_portable_sget_boolean.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt1Ty, kField), + _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy)) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetByteFast, + art_portable_sget_byte.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt8Ty, kField), + _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy)) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetCharFast, + art_portable_sget_char.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt16Ty, kField), + _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy)) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetShortFast, + art_portable_sget_short.fast, + kAttrReadOnly | kAttrNoThrow, + _JTYPE(kInt16Ty, kField), + _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy)) + +// void art_portable_sput_[type](uint32_t field_idx, +// Method* referrer, +// [type] new_value) +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPut, + art_portable_sput, + kAttrNone, + kVoidTy, + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kInt32Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutWide, + art_portable_sput_wide, + kAttrNone, + kVoidTy, + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kInt64Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutObject, + art_portable_sput_object, + kAttrNone, + kVoidTy, + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kJavaObjectTy, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutBoolean, + art_portable_sput_boolean, + kAttrNone, + kVoidTy, + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kInt1Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutByte, + art_portable_sput_byte, + kAttrNone, + kVoidTy, + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kInt8Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutChar, + art_portable_sput_char, + kAttrNone, + kVoidTy, + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kInt16Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutShort, + art_portable_sput_short, + kAttrNone, + kVoidTy, + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kInt16Ty, kField))) + +// void art_portable_sput_[type].fast(JavaObject* ssb, +// int field_offset, +// bool is_volatile, +// [type] new_value) +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutFast, + art_portable_sput.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kInt32Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutWideFast, + art_portable_sput_wide.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kInt64Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutObjectFast, + art_portable_sput_object.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kJavaObjectTy, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutBooleanFast, + art_portable_sput_boolean.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kInt1Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutByteFast, + art_portable_sput_byte.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kInt8Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutCharFast, + art_portable_sput_char.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kInt16Ty, kField))) + +_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutShortFast, + art_portable_sput_short.fast, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kInt16Ty, kField))) + +// JavaObject* art_portable_load_declaring_class_ssb(Method* method) +// Load the static storage base of the class that given method resides +_EVAL_DEF_INTRINSICS_FUNC(LoadDeclaringClassSSB, + art_portable_load_declaring_class_ssb, + kAttrReadOnly | kAttrNoThrow, + kJavaObjectTy, + _EXPAND_ARG1(kJavaMethodTy)) + +// JavaObject* art_portable_load_class_ssb_from_dex_cache(uint32_t type_idx) +_EVAL_DEF_INTRINSICS_FUNC(LoadClassSSBFromDexCache, + art_portable_load_class_ssb_from_dex_cache, + kAttrReadOnly | kAttrNoThrow, + kJavaObjectTy, + _EXPAND_ARG1(kInt32ConstantTy)) + +// JavaObject* art_portable_init_and_load_class_ssb(uint32_t type_idx, +// Method* referrer, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(InitializeAndLoadClassSSB, + art_portable_init_and_load_class_ssb, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaThreadTy)) + +//---------------------------------------------------------------------------- +// High-level Array get/put +// +// Similar to art_portable_aget/aput_xxx, but checks not yet performed. +// OptFlags contain info describing whether frontend has determined that +// null check and/or array bounds check may be skipped. +// +// [type] void art_portable_hl_aget_[type](int optFlags, JavaObject* array, uint32_t index) +_EVAL_DEF_INTRINSICS_FUNC(HLArrayGet, + art_portable_hl_aget, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetFloat, + art_portable_hl_aget_float, + kAttrReadOnly | kAttrNoThrow, + kFloatTy, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetWide, + art_portable_hl_aget_wide, + kAttrReadOnly | kAttrNoThrow, + kInt64Ty, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetDouble, + art_portable_hl_aget_double, + kAttrReadOnly | kAttrNoThrow, + kDoubleTy, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetObject, + art_portable_hl_aget_object, + kAttrReadOnly | kAttrNoThrow, + kJavaObjectTy, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetBoolean, + art_portable_hl_aget_boolean, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetByte, + art_portable_hl_aget_byte, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetChar, + art_portable_hl_aget_char, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetShort, + art_portable_hl_aget_short, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +// void art_portable_aput_[type](int optFlags, [type] value, JavaObject* array, uint32_t index) +_EVAL_DEF_INTRINSICS_FUNC(HLArrayPut, + art_portable_hl_aput, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutFloat, + art_portable_hl_aput_float, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kFloatTy, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutWide, + art_portable_hl_aput_wide, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kInt64Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutDouble, + art_portable_hl_aput_double, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kDoubleTy, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutObject, + art_portable_hl_aput_object, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kJavaObjectTy, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutBoolean, + art_portable_hl_aput_boolean, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutByte, + art_portable_hl_aput_byte, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutChar, + art_portable_hl_aput_char, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutShort, + art_portable_hl_aput_short, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty)) + +//---------------------------------------------------------------------------- +// High-level Instance get/put +// +// Similar to art_portable_iget/iput_xxx, but checks not yet performed. +// OptFlags contain info describing whether frontend has determined that +// null check may be skipped. +// +// [type] void art_portable_hl_iget_[type](int optFlags, JavaObject* obj, uint32_t field_idx) +_EVAL_DEF_INTRINSICS_FUNC(HLIGet, + art_portable_hl_iget, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIGetFloat, + art_portable_hl_iget_float, + kAttrReadOnly | kAttrNoThrow, + kFloatTy, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIGetWide, + art_portable_hl_iget_wide, + kAttrReadOnly | kAttrNoThrow, + kInt64Ty, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIGetDouble, + art_portable_hl_iget_double, + kAttrReadOnly | kAttrNoThrow, + kDoubleTy, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIGetObject, + art_portable_hl_iget_object, + kAttrReadOnly | kAttrNoThrow, + kJavaObjectTy, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIGetBoolean, + art_portable_hl_iget_boolean, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIGetByte, + art_portable_hl_iget_byte, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIGetChar, + art_portable_hl_iget_char, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIGetShort, + art_portable_hl_iget_short, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty)) + +// void art_portable_iput_[type](int optFlags, [type] value, JavaObject* obj, uint32_t field_idx) +_EVAL_DEF_INTRINSICS_FUNC(HLIPut, + art_portable_hl_iput, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIPutFloat, + art_portable_hl_iput_float, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kFloatTy, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIPutWide, + art_portable_hl_iput_wide, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kInt64Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIPutDouble, + art_portable_hl_iput_double, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kDoubleTy, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIPutObject, + art_portable_hl_iput_object, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kJavaObjectTy, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIPutBoolean, + art_portable_hl_iput_boolean, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIPutByte, + art_portable_hl_iput_byte, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIPutChar, + art_portable_hl_iput_char, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(HLIPutShort, + art_portable_hl_iput_short, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty)) + +//---------------------------------------------------------------------------- +// High-level Invokes (fast-path determination not yet performed) +// +// NOTE: We expect these intrinsics to be temporary. Once calling conventions are +// fully merged, the unified front end will lower down to the +// InvokeRetxxx() intrinsics in the next section and these will be +// removed. +// +// arg0: InvokeType [ignored if FilledNewArray] +// arg1: method_idx [ignored if FilledNewArray] +// arg2: optimization_flags (primary to note whether null checking is needed) +// [arg3..argN]: actual arguments +//---------------------------------------------------------------------------- +// INVOKE method returns void +_EVAL_DEF_INTRINSICS_FUNC(HLInvokeVoid, + art_portable_hl_invoke.void, + kAttrNone, + kVoidTy, + _EXPAND_ARG1(kVarArgTy)) + +// INVOKE method returns object +_EVAL_DEF_INTRINSICS_FUNC(HLInvokeObj, + art_portable_hl_invoke.obj, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG1(kVarArgTy)) + +// INVOKE method returns int +_EVAL_DEF_INTRINSICS_FUNC(HLInvokeInt, + art_portable_hl_invoke.i32, + kAttrNone, + kInt32Ty, + _EXPAND_ARG1(kVarArgTy)) + +// INVOKE method returns float +_EVAL_DEF_INTRINSICS_FUNC(HLInvokeFloat, + art_portable_hl_invoke.f32, + kAttrNone, + kFloatTy, + _EXPAND_ARG1(kVarArgTy)) + +// INVOKE method returns long +_EVAL_DEF_INTRINSICS_FUNC(HLInvokeLong, + art_portable_hl_invoke.i64, + kAttrNone, + kInt64Ty, + _EXPAND_ARG1(kVarArgTy)) + +// INVOKE method returns double +_EVAL_DEF_INTRINSICS_FUNC(HLInvokeDouble, + art_portable_hl_invoke.f64, + kAttrNone, + kDoubleTy, + _EXPAND_ARG1(kVarArgTy)) + +// FILLED_NEW_ARRAY returns object +_EVAL_DEF_INTRINSICS_FUNC(HLFilledNewArray, + art_portable_hl_filled_new_array, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG1(kVarArgTy)) + +//---------------------------------------------------------------------------- +// Invoke +//---------------------------------------------------------------------------- + +// Method* art_portable_find_static_method_with_access_check(uint32_t method_idx, +// JavaObject* this, +// Method* referrer, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(FindStaticMethodWithAccessCheck, + art_portable_find_static_method_with_access_check, + kAttrNone, + kJavaMethodTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaObjectTy, kJavaMethodTy, kJavaThreadTy)) + +// Method* art_portable_find_direct_method_with_access_check(uint32_t method_idx, +// JavaObject* this, +// Method* referrer, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(FindDirectMethodWithAccessCheck, + art_portable_find_direct_method_with_access_check, + kAttrNone, + kJavaMethodTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaObjectTy, kJavaMethodTy, kJavaThreadTy)) + +// Method* art_portable_find_virtual_method_with_access_check(uint32_t method_idx, +// JavaObject* this, +// Method* referrer, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(FindVirtualMethodWithAccessCheck, + art_portable_find_virtual_method_with_access_check, + kAttrNone, + kJavaMethodTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaObjectTy, kJavaMethodTy, kJavaThreadTy)) + +// Method* art_portable_find_super_method_with_access_check(uint32_t method_idx, +// JavaObject* this, +// Method* referrer, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(FindSuperMethodWithAccessCheck, + art_portable_find_super_method_with_access_check, + kAttrNone, + kJavaMethodTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaObjectTy, kJavaMethodTy, kJavaThreadTy)) + +// Method* art_portable_find_interface_method_with_access_check(uint32_t method_idx, +// JavaObject* this, +// Method* referrer, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(FindInterfaceMethodWithAccessCheck, + art_portable_find_interface_method_with_access_check, + kAttrNone, + kJavaMethodTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaObjectTy, kJavaMethodTy, kJavaThreadTy)) + +// Method* art_portable_get_sd_callee_method_obj_addr(uint32_t method_idx) +_EVAL_DEF_INTRINSICS_FUNC(GetSDCalleeMethodObjAddrFast, + art_portable_get_sd_callee_method_obj_addr_fast, + kAttrReadOnly | kAttrNoThrow, + kJavaMethodTy, + _EXPAND_ARG1(kInt32ConstantTy)) + +// Method* art_portable_get_virtual_callee_method_obj_addr(uint32_t vtable_idx, +// JavaObject* this) +_EVAL_DEF_INTRINSICS_FUNC(GetVirtualCalleeMethodObjAddrFast, + art_portable_get_virtual_callee_method_obj_addr_fast, + kAttrReadOnly | kAttrNoThrow, + kJavaMethodTy, + _EXPAND_ARG2(kInt32ConstantTy, kJavaObjectTy)) + +// Method* art_portable_get_interface_callee_method_obj_addr(uint32_t method_idx, +// JavaObject* this, +// Method* referrer, +// Thread* thread) +_EVAL_DEF_INTRINSICS_FUNC(GetInterfaceCalleeMethodObjAddrFast, + art_portable_get_interface_callee_method_obj_addr_fast, + kAttrNone, + kJavaMethodTy, + _EXPAND_ARG4(kInt32ConstantTy, kJavaObjectTy, kJavaMethodTy, kJavaThreadTy)) + +// [type] art_portable_invoke.[type](Method* callee, ...) +// INVOKE method returns void +_EVAL_DEF_INTRINSICS_FUNC(InvokeRetVoid, + art_portable_invoke.void, + kAttrNone, + kVoidTy, + _EXPAND_ARG2(kJavaMethodTy, kVarArgTy)) + +// INVOKE method returns the value of type boolean +_EVAL_DEF_INTRINSICS_FUNC(InvokeRetBoolean, + art_portable_invoke.bool, + kAttrNone, + kInt1Ty, + _EXPAND_ARG2(kJavaMethodTy, kVarArgTy)) + +// INVOKE method returns the value of type byte +_EVAL_DEF_INTRINSICS_FUNC(InvokeRetByte, + art_portable_invoke.byte, + kAttrNone, + kInt8Ty, + _EXPAND_ARG2(kJavaMethodTy, kVarArgTy)) + +// INVOKE method returns the value of type char +_EVAL_DEF_INTRINSICS_FUNC(InvokeRetChar, + art_portable_invoke.char, + kAttrNone, + kInt16Ty, + _EXPAND_ARG2(kJavaMethodTy, kVarArgTy)) + +// INVOKE method returns the value of type short +_EVAL_DEF_INTRINSICS_FUNC(InvokeRetShort, + art_portable_invoke.short, + kAttrNone, + kInt16Ty, + _EXPAND_ARG2(kJavaMethodTy, kVarArgTy)) + +// INVOKE method returns the value of type int +_EVAL_DEF_INTRINSICS_FUNC(InvokeRetInt, + art_portable_invoke.int, + kAttrNone, + kInt32Ty, + _EXPAND_ARG2(kJavaMethodTy, kVarArgTy)) + +// INVOKE method returns the value of type long +_EVAL_DEF_INTRINSICS_FUNC(InvokeRetLong, + art_portable_invoke.long, + kAttrNone, + kInt64Ty, + _EXPAND_ARG2(kJavaMethodTy, kVarArgTy)) + +// INVOKE method returns the value of type float +_EVAL_DEF_INTRINSICS_FUNC(InvokeRetFloat, + art_portable_invoke.float, + kAttrNone, + kFloatTy, + _EXPAND_ARG2(kJavaMethodTy, kVarArgTy)) + +// INVOKE method returns the value of type double +_EVAL_DEF_INTRINSICS_FUNC(InvokeRetDouble, + art_portable_invoke.double, + kAttrNone, + kDoubleTy, + _EXPAND_ARG2(kJavaMethodTy, kVarArgTy)) + +// INVOKE method returns the value of type "object" +_EVAL_DEF_INTRINSICS_FUNC(InvokeRetObject, + art_portable_invoke.object, + kAttrNone, + kJavaObjectTy, + _EXPAND_ARG2(kJavaMethodTy, kVarArgTy)) + +//---------------------------------------------------------------------------- +// Math +//---------------------------------------------------------------------------- + +// int art_portable_{div,rem}_int(int a, int b) +_EVAL_DEF_INTRINSICS_FUNC(DivInt, + art_portable_div_int, + kAttrReadNone | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG2(kInt32Ty, kInt32Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(RemInt, + art_portable_rem_int, + kAttrReadNone | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG2(kInt32Ty, kInt32Ty)) + +// long art_portable_{div,rem}_long(long a, long b) +_EVAL_DEF_INTRINSICS_FUNC(DivLong, + art_portable_div_long, + kAttrReadNone | kAttrNoThrow, + kInt64Ty, + _EXPAND_ARG2(kInt64Ty, kInt64Ty)) + +_EVAL_DEF_INTRINSICS_FUNC(RemLong, + art_portable_rem_long, + kAttrReadNone | kAttrNoThrow, + kInt64Ty, + _EXPAND_ARG2(kInt64Ty, kInt64Ty)) + +// int64_t art_portable_d2l(double f) +_EVAL_DEF_INTRINSICS_FUNC(D2L, + art_portable_d2l, + kAttrReadNone | kAttrNoThrow, + kInt64Ty, + _EXPAND_ARG1(kDoubleTy)) + +// int32_t art_portable_d2l(double f) +_EVAL_DEF_INTRINSICS_FUNC(D2I, + art_portable_d2i, + kAttrReadNone | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kDoubleTy)) + +// int64_t art_portable_f2l(float f) +_EVAL_DEF_INTRINSICS_FUNC(F2L, + art_portable_f2l, + kAttrReadNone | kAttrNoThrow, + kInt64Ty, + _EXPAND_ARG1(kFloatTy)) + +// int32_t art_portable_f2i(float f) +_EVAL_DEF_INTRINSICS_FUNC(F2I, + art_portable_f2i, + kAttrReadNone | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kFloatTy)) + +//---------------------------------------------------------------------------- +// sput intrinsics to assist MIR to Greenland_ir conversion. +// "HL" versions - will be deprecated when fast/slow path handling done +// in the common frontend. +//---------------------------------------------------------------------------- + +// void sput_hl(int field_idx, int val) +_EVAL_DEF_INTRINSICS_FUNC(HLSput, + art_portable_hl_sput, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32Ty, kInt32Ty)) + +// void sput_hl_object(int field_idx, object* val) +_EVAL_DEF_INTRINSICS_FUNC(HLSputObject, + art_portable_hl_sput_object, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32Ty, kJavaObjectTy)) + +// void sput_hl_boolean(int field_idx, kInt1Ty) +_EVAL_DEF_INTRINSICS_FUNC(HLSputBoolean, + art_portable_hl_sput_boolean, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32Ty, kInt32Ty)) + +// void sput_hl_byte(int field_idx, int val) +_EVAL_DEF_INTRINSICS_FUNC(HLSputByte, + art_portable_hl_sput_byte, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32Ty, kInt32Ty)) + +// void sput_hl_char(int field_idx, kInt16Ty val) +_EVAL_DEF_INTRINSICS_FUNC(HLSputChar, + art_portable_hl_sput_char, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32Ty, kInt32Ty)) + +// void sput_hl_short(int field_idx, int val) +_EVAL_DEF_INTRINSICS_FUNC(HLSputShort, + art_portable_hl_sput_short, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32Ty, kInt32Ty)) + +// void sput_hl_wide(int field_idx, long val) +_EVAL_DEF_INTRINSICS_FUNC(HLSputWide, + art_portable_hl_sput_wide, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32Ty, kInt64Ty)) + +// void sput_hl_double(int field_idx, double val) +_EVAL_DEF_INTRINSICS_FUNC(HLSputDouble, + art_portable_hl_sput_double, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32Ty, kDoubleTy)) + +// void sput_hl_float(int field_idx, float val) +_EVAL_DEF_INTRINSICS_FUNC(HLSputFloat, + art_portable_hl_sput_float, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32Ty, kFloatTy)) + +//---------------------------------------------------------------------------- +// sget intrinsics to assist MIR to Greenland_ir conversion. +// "HL" versions - will be deprecated when fast/slow path handling done +// in the common frontend. +//---------------------------------------------------------------------------- + +// int sget_hl(int field_idx) +_EVAL_DEF_INTRINSICS_FUNC(HLSget, + art_portable_hl_sget, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kInt32Ty)) + +// object* sget_hl_object(int field_idx) +_EVAL_DEF_INTRINSICS_FUNC(HLSgetObject, + art_portable_hl_sget_object, + kAttrReadOnly | kAttrNoThrow, + kJavaObjectTy, + _EXPAND_ARG1(kInt32Ty)) + +// boolean sget_hl_boolean(int field_idx) +_EVAL_DEF_INTRINSICS_FUNC(HLSgetBoolean, + art_portable_hl_sget_boolean, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kInt32Ty)) + +// byte sget_hl_byte(int field_idx) +_EVAL_DEF_INTRINSICS_FUNC(HLSgetByte, + art_portable_hl_sget_byte, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kInt32Ty)) + +// char sget_hl_char(int field_idx) +_EVAL_DEF_INTRINSICS_FUNC(HLSgetChar, + art_portable_hl_sget_char, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kInt32Ty)) + +// char sget_hl_short(int field_idx) +_EVAL_DEF_INTRINSICS_FUNC(HLSgetShort, + art_portable_hl_sget_short, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kInt32Ty)) + +// char sget_hl_wide(int field_idx) +_EVAL_DEF_INTRINSICS_FUNC(HLSgetWide, + art_portable_hl_sget_wide, + kAttrReadOnly | kAttrNoThrow, + kInt64Ty, + _EXPAND_ARG1(kInt32Ty)) + +// char sget_hl_double(int field_idx) +_EVAL_DEF_INTRINSICS_FUNC(HLSgetDouble, + art_portable_hl_sget_double, + kAttrReadOnly | kAttrNoThrow, + kDoubleTy, + _EXPAND_ARG1(kInt32Ty)) + +// char sget_hl_float(int field_idx) +_EVAL_DEF_INTRINSICS_FUNC(HLSgetFloat, + art_portable_hl_sget_float, + kAttrReadOnly | kAttrNoThrow, + kFloatTy, + _EXPAND_ARG1(kInt32Ty)) +//---------------------------------------------------------------------------- +// Monitor enter/exit +//---------------------------------------------------------------------------- +// uint32_t art_portable_monitor_enter(int optFlags, JavaObject* obj) +_EVAL_DEF_INTRINSICS_FUNC(MonitorEnter, + art_portable_monitor_enter, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32Ty, kJavaObjectTy)) + +// uint32_t art_portable_monitor_exit(int optFlags, JavaObject* obj) +_EVAL_DEF_INTRINSICS_FUNC(MonitorExit, + art_portable_monitor_exit, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32Ty, kJavaObjectTy)) + +//---------------------------------------------------------------------------- +// Shadow Frame +//---------------------------------------------------------------------------- + +// void art_portable_alloca_shadow_frame(int num_entry) +_EVAL_DEF_INTRINSICS_FUNC(AllocaShadowFrame, + art_portable_alloca_shadow_frame, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG1(kInt32ConstantTy)) + +// void art_portable_set_vreg(int entry_idx, ...) +_EVAL_DEF_INTRINSICS_FUNC(SetVReg, + art_portable_set_vreg, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG2(kInt32ConstantTy, kVarArgTy)) + +// void art_portable_pop_shadow_frame() +_EVAL_DEF_INTRINSICS_FUNC(PopShadowFrame, + art_portable_pop_shadow_frame, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG0()) + +// void art_portable_update_dex_pc(uint32_t dex_pc) +_EVAL_DEF_INTRINSICS_FUNC(UpdateDexPC, + art_portable_update_dex_pc, + kAttrNoThrow, + kVoidTy, + _EXPAND_ARG1(kInt32ConstantTy)) + +//---------------------------------------------------------------------------- +// FP Comparison +//---------------------------------------------------------------------------- +// int cmpl_float(float, float) +_EVAL_DEF_INTRINSICS_FUNC(CmplFloat, + art_portable_cmpl_float, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG2(kFloatTy, kFloatTy)) + +// int cmpg_float(float, float) +_EVAL_DEF_INTRINSICS_FUNC(CmpgFloat, + art_portable_cmpg_float, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG2(kFloatTy, kFloatTy)) + +// int cmpl_double(double, double) +_EVAL_DEF_INTRINSICS_FUNC(CmplDouble, + art_portable_cmpl_double, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG2(kDoubleTy, kDoubleTy)) + +// int cmpg_double(double, double) +_EVAL_DEF_INTRINSICS_FUNC(CmpgDouble, + art_portable_cmpg_double, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG2(kDoubleTy, kDoubleTy)) + +//---------------------------------------------------------------------------- +// Long Comparison +//---------------------------------------------------------------------------- +// int cmp_long(long, long) +_EVAL_DEF_INTRINSICS_FUNC(CmpLong, + art_portable_cmp_long, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG2(kInt64Ty, kInt64Ty)) + +//---------------------------------------------------------------------------- +// Const intrinsics to assist MIR to Greenland_ir conversion. Should not materialize +// For simplicity, all use integer input +//---------------------------------------------------------------------------- +// int const_int(int) +_EVAL_DEF_INTRINSICS_FUNC(ConstInt, + art_portable_const_int, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kInt32Ty)) + +// JavaObject* const_obj(int) +_EVAL_DEF_INTRINSICS_FUNC(ConstObj, + art_portable_const_obj, + kAttrReadOnly | kAttrNoThrow, + kJavaObjectTy, + _EXPAND_ARG1(kInt32Ty)) + +// long const_long(long) +_EVAL_DEF_INTRINSICS_FUNC(ConstLong, + art_portable_const_long, + kAttrReadOnly | kAttrNoThrow, + kInt64Ty, + _EXPAND_ARG1(kInt64Ty)) + +// float const_float(int) +_EVAL_DEF_INTRINSICS_FUNC(ConstFloat, + art_portable_const_Float, + kAttrReadOnly | kAttrNoThrow, + kFloatTy, + _EXPAND_ARG1(kInt32Ty)) + +// double const_double(long) +_EVAL_DEF_INTRINSICS_FUNC(ConstDouble, + art_portable_const_Double, + kAttrReadOnly | kAttrNoThrow, + kDoubleTy, + _EXPAND_ARG1(kInt64Ty)) + + +//---------------------------------------------------------------------------- +// Copy intrinsics to assist MIR to Greenland_ir conversion. Should not materialize +//---------------------------------------------------------------------------- + +// void method_info(void) +_EVAL_DEF_INTRINSICS_FUNC(MethodInfo, + art_portable_method_info, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG0()) + +// int copy_int(int) +_EVAL_DEF_INTRINSICS_FUNC(CopyInt, + art_portable_copy_int, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kInt32Ty)) + +// JavaObject* copy_obj(obj) +_EVAL_DEF_INTRINSICS_FUNC(CopyObj, + art_portable_copy_obj, + kAttrReadOnly | kAttrNoThrow, + kJavaObjectTy, + _EXPAND_ARG1(kJavaObjectTy)) + +// long copy_long(long) +_EVAL_DEF_INTRINSICS_FUNC(CopyLong, + art_portable_copy_long, + kAttrReadOnly | kAttrNoThrow, + kInt64Ty, + _EXPAND_ARG1(kInt64Ty)) + +// float copy_float(float) +_EVAL_DEF_INTRINSICS_FUNC(CopyFloat, + art_portable_copy_Float, + kAttrReadOnly | kAttrNoThrow, + kFloatTy, + _EXPAND_ARG1(kFloatTy)) + +// double copy_double(double) +_EVAL_DEF_INTRINSICS_FUNC(CopyDouble, + art_portable_copy_Double, + kAttrReadOnly | kAttrNoThrow, + kDoubleTy, + _EXPAND_ARG1(kDoubleTy)) + +//---------------------------------------------------------------------------- +// Shift intrinsics. Shift semantics for Dalvik are a bit different than +// the llvm shift operators. For 32-bit shifts, the shift count is constrained +// to the range of 0..31, while for 64-bit shifts we limit to 0..63. +// Further, the shift count for Long shifts in Dalvik is 32 bits, while +// llvm requires a 64-bit shift count. For GBC, we represent shifts as an +// intrinsic to allow most efficient target-dependent lowering. +//---------------------------------------------------------------------------- +// long shl_long(long,int) +_EVAL_DEF_INTRINSICS_FUNC(SHLLong, + art_portable_shl_long, + kAttrReadOnly | kAttrNoThrow, + kInt64Ty, + _EXPAND_ARG2(kInt64Ty,kInt32Ty)) +// long shr_long(long,int) +_EVAL_DEF_INTRINSICS_FUNC(SHRLong, + art_portable_shr_long, + kAttrReadOnly | kAttrNoThrow, + kInt64Ty, + _EXPAND_ARG2(kInt64Ty,kInt32Ty)) +// long ushr_long(long,int) +_EVAL_DEF_INTRINSICS_FUNC(USHRLong, + art_portable_ushl_long, + kAttrReadOnly | kAttrNoThrow, + kInt64Ty, + _EXPAND_ARG2(kInt64Ty,kInt32Ty)) +// int shl_int(int,int) +_EVAL_DEF_INTRINSICS_FUNC(SHLInt, + art_portable_shl_int, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG2(kInt32Ty,kInt32Ty)) +// long shr_int(int,int) +_EVAL_DEF_INTRINSICS_FUNC(SHRInt, + art_portable_shr_int, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG2(kInt32Ty,kInt32Ty)) +// int ushr_long(int,int) +_EVAL_DEF_INTRINSICS_FUNC(USHRInt, + art_portable_ushl_int, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG2(kInt32Ty,kInt32Ty)) +//---------------------------------------------------------------------------- +// Conversion instrinsics. Note: these should eventually be removed. We +// can express these directly in bitcode, but by using intrinsics the +// Quick compiler can be more efficient. Some extra optimization infrastructure +// will have to be developed to undo the bitcode verbosity when these are +// done inline. +//---------------------------------------------------------------------------- +// int int_to_byte(int) +_EVAL_DEF_INTRINSICS_FUNC(IntToByte, + art_portable_int_to_byte, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kInt32Ty)) + +// int int_to_char(int) +_EVAL_DEF_INTRINSICS_FUNC(IntToChar, + art_portable_int_to_char, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kInt32Ty)) + +// int int_to_short(int) +_EVAL_DEF_INTRINSICS_FUNC(IntToShort, + art_portable_int_to_short, + kAttrReadOnly | kAttrNoThrow, + kInt32Ty, + _EXPAND_ARG1(kInt32Ty)) + +//---------------------------------------------------------------------------- +// Memory barrier +//---------------------------------------------------------------------------- +// void constructor_barrier() +_EVAL_DEF_INTRINSICS_FUNC(ConstructorBarrier, + art_portable_constructor_barrier, + kAttrReadOnly | kAttrNoThrow, + kVoidTy, + _EXPAND_ARG0()) + +// Clean up all internal used macros +#undef _EXPAND_ARG0 +#undef _EXPAND_ARG1 +#undef _EXPAND_ARG2 +#undef _EXPAND_ARG3 +#undef _EXPAND_ARG4 +#undef _EXPAND_ARG5 + +#undef _JTYPE_OF_kInt1Ty_UNDER_kArray +#undef _JTYPE_OF_kInt8Ty_UNDER_kArray +#undef _JTYPE_OF_kInt16Ty_UNDER_kArray +#undef _JTYPE_OF_kInt32Ty_UNDER_kArray +#undef _JTYPE_OF_kInt64Ty_UNDER_kArray +#undef _JTYPE_OF_kJavaObjectTy_UNDER_kArray + +#undef _JTYPE_OF_kInt1Ty_UNDER_kField +#undef _JTYPE_OF_kInt8Ty_UNDER_kField +#undef _JTYPE_OF_kInt16Ty_UNDER_kField +#undef _JTYPE_OF_kInt32Ty_UNDER_kField +#undef _JTYPE_OF_kInt64Ty_UNDER_kField +#undef _JTYPE_OF_kJavaObjectTy_UNDER_kField + +#undef DEF_INTRINSICS_FUNC |