• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// DEF_INTRINSICS_FUNC(ID, NAME, ATTR, RET_TYPE,
18//                     ARG1_TYPE, ARG2_TYPE, ARG3_TYPE, ARG4_TYPE, ARG5_TYPE)
19#ifndef DEF_INTRINSICS_FUNC
20#  error "missing DEF_INTRINSICS_FUNC definition!"
21#endif
22
23#define _EVAL_DEF_INTRINSICS_FUNC(ID, NAME, ATTR, RET_TYPE, ...) \
24    DEF_INTRINSICS_FUNC(ID, NAME, ATTR, RET_TYPE, __VA_ARGS__)
25
26#define _EXPAND_ARG0()                         kNone, kNone, kNone, kNone, kNone
27#define _EXPAND_ARG1(ARG1)                      ARG1, kNone, kNone, kNone, kNone
28#define _EXPAND_ARG2(ARG1, ARG2)                ARG1,  ARG2, kNone, kNone, kNone
29#define _EXPAND_ARG3(ARG1, ARG2, ARG3)          ARG1,  ARG2,  ARG3, kNone, kNone
30#define _EXPAND_ARG4(ARG1, ARG2, ARG3, ARG4)    ARG1,  ARG2,  ARG3,  ARG4, kNone
31#define _EXPAND_ARG5(ARG1, ARG2, ARG3, ARG4, ARG5) \
32                                                ARG1,  ARG2,  ARG3,  ARG4,  ARG5
33
34#define _JTYPE(TYPE, SPACE) _JTYPE_OF_ ## TYPE ## _UNDER_ ## SPACE
35
36// Note: These should be consistent with the type return from
37// IRBuilder::GetJType([type], kArray).
38#define _JTYPE_OF_kInt1Ty_UNDER_kArray        kInt8Ty
39#define _JTYPE_OF_kInt8Ty_UNDER_kArray        kInt8Ty
40#define _JTYPE_OF_kInt16Ty_UNDER_kArray       kInt16Ty
41#define _JTYPE_OF_kInt32Ty_UNDER_kArray       kInt32Ty
42#define _JTYPE_OF_kInt64Ty_UNDER_kArray       kInt64Ty
43#define _JTYPE_OF_kJavaObjectTy_UNDER_kArray  kJavaObjectTy
44
45// Note: These should be consistent with the type return from
46// IRBuilder::GetJType([type], kField).
47#define _JTYPE_OF_kInt1Ty_UNDER_kField        kInt32Ty
48#define _JTYPE_OF_kInt8Ty_UNDER_kField        kInt32Ty
49#define _JTYPE_OF_kInt16Ty_UNDER_kField       kInt32Ty
50#define _JTYPE_OF_kInt32Ty_UNDER_kField       kInt32Ty
51#define _JTYPE_OF_kInt64Ty_UNDER_kField       kInt64Ty
52#define _JTYPE_OF_kJavaObjectTy_UNDER_kField  kJavaObjectTy
53
54//----------------------------------------------------------------------------
55// Thread
56//----------------------------------------------------------------------------
57
58// Thread* art_portable_get_current_thread()
59_EVAL_DEF_INTRINSICS_FUNC(GetCurrentThread,
60                          art_portable_get_current_thread,
61                          kAttrReadNone | kAttrNoThrow,
62                          kJavaThreadTy,
63                          _EXPAND_ARG0())
64
65// void art_portable_test_suspend(Thread* thread)
66_EVAL_DEF_INTRINSICS_FUNC(TestSuspend,
67                          art_portable_test_suspend,
68                          kAttrNoThrow,
69                          kVoidTy,
70                          _EXPAND_ARG1(kJavaThreadTy))
71
72// void art_portable_check_suspend() /* Expands to GetCurrentThread/TestSuspend */
73_EVAL_DEF_INTRINSICS_FUNC(CheckSuspend,
74                          art_portable_check_suspend,
75                          kAttrNoThrow,
76                          kVoidTy,
77                          _EXPAND_ARG0())
78
79// void art_portable_mark_gc_card(Object* new_value, Object* object)
80_EVAL_DEF_INTRINSICS_FUNC(MarkGCCard,
81                          art_portable_mark_gc_card,
82                          kAttrNoThrow,
83                          kVoidTy,
84                          _EXPAND_ARG2(kJavaObjectTy, kJavaObjectTy))
85
86//----------------------------------------------------------------------------
87// Exception
88//----------------------------------------------------------------------------
89
90// Should not expand - introduces the catch targets for a potentially
91// throwing instruction.  The result is a switch key and this
92// instruction will be followed by a switch statement.  The catch
93// targets will be enumerated as cases of the switch, with the fallthrough
94// designating the block containing the potentially throwing instruction.
95// bool art_portable_catch_targets(int dex_pc)
96_EVAL_DEF_INTRINSICS_FUNC(CatchTargets,
97                          art_portable_catch_targets,
98                          kAttrReadOnly | kAttrNoThrow,
99                          kInt32Ty,
100                          _EXPAND_ARG1(kInt32ConstantTy))
101
102// void art_portable_throw_exception(JavaObject* exception)
103_EVAL_DEF_INTRINSICS_FUNC(ThrowException,
104                          art_portable_throw_exception,
105                          kAttrDoThrow,
106                          kVoidTy,
107                          _EXPAND_ARG1(kJavaObjectTy))
108
109// void art_portable_hl_throw_exception(JavaObject* exception)
110_EVAL_DEF_INTRINSICS_FUNC(HLThrowException,
111                          art_portable_hl_throw_exception,
112                          kAttrDoThrow,
113                          kVoidTy,
114                          _EXPAND_ARG1(kJavaObjectTy))
115
116// JavaObject* art_portable_get_current_exception()
117_EVAL_DEF_INTRINSICS_FUNC(GetException,
118                          art_portable_get_current_exception,
119                          kAttrReadOnly | kAttrNoThrow,
120                          kJavaObjectTy,
121                          _EXPAND_ARG0())
122
123// bool art_portable_is_exception_pending()
124_EVAL_DEF_INTRINSICS_FUNC(IsExceptionPending,
125                          art_portable_is_exception_pending,
126                          kAttrReadOnly | kAttrNoThrow,
127                          kInt1Ty,
128                          _EXPAND_ARG0())
129
130// int art_portable_find_catch_block(Method* method, int try_item_offset)
131_EVAL_DEF_INTRINSICS_FUNC(FindCatchBlock,
132                          art_portable_find_catch_block,
133                          kAttrReadOnly | kAttrNoThrow,
134                          kInt32Ty,
135                          _EXPAND_ARG2(kJavaMethodTy, kInt32ConstantTy))
136
137// void art_portable_throw_div_zero()
138_EVAL_DEF_INTRINSICS_FUNC(ThrowDivZeroException,
139                          art_portable_throw_div_zero,
140                          kAttrDoThrow,
141                          kVoidTy,
142                          _EXPAND_ARG0())
143
144// void art_portable_throw_null_pointer_exception(uint32_t dex_pc)
145_EVAL_DEF_INTRINSICS_FUNC(ThrowNullPointerException,
146                          art_portable_throw_null_pointer_exception,
147                          kAttrDoThrow,
148                          kVoidTy,
149                          _EXPAND_ARG1(kInt32ConstantTy))
150
151// void art_portable_throw_array_bounds(int index, int array_len)
152_EVAL_DEF_INTRINSICS_FUNC(ThrowIndexOutOfBounds,
153                          art_portable_throw_array_bounds,
154                          kAttrDoThrow,
155                          kVoidTy,
156                          _EXPAND_ARG2(kInt32Ty, kInt32Ty))
157
158//----------------------------------------------------------------------------
159// ConstString
160//----------------------------------------------------------------------------
161
162// JavaObject* art_portable_const_string(uint32_t string_idx)
163_EVAL_DEF_INTRINSICS_FUNC(ConstString,
164                          art_portable_const_string,
165                          kAttrReadOnly | kAttrNoThrow,
166                          kJavaObjectTy,
167                          _EXPAND_ARG1(kInt32ConstantTy))
168
169// JavaObject* art_portable_load_string_from_dex_cache(Method* method, uint32_t string_idx)
170_EVAL_DEF_INTRINSICS_FUNC(LoadStringFromDexCache,
171                          art_portable_load_string_from_dex_cache,
172                          kAttrReadOnly | kAttrNoThrow,
173                          kJavaObjectTy,
174                          _EXPAND_ARG1(kInt32ConstantTy))
175
176// JavaObject* art_portable_resolve_string(Method* method, uint32_t string_idx)
177_EVAL_DEF_INTRINSICS_FUNC(ResolveString,
178                          art_portable_resolve_string,
179                          kAttrNone,
180                          kJavaObjectTy,
181                          _EXPAND_ARG2(kJavaMethodTy, kInt32ConstantTy))
182
183//----------------------------------------------------------------------------
184// ConstClass
185//----------------------------------------------------------------------------
186
187// JavaObject* art_portable_const_class(uint32_t type_idx)
188_EVAL_DEF_INTRINSICS_FUNC(ConstClass,
189                          art_portable_const_class,
190                          kAttrReadOnly | kAttrNoThrow,
191                          kJavaObjectTy,
192                          _EXPAND_ARG1(kInt32ConstantTy))
193
194// JavaObject* art_portable_initialize_type_and_verify_access(uint32_t type_idx,
195//                                                        Method* referrer,
196//                                                        Thread* thread)
197_EVAL_DEF_INTRINSICS_FUNC(InitializeTypeAndVerifyAccess,
198                          art_portable_initialize_type_and_verify_access,
199                          kAttrNone,
200                          kJavaObjectTy,
201                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaThreadTy))
202
203// JavaObject* art_portable_load_type_from_dex_cache(uint32_t type_idx)
204_EVAL_DEF_INTRINSICS_FUNC(LoadTypeFromDexCache,
205                          art_portable_load_type_from_dex_cache,
206                          kAttrReadOnly | kAttrNoThrow,
207                          kJavaObjectTy,
208                          _EXPAND_ARG1(kInt32ConstantTy))
209
210// JavaObject* art_portable_initialize_type(uint32_t type_idx,
211//                                      Method* referrer,
212//                                      Thread* thread)
213_EVAL_DEF_INTRINSICS_FUNC(InitializeType,
214                          art_portable_initialize_type,
215                          kAttrNone,
216                          kJavaObjectTy,
217                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaThreadTy))
218
219//----------------------------------------------------------------------------
220// Lock
221//----------------------------------------------------------------------------
222
223// void art_portable_lock_object(JavaObject* obj, Thread* thread)
224_EVAL_DEF_INTRINSICS_FUNC(LockObject,
225                          art_portable_lock_object,
226                          kAttrNoThrow,
227                          kVoidTy,
228                          _EXPAND_ARG2(kJavaObjectTy, kJavaThreadTy))
229
230// void art_portable_unlock_object(JavaObject* obj, Thread* thread)
231_EVAL_DEF_INTRINSICS_FUNC(UnlockObject,
232                          art_portable_unlock_object,
233                          kAttrNone,
234                          kVoidTy,
235                          _EXPAND_ARG2(kJavaObjectTy, kJavaThreadTy))
236
237//----------------------------------------------------------------------------
238// Cast
239//----------------------------------------------------------------------------
240
241// void art_portable_check_cast(JavaObject* dest_type, JavaObject* src_type)
242_EVAL_DEF_INTRINSICS_FUNC(CheckCast,
243                          art_portable_check_cast,
244                          kAttrNone,
245                          kVoidTy,
246                          _EXPAND_ARG2(kJavaObjectTy, kJavaObjectTy))
247
248// void art_portable_hl_check_cast(uint32_t type_idx, JavaObject* obj)
249_EVAL_DEF_INTRINSICS_FUNC(HLCheckCast,
250                          art_portable_hl_check_cast,
251                          kAttrReadOnly | kAttrNoThrow,
252                          kVoidTy,
253                          _EXPAND_ARG2(kInt32ConstantTy, kJavaObjectTy))
254
255// int art_portable_is_assignable(JavaObject* dest_type, JavaObject* src_type)
256_EVAL_DEF_INTRINSICS_FUNC(IsAssignable,
257                          art_portable_is_assignable,
258                          kAttrReadOnly | kAttrNoThrow,
259                          kInt32Ty,
260                          _EXPAND_ARG2(kJavaObjectTy, kJavaObjectTy))
261
262//----------------------------------------------------------------------------
263// Allocation
264//----------------------------------------------------------------------------
265
266// JavaObject* art_portable_alloc_object(uint32_t type_idx,
267//                                   Method* referrer,
268//                                   Thread* thread)
269_EVAL_DEF_INTRINSICS_FUNC(AllocObject,
270                          art_portable_alloc_object,
271                          kAttrNone,
272                          kJavaObjectTy,
273                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaThreadTy))
274
275// JavaObject* art_portable_alloc_object_with_access_check(uint32_t type_idx,
276//                                                     Method* referrer,
277//                                                     Thread* thread)
278_EVAL_DEF_INTRINSICS_FUNC(AllocObjectWithAccessCheck,
279                          art_portable_alloc_object_with_access_check,
280                          kAttrNone,
281                          kJavaObjectTy,
282                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaThreadTy))
283
284//----------------------------------------------------------------------------
285// Instance
286//----------------------------------------------------------------------------
287
288// JavaObject* art_portable_new_instance(uint32_t type_idx)
289_EVAL_DEF_INTRINSICS_FUNC(NewInstance,
290                          art_portable_new_instance,
291                          kAttrNone,
292                          kJavaObjectTy,
293                          _EXPAND_ARG1(kInt32Ty))
294
295// bool art_portable_instance_of(uint32_t type_idx, JavaObject* ref)
296_EVAL_DEF_INTRINSICS_FUNC(InstanceOf,
297                          art_portable_instance_of,
298                          kAttrNone,
299                          kInt32Ty,
300                          _EXPAND_ARG2(kInt32Ty, kJavaObjectTy))
301
302//----------------------------------------------------------------------------
303// Array
304//----------------------------------------------------------------------------
305
306// JavaObject* art_portable_new_array(uint32_t type_idx, uint32_t array_size)
307_EVAL_DEF_INTRINSICS_FUNC(NewArray,
308                          art_portable_new_array,
309                          kAttrNone,
310                          kJavaObjectTy,
311                          _EXPAND_ARG2(kInt32ConstantTy, kInt32Ty))
312
313// uint32_t art_portable_opt_array_length(int32_t opt_flags, JavaObject* array)
314_EVAL_DEF_INTRINSICS_FUNC(OptArrayLength,
315                          art_portable_opt_array_length,
316                          kAttrReadOnly | kAttrNoThrow,
317                          kInt32Ty,
318                          _EXPAND_ARG2(kInt32Ty, kJavaObjectTy))
319
320// uint32_t art_portable_array_length(JavaObject* array)
321_EVAL_DEF_INTRINSICS_FUNC(ArrayLength,
322                          art_portable_array_length,
323                          kAttrReadOnly | kAttrNoThrow,
324                          kInt32Ty,
325                          _EXPAND_ARG1(kJavaObjectTy))
326
327// JavaObject* art_portable_alloc_array(uint32_t type_idx,
328//                                  Method* referrer,
329//                                  uint32_t length,
330//                                  Thread* thread)
331_EVAL_DEF_INTRINSICS_FUNC(AllocArray,
332                          art_portable_alloc_array,
333                          kAttrNone,
334                          kJavaObjectTy,
335                          _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kInt32Ty, kJavaThreadTy))
336
337// JavaObject* art_portable_alloc_array_with_access_check(uint32_t type_idx,
338//                                                    Method* referrer,
339//                                                    uint32_t length,
340//                                                    Thread* thread)
341_EVAL_DEF_INTRINSICS_FUNC(AllocArrayWithAccessCheck,
342                          art_portable_alloc_array_with_access_check,
343                          kAttrNone,
344                          kJavaObjectTy,
345                          _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kInt32Ty, kJavaThreadTy))
346
347// JavaObject* art_portable_check_and_alloc_array(uint32_t type_idx,
348//                                            Method* referrer,
349//                                            uint32_t length,
350//                                            Thread* thread)
351_EVAL_DEF_INTRINSICS_FUNC(CheckAndAllocArray,
352                          art_portable_check_and_alloc_array,
353                          kAttrNone,
354                          kJavaObjectTy,
355                          _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kInt32ConstantTy, kJavaThreadTy))
356
357// JavaObject* art_portable_check_and_alloc_array_with_access_check(uint32_t type_idx,
358//                                                              Method* referrer,
359//                                                              uint32_t length,
360//                                                              Thread* thread)
361_EVAL_DEF_INTRINSICS_FUNC(CheckAndAllocArrayWithAccessCheck,
362                          art_portable_check_and_alloc_array_with_access_check,
363                          kAttrNone,
364                          kJavaObjectTy,
365                          _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kInt32ConstantTy, kJavaThreadTy))
366
367// art_portable_aget_* and art_portable_aput_* never generate exception since the
368// necessary checking on arguments (e.g., array and index) has already done
369// before invocation of these intrinsics.
370//
371// [type] void art_portable_aget_[type](JavaObject* array, uint32_t index)
372_EVAL_DEF_INTRINSICS_FUNC(ArrayGet,
373                          art_portable_aget,
374                          kAttrReadOnly | kAttrNoThrow,
375                          _JTYPE(kInt32Ty, kArray),
376                          _EXPAND_ARG2(kJavaObjectTy, kInt32Ty))
377
378_EVAL_DEF_INTRINSICS_FUNC(ArrayGetWide,
379                          art_portable_aget_wide,
380                          kAttrReadOnly | kAttrNoThrow,
381                          _JTYPE(kInt64Ty, kArray),
382                          _EXPAND_ARG2(kJavaObjectTy, kInt32Ty))
383
384_EVAL_DEF_INTRINSICS_FUNC(ArrayGetObject,
385                          art_portable_aget_object,
386                          kAttrReadOnly | kAttrNoThrow,
387                          _JTYPE(kJavaObjectTy, kArray),
388                          _EXPAND_ARG2(kJavaObjectTy, kInt32Ty))
389
390_EVAL_DEF_INTRINSICS_FUNC(ArrayGetBoolean,
391                          art_portable_aget_boolean,
392                          kAttrReadOnly | kAttrNoThrow,
393                          _JTYPE(kInt1Ty, kArray),
394                          _EXPAND_ARG2(kJavaObjectTy, kInt32Ty))
395
396_EVAL_DEF_INTRINSICS_FUNC(ArrayGetByte,
397                          art_portable_aget_byte,
398                          kAttrReadOnly | kAttrNoThrow,
399                          _JTYPE(kInt8Ty, kArray),
400                          _EXPAND_ARG2(kJavaObjectTy, kInt32Ty))
401
402_EVAL_DEF_INTRINSICS_FUNC(ArrayGetChar,
403                          art_portable_aget_char,
404                          kAttrReadOnly | kAttrNoThrow,
405                          _JTYPE(kInt16Ty, kArray),
406                          _EXPAND_ARG2(kJavaObjectTy, kInt32Ty))
407
408_EVAL_DEF_INTRINSICS_FUNC(ArrayGetShort,
409                          art_portable_aget_short,
410                          kAttrReadOnly | kAttrNoThrow,
411                          _JTYPE(kInt16Ty, kArray),
412                          _EXPAND_ARG2(kJavaObjectTy, kInt32Ty))
413
414// void art_portable_aput_[type]([type] value, JavaObject* array, uint32_t index)
415_EVAL_DEF_INTRINSICS_FUNC(ArrayPut,
416                          art_portable_aput,
417                          kAttrNoThrow,
418                          kVoidTy,
419                          _EXPAND_ARG3(_JTYPE(kInt32Ty, kArray), kJavaObjectTy, kInt32Ty))
420
421_EVAL_DEF_INTRINSICS_FUNC(ArrayPutWide,
422                          art_portable_aput_wide,
423                          kAttrNoThrow,
424                          kVoidTy,
425                          _EXPAND_ARG3(_JTYPE(kInt64Ty, kArray), kJavaObjectTy, kInt32Ty))
426
427_EVAL_DEF_INTRINSICS_FUNC(ArrayPutObject,
428                          art_portable_aput_object,
429                          kAttrNoThrow,
430                          kVoidTy,
431                          _EXPAND_ARG3(_JTYPE(kJavaObjectTy, kArray), kJavaObjectTy, kInt32Ty))
432
433_EVAL_DEF_INTRINSICS_FUNC(ArrayPutBoolean,
434                          art_portable_aput_boolean,
435                          kAttrNoThrow,
436                          kVoidTy,
437                          _EXPAND_ARG3(_JTYPE(kInt1Ty, kArray), kJavaObjectTy, kInt32Ty))
438
439_EVAL_DEF_INTRINSICS_FUNC(ArrayPutByte,
440                          art_portable_aput_byte,
441                          kAttrNoThrow,
442                          kVoidTy,
443                          _EXPAND_ARG3(_JTYPE(kInt8Ty, kArray), kJavaObjectTy, kInt32Ty))
444
445_EVAL_DEF_INTRINSICS_FUNC(ArrayPutChar,
446                          art_portable_aput_char,
447                          kAttrNoThrow,
448                          kVoidTy,
449                          _EXPAND_ARG3(_JTYPE(kInt16Ty, kArray), kJavaObjectTy, kInt32Ty))
450
451_EVAL_DEF_INTRINSICS_FUNC(ArrayPutShort,
452                          art_portable_aput_short,
453                          kAttrNoThrow,
454                          kVoidTy,
455                          _EXPAND_ARG3(_JTYPE(kInt16Ty, kArray), kJavaObjectTy, kInt32Ty))
456
457// void art_portable_check_put_array_element(JavaObject* value, JavaObject* array)
458_EVAL_DEF_INTRINSICS_FUNC(CheckPutArrayElement,
459                          art_portable_check_put_array_element,
460                          kAttrNone,
461                          kVoidTy,
462                          _EXPAND_ARG2(kJavaObjectTy, kJavaObjectTy))
463
464// void art_portable_filled_new_array(Array* array,
465//                                uint32_t elem_jty, ...)
466_EVAL_DEF_INTRINSICS_FUNC(FilledNewArray,
467                          art_portable_filled_new_array,
468                          kAttrNoThrow,
469                          kVoidTy,
470                          _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kVarArgTy))
471
472// void art_portable_fill_array_data(Method* referrer,
473//                               uint32_t dex_pc,
474//                               Array* array,
475//                               uint32_t payload_offset)
476_EVAL_DEF_INTRINSICS_FUNC(FillArrayData,
477                          art_portable_fill_array_data,
478                          kAttrNone,
479                          kVoidTy,
480                          _EXPAND_ARG4(kJavaMethodTy, kInt32ConstantTy, kJavaObjectTy, kInt32ConstantTy))
481
482// void art_portable_hl_fill_array_data(int32_t offset, JavaObject* array)
483_EVAL_DEF_INTRINSICS_FUNC(HLFillArrayData,
484                          art_portable_hl_fill_array_data,
485                          kAttrNone,
486                          kVoidTy,
487                          _EXPAND_ARG2(kInt32ConstantTy, kJavaObjectTy))
488
489//----------------------------------------------------------------------------
490// Instance Field
491//----------------------------------------------------------------------------
492
493// [type] art_portable_iget_[type](uint32_t field_idx,
494//                             Method* referrer,
495//                             JavaObject* obj)
496_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGet,
497                          art_portable_iget,
498                          kAttrNone,
499                          _JTYPE(kInt32Ty, kField),
500                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy))
501
502_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetWide,
503                          art_portable_iget_wide,
504                          kAttrNone,
505                          _JTYPE(kInt64Ty, kField),
506                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy))
507
508_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetObject,
509                          art_portable_iget_object,
510                          kAttrNone,
511                          _JTYPE(kJavaObjectTy, kField),
512                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy))
513
514_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetBoolean,
515                          art_portable_iget_boolean,
516                          kAttrNone,
517                          _JTYPE(kInt1Ty, kField),
518                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy))
519
520_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetByte,
521                          art_portable_iget_byte,
522                          kAttrNone,
523                          _JTYPE(kInt8Ty, kField),
524                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy))
525
526_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetChar,
527                          art_portable_iget_char,
528                          kAttrNone,
529                          _JTYPE(kInt16Ty, kField),
530                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy))
531
532_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetShort,
533                          art_portable_iget_short,
534                          kAttrNone,
535                          _JTYPE(kInt16Ty, kField),
536                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy))
537
538// [type] art_portable_iget_[type].fast(int field_offset,
539//                                  bool is_volatile,
540//                                  JavaObject* obj)
541_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetFast,
542                          art_portable_iget.fast,
543                          kAttrReadOnly | kAttrNoThrow,
544                          _JTYPE(kInt32Ty, kField),
545                          _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy))
546
547_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetWideFast,
548                          art_portable_iget_wide.fast,
549                          kAttrReadOnly | kAttrNoThrow,
550                          _JTYPE(kInt64Ty, kField),
551                          _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy))
552
553_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetObjectFast,
554                          art_portable_iget_object.fast,
555                          kAttrReadOnly | kAttrNoThrow,
556                          _JTYPE(kJavaObjectTy, kField),
557                          _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy))
558
559_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetBooleanFast,
560                          art_portable_iget_boolean.fast,
561                          kAttrReadOnly | kAttrNoThrow,
562                          _JTYPE(kInt1Ty, kField),
563                          _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy))
564
565_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetByteFast,
566                          art_portable_iget_byte.fast,
567                          kAttrReadOnly | kAttrNoThrow,
568                          _JTYPE(kInt8Ty, kField),
569                          _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy))
570
571_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetCharFast,
572                          art_portable_iget_char.fast,
573                          kAttrReadOnly | kAttrNoThrow,
574                          _JTYPE(kInt16Ty, kField),
575                          _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy))
576
577_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldGetShortFast,
578                          art_portable_iget_short.fast,
579                          kAttrReadOnly | kAttrNoThrow,
580                          _JTYPE(kInt16Ty, kField),
581                          _EXPAND_ARG3(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy))
582
583// void art_portable_iput_[type](uint32_t field_idx,
584//                           Method* referrer,
585//                           JavaObject* obj,
586//                           [type] new_value)
587_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPut,
588                          art_portable_iput,
589                          kAttrNone,
590                          kVoidTy,
591                          _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kInt32Ty, kField)))
592
593_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutWide,
594                          art_portable_iput_wide,
595                          kAttrNone,
596                          kVoidTy,
597                          _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kInt64Ty, kField)))
598
599_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutObject,
600                          art_portable_iput_object,
601                          kAttrNone,
602                          kVoidTy,
603                          _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kJavaObjectTy, kField)))
604
605_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutBoolean,
606                          art_portable_iput_boolean,
607                          kAttrNone,
608                          kVoidTy,
609                          _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kInt1Ty, kField)))
610
611_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutByte,
612                          art_portable_iput_byte,
613                          kAttrNone,
614                          kVoidTy,
615                          _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kInt8Ty, kField)))
616
617_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutChar,
618                          art_portable_iput_char,
619                          kAttrNone,
620                          kVoidTy,
621                          _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kInt16Ty, kField)))
622
623_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutShort,
624                          art_portable_iput_short,
625                          kAttrNone,
626                          kVoidTy,
627                          _EXPAND_ARG4(kInt32ConstantTy, kJavaMethodTy, kJavaObjectTy, _JTYPE(kInt16Ty, kField)))
628
629// void art_portable_iput_[type].fast(int field_offset,
630//                                bool is_volatile,
631//                                JavaObject* obj,
632//                                [type] new_value)
633_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutFast,
634                          art_portable_iput.fast,
635                          kAttrNoThrow,
636                          kVoidTy,
637                          _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kInt32Ty, kField)))
638
639_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutWideFast,
640                          art_portable_iput_wide.fast,
641                          kAttrNoThrow,
642                          kVoidTy,
643                          _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kInt64Ty, kField)))
644
645_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutObjectFast,
646                          art_portable_iput_object.fast,
647                          kAttrNoThrow,
648                          kVoidTy,
649                          _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kJavaObjectTy, kField)))
650
651_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutBooleanFast,
652                          art_portable_iput_boolean.fast,
653                          kAttrNoThrow,
654                          kVoidTy,
655                          _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kInt1Ty, kField)))
656
657_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutByteFast,
658                          art_portable_iput_byte.fast,
659                          kAttrNoThrow,
660                          kVoidTy,
661                          _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kInt8Ty, kField)))
662
663_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutCharFast,
664                          art_portable_iput_char.fast,
665                          kAttrNoThrow,
666                          kVoidTy,
667                          _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kInt16Ty, kField)))
668
669_EVAL_DEF_INTRINSICS_FUNC(InstanceFieldPutShortFast,
670                          art_portable_iput_short.fast,
671                          kAttrNoThrow,
672                          kVoidTy,
673                          _EXPAND_ARG4(kInt32ConstantTy, kInt1ConstantTy, kJavaObjectTy, _JTYPE(kInt16Ty, kField)))
674
675//----------------------------------------------------------------------------
676// Static Field
677//----------------------------------------------------------------------------
678
679// [type] art_portable_sget_[type](uint32_t field_idx, Method* referrer)
680_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGet,
681                          art_portable_sget,
682                          kAttrNone,
683                          _JTYPE(kInt32Ty, kField),
684                          _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy))
685
686_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetWide,
687                          art_portable_sget_wide,
688                          kAttrNone,
689                          _JTYPE(kInt64Ty, kField),
690                          _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy))
691
692_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetObject,
693                          art_portable_sget_object,
694                          kAttrNone,
695                          _JTYPE(kJavaObjectTy, kField),
696                          _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy))
697
698_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetBoolean,
699                          art_portable_sget_boolean,
700                          kAttrNone,
701                          _JTYPE(kInt1Ty, kField),
702                          _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy))
703
704_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetByte,
705                          art_portable_sget_byte,
706                          kAttrNone,
707                          _JTYPE(kInt8Ty, kField),
708                          _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy))
709
710_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetChar,
711                          art_portable_sget_char,
712                          kAttrNone,
713                          _JTYPE(kInt16Ty, kField),
714                          _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy))
715
716_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetShort,
717                          art_portable_sget_short,
718                          kAttrNone,
719                          _JTYPE(kInt16Ty, kField),
720                          _EXPAND_ARG2(kInt32ConstantTy, kJavaMethodTy))
721
722// [type] art_portable_sget_[type].fast(JavaObject* ssb,
723//                                  int field_offset,
724//                                  bool is_volatile)
725_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetFast,
726                          art_portable_sget.fast,
727                          kAttrReadOnly | kAttrNoThrow,
728                          _JTYPE(kInt32Ty, kField),
729                          _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy))
730
731_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetWideFast,
732                          art_portable_sget_wide.fast,
733                          kAttrReadOnly | kAttrNoThrow,
734                          _JTYPE(kInt64Ty, kField),
735                          _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy))
736
737_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetObjectFast,
738                          art_portable_sget_object.fast,
739                          kAttrReadOnly | kAttrNoThrow,
740                          _JTYPE(kJavaObjectTy, kField),
741                          _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy))
742
743_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetBooleanFast,
744                          art_portable_sget_boolean.fast,
745                          kAttrReadOnly | kAttrNoThrow,
746                          _JTYPE(kInt1Ty, kField),
747                          _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy))
748
749_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetByteFast,
750                          art_portable_sget_byte.fast,
751                          kAttrReadOnly | kAttrNoThrow,
752                          _JTYPE(kInt8Ty, kField),
753                          _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy))
754
755_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetCharFast,
756                          art_portable_sget_char.fast,
757                          kAttrReadOnly | kAttrNoThrow,
758                          _JTYPE(kInt16Ty, kField),
759                          _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy))
760
761_EVAL_DEF_INTRINSICS_FUNC(StaticFieldGetShortFast,
762                          art_portable_sget_short.fast,
763                          kAttrReadOnly | kAttrNoThrow,
764                          _JTYPE(kInt16Ty, kField),
765                          _EXPAND_ARG3(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy))
766
767// void art_portable_sput_[type](uint32_t field_idx,
768//                           Method* referrer,
769//                           [type] new_value)
770_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPut,
771                          art_portable_sput,
772                          kAttrNone,
773                          kVoidTy,
774                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kInt32Ty, kField)))
775
776_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutWide,
777                          art_portable_sput_wide,
778                          kAttrNone,
779                          kVoidTy,
780                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kInt64Ty, kField)))
781
782_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutObject,
783                          art_portable_sput_object,
784                          kAttrNone,
785                          kVoidTy,
786                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kJavaObjectTy, kField)))
787
788_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutBoolean,
789                          art_portable_sput_boolean,
790                          kAttrNone,
791                          kVoidTy,
792                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kInt1Ty, kField)))
793
794_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutByte,
795                          art_portable_sput_byte,
796                          kAttrNone,
797                          kVoidTy,
798                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kInt8Ty, kField)))
799
800_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutChar,
801                          art_portable_sput_char,
802                          kAttrNone,
803                          kVoidTy,
804                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kInt16Ty, kField)))
805
806_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutShort,
807                          art_portable_sput_short,
808                          kAttrNone,
809                          kVoidTy,
810                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, _JTYPE(kInt16Ty, kField)))
811
812// void art_portable_sput_[type].fast(JavaObject* ssb,
813//                                int field_offset,
814//                                bool is_volatile,
815//                                [type] new_value)
816_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutFast,
817                          art_portable_sput.fast,
818                          kAttrNoThrow,
819                          kVoidTy,
820                          _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kInt32Ty, kField)))
821
822_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutWideFast,
823                          art_portable_sput_wide.fast,
824                          kAttrNoThrow,
825                          kVoidTy,
826                          _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kInt64Ty, kField)))
827
828_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutObjectFast,
829                          art_portable_sput_object.fast,
830                          kAttrNoThrow,
831                          kVoidTy,
832                          _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kJavaObjectTy, kField)))
833
834_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutBooleanFast,
835                          art_portable_sput_boolean.fast,
836                          kAttrNoThrow,
837                          kVoidTy,
838                          _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kInt1Ty, kField)))
839
840_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutByteFast,
841                          art_portable_sput_byte.fast,
842                          kAttrNoThrow,
843                          kVoidTy,
844                          _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kInt8Ty, kField)))
845
846_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutCharFast,
847                          art_portable_sput_char.fast,
848                          kAttrNoThrow,
849                          kVoidTy,
850                          _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kInt16Ty, kField)))
851
852_EVAL_DEF_INTRINSICS_FUNC(StaticFieldPutShortFast,
853                          art_portable_sput_short.fast,
854                          kAttrNoThrow,
855                          kVoidTy,
856                          _EXPAND_ARG4(kJavaObjectTy, kInt32ConstantTy, kInt1ConstantTy, _JTYPE(kInt16Ty, kField)))
857
858// JavaObject* art_portable_load_declaring_class_ssb(Method* method)
859// Load the static storage base of the class that given method resides
860_EVAL_DEF_INTRINSICS_FUNC(LoadDeclaringClassSSB,
861                          art_portable_load_declaring_class_ssb,
862                          kAttrReadOnly | kAttrNoThrow,
863                          kJavaObjectTy,
864                          _EXPAND_ARG1(kJavaMethodTy))
865
866// JavaObject* art_portable_load_class_ssb_from_dex_cache(uint32_t type_idx)
867_EVAL_DEF_INTRINSICS_FUNC(LoadClassSSBFromDexCache,
868                          art_portable_load_class_ssb_from_dex_cache,
869                          kAttrReadOnly | kAttrNoThrow,
870                          kJavaObjectTy,
871                          _EXPAND_ARG1(kInt32ConstantTy))
872
873// JavaObject* art_portable_init_and_load_class_ssb(uint32_t type_idx,
874//                                              Method* referrer,
875//                                              Thread* thread)
876_EVAL_DEF_INTRINSICS_FUNC(InitializeAndLoadClassSSB,
877                          art_portable_init_and_load_class_ssb,
878                          kAttrNone,
879                          kJavaObjectTy,
880                          _EXPAND_ARG3(kInt32ConstantTy, kJavaMethodTy, kJavaThreadTy))
881
882//----------------------------------------------------------------------------
883// High-level Array get/put
884//
885// Similar to art_portable_aget/aput_xxx, but checks not yet performed.
886// OptFlags contain info describing whether frontend has determined that
887// null check and/or array bounds check may be skipped.
888//
889// [type] void art_portable_hl_aget_[type](int optFlags, JavaObject* array, uint32_t index)
890_EVAL_DEF_INTRINSICS_FUNC(HLArrayGet,
891                          art_portable_hl_aget,
892                          kAttrReadOnly | kAttrNoThrow,
893                          kInt32Ty,
894                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
895
896_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetFloat,
897                          art_portable_hl_aget_float,
898                          kAttrReadOnly | kAttrNoThrow,
899                          kFloatTy,
900                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
901
902_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetWide,
903                          art_portable_hl_aget_wide,
904                          kAttrReadOnly | kAttrNoThrow,
905                          kInt64Ty,
906                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
907
908_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetDouble,
909                          art_portable_hl_aget_double,
910                          kAttrReadOnly | kAttrNoThrow,
911                          kDoubleTy,
912                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
913
914_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetObject,
915                          art_portable_hl_aget_object,
916                          kAttrReadOnly | kAttrNoThrow,
917                          kJavaObjectTy,
918                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
919
920_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetBoolean,
921                          art_portable_hl_aget_boolean,
922                          kAttrReadOnly | kAttrNoThrow,
923                          kInt32Ty,
924                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
925
926_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetByte,
927                          art_portable_hl_aget_byte,
928                          kAttrReadOnly | kAttrNoThrow,
929                          kInt32Ty,
930                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
931
932_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetChar,
933                          art_portable_hl_aget_char,
934                          kAttrReadOnly | kAttrNoThrow,
935                          kInt32Ty,
936                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
937
938_EVAL_DEF_INTRINSICS_FUNC(HLArrayGetShort,
939                          art_portable_hl_aget_short,
940                          kAttrReadOnly | kAttrNoThrow,
941                          kInt32Ty,
942                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
943
944// void art_portable_aput_[type](int optFlags, [type] value, JavaObject* array, uint32_t index)
945_EVAL_DEF_INTRINSICS_FUNC(HLArrayPut,
946                          art_portable_hl_aput,
947                          kAttrNoThrow,
948                          kVoidTy,
949                          _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty))
950
951_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutFloat,
952                          art_portable_hl_aput_float,
953                          kAttrNoThrow,
954                          kVoidTy,
955                          _EXPAND_ARG4(kInt32Ty, kFloatTy, kJavaObjectTy, kInt32Ty))
956
957_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutWide,
958                          art_portable_hl_aput_wide,
959                          kAttrNoThrow,
960                          kVoidTy,
961                          _EXPAND_ARG4(kInt32Ty, kInt64Ty, kJavaObjectTy, kInt32Ty))
962
963_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutDouble,
964                          art_portable_hl_aput_double,
965                          kAttrNoThrow,
966                          kVoidTy,
967                          _EXPAND_ARG4(kInt32Ty, kDoubleTy, kJavaObjectTy, kInt32Ty))
968
969_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutObject,
970                          art_portable_hl_aput_object,
971                          kAttrNoThrow,
972                          kVoidTy,
973                          _EXPAND_ARG4(kInt32Ty, kJavaObjectTy, kJavaObjectTy, kInt32Ty))
974
975_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutBoolean,
976                          art_portable_hl_aput_boolean,
977                          kAttrNoThrow,
978                          kVoidTy,
979                          _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty))
980
981_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutByte,
982                          art_portable_hl_aput_byte,
983                          kAttrNoThrow,
984                          kVoidTy,
985                          _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty))
986
987_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutChar,
988                          art_portable_hl_aput_char,
989                          kAttrNoThrow,
990                          kVoidTy,
991                          _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty))
992
993_EVAL_DEF_INTRINSICS_FUNC(HLArrayPutShort,
994                          art_portable_hl_aput_short,
995                          kAttrNoThrow,
996                          kVoidTy,
997                          _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty))
998
999//----------------------------------------------------------------------------
1000// High-level Instance get/put
1001//
1002// Similar to art_portable_iget/iput_xxx, but checks not yet performed.
1003// OptFlags contain info describing whether frontend has determined that
1004// null check may be skipped.
1005//
1006// [type] void art_portable_hl_iget_[type](int optFlags, JavaObject* obj, uint32_t field_idx)
1007_EVAL_DEF_INTRINSICS_FUNC(HLIGet,
1008                          art_portable_hl_iget,
1009                          kAttrReadOnly | kAttrNoThrow,
1010                          kInt32Ty,
1011                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
1012
1013_EVAL_DEF_INTRINSICS_FUNC(HLIGetFloat,
1014                          art_portable_hl_iget_float,
1015                          kAttrReadOnly | kAttrNoThrow,
1016                          kFloatTy,
1017                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
1018
1019_EVAL_DEF_INTRINSICS_FUNC(HLIGetWide,
1020                          art_portable_hl_iget_wide,
1021                          kAttrReadOnly | kAttrNoThrow,
1022                          kInt64Ty,
1023                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
1024
1025_EVAL_DEF_INTRINSICS_FUNC(HLIGetDouble,
1026                          art_portable_hl_iget_double,
1027                          kAttrReadOnly | kAttrNoThrow,
1028                          kDoubleTy,
1029                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
1030
1031_EVAL_DEF_INTRINSICS_FUNC(HLIGetObject,
1032                          art_portable_hl_iget_object,
1033                          kAttrReadOnly | kAttrNoThrow,
1034                          kJavaObjectTy,
1035                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
1036
1037_EVAL_DEF_INTRINSICS_FUNC(HLIGetBoolean,
1038                          art_portable_hl_iget_boolean,
1039                          kAttrReadOnly | kAttrNoThrow,
1040                          kInt32Ty,
1041                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
1042
1043_EVAL_DEF_INTRINSICS_FUNC(HLIGetByte,
1044                          art_portable_hl_iget_byte,
1045                          kAttrReadOnly | kAttrNoThrow,
1046                          kInt32Ty,
1047                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
1048
1049_EVAL_DEF_INTRINSICS_FUNC(HLIGetChar,
1050                          art_portable_hl_iget_char,
1051                          kAttrReadOnly | kAttrNoThrow,
1052                          kInt32Ty,
1053                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
1054
1055_EVAL_DEF_INTRINSICS_FUNC(HLIGetShort,
1056                          art_portable_hl_iget_short,
1057                          kAttrReadOnly | kAttrNoThrow,
1058                          kInt32Ty,
1059                          _EXPAND_ARG3(kInt32Ty, kJavaObjectTy, kInt32Ty))
1060
1061// void art_portable_iput_[type](int optFlags, [type] value, JavaObject* obj, uint32_t field_idx)
1062_EVAL_DEF_INTRINSICS_FUNC(HLIPut,
1063                          art_portable_hl_iput,
1064                          kAttrNoThrow,
1065                          kVoidTy,
1066                          _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty))
1067
1068_EVAL_DEF_INTRINSICS_FUNC(HLIPutFloat,
1069                          art_portable_hl_iput_float,
1070                          kAttrNoThrow,
1071                          kVoidTy,
1072                          _EXPAND_ARG4(kInt32Ty, kFloatTy, kJavaObjectTy, kInt32Ty))
1073
1074_EVAL_DEF_INTRINSICS_FUNC(HLIPutWide,
1075                          art_portable_hl_iput_wide,
1076                          kAttrNoThrow,
1077                          kVoidTy,
1078                          _EXPAND_ARG4(kInt32Ty, kInt64Ty, kJavaObjectTy, kInt32Ty))
1079
1080_EVAL_DEF_INTRINSICS_FUNC(HLIPutDouble,
1081                          art_portable_hl_iput_double,
1082                          kAttrNoThrow,
1083                          kVoidTy,
1084                          _EXPAND_ARG4(kInt32Ty, kDoubleTy, kJavaObjectTy, kInt32Ty))
1085
1086_EVAL_DEF_INTRINSICS_FUNC(HLIPutObject,
1087                          art_portable_hl_iput_object,
1088                          kAttrNoThrow,
1089                          kVoidTy,
1090                          _EXPAND_ARG4(kInt32Ty, kJavaObjectTy, kJavaObjectTy, kInt32Ty))
1091
1092_EVAL_DEF_INTRINSICS_FUNC(HLIPutBoolean,
1093                          art_portable_hl_iput_boolean,
1094                          kAttrNoThrow,
1095                          kVoidTy,
1096                          _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty))
1097
1098_EVAL_DEF_INTRINSICS_FUNC(HLIPutByte,
1099                          art_portable_hl_iput_byte,
1100                          kAttrNoThrow,
1101                          kVoidTy,
1102                          _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty))
1103
1104_EVAL_DEF_INTRINSICS_FUNC(HLIPutChar,
1105                          art_portable_hl_iput_char,
1106                          kAttrNoThrow,
1107                          kVoidTy,
1108                          _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty))
1109
1110_EVAL_DEF_INTRINSICS_FUNC(HLIPutShort,
1111                          art_portable_hl_iput_short,
1112                          kAttrNoThrow,
1113                          kVoidTy,
1114                          _EXPAND_ARG4(kInt32Ty, kInt32Ty, kJavaObjectTy, kInt32Ty))
1115
1116//----------------------------------------------------------------------------
1117// High-level Invokes (fast-path determination not yet performed)
1118//
1119// NOTE: We expect these intrinsics to be temporary.  Once calling conventions are
1120//       fully merged, the unified front end will lower down to the
1121//       InvokeRetxxx() intrinsics in the next section and these will be
1122//       removed.
1123//
1124// arg0: InvokeType [ignored if FilledNewArray]
1125// arg1: method_idx [ignored if FilledNewArray]
1126// arg2: optimization_flags (primary to note whether null checking is needed)
1127// [arg3..argN]: actual arguments
1128//----------------------------------------------------------------------------
1129// INVOKE method returns void
1130_EVAL_DEF_INTRINSICS_FUNC(HLInvokeVoid,
1131                          art_portable_hl_invoke.void,
1132                          kAttrNone,
1133                          kVoidTy,
1134                          _EXPAND_ARG1(kVarArgTy))
1135
1136// INVOKE method returns object
1137_EVAL_DEF_INTRINSICS_FUNC(HLInvokeObj,
1138                          art_portable_hl_invoke.obj,
1139                          kAttrNone,
1140                          kJavaObjectTy,
1141                          _EXPAND_ARG1(kVarArgTy))
1142
1143// INVOKE method returns int
1144_EVAL_DEF_INTRINSICS_FUNC(HLInvokeInt,
1145                          art_portable_hl_invoke.i32,
1146                          kAttrNone,
1147                          kInt32Ty,
1148                          _EXPAND_ARG1(kVarArgTy))
1149
1150// INVOKE method returns float
1151_EVAL_DEF_INTRINSICS_FUNC(HLInvokeFloat,
1152                          art_portable_hl_invoke.f32,
1153                          kAttrNone,
1154                          kFloatTy,
1155                          _EXPAND_ARG1(kVarArgTy))
1156
1157// INVOKE method returns long
1158_EVAL_DEF_INTRINSICS_FUNC(HLInvokeLong,
1159                          art_portable_hl_invoke.i64,
1160                          kAttrNone,
1161                          kInt64Ty,
1162                          _EXPAND_ARG1(kVarArgTy))
1163
1164// INVOKE method returns double
1165_EVAL_DEF_INTRINSICS_FUNC(HLInvokeDouble,
1166                          art_portable_hl_invoke.f64,
1167                          kAttrNone,
1168                          kDoubleTy,
1169                          _EXPAND_ARG1(kVarArgTy))
1170
1171// FILLED_NEW_ARRAY returns object
1172_EVAL_DEF_INTRINSICS_FUNC(HLFilledNewArray,
1173                          art_portable_hl_filled_new_array,
1174                          kAttrNone,
1175                          kJavaObjectTy,
1176                          _EXPAND_ARG1(kVarArgTy))
1177
1178//----------------------------------------------------------------------------
1179// Invoke
1180//----------------------------------------------------------------------------
1181
1182// Method* art_portable_find_static_method_with_access_check(uint32_t method_idx,
1183//                                                       JavaObject* this,
1184//                                                       Method* referrer,
1185//                                                       Thread* thread)
1186_EVAL_DEF_INTRINSICS_FUNC(FindStaticMethodWithAccessCheck,
1187                          art_portable_find_static_method_with_access_check,
1188                          kAttrNone,
1189                          kJavaMethodTy,
1190                          _EXPAND_ARG4(kInt32ConstantTy, kJavaObjectTy, kJavaMethodTy, kJavaThreadTy))
1191
1192// Method* art_portable_find_direct_method_with_access_check(uint32_t method_idx,
1193//                                                       JavaObject* this,
1194//                                                       Method* referrer,
1195//                                                       Thread* thread)
1196_EVAL_DEF_INTRINSICS_FUNC(FindDirectMethodWithAccessCheck,
1197                          art_portable_find_direct_method_with_access_check,
1198                          kAttrNone,
1199                          kJavaMethodTy,
1200                          _EXPAND_ARG4(kInt32ConstantTy, kJavaObjectTy, kJavaMethodTy, kJavaThreadTy))
1201
1202// Method* art_portable_find_virtual_method_with_access_check(uint32_t method_idx,
1203//                                                        JavaObject* this,
1204//                                                        Method* referrer,
1205//                                                        Thread* thread)
1206_EVAL_DEF_INTRINSICS_FUNC(FindVirtualMethodWithAccessCheck,
1207                          art_portable_find_virtual_method_with_access_check,
1208                          kAttrNone,
1209                          kJavaMethodTy,
1210                          _EXPAND_ARG4(kInt32ConstantTy, kJavaObjectTy, kJavaMethodTy, kJavaThreadTy))
1211
1212// Method* art_portable_find_super_method_with_access_check(uint32_t method_idx,
1213//                                                      JavaObject* this,
1214//                                                      Method* referrer,
1215//                                                      Thread* thread)
1216_EVAL_DEF_INTRINSICS_FUNC(FindSuperMethodWithAccessCheck,
1217                          art_portable_find_super_method_with_access_check,
1218                          kAttrNone,
1219                          kJavaMethodTy,
1220                          _EXPAND_ARG4(kInt32ConstantTy, kJavaObjectTy, kJavaMethodTy, kJavaThreadTy))
1221
1222// Method* art_portable_find_interface_method_with_access_check(uint32_t method_idx,
1223//                                                          JavaObject* this,
1224//                                                          Method* referrer,
1225//                                                          Thread* thread)
1226_EVAL_DEF_INTRINSICS_FUNC(FindInterfaceMethodWithAccessCheck,
1227                          art_portable_find_interface_method_with_access_check,
1228                          kAttrNone,
1229                          kJavaMethodTy,
1230                          _EXPAND_ARG4(kInt32ConstantTy, kJavaObjectTy, kJavaMethodTy, kJavaThreadTy))
1231
1232// Method* art_portable_get_sd_callee_method_obj_addr(uint32_t method_idx)
1233_EVAL_DEF_INTRINSICS_FUNC(GetSDCalleeMethodObjAddrFast,
1234                          art_portable_get_sd_callee_method_obj_addr_fast,
1235                          kAttrReadOnly | kAttrNoThrow,
1236                          kJavaMethodTy,
1237                          _EXPAND_ARG1(kInt32ConstantTy))
1238
1239// Method* art_portable_get_virtual_callee_method_obj_addr(uint32_t vtable_idx,
1240//                                                     JavaObject* this)
1241_EVAL_DEF_INTRINSICS_FUNC(GetVirtualCalleeMethodObjAddrFast,
1242                          art_portable_get_virtual_callee_method_obj_addr_fast,
1243                          kAttrReadOnly | kAttrNoThrow,
1244                          kJavaMethodTy,
1245                          _EXPAND_ARG2(kInt32ConstantTy, kJavaObjectTy))
1246
1247// Method* art_portable_get_interface_callee_method_obj_addr(uint32_t method_idx,
1248//                                                       JavaObject* this,
1249//                                                       Method* referrer,
1250//                                                       Thread* thread)
1251_EVAL_DEF_INTRINSICS_FUNC(GetInterfaceCalleeMethodObjAddrFast,
1252                          art_portable_get_interface_callee_method_obj_addr_fast,
1253                          kAttrNone,
1254                          kJavaMethodTy,
1255                          _EXPAND_ARG4(kInt32ConstantTy, kJavaObjectTy, kJavaMethodTy, kJavaThreadTy))
1256
1257// [type] art_portable_invoke.[type](Method* callee, ...)
1258// INVOKE method returns void
1259_EVAL_DEF_INTRINSICS_FUNC(InvokeRetVoid,
1260                          art_portable_invoke.void,
1261                          kAttrNone,
1262                          kVoidTy,
1263                          _EXPAND_ARG2(kJavaMethodTy, kVarArgTy))
1264
1265// INVOKE method returns the value of type boolean
1266_EVAL_DEF_INTRINSICS_FUNC(InvokeRetBoolean,
1267                          art_portable_invoke.bool,
1268                          kAttrNone,
1269                          kInt1Ty,
1270                          _EXPAND_ARG2(kJavaMethodTy, kVarArgTy))
1271
1272// INVOKE method returns the value of type byte
1273_EVAL_DEF_INTRINSICS_FUNC(InvokeRetByte,
1274                          art_portable_invoke.byte,
1275                          kAttrNone,
1276                          kInt8Ty,
1277                          _EXPAND_ARG2(kJavaMethodTy, kVarArgTy))
1278
1279// INVOKE method returns the value of type char
1280_EVAL_DEF_INTRINSICS_FUNC(InvokeRetChar,
1281                          art_portable_invoke.char,
1282                          kAttrNone,
1283                          kInt16Ty,
1284                          _EXPAND_ARG2(kJavaMethodTy, kVarArgTy))
1285
1286// INVOKE method returns the value of type short
1287_EVAL_DEF_INTRINSICS_FUNC(InvokeRetShort,
1288                          art_portable_invoke.short,
1289                          kAttrNone,
1290                          kInt16Ty,
1291                          _EXPAND_ARG2(kJavaMethodTy, kVarArgTy))
1292
1293// INVOKE method returns the value of type int
1294_EVAL_DEF_INTRINSICS_FUNC(InvokeRetInt,
1295                          art_portable_invoke.int,
1296                          kAttrNone,
1297                          kInt32Ty,
1298                          _EXPAND_ARG2(kJavaMethodTy, kVarArgTy))
1299
1300// INVOKE method returns the value of type long
1301_EVAL_DEF_INTRINSICS_FUNC(InvokeRetLong,
1302                          art_portable_invoke.long,
1303                          kAttrNone,
1304                          kInt64Ty,
1305                          _EXPAND_ARG2(kJavaMethodTy, kVarArgTy))
1306
1307// INVOKE method returns the value of type float
1308_EVAL_DEF_INTRINSICS_FUNC(InvokeRetFloat,
1309                          art_portable_invoke.float,
1310                          kAttrNone,
1311                          kFloatTy,
1312                          _EXPAND_ARG2(kJavaMethodTy, kVarArgTy))
1313
1314// INVOKE method returns the value of type double
1315_EVAL_DEF_INTRINSICS_FUNC(InvokeRetDouble,
1316                          art_portable_invoke.double,
1317                          kAttrNone,
1318                          kDoubleTy,
1319                          _EXPAND_ARG2(kJavaMethodTy, kVarArgTy))
1320
1321// INVOKE method returns the value of type "object"
1322_EVAL_DEF_INTRINSICS_FUNC(InvokeRetObject,
1323                          art_portable_invoke.object,
1324                          kAttrNone,
1325                          kJavaObjectTy,
1326                          _EXPAND_ARG2(kJavaMethodTy, kVarArgTy))
1327
1328//----------------------------------------------------------------------------
1329// Math
1330//----------------------------------------------------------------------------
1331
1332// int art_portable_{div,rem}_int(int a, int b)
1333_EVAL_DEF_INTRINSICS_FUNC(DivInt,
1334                          art_portable_div_int,
1335                          kAttrReadNone | kAttrNoThrow,
1336                          kInt32Ty,
1337                          _EXPAND_ARG2(kInt32Ty, kInt32Ty))
1338
1339_EVAL_DEF_INTRINSICS_FUNC(RemInt,
1340                          art_portable_rem_int,
1341                          kAttrReadNone | kAttrNoThrow,
1342                          kInt32Ty,
1343                          _EXPAND_ARG2(kInt32Ty, kInt32Ty))
1344
1345// long art_portable_{div,rem}_long(long a, long b)
1346_EVAL_DEF_INTRINSICS_FUNC(DivLong,
1347                          art_portable_div_long,
1348                          kAttrReadNone | kAttrNoThrow,
1349                          kInt64Ty,
1350                          _EXPAND_ARG2(kInt64Ty, kInt64Ty))
1351
1352_EVAL_DEF_INTRINSICS_FUNC(RemLong,
1353                          art_portable_rem_long,
1354                          kAttrReadNone | kAttrNoThrow,
1355                          kInt64Ty,
1356                          _EXPAND_ARG2(kInt64Ty, kInt64Ty))
1357
1358// int64_t art_portable_d2l(double f)
1359_EVAL_DEF_INTRINSICS_FUNC(D2L,
1360                          art_portable_d2l,
1361                          kAttrReadNone | kAttrNoThrow,
1362                          kInt64Ty,
1363                          _EXPAND_ARG1(kDoubleTy))
1364
1365// int32_t art_portable_d2l(double f)
1366_EVAL_DEF_INTRINSICS_FUNC(D2I,
1367                          art_portable_d2i,
1368                          kAttrReadNone | kAttrNoThrow,
1369                          kInt32Ty,
1370                          _EXPAND_ARG1(kDoubleTy))
1371
1372// int64_t art_portable_f2l(float f)
1373_EVAL_DEF_INTRINSICS_FUNC(F2L,
1374                          art_portable_f2l,
1375                          kAttrReadNone | kAttrNoThrow,
1376                          kInt64Ty,
1377                          _EXPAND_ARG1(kFloatTy))
1378
1379// int32_t art_portable_f2i(float f)
1380_EVAL_DEF_INTRINSICS_FUNC(F2I,
1381                          art_portable_f2i,
1382                          kAttrReadNone | kAttrNoThrow,
1383                          kInt32Ty,
1384                          _EXPAND_ARG1(kFloatTy))
1385
1386//----------------------------------------------------------------------------
1387// sput intrinsics to assist MIR to Greenland_ir conversion.
1388// "HL" versions - will be deprecated when fast/slow path handling done
1389// in the common frontend.
1390//----------------------------------------------------------------------------
1391
1392// void sput_hl(int field_idx, int val)
1393_EVAL_DEF_INTRINSICS_FUNC(HLSput,
1394                          art_portable_hl_sput,
1395                          kAttrReadOnly | kAttrNoThrow,
1396                          kVoidTy,
1397                          _EXPAND_ARG2(kInt32Ty, kInt32Ty))
1398
1399// void sput_hl_object(int field_idx, object* val)
1400_EVAL_DEF_INTRINSICS_FUNC(HLSputObject,
1401                          art_portable_hl_sput_object,
1402                          kAttrReadOnly | kAttrNoThrow,
1403                          kVoidTy,
1404                          _EXPAND_ARG2(kInt32Ty, kJavaObjectTy))
1405
1406// void sput_hl_boolean(int field_idx, kInt1Ty)
1407_EVAL_DEF_INTRINSICS_FUNC(HLSputBoolean,
1408                          art_portable_hl_sput_boolean,
1409                          kAttrReadOnly | kAttrNoThrow,
1410                          kVoidTy,
1411                          _EXPAND_ARG2(kInt32Ty, kInt32Ty))
1412
1413// void sput_hl_byte(int field_idx, int val)
1414_EVAL_DEF_INTRINSICS_FUNC(HLSputByte,
1415                          art_portable_hl_sput_byte,
1416                          kAttrReadOnly | kAttrNoThrow,
1417                          kVoidTy,
1418                          _EXPAND_ARG2(kInt32Ty, kInt32Ty))
1419
1420// void sput_hl_char(int field_idx, kInt16Ty val)
1421_EVAL_DEF_INTRINSICS_FUNC(HLSputChar,
1422                          art_portable_hl_sput_char,
1423                          kAttrReadOnly | kAttrNoThrow,
1424                          kVoidTy,
1425                          _EXPAND_ARG2(kInt32Ty, kInt32Ty))
1426
1427// void sput_hl_short(int field_idx, int val)
1428_EVAL_DEF_INTRINSICS_FUNC(HLSputShort,
1429                          art_portable_hl_sput_short,
1430                          kAttrReadOnly | kAttrNoThrow,
1431                          kVoidTy,
1432                          _EXPAND_ARG2(kInt32Ty, kInt32Ty))
1433
1434// void sput_hl_wide(int field_idx, long val)
1435_EVAL_DEF_INTRINSICS_FUNC(HLSputWide,
1436                          art_portable_hl_sput_wide,
1437                          kAttrReadOnly | kAttrNoThrow,
1438                          kVoidTy,
1439                          _EXPAND_ARG2(kInt32Ty, kInt64Ty))
1440
1441// void sput_hl_double(int field_idx, double val)
1442_EVAL_DEF_INTRINSICS_FUNC(HLSputDouble,
1443                          art_portable_hl_sput_double,
1444                          kAttrReadOnly | kAttrNoThrow,
1445                          kVoidTy,
1446                          _EXPAND_ARG2(kInt32Ty, kDoubleTy))
1447
1448// void sput_hl_float(int field_idx, float val)
1449_EVAL_DEF_INTRINSICS_FUNC(HLSputFloat,
1450                          art_portable_hl_sput_float,
1451                          kAttrReadOnly | kAttrNoThrow,
1452                          kVoidTy,
1453                          _EXPAND_ARG2(kInt32Ty, kFloatTy))
1454
1455//----------------------------------------------------------------------------
1456// sget intrinsics to assist MIR to Greenland_ir conversion.
1457// "HL" versions - will be deprecated when fast/slow path handling done
1458// in the common frontend.
1459//----------------------------------------------------------------------------
1460
1461// int sget_hl(int field_idx)
1462_EVAL_DEF_INTRINSICS_FUNC(HLSget,
1463                          art_portable_hl_sget,
1464                          kAttrReadOnly | kAttrNoThrow,
1465                          kInt32Ty,
1466                          _EXPAND_ARG1(kInt32Ty))
1467
1468// object* sget_hl_object(int field_idx)
1469_EVAL_DEF_INTRINSICS_FUNC(HLSgetObject,
1470                          art_portable_hl_sget_object,
1471                          kAttrReadOnly | kAttrNoThrow,
1472                          kJavaObjectTy,
1473                          _EXPAND_ARG1(kInt32Ty))
1474
1475// boolean sget_hl_boolean(int field_idx)
1476_EVAL_DEF_INTRINSICS_FUNC(HLSgetBoolean,
1477                          art_portable_hl_sget_boolean,
1478                          kAttrReadOnly | kAttrNoThrow,
1479                          kInt32Ty,
1480                          _EXPAND_ARG1(kInt32Ty))
1481
1482// byte sget_hl_byte(int field_idx)
1483_EVAL_DEF_INTRINSICS_FUNC(HLSgetByte,
1484                          art_portable_hl_sget_byte,
1485                          kAttrReadOnly | kAttrNoThrow,
1486                          kInt32Ty,
1487                          _EXPAND_ARG1(kInt32Ty))
1488
1489// char sget_hl_char(int field_idx)
1490_EVAL_DEF_INTRINSICS_FUNC(HLSgetChar,
1491                          art_portable_hl_sget_char,
1492                          kAttrReadOnly | kAttrNoThrow,
1493                          kInt32Ty,
1494                          _EXPAND_ARG1(kInt32Ty))
1495
1496// char sget_hl_short(int field_idx)
1497_EVAL_DEF_INTRINSICS_FUNC(HLSgetShort,
1498                          art_portable_hl_sget_short,
1499                          kAttrReadOnly | kAttrNoThrow,
1500                          kInt32Ty,
1501                          _EXPAND_ARG1(kInt32Ty))
1502
1503// char sget_hl_wide(int field_idx)
1504_EVAL_DEF_INTRINSICS_FUNC(HLSgetWide,
1505                          art_portable_hl_sget_wide,
1506                          kAttrReadOnly | kAttrNoThrow,
1507                          kInt64Ty,
1508                          _EXPAND_ARG1(kInt32Ty))
1509
1510// char sget_hl_double(int field_idx)
1511_EVAL_DEF_INTRINSICS_FUNC(HLSgetDouble,
1512                          art_portable_hl_sget_double,
1513                          kAttrReadOnly | kAttrNoThrow,
1514                          kDoubleTy,
1515                          _EXPAND_ARG1(kInt32Ty))
1516
1517// char sget_hl_float(int field_idx)
1518_EVAL_DEF_INTRINSICS_FUNC(HLSgetFloat,
1519                          art_portable_hl_sget_float,
1520                          kAttrReadOnly | kAttrNoThrow,
1521                          kFloatTy,
1522                          _EXPAND_ARG1(kInt32Ty))
1523//----------------------------------------------------------------------------
1524// Monitor enter/exit
1525//----------------------------------------------------------------------------
1526// uint32_t art_portable_monitor_enter(int optFlags, JavaObject* obj)
1527_EVAL_DEF_INTRINSICS_FUNC(MonitorEnter,
1528                          art_portable_monitor_enter,
1529                          kAttrReadOnly | kAttrNoThrow,
1530                          kVoidTy,
1531                          _EXPAND_ARG2(kInt32Ty, kJavaObjectTy))
1532
1533// uint32_t art_portable_monitor_exit(int optFlags, JavaObject* obj)
1534_EVAL_DEF_INTRINSICS_FUNC(MonitorExit,
1535                          art_portable_monitor_exit,
1536                          kAttrReadOnly | kAttrNoThrow,
1537                          kVoidTy,
1538                          _EXPAND_ARG2(kInt32Ty, kJavaObjectTy))
1539
1540//----------------------------------------------------------------------------
1541// Shadow Frame
1542//----------------------------------------------------------------------------
1543
1544// void art_portable_alloca_shadow_frame(int num_entry)
1545_EVAL_DEF_INTRINSICS_FUNC(AllocaShadowFrame,
1546                          art_portable_alloca_shadow_frame,
1547                          kAttrNoThrow,
1548                          kVoidTy,
1549                          _EXPAND_ARG1(kInt32ConstantTy))
1550
1551// void art_portable_set_vreg(int entry_idx, ...)
1552_EVAL_DEF_INTRINSICS_FUNC(SetVReg,
1553                          art_portable_set_vreg,
1554                          kAttrNoThrow,
1555                          kVoidTy,
1556                          _EXPAND_ARG2(kInt32ConstantTy, kVarArgTy))
1557
1558// void art_portable_pop_shadow_frame()
1559_EVAL_DEF_INTRINSICS_FUNC(PopShadowFrame,
1560                          art_portable_pop_shadow_frame,
1561                          kAttrNoThrow,
1562                          kVoidTy,
1563                          _EXPAND_ARG0())
1564
1565// void art_portable_update_dex_pc(uint32_t dex_pc)
1566_EVAL_DEF_INTRINSICS_FUNC(UpdateDexPC,
1567                          art_portable_update_dex_pc,
1568                          kAttrNoThrow,
1569                          kVoidTy,
1570                          _EXPAND_ARG1(kInt32ConstantTy))
1571
1572//----------------------------------------------------------------------------
1573// FP Comparison
1574//----------------------------------------------------------------------------
1575// int cmpl_float(float, float)
1576_EVAL_DEF_INTRINSICS_FUNC(CmplFloat,
1577                          art_portable_cmpl_float,
1578                          kAttrReadOnly | kAttrNoThrow,
1579                          kInt32Ty,
1580                          _EXPAND_ARG2(kFloatTy, kFloatTy))
1581
1582// int cmpg_float(float, float)
1583_EVAL_DEF_INTRINSICS_FUNC(CmpgFloat,
1584                          art_portable_cmpg_float,
1585                          kAttrReadOnly | kAttrNoThrow,
1586                          kInt32Ty,
1587                          _EXPAND_ARG2(kFloatTy, kFloatTy))
1588
1589// int cmpl_double(double, double)
1590_EVAL_DEF_INTRINSICS_FUNC(CmplDouble,
1591                          art_portable_cmpl_double,
1592                          kAttrReadOnly | kAttrNoThrow,
1593                          kInt32Ty,
1594                          _EXPAND_ARG2(kDoubleTy, kDoubleTy))
1595
1596// int cmpg_double(double, double)
1597_EVAL_DEF_INTRINSICS_FUNC(CmpgDouble,
1598                          art_portable_cmpg_double,
1599                          kAttrReadOnly | kAttrNoThrow,
1600                          kInt32Ty,
1601                          _EXPAND_ARG2(kDoubleTy, kDoubleTy))
1602
1603//----------------------------------------------------------------------------
1604// Long Comparison
1605//----------------------------------------------------------------------------
1606// int cmp_long(long, long)
1607_EVAL_DEF_INTRINSICS_FUNC(CmpLong,
1608                          art_portable_cmp_long,
1609                          kAttrReadOnly | kAttrNoThrow,
1610                          kInt32Ty,
1611                          _EXPAND_ARG2(kInt64Ty, kInt64Ty))
1612
1613//----------------------------------------------------------------------------
1614// Const intrinsics to assist MIR to Greenland_ir conversion.  Should not materialize
1615// For simplicity, all use integer input
1616//----------------------------------------------------------------------------
1617// int const_int(int)
1618_EVAL_DEF_INTRINSICS_FUNC(ConstInt,
1619                          art_portable_const_int,
1620                          kAttrReadOnly | kAttrNoThrow,
1621                          kInt32Ty,
1622                          _EXPAND_ARG1(kInt32Ty))
1623
1624// JavaObject* const_obj(int)
1625_EVAL_DEF_INTRINSICS_FUNC(ConstObj,
1626                          art_portable_const_obj,
1627                          kAttrReadOnly | kAttrNoThrow,
1628                          kJavaObjectTy,
1629                          _EXPAND_ARG1(kInt32Ty))
1630
1631// long const_long(long)
1632_EVAL_DEF_INTRINSICS_FUNC(ConstLong,
1633                          art_portable_const_long,
1634                          kAttrReadOnly | kAttrNoThrow,
1635                          kInt64Ty,
1636                          _EXPAND_ARG1(kInt64Ty))
1637
1638// float const_float(int)
1639_EVAL_DEF_INTRINSICS_FUNC(ConstFloat,
1640                          art_portable_const_Float,
1641                          kAttrReadOnly | kAttrNoThrow,
1642                          kFloatTy,
1643                          _EXPAND_ARG1(kInt32Ty))
1644
1645// double const_double(long)
1646_EVAL_DEF_INTRINSICS_FUNC(ConstDouble,
1647                          art_portable_const_Double,
1648                          kAttrReadOnly | kAttrNoThrow,
1649                          kDoubleTy,
1650                          _EXPAND_ARG1(kInt64Ty))
1651
1652
1653//----------------------------------------------------------------------------
1654// Copy intrinsics to assist MIR to Greenland_ir conversion.  Should not materialize
1655//----------------------------------------------------------------------------
1656
1657// void method_info(void)
1658_EVAL_DEF_INTRINSICS_FUNC(MethodInfo,
1659                          art_portable_method_info,
1660                          kAttrReadOnly | kAttrNoThrow,
1661                          kVoidTy,
1662                          _EXPAND_ARG0())
1663
1664// int copy_int(int)
1665_EVAL_DEF_INTRINSICS_FUNC(CopyInt,
1666                          art_portable_copy_int,
1667                          kAttrReadOnly | kAttrNoThrow,
1668                          kInt32Ty,
1669                          _EXPAND_ARG1(kInt32Ty))
1670
1671// JavaObject* copy_obj(obj)
1672_EVAL_DEF_INTRINSICS_FUNC(CopyObj,
1673                          art_portable_copy_obj,
1674                          kAttrReadOnly | kAttrNoThrow,
1675                          kJavaObjectTy,
1676                          _EXPAND_ARG1(kJavaObjectTy))
1677
1678// long copy_long(long)
1679_EVAL_DEF_INTRINSICS_FUNC(CopyLong,
1680                          art_portable_copy_long,
1681                          kAttrReadOnly | kAttrNoThrow,
1682                          kInt64Ty,
1683                          _EXPAND_ARG1(kInt64Ty))
1684
1685// float copy_float(float)
1686_EVAL_DEF_INTRINSICS_FUNC(CopyFloat,
1687                          art_portable_copy_Float,
1688                          kAttrReadOnly | kAttrNoThrow,
1689                          kFloatTy,
1690                          _EXPAND_ARG1(kFloatTy))
1691
1692// double copy_double(double)
1693_EVAL_DEF_INTRINSICS_FUNC(CopyDouble,
1694                          art_portable_copy_Double,
1695                          kAttrReadOnly | kAttrNoThrow,
1696                          kDoubleTy,
1697                          _EXPAND_ARG1(kDoubleTy))
1698
1699//----------------------------------------------------------------------------
1700// Shift intrinsics.  Shift semantics for Dalvik are a bit different than
1701// the llvm shift operators.  For 32-bit shifts, the shift count is constrained
1702// to the range of 0..31, while for 64-bit shifts we limit to 0..63.
1703// Further, the shift count for Long shifts in Dalvik is 32 bits, while
1704// llvm requires a 64-bit shift count. For GBC, we represent shifts as an
1705//  intrinsic to allow most efficient target-dependent lowering.
1706//----------------------------------------------------------------------------
1707// long shl_long(long,int)
1708_EVAL_DEF_INTRINSICS_FUNC(SHLLong,
1709                          art_portable_shl_long,
1710                          kAttrReadOnly | kAttrNoThrow,
1711                          kInt64Ty,
1712                          _EXPAND_ARG2(kInt64Ty,kInt32Ty))
1713// long shr_long(long,int)
1714_EVAL_DEF_INTRINSICS_FUNC(SHRLong,
1715                          art_portable_shr_long,
1716                          kAttrReadOnly | kAttrNoThrow,
1717                          kInt64Ty,
1718                          _EXPAND_ARG2(kInt64Ty,kInt32Ty))
1719// long ushr_long(long,int)
1720_EVAL_DEF_INTRINSICS_FUNC(USHRLong,
1721                          art_portable_ushl_long,
1722                          kAttrReadOnly | kAttrNoThrow,
1723                          kInt64Ty,
1724                          _EXPAND_ARG2(kInt64Ty,kInt32Ty))
1725// int shl_int(int,int)
1726_EVAL_DEF_INTRINSICS_FUNC(SHLInt,
1727                          art_portable_shl_int,
1728                          kAttrReadOnly | kAttrNoThrow,
1729                          kInt32Ty,
1730                          _EXPAND_ARG2(kInt32Ty,kInt32Ty))
1731// long shr_int(int,int)
1732_EVAL_DEF_INTRINSICS_FUNC(SHRInt,
1733                          art_portable_shr_int,
1734                          kAttrReadOnly | kAttrNoThrow,
1735                          kInt32Ty,
1736                          _EXPAND_ARG2(kInt32Ty,kInt32Ty))
1737// int ushr_long(int,int)
1738_EVAL_DEF_INTRINSICS_FUNC(USHRInt,
1739                          art_portable_ushl_int,
1740                          kAttrReadOnly | kAttrNoThrow,
1741                          kInt32Ty,
1742                          _EXPAND_ARG2(kInt32Ty,kInt32Ty))
1743//----------------------------------------------------------------------------
1744// Conversion instrinsics.  Note: these should eventually be removed.  We
1745// can express these directly in bitcode, but by using intrinsics the
1746// Quick compiler can be more efficient.  Some extra optimization infrastructure
1747// will have to be developed to undo the bitcode verbosity when these are
1748// done inline.
1749//----------------------------------------------------------------------------
1750// int int_to_byte(int)
1751_EVAL_DEF_INTRINSICS_FUNC(IntToByte,
1752                          art_portable_int_to_byte,
1753                          kAttrReadOnly | kAttrNoThrow,
1754                          kInt32Ty,
1755                          _EXPAND_ARG1(kInt32Ty))
1756
1757// int int_to_char(int)
1758_EVAL_DEF_INTRINSICS_FUNC(IntToChar,
1759                          art_portable_int_to_char,
1760                          kAttrReadOnly | kAttrNoThrow,
1761                          kInt32Ty,
1762                          _EXPAND_ARG1(kInt32Ty))
1763
1764// int int_to_short(int)
1765_EVAL_DEF_INTRINSICS_FUNC(IntToShort,
1766                          art_portable_int_to_short,
1767                          kAttrReadOnly | kAttrNoThrow,
1768                          kInt32Ty,
1769                          _EXPAND_ARG1(kInt32Ty))
1770
1771//----------------------------------------------------------------------------
1772// Memory barrier
1773//----------------------------------------------------------------------------
1774// void constructor_barrier()
1775_EVAL_DEF_INTRINSICS_FUNC(ConstructorBarrier,
1776                          art_portable_constructor_barrier,
1777                          kAttrReadOnly | kAttrNoThrow,
1778                          kVoidTy,
1779                          _EXPAND_ARG0())
1780
1781// Clean up all internal used macros
1782#undef _EXPAND_ARG0
1783#undef _EXPAND_ARG1
1784#undef _EXPAND_ARG2
1785#undef _EXPAND_ARG3
1786#undef _EXPAND_ARG4
1787#undef _EXPAND_ARG5
1788
1789#undef _JTYPE_OF_kInt1Ty_UNDER_kArray
1790#undef _JTYPE_OF_kInt8Ty_UNDER_kArray
1791#undef _JTYPE_OF_kInt16Ty_UNDER_kArray
1792#undef _JTYPE_OF_kInt32Ty_UNDER_kArray
1793#undef _JTYPE_OF_kInt64Ty_UNDER_kArray
1794#undef _JTYPE_OF_kJavaObjectTy_UNDER_kArray
1795
1796#undef _JTYPE_OF_kInt1Ty_UNDER_kField
1797#undef _JTYPE_OF_kInt8Ty_UNDER_kField
1798#undef _JTYPE_OF_kInt16Ty_UNDER_kField
1799#undef _JTYPE_OF_kInt32Ty_UNDER_kField
1800#undef _JTYPE_OF_kInt64Ty_UNDER_kField
1801#undef _JTYPE_OF_kJavaObjectTy_UNDER_kField
1802
1803#undef DEF_INTRINSICS_FUNC
1804