blob: e23f5a8da240a4e8cf8d33fba2ebef7aeb830fc1 [file] [log] [blame]
Elliott Hughes0f3c5532012-03-30 14:51:51 -07001/*
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
Ian Rogers7655f292013-07-29 11:07:13 -070017#include "asm_support_arm.S"
Ian Rogers9651f422011-09-19 20:26:07 -070018
Ian Rogersff1ed472011-09-20 13:46:24 -070019 /* Deliver the given exception */
20 .extern artDeliverExceptionFromCode
21 /* Deliver an exception pending on a thread */
22 .extern artDeliverPendingException
23
Ian Rogers4f0d07c2011-10-06 23:38:47 -070024 /*
25 * Macro that sets up the callee save frame to conform with
26 * Runtime::CreateCalleeSaveMethod(kSaveAll)
27 */
Ian Rogers57b86d42012-03-27 16:05:41 -070028.macro SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
Ian Rogers4f0d07c2011-10-06 23:38:47 -070029 push {r4-r11, lr} @ 9 words of callee saves
Ian Rogers9329bbb2013-02-08 19:56:30 -080030 .save {r4-r11, lr}
31 .cfi_adjust_cfa_offset 36
32 .cfi_rel_offset r4, 0
33 .cfi_rel_offset r5, 4
34 .cfi_rel_offset r6, 8
35 .cfi_rel_offset r7, 12
36 .cfi_rel_offset r8, 16
37 .cfi_rel_offset r9, 20
38 .cfi_rel_offset r10, 24
39 .cfi_rel_offset r11, 28
40 .cfi_rel_offset lr, 32
Ian Rogers15fdb8c2011-09-25 15:45:07 -070041 vpush {s0-s31}
Ian Rogers9329bbb2013-02-08 19:56:30 -080042 .pad #128
43 .cfi_adjust_cfa_offset 128
Ian Rogers4f0d07c2011-10-06 23:38:47 -070044 sub sp, #12 @ 3 words of space, bottom word will hold Method*
Ian Rogers9329bbb2013-02-08 19:56:30 -080045 .pad #12
46 .cfi_adjust_cfa_offset 12
Ian Rogers4f0d07c2011-10-06 23:38:47 -070047.endm
48
49 /*
50 * Macro that sets up the callee save frame to conform with
Ian Rogersdfcdf1a2011-10-10 17:50:35 -070051 * Runtime::CreateCalleeSaveMethod(kRefsOnly). Restoration assumes non-moving GC.
Ian Rogers4f0d07c2011-10-06 23:38:47 -070052 */
53.macro SETUP_REF_ONLY_CALLEE_SAVE_FRAME
54 push {r5-r8, r10-r11, lr} @ 7 words of callee saves
Ian Rogers9329bbb2013-02-08 19:56:30 -080055 .save {r5-r8, r10-r11, lr}
56 .cfi_adjust_cfa_offset 28
57 .cfi_rel_offset r5, 0
58 .cfi_rel_offset r6, 4
59 .cfi_rel_offset r7, 8
60 .cfi_rel_offset r8, 12
61 .cfi_rel_offset r10, 16
62 .cfi_rel_offset r11, 20
63 .cfi_rel_offset lr, 24
Ian Rogers4f0d07c2011-10-06 23:38:47 -070064 sub sp, #4 @ bottom word will hold Method*
Ian Rogers9329bbb2013-02-08 19:56:30 -080065 .pad #4
66 .cfi_adjust_cfa_offset 4
Ian Rogers4f0d07c2011-10-06 23:38:47 -070067.endm
68
69.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
Ian Rogersdfcdf1a2011-10-10 17:50:35 -070070 ldr lr, [sp, #28] @ restore lr for return
71 add sp, #32 @ unwind stack
Ian Rogers9329bbb2013-02-08 19:56:30 -080072 .cfi_adjust_cfa_offset -32
Ian Rogers4f0d07c2011-10-06 23:38:47 -070073.endm
74
75.macro RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
Ian Rogersdfcdf1a2011-10-10 17:50:35 -070076 ldr lr, [sp, #28] @ restore lr for return
77 add sp, #32 @ unwind stack
Ian Rogers9329bbb2013-02-08 19:56:30 -080078 .cfi_adjust_cfa_offset -32
Ian Rogersdfcdf1a2011-10-10 17:50:35 -070079 bx lr @ return
Ian Rogers4f0d07c2011-10-06 23:38:47 -070080.endm
81
82 /*
83 * Macro that sets up the callee save frame to conform with
Ian Rogersdfcdf1a2011-10-10 17:50:35 -070084 * Runtime::CreateCalleeSaveMethod(kRefsAndArgs). Restoration assumes non-moving GC.
Ian Rogers4f0d07c2011-10-06 23:38:47 -070085 */
86.macro SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
Ian Rogersdfcdf1a2011-10-10 17:50:35 -070087 push {r1-r3, r5-r8, r10-r11, lr} @ 10 words of callee saves
Ian Rogers9329bbb2013-02-08 19:56:30 -080088 .save {r1-r3, r5-r8, r10-r11, lr}
89 .cfi_adjust_cfa_offset 40
Jeff Hao5d917302013-02-27 17:57:33 -080090 .cfi_rel_offset r1, 0
91 .cfi_rel_offset r2, 4
92 .cfi_rel_offset r3, 8
93 .cfi_rel_offset r5, 12
94 .cfi_rel_offset r6, 16
95 .cfi_rel_offset r7, 20
96 .cfi_rel_offset r8, 24
97 .cfi_rel_offset r10, 28
98 .cfi_rel_offset r11, 32
99 .cfi_rel_offset lr, 36
Ian Rogersdfcdf1a2011-10-10 17:50:35 -0700100 sub sp, #8 @ 2 words of space, bottom word will hold Method*
Ian Rogers9329bbb2013-02-08 19:56:30 -0800101 .pad #8
102 .cfi_adjust_cfa_offset 8
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700103.endm
104
105.macro RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
Ian Rogersdfcdf1a2011-10-10 17:50:35 -0700106 ldr r1, [sp, #8] @ restore non-callee save r1
107 ldrd r2, [sp, #12] @ restore non-callee saves r2-r3
108 ldr lr, [sp, #44] @ restore lr
109 add sp, #48 @ rewind sp
Ian Rogers9329bbb2013-02-08 19:56:30 -0800110 .cfi_adjust_cfa_offset -48
Ian Rogers15fdb8c2011-09-25 15:45:07 -0700111.endm
112
Ian Rogersce9eca62011-10-07 17:11:03 -0700113 /*
114 * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending
115 * exception is Thread::Current()->exception_
116 */
117.macro DELIVER_PENDING_EXCEPTION
Ian Rogers9329bbb2013-02-08 19:56:30 -0800118 .fnend
119 .fnstart
Ian Rogers57b86d42012-03-27 16:05:41 -0700120 SETUP_SAVE_ALL_CALLEE_SAVE_FRAME @ save callee saves for throw
Ian Rogersce9eca62011-10-07 17:11:03 -0700121 mov r0, r9 @ pass Thread::Current
122 mov r1, sp @ pass SP
123 b artDeliverPendingExceptionFromCode @ artDeliverPendingExceptionFromCode(Thread*, SP)
124.endm
125
Ian Rogers57b86d42012-03-27 16:05:41 -0700126.macro NO_ARG_RUNTIME_EXCEPTION c_name, cxx_name
Ian Rogers57b86d42012-03-27 16:05:41 -0700127 .extern \cxx_name
Ian Rogers9329bbb2013-02-08 19:56:30 -0800128ENTRY \c_name
Ian Rogers57b86d42012-03-27 16:05:41 -0700129 SETUP_SAVE_ALL_CALLEE_SAVE_FRAME // save all registers as basis for long jump context
130 mov r0, r9 @ pass Thread::Current
131 mov r1, sp @ pass SP
132 b \cxx_name @ \cxx_name(Thread*, SP)
Ian Rogers9329bbb2013-02-08 19:56:30 -0800133END \c_name
Ian Rogers57b86d42012-03-27 16:05:41 -0700134.endm
buzbee44b412b2012-02-04 08:50:53 -0800135
Ian Rogers57b86d42012-03-27 16:05:41 -0700136.macro ONE_ARG_RUNTIME_EXCEPTION c_name, cxx_name
Ian Rogers57b86d42012-03-27 16:05:41 -0700137 .extern \cxx_name
Ian Rogers9329bbb2013-02-08 19:56:30 -0800138ENTRY \c_name
Ian Rogers57b86d42012-03-27 16:05:41 -0700139 SETUP_SAVE_ALL_CALLEE_SAVE_FRAME // save all registers as basis for long jump context
Ian Rogersff1ed472011-09-20 13:46:24 -0700140 mov r1, r9 @ pass Thread::Current
141 mov r2, sp @ pass SP
Ian Rogers57b86d42012-03-27 16:05:41 -0700142 b \cxx_name @ \cxx_name(Thread*, SP)
Ian Rogers9329bbb2013-02-08 19:56:30 -0800143END \c_name
Ian Rogers57b86d42012-03-27 16:05:41 -0700144.endm
Ian Rogers9651f422011-09-19 20:26:07 -0700145
Ian Rogers57b86d42012-03-27 16:05:41 -0700146.macro TWO_ARG_RUNTIME_EXCEPTION c_name, cxx_name
Ian Rogers57b86d42012-03-27 16:05:41 -0700147 .extern \cxx_name
Ian Rogers9329bbb2013-02-08 19:56:30 -0800148ENTRY \c_name
Ian Rogers57b86d42012-03-27 16:05:41 -0700149 SETUP_SAVE_ALL_CALLEE_SAVE_FRAME // save all registers as basis for long jump context
Ian Rogersff1ed472011-09-20 13:46:24 -0700150 mov r2, r9 @ pass Thread::Current
151 mov r3, sp @ pass SP
Ian Rogers57b86d42012-03-27 16:05:41 -0700152 b \cxx_name @ \cxx_name(Thread*, SP)
Ian Rogers9329bbb2013-02-08 19:56:30 -0800153END \c_name
Ian Rogers57b86d42012-03-27 16:05:41 -0700154.endm
Ian Rogersbdb03912011-09-14 00:55:44 -0700155
Ian Rogers57b86d42012-03-27 16:05:41 -0700156 /*
157 * Called by managed code, saves callee saves and then calls artThrowException
158 * that will place a mock Method* at the bottom of the stack. Arg1 holds the exception.
159 */
Ian Rogers468532e2013-08-05 10:56:33 -0700160ONE_ARG_RUNTIME_EXCEPTION art_quick_deliver_exception, artDeliverExceptionFromCode
Ian Rogers932746a2011-09-22 18:57:50 -0700161
Ian Rogers57b86d42012-03-27 16:05:41 -0700162 /*
163 * Called by managed code to create and deliver a NullPointerException.
164 */
Ian Rogers468532e2013-08-05 10:56:33 -0700165NO_ARG_RUNTIME_EXCEPTION art_quick_throw_null_pointer_exception, artThrowNullPointerExceptionFromCode
Ian Rogersc0c8dc82011-09-24 18:15:59 -0700166
Ian Rogers57b86d42012-03-27 16:05:41 -0700167 /*
168 * Called by managed code to create and deliver an ArithmeticException.
169 */
Ian Rogers468532e2013-08-05 10:56:33 -0700170NO_ARG_RUNTIME_EXCEPTION art_quick_throw_div_zero, artThrowDivZeroFromCode
Ian Rogersc0c8dc82011-09-24 18:15:59 -0700171
Ian Rogers57b86d42012-03-27 16:05:41 -0700172 /*
173 * Called by managed code to create and deliver an ArrayIndexOutOfBoundsException. Arg1 holds
174 * index, arg2 holds limit.
175 */
Ian Rogers468532e2013-08-05 10:56:33 -0700176TWO_ARG_RUNTIME_EXCEPTION art_quick_throw_array_bounds, artThrowArrayBoundsFromCode
Ian Rogers57b86d42012-03-27 16:05:41 -0700177
178 /*
179 * Called by managed code to create and deliver a StackOverflowError.
180 */
Ian Rogers468532e2013-08-05 10:56:33 -0700181NO_ARG_RUNTIME_EXCEPTION art_quick_throw_stack_overflow, artThrowStackOverflowFromCode
Ian Rogers57b86d42012-03-27 16:05:41 -0700182
183 /*
184 * Called by managed code to create and deliver a NoSuchMethodError.
185 */
Ian Rogers468532e2013-08-05 10:56:33 -0700186ONE_ARG_RUNTIME_EXCEPTION art_quick_throw_no_such_method, artThrowNoSuchMethodFromCode
Ian Rogers57b86d42012-03-27 16:05:41 -0700187
188 /*
Ian Rogersc8b306f2012-02-17 21:34:44 -0800189 * All generated callsites for interface invokes and invocation slow paths will load arguments
190 * as usual - except instead of loading arg0/r0 with the target Method*, arg0/r0 will contain
191 * the method_idx. This wrapper will save arg1-arg3, load the caller's Method*, align the
192 * stack and call the appropriate C helper.
Elliott Hughes634eb2e2012-03-22 16:06:28 -0700193 * NOTE: "this" is first visible argument of the target, and so can be found in arg1/r1.
buzbee4a3164f2011-09-03 11:25:10 -0700194 *
Ian Rogersc8b306f2012-02-17 21:34:44 -0800195 * The helper will attempt to locate the target and return a 64-bit result in r0/r1 consisting
196 * of the target Method* in r0 and method->code_ in r1.
buzbee4a3164f2011-09-03 11:25:10 -0700197 *
Ian Rogersc8b306f2012-02-17 21:34:44 -0800198 * If unsuccessful, the helper will return NULL/NULL. There will bea pending exception in the
199 * thread and we branch to another stub to deliver it.
buzbee4a3164f2011-09-03 11:25:10 -0700200 *
Ian Rogersff1ed472011-09-20 13:46:24 -0700201 * On success this wrapper will restore arguments and *jump* to the target, leaving the lr
202 * pointing back to the original caller.
buzbee4a3164f2011-09-03 11:25:10 -0700203 */
Ian Rogersc8b306f2012-02-17 21:34:44 -0800204.macro INVOKE_TRAMPOLINE c_name, cxx_name
Ian Rogersc8b306f2012-02-17 21:34:44 -0800205 .extern \cxx_name
Ian Rogers9329bbb2013-02-08 19:56:30 -0800206ENTRY \c_name
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700207 SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME @ save callee saves in case allocation triggers GC
Ian Rogersc8b306f2012-02-17 21:34:44 -0800208 ldr r2, [sp, #48] @ pass caller Method*
209 mov r3, r9 @ pass Thread::Current
buzbee865e6e02012-08-14 15:09:57 -0700210 mov r12, sp
211 str r12, [sp, #-16]! @ expand the frame and pass SP
Ian Rogers9329bbb2013-02-08 19:56:30 -0800212 .pad #16
213 .cfi_adjust_cfa_offset 16
Ian Rogersc8b306f2012-02-17 21:34:44 -0800214 bl \cxx_name @ (method_idx, this, caller, Thread*, SP)
buzbee865e6e02012-08-14 15:09:57 -0700215 add sp, #16 @ strip the extra frame
Ian Rogers9329bbb2013-02-08 19:56:30 -0800216 .cfi_adjust_cfa_offset -16
Elliott Hughes634eb2e2012-03-22 16:06:28 -0700217 mov r12, r1 @ save Method*->code_
Ian Rogersa32a6fd2012-02-06 20:18:44 -0800218 RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
Ian Rogersc8b306f2012-02-17 21:34:44 -0800219 cmp r0, #0 @ did we find the target?
220 bxne r12 @ tail call to target if so
Ian Rogersa32a6fd2012-02-06 20:18:44 -0800221 DELIVER_PENDING_EXCEPTION
Ian Rogers9329bbb2013-02-08 19:56:30 -0800222END \c_name
Ian Rogersc8b306f2012-02-17 21:34:44 -0800223.endm
Ian Rogersa32a6fd2012-02-06 20:18:44 -0800224
Logan Chien8dbb7082013-01-25 20:31:17 +0800225INVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline, artInvokeInterfaceTrampoline
226INVOKE_TRAMPOLINE art_quick_invoke_interface_trampoline_with_access_check, artInvokeInterfaceTrampolineWithAccessCheck
Ian Rogersa32a6fd2012-02-06 20:18:44 -0800227
Logan Chien8dbb7082013-01-25 20:31:17 +0800228INVOKE_TRAMPOLINE art_quick_invoke_static_trampoline_with_access_check, artInvokeStaticTrampolineWithAccessCheck
229INVOKE_TRAMPOLINE art_quick_invoke_direct_trampoline_with_access_check, artInvokeDirectTrampolineWithAccessCheck
230INVOKE_TRAMPOLINE art_quick_invoke_super_trampoline_with_access_check, artInvokeSuperTrampolineWithAccessCheck
231INVOKE_TRAMPOLINE art_quick_invoke_virtual_trampoline_with_access_check, artInvokeVirtualTrampolineWithAccessCheck
Ian Rogersff1ed472011-09-20 13:46:24 -0700232
Ian Rogers57b86d42012-03-27 16:05:41 -0700233 /*
Jeff Hao6474d192013-03-26 14:08:09 -0700234 * Quick invocation stub.
235 * On entry:
236 * r0 = method pointer
237 * r1 = argument array or NULL for no argument methods
238 * r2 = size of argument array in bytes
239 * r3 = (managed) thread pointer
240 * [sp] = JValue* result
241 * [sp + 4] = result type char
Jeff Hao5d917302013-02-27 17:57:33 -0800242 */
243ENTRY art_quick_invoke_stub
244 push {r0, r4, r5, r9, r11, lr} @ spill regs
245 .save {r0, r4, r5, r9, r11, lr}
246 .pad #24
247 .cfi_adjust_cfa_offset 24
248 .cfi_rel_offset r0, 0
249 .cfi_rel_offset r4, 4
250 .cfi_rel_offset r5, 8
251 .cfi_rel_offset r9, 12
252 .cfi_rel_offset r11, 16
253 .cfi_rel_offset lr, 20
254 mov r11, sp @ save the stack pointer
255 .cfi_def_cfa_register r11
256 mov r9, r3 @ move managed thread pointer into r9
257 mov r4, #SUSPEND_CHECK_INTERVAL @ reset r4 to suspend check interval
258 add r5, r2, #16 @ create space for method pointer in frame
Jeff Hao6474d192013-03-26 14:08:09 -0700259 and r5, #0xFFFFFFF0 @ align frame size to 16 bytes
Jeff Hao5d917302013-02-27 17:57:33 -0800260 sub sp, r5 @ reserve stack space for argument array
261 add r0, sp, #4 @ pass stack pointer + method ptr as dest for memcpy
262 bl memcpy @ memcpy (dest, src, bytes)
263 ldr r0, [r11] @ restore method*
264 ldr r1, [sp, #4] @ copy arg value for r1
265 ldr r2, [sp, #8] @ copy arg value for r2
266 ldr r3, [sp, #12] @ copy arg value for r3
267 mov ip, #0 @ set ip to 0
268 str ip, [sp] @ store NULL for method* at bottom of frame
269 ldr ip, [r0, #METHOD_CODE_OFFSET] @ get pointer to the code
270 blx ip @ call the method
Jeff Hao6474d192013-03-26 14:08:09 -0700271 mov sp, r11 @ restore the stack pointer
Jeff Hao5d917302013-02-27 17:57:33 -0800272 ldr ip, [sp, #24] @ load the result pointer
273 strd r0, [ip] @ store r0/r1 into result pointer
Jeff Hao5d917302013-02-27 17:57:33 -0800274 pop {r0, r4, r5, r9, r11, lr} @ restore spill regs
275 .cfi_adjust_cfa_offset -24
276 bx lr
277END art_quick_invoke_stub
Jeff Hao6474d192013-03-26 14:08:09 -0700278
Jeff Hao5d917302013-02-27 17:57:33 -0800279 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700280 * On entry r0 is uint32_t* gprs_ and r1 is uint32_t* fprs_
281 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800282ENTRY art_quick_do_long_jump
Ian Rogers57b86d42012-03-27 16:05:41 -0700283 vldm r1, {s0-s31} @ load all fprs from argument fprs_
284 ldr r2, [r0, #60] @ r2 = r15 (PC from gprs_ 60=4*15)
285 add r0, r0, #12 @ increment r0 to skip gprs_[0..2] 12=4*3
286 ldm r0, {r3-r14} @ load remaining gprs from argument gprs_
287 mov r0, #0 @ clear result registers r0 and r1
288 mov r1, #0
289 bx r2 @ do long jump
Ian Rogers9329bbb2013-02-08 19:56:30 -0800290END art_quick_do_long_jump
Ian Rogers57b86d42012-03-27 16:05:41 -0700291
Ian Rogers60db5ab2012-02-20 17:02:00 -0800292 /*
Ian Rogersff1ed472011-09-20 13:46:24 -0700293 * Entry from managed code that calls artHandleFillArrayDataFromCode and delivers exception on
294 * failure.
295 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800296 .extern artHandleFillArrayDataFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700297ENTRY art_quick_handle_fill_data
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700298 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case exception allocation triggers GC
299 mov r2, r9 @ pass Thread::Current
300 mov r3, sp @ pass SP
Elliott Hughesaf778e62012-05-01 18:45:31 -0700301 bl artHandleFillArrayDataFromCode @ (Array*, const DexFile::Payload*, Thread*, SP)
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700302 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
303 cmp r0, #0 @ success?
Ian Rogersae675992011-10-09 17:10:22 -0700304 bxeq lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700305 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700306END art_quick_handle_fill_data
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700307
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700308 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700309 * Entry from managed code that calls artLockObjectFromCode, may block for GC.
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700310 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800311 .extern artLockObjectFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700312ENTRY art_quick_lock_object
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700313 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case we block
314 mov r1, r9 @ pass Thread::Current
315 mov r2, sp @ pass SP
316 bl artLockObjectFromCode @ (Object* obj, Thread*, SP)
317 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
Ian Rogers468532e2013-08-05 10:56:33 -0700318END art_quick_lock_object
Ian Rogersff1ed472011-09-20 13:46:24 -0700319
Ian Rogersff1ed472011-09-20 13:46:24 -0700320 /*
321 * Entry from managed code that calls artUnlockObjectFromCode and delivers exception on failure.
322 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800323 .extern artUnlockObjectFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700324ENTRY art_quick_unlock_object
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700325 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case exception allocation triggers GC
326 mov r1, r9 @ pass Thread::Current
327 mov r2, sp @ pass SP
328 bl artUnlockObjectFromCode @ (Object* obj, Thread*, SP)
329 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
330 cmp r0, #0 @ success?
Ian Rogersae675992011-10-09 17:10:22 -0700331 bxeq lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700332 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700333END art_quick_unlock_object
Ian Rogersff1ed472011-09-20 13:46:24 -0700334
Ian Rogersff1ed472011-09-20 13:46:24 -0700335 /*
336 * Entry from managed code that calls artCheckCastFromCode and delivers exception on failure.
337 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800338 .extern artCheckCastFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700339ENTRY art_quick_check_cast
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700340 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case exception allocation triggers GC
341 mov r2, r9 @ pass Thread::Current
342 mov r3, sp @ pass SP
343 bl artCheckCastFromCode @ (Class* a, Class* b, Thread*, SP)
344 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
345 cmp r0, #0 @ success?
Ian Rogersae675992011-10-09 17:10:22 -0700346 bxeq lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700347 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700348END art_quick_check_cast
buzbee4a3164f2011-09-03 11:25:10 -0700349
Ian Rogerse51a5112011-09-23 14:16:35 -0700350 /*
351 * Entry from managed code that calls artCanPutArrayElementFromCode and delivers exception on
352 * failure.
353 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800354 .extern artCanPutArrayElementFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700355ENTRY art_quick_can_put_array_element
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700356 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case exception allocation triggers GC
357 mov r2, r9 @ pass Thread::Current
358 mov r3, sp @ pass SP
359 bl artCanPutArrayElementFromCode @ (Object* element, Class* array_class, Thread*, SP)
360 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
361 cmp r0, #0 @ success?
Ian Rogersae675992011-10-09 17:10:22 -0700362 bxeq lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700363 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700364END art_quick_can_put_array_element
Ian Rogerse51a5112011-09-23 14:16:35 -0700365
Ian Rogerscbba6ac2011-09-22 16:28:37 -0700366 /*
367 * Entry from managed code when uninitialized static storage, this stub will run the class
368 * initializer and deliver the exception on error. On success the static storage base is
369 * returned.
370 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800371 .extern artInitializeStaticStorageFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700372ENTRY art_quick_initialize_static_storage
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700373 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
374 mov r2, r9 @ pass Thread::Current
375 mov r3, sp @ pass SP
Brian Carlstromaded5f72011-10-07 17:15:04 -0700376 @ artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, SP)
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700377 bl artInitializeStaticStorageFromCode
378 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
379 cmp r0, #0 @ success if result is non-null
Ian Rogersae675992011-10-09 17:10:22 -0700380 bxne lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700381 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700382END art_quick_initialize_static_storage
Ian Rogersce9eca62011-10-07 17:11:03 -0700383
Ian Rogers28ad40d2011-10-27 15:19:26 -0700384 /*
385 * Entry from managed code when dex cache misses for a type_idx
386 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800387 .extern artInitializeTypeFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700388ENTRY art_quick_initialize_type
Ian Rogers28ad40d2011-10-27 15:19:26 -0700389 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
390 mov r2, r9 @ pass Thread::Current
391 mov r3, sp @ pass SP
392 @ artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, SP)
393 bl artInitializeTypeFromCode
394 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
395 cmp r0, #0 @ success if result is non-null
396 bxne lr @ return on success
397 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700398END art_quick_initialize_type
Ian Rogers28ad40d2011-10-27 15:19:26 -0700399
Ian Rogersb093c6b2011-10-31 16:19:55 -0700400 /*
401 * Entry from managed code when type_idx needs to be checked for access and dex cache may also
Ian Rogers57b86d42012-03-27 16:05:41 -0700402 * miss.
Ian Rogersb093c6b2011-10-31 16:19:55 -0700403 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800404 .extern artInitializeTypeAndVerifyAccessFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700405ENTRY art_quick_initialize_type_and_verify_access
Ian Rogersb093c6b2011-10-31 16:19:55 -0700406 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
407 mov r2, r9 @ pass Thread::Current
408 mov r3, sp @ pass SP
Elliott Hughes8a1ea9f2012-04-16 20:41:17 -0700409 @ artInitializeTypeAndVerifyAccessFromCode(uint32_t type_idx, Method* referrer, Thread*, SP)
Ian Rogersb093c6b2011-10-31 16:19:55 -0700410 bl artInitializeTypeAndVerifyAccessFromCode
411 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
412 cmp r0, #0 @ success if result is non-null
413 bxne lr @ return on success
414 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700415END art_quick_initialize_type_and_verify_access
Ian Rogersb093c6b2011-10-31 16:19:55 -0700416
Ian Rogersce9eca62011-10-07 17:11:03 -0700417 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700418 * Called by managed code to resolve a static field and load a 32-bit primitive value.
Ian Rogersce9eca62011-10-07 17:11:03 -0700419 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800420 .extern artGet32StaticFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700421ENTRY art_quick_get32_static
Ian Rogersce9eca62011-10-07 17:11:03 -0700422 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
Ian Rogers1bddec32012-02-04 12:27:34 -0800423 ldr r1, [sp, #32] @ pass referrer
Ian Rogersce9eca62011-10-07 17:11:03 -0700424 mov r2, r9 @ pass Thread::Current
425 mov r3, sp @ pass SP
426 bl artGet32StaticFromCode @ (uint32_t field_idx, const Method* referrer, Thread*, SP)
427 ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_
428 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
429 cmp r12, #0 @ success if no exception is pending
Ian Rogersae675992011-10-09 17:10:22 -0700430 bxeq lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700431 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700432END art_quick_get32_static
Ian Rogersce9eca62011-10-07 17:11:03 -0700433
Ian Rogersce9eca62011-10-07 17:11:03 -0700434 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700435 * Called by managed code to resolve a static field and load a 64-bit primitive value.
Ian Rogersce9eca62011-10-07 17:11:03 -0700436 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800437 .extern artGet64StaticFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700438ENTRY art_quick_get64_static
Ian Rogersce9eca62011-10-07 17:11:03 -0700439 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
Ian Rogers1bddec32012-02-04 12:27:34 -0800440 ldr r1, [sp, #32] @ pass referrer
Ian Rogersce9eca62011-10-07 17:11:03 -0700441 mov r2, r9 @ pass Thread::Current
442 mov r3, sp @ pass SP
443 bl artGet64StaticFromCode @ (uint32_t field_idx, const Method* referrer, Thread*, SP)
444 ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_
445 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
446 cmp r12, #0 @ success if no exception is pending
Ian Rogersae675992011-10-09 17:10:22 -0700447 bxeq lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700448 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700449END art_quick_get64_static
Ian Rogersce9eca62011-10-07 17:11:03 -0700450
Ian Rogersce9eca62011-10-07 17:11:03 -0700451 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700452 * Called by managed code to resolve a static field and load an object reference.
Ian Rogersce9eca62011-10-07 17:11:03 -0700453 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800454 .extern artGetObjStaticFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700455ENTRY art_quick_get_obj_static
Ian Rogersce9eca62011-10-07 17:11:03 -0700456 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
Ian Rogers1bddec32012-02-04 12:27:34 -0800457 ldr r1, [sp, #32] @ pass referrer
Ian Rogersce9eca62011-10-07 17:11:03 -0700458 mov r2, r9 @ pass Thread::Current
459 mov r3, sp @ pass SP
460 bl artGetObjStaticFromCode @ (uint32_t field_idx, const Method* referrer, Thread*, SP)
461 ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_
462 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
463 cmp r12, #0 @ success if no exception is pending
Ian Rogersae675992011-10-09 17:10:22 -0700464 bxeq lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700465 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700466END art_quick_get_obj_static
Ian Rogersce9eca62011-10-07 17:11:03 -0700467
Ian Rogers1bddec32012-02-04 12:27:34 -0800468 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700469 * Called by managed code to resolve an instance field and load a 32-bit primitive value.
Ian Rogers1bddec32012-02-04 12:27:34 -0800470 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800471 .extern artGet32InstanceFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700472ENTRY art_quick_get32_instance
Ian Rogers1bddec32012-02-04 12:27:34 -0800473 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
474 ldr r2, [sp, #32] @ pass referrer
475 mov r3, r9 @ pass Thread::Current
buzbee865e6e02012-08-14 15:09:57 -0700476 mov r12, sp
477 str r12, [sp, #-16]! @ expand the frame and pass SP
Ian Rogers1bddec32012-02-04 12:27:34 -0800478 bl artGet32InstanceFromCode @ (field_idx, Object*, referrer, Thread*, SP)
buzbee865e6e02012-08-14 15:09:57 -0700479 add sp, #16 @ strip the extra frame
Ian Rogers1bddec32012-02-04 12:27:34 -0800480 ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_
481 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
482 cmp r12, #0 @ success if no exception is pending
483 bxeq lr @ return on success
484 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700485END art_quick_get32_instance
Ian Rogers1bddec32012-02-04 12:27:34 -0800486
Ian Rogers1bddec32012-02-04 12:27:34 -0800487 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700488 * Called by managed code to resolve an instance field and load a 64-bit primitive value.
Ian Rogers1bddec32012-02-04 12:27:34 -0800489 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800490 .extern artGet64InstanceFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700491ENTRY art_quick_get64_instance
Ian Rogers1bddec32012-02-04 12:27:34 -0800492 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
493 ldr r2, [sp, #32] @ pass referrer
494 mov r3, r9 @ pass Thread::Current
buzbee865e6e02012-08-14 15:09:57 -0700495 mov r12, sp
496 str r12, [sp, #-16]! @ expand the frame and pass SP
Ian Rogers9329bbb2013-02-08 19:56:30 -0800497 .pad #16
498 .cfi_adjust_cfa_offset 16
Ian Rogers1bddec32012-02-04 12:27:34 -0800499 bl artGet64InstanceFromCode @ (field_idx, Object*, referrer, Thread*, SP)
buzbee865e6e02012-08-14 15:09:57 -0700500 add sp, #16 @ strip the extra frame
Ian Rogers9329bbb2013-02-08 19:56:30 -0800501 .cfi_adjust_cfa_offset -16
Ian Rogers1bddec32012-02-04 12:27:34 -0800502 ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_
503 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
504 cmp r12, #0 @ success if no exception is pending
505 bxeq lr @ return on success
506 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700507END art_quick_get64_instance
Ian Rogers1bddec32012-02-04 12:27:34 -0800508
Ian Rogers1bddec32012-02-04 12:27:34 -0800509 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700510 * Called by managed code to resolve an instance field and load an object reference.
Ian Rogers1bddec32012-02-04 12:27:34 -0800511 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800512 .extern artGetObjInstanceFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700513ENTRY art_quick_get_obj_instance
Ian Rogers1bddec32012-02-04 12:27:34 -0800514 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
515 ldr r2, [sp, #32] @ pass referrer
516 mov r3, r9 @ pass Thread::Current
buzbee865e6e02012-08-14 15:09:57 -0700517 mov r12, sp
518 str r12, [sp, #-16]! @ expand the frame and pass SP
Ian Rogers9329bbb2013-02-08 19:56:30 -0800519 .pad #16
520 .cfi_adjust_cfa_offset 16
Ian Rogers1bddec32012-02-04 12:27:34 -0800521 bl artGetObjInstanceFromCode @ (field_idx, Object*, referrer, Thread*, SP)
buzbee865e6e02012-08-14 15:09:57 -0700522 add sp, #16 @ strip the extra frame
Ian Rogers9329bbb2013-02-08 19:56:30 -0800523 .cfi_adjust_cfa_offset -16
Ian Rogers1bddec32012-02-04 12:27:34 -0800524 ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_
525 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
526 cmp r12, #0 @ success if no exception is pending
527 bxeq lr @ return on success
528 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700529END art_quick_get_obj_instance
Ian Rogers1bddec32012-02-04 12:27:34 -0800530
Ian Rogersce9eca62011-10-07 17:11:03 -0700531 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700532 * Called by managed code to resolve a static field and store a 32-bit primitive value.
Ian Rogersce9eca62011-10-07 17:11:03 -0700533 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800534 .extern artSet32StaticFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700535ENTRY art_quick_set32_static
Ian Rogersce9eca62011-10-07 17:11:03 -0700536 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
Ian Rogers1bddec32012-02-04 12:27:34 -0800537 ldr r2, [sp, #32] @ pass referrer
Ian Rogersce9eca62011-10-07 17:11:03 -0700538 mov r3, r9 @ pass Thread::Current
buzbee865e6e02012-08-14 15:09:57 -0700539 mov r12, sp
540 str r12, [sp, #-16]! @ expand the frame and pass SP
Ian Rogers9329bbb2013-02-08 19:56:30 -0800541 .pad #16
542 .cfi_adjust_cfa_offset 16
Ian Rogers1bddec32012-02-04 12:27:34 -0800543 bl artSet32StaticFromCode @ (field_idx, new_val, referrer, Thread*, SP)
buzbee865e6e02012-08-14 15:09:57 -0700544 add sp, #16 @ strip the extra frame
Ian Rogers9329bbb2013-02-08 19:56:30 -0800545 .cfi_adjust_cfa_offset -16
Ian Rogersce9eca62011-10-07 17:11:03 -0700546 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
547 cmp r0, #0 @ success if result is 0
Ian Rogersae675992011-10-09 17:10:22 -0700548 bxeq lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700549 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700550END art_quick_set32_static
Ian Rogersce9eca62011-10-07 17:11:03 -0700551
Ian Rogersce9eca62011-10-07 17:11:03 -0700552 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700553 * Called by managed code to resolve a static field and store a 64-bit primitive value.
Brian Carlstrom19abfb42012-04-01 16:58:53 -0700554 * On entry r0 holds field index, r1:r2 hold new_val
Ian Rogersce9eca62011-10-07 17:11:03 -0700555 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800556 .extern artSet64StaticFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700557ENTRY art_quick_set64_static
Ian Rogersce9eca62011-10-07 17:11:03 -0700558 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
Brian Carlstrom19abfb42012-04-01 16:58:53 -0700559 mov r3, r2 @ pass one half of wide argument
560 mov r2, r1 @ pass other half of wide argument
Ian Rogers1bddec32012-02-04 12:27:34 -0800561 ldr r1, [sp, #32] @ pass referrer
Ian Rogersce9eca62011-10-07 17:11:03 -0700562 mov r12, sp @ save SP
563 sub sp, #8 @ grow frame for alignment with stack args
Ian Rogers9329bbb2013-02-08 19:56:30 -0800564 .pad #8
565 .cfi_adjust_cfa_offset 8
Ian Rogersce9eca62011-10-07 17:11:03 -0700566 push {r9, r12} @ pass Thread::Current and SP
Ian Rogers9329bbb2013-02-08 19:56:30 -0800567 .save {r9, r12}
568 .cfi_adjust_cfa_offset 8
569 .cfi_rel_offset r9, 0
Ian Rogersce9eca62011-10-07 17:11:03 -0700570 bl artSet64StaticFromCode @ (field_idx, referrer, new_val, Thread*, SP)
571 add sp, #16 @ release out args
572 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME @ TODO: we can clearly save an add here
573 cmp r0, #0 @ success if result is 0
Ian Rogersae675992011-10-09 17:10:22 -0700574 bxeq lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700575 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700576END art_quick_set64_static
Ian Rogersce9eca62011-10-07 17:11:03 -0700577
Ian Rogersce9eca62011-10-07 17:11:03 -0700578 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700579 * Called by managed code to resolve a static field and store an object reference.
Ian Rogersce9eca62011-10-07 17:11:03 -0700580 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800581 .extern artSetObjStaticFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700582ENTRY art_quick_set_obj_static
Ian Rogersce9eca62011-10-07 17:11:03 -0700583 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
Ian Rogers1bddec32012-02-04 12:27:34 -0800584 ldr r2, [sp, #32] @ pass referrer
Ian Rogersce9eca62011-10-07 17:11:03 -0700585 mov r3, r9 @ pass Thread::Current
buzbee865e6e02012-08-14 15:09:57 -0700586 mov r12, sp
587 str r12, [sp, #-16]! @ expand the frame and pass SP
Ian Rogers9329bbb2013-02-08 19:56:30 -0800588 .pad #16
589 .cfi_adjust_cfa_offset 16
Ian Rogers1bddec32012-02-04 12:27:34 -0800590 bl artSetObjStaticFromCode @ (field_idx, new_val, referrer, Thread*, SP)
buzbee865e6e02012-08-14 15:09:57 -0700591 add sp, #16 @ strip the extra frame
Ian Rogers9329bbb2013-02-08 19:56:30 -0800592 .cfi_adjust_cfa_offset -16
Ian Rogersce9eca62011-10-07 17:11:03 -0700593 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
594 cmp r0, #0 @ success if result is 0
Ian Rogersae675992011-10-09 17:10:22 -0700595 bxeq lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700596 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700597END art_quick_set_obj_static
Ian Rogerscbba6ac2011-09-22 16:28:37 -0700598
Ian Rogers1bddec32012-02-04 12:27:34 -0800599 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700600 * Called by managed code to resolve an instance field and store a 32-bit primitive value.
Ian Rogers1bddec32012-02-04 12:27:34 -0800601 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800602 .extern artSet32InstanceFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700603ENTRY art_quick_set32_instance
Ian Rogers1bddec32012-02-04 12:27:34 -0800604 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
605 ldr r3, [sp, #32] @ pass referrer
606 mov r12, sp @ save SP
607 sub sp, #8 @ grow frame for alignment with stack args
Ian Rogers9329bbb2013-02-08 19:56:30 -0800608 .pad #8
609 .cfi_adjust_cfa_offset 8
Ian Rogers1bddec32012-02-04 12:27:34 -0800610 push {r9, r12} @ pass Thread::Current and SP
Ian Rogers9329bbb2013-02-08 19:56:30 -0800611 .save {r9, r12}
612 .cfi_adjust_cfa_offset 8
613 .cfi_rel_offset r9, 0
614 .cfi_rel_offset r12, 4
Ian Rogers1bddec32012-02-04 12:27:34 -0800615 bl artSet32InstanceFromCode @ (field_idx, Object*, new_val, referrer, Thread*, SP)
616 add sp, #16 @ release out args
Ian Rogers9329bbb2013-02-08 19:56:30 -0800617 .cfi_adjust_cfa_offset -16
Ian Rogers1bddec32012-02-04 12:27:34 -0800618 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME @ TODO: we can clearly save an add here
619 cmp r0, #0 @ success if result is 0
620 bxeq lr @ return on success
621 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700622END art_quick_set32_instance
Ian Rogers1bddec32012-02-04 12:27:34 -0800623
Ian Rogers1bddec32012-02-04 12:27:34 -0800624 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700625 * Called by managed code to resolve an instance field and store a 64-bit primitive value.
Ian Rogers1bddec32012-02-04 12:27:34 -0800626 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800627 .extern artSet32InstanceFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700628ENTRY art_quick_set64_instance
Ian Rogers1bddec32012-02-04 12:27:34 -0800629 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
630 mov r12, sp @ save SP
631 sub sp, #8 @ grow frame for alignment with stack args
Ian Rogers9329bbb2013-02-08 19:56:30 -0800632 .pad #8
633 .cfi_adjust_cfa_offset 8
Ian Rogers1bddec32012-02-04 12:27:34 -0800634 push {r9, r12} @ pass Thread::Current and SP
Ian Rogers9329bbb2013-02-08 19:56:30 -0800635 .save {r9, r12}
636 .cfi_adjust_cfa_offset 8
637 .cfi_rel_offset r9, 0
Ian Rogers1bddec32012-02-04 12:27:34 -0800638 bl artSet64InstanceFromCode @ (field_idx, Object*, new_val, Thread*, SP)
639 add sp, #16 @ release out args
Ian Rogers9329bbb2013-02-08 19:56:30 -0800640 .cfi_adjust_cfa_offset -16
Ian Rogers1bddec32012-02-04 12:27:34 -0800641 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME @ TODO: we can clearly save an add here
642 cmp r0, #0 @ success if result is 0
643 bxeq lr @ return on success
644 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700645END art_quick_set64_instance
Ian Rogers1bddec32012-02-04 12:27:34 -0800646
Ian Rogers1bddec32012-02-04 12:27:34 -0800647 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700648 * Called by managed code to resolve an instance field and store an object reference.
Ian Rogers1bddec32012-02-04 12:27:34 -0800649 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800650 .extern artSetObjInstanceFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700651ENTRY art_quick_set_obj_instance
Ian Rogers1bddec32012-02-04 12:27:34 -0800652 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
653 ldr r3, [sp, #32] @ pass referrer
654 mov r12, sp @ save SP
655 sub sp, #8 @ grow frame for alignment with stack args
Ian Rogers9329bbb2013-02-08 19:56:30 -0800656 .pad #8
657 .cfi_adjust_cfa_offset 8
Ian Rogers1bddec32012-02-04 12:27:34 -0800658 push {r9, r12} @ pass Thread::Current and SP
Ian Rogers9329bbb2013-02-08 19:56:30 -0800659 .save {r9, r12}
660 .cfi_adjust_cfa_offset 8
661 .cfi_rel_offset r9, 0
Ian Rogers1bddec32012-02-04 12:27:34 -0800662 bl artSetObjInstanceFromCode @ (field_idx, Object*, new_val, referrer, Thread*, SP)
663 add sp, #16 @ release out args
Ian Rogers9329bbb2013-02-08 19:56:30 -0800664 .cfi_adjust_cfa_offset -16
Ian Rogers1bddec32012-02-04 12:27:34 -0800665 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME @ TODO: we can clearly save an add here
666 cmp r0, #0 @ success if result is 0
667 bxeq lr @ return on success
668 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700669END art_quick_set_obj_instance
Ian Rogers1bddec32012-02-04 12:27:34 -0800670
Brian Carlstromaded5f72011-10-07 17:15:04 -0700671 /*
Ian Rogerscaab8c42011-10-12 12:11:18 -0700672 * Entry from managed code to resolve a string, this stub will allocate a String and deliver an
673 * exception on error. On success the String is returned. R0 holds the referring method,
674 * R1 holds the string index. The fast path check for hit in strings cache has already been
675 * performed.
Brian Carlstromaded5f72011-10-07 17:15:04 -0700676 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800677 .extern artResolveStringFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700678ENTRY art_quick_resolve_string
Ian Rogerscaab8c42011-10-12 12:11:18 -0700679 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
680 mov r2, r9 @ pass Thread::Current
681 mov r3, sp @ pass SP
682 @ artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, SP)
Brian Carlstromaded5f72011-10-07 17:15:04 -0700683 bl artResolveStringFromCode
684 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
Ian Rogerscaab8c42011-10-12 12:11:18 -0700685 cmp r0, #0 @ success if result is non-null
686 bxne lr @ return on success
Brian Carlstromaded5f72011-10-07 17:15:04 -0700687 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700688END art_quick_resolve_string
Brian Carlstromaded5f72011-10-07 17:15:04 -0700689
Ian Rogers21d9e832011-09-23 17:05:09 -0700690 /*
691 * Called by managed code to allocate an object
692 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800693 .extern artAllocObjectFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700694ENTRY art_quick_alloc_object
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700695 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
696 mov r2, r9 @ pass Thread::Current
697 mov r3, sp @ pass SP
698 bl artAllocObjectFromCode @ (uint32_t type_idx, Method* method, Thread*, SP)
699 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
700 cmp r0, #0 @ success if result is non-null
Ian Rogersae675992011-10-09 17:10:22 -0700701 bxne lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700702 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700703END art_quick_alloc_object
Ian Rogers21d9e832011-09-23 17:05:09 -0700704
buzbeecc4540e2011-10-27 13:06:03 -0700705 /*
Ian Rogers28ad40d2011-10-27 15:19:26 -0700706 * Called by managed code to allocate an object when the caller doesn't know whether it has
Ian Rogers57b86d42012-03-27 16:05:41 -0700707 * access to the created type.
buzbeecc4540e2011-10-27 13:06:03 -0700708 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800709 .extern artAllocObjectFromCodeWithAccessCheck
Ian Rogers468532e2013-08-05 10:56:33 -0700710ENTRY art_quick_alloc_object_with_access_check
buzbeecc4540e2011-10-27 13:06:03 -0700711 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
712 mov r2, r9 @ pass Thread::Current
713 mov r3, sp @ pass SP
Ian Rogers28ad40d2011-10-27 15:19:26 -0700714 bl artAllocObjectFromCodeWithAccessCheck @ (uint32_t type_idx, Method* method, Thread*, SP)
buzbeecc4540e2011-10-27 13:06:03 -0700715 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
716 cmp r0, #0 @ success if result is non-null
717 bxne lr @ return on success
718 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700719END art_quick_alloc_object_with_access_check
buzbeecc4540e2011-10-27 13:06:03 -0700720
Ian Rogersb886da82011-09-23 16:27:54 -0700721 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700722 * Called by managed code to allocate an array.
Ian Rogersb886da82011-09-23 16:27:54 -0700723 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800724 .extern artAllocArrayFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700725ENTRY art_quick_alloc_array
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700726 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
727 mov r3, r9 @ pass Thread::Current
buzbee865e6e02012-08-14 15:09:57 -0700728 mov r12, sp
729 str r12, [sp, #-16]! @ expand the frame and pass SP
Ian Rogers9329bbb2013-02-08 19:56:30 -0800730 .pad #16
731 .cfi_adjust_cfa_offset 16
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700732 @ artAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t component_count, Thread*, SP)
733 bl artAllocArrayFromCode
buzbee865e6e02012-08-14 15:09:57 -0700734 add sp, #16 @ strip the extra frame
Ian Rogers9329bbb2013-02-08 19:56:30 -0800735 .cfi_adjust_cfa_offset -16
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700736 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
737 cmp r0, #0 @ success if result is non-null
Ian Rogersae675992011-10-09 17:10:22 -0700738 bxne lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700739 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700740END art_quick_alloc_array
Ian Rogersb886da82011-09-23 16:27:54 -0700741
Ian Rogers0eb7d7e2012-01-31 21:12:32 -0800742 /*
743 * Called by managed code to allocate an array when the caller doesn't know whether it has
Ian Rogers57b86d42012-03-27 16:05:41 -0700744 * access to the created type.
Ian Rogers0eb7d7e2012-01-31 21:12:32 -0800745 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800746 .extern artAllocArrayFromCodeWithAccessCheck
Ian Rogers468532e2013-08-05 10:56:33 -0700747ENTRY art_quick_alloc_array_with_access_check
Ian Rogers0eb7d7e2012-01-31 21:12:32 -0800748 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
749 mov r3, r9 @ pass Thread::Current
buzbee865e6e02012-08-14 15:09:57 -0700750 mov r12, sp
751 str r12, [sp, #-16]! @ expand the frame and pass SP
Ian Rogers9329bbb2013-02-08 19:56:30 -0800752 .pad #16
753 .cfi_adjust_cfa_offset 16
Ian Rogers0eb7d7e2012-01-31 21:12:32 -0800754 @ artAllocArrayFromCodeWithAccessCheck(type_idx, method, component_count, Thread*, SP)
755 bl artAllocArrayFromCodeWithAccessCheck
buzbee865e6e02012-08-14 15:09:57 -0700756 add sp, #16 @ strip the extra frame
Ian Rogers9329bbb2013-02-08 19:56:30 -0800757 .cfi_adjust_cfa_offset -16
Ian Rogers0eb7d7e2012-01-31 21:12:32 -0800758 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
759 cmp r0, #0 @ success if result is non-null
760 bxne lr @ return on success
761 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700762END art_quick_alloc_array_with_access_check
Ian Rogers0eb7d7e2012-01-31 21:12:32 -0800763
Ian Rogersb886da82011-09-23 16:27:54 -0700764 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700765 * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY.
Ian Rogersb886da82011-09-23 16:27:54 -0700766 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800767 .extern artCheckAndAllocArrayFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700768ENTRY art_quick_check_and_alloc_array
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700769 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
770 mov r3, r9 @ pass Thread::Current
buzbee865e6e02012-08-14 15:09:57 -0700771 mov r12, sp
772 str r12, [sp, #-16]! @ expand the frame and pass SP
Ian Rogers9329bbb2013-02-08 19:56:30 -0800773 .pad #16
774 .cfi_adjust_cfa_offset 16
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700775 @ artCheckAndAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t count, Thread* , SP)
776 bl artCheckAndAllocArrayFromCode
buzbee865e6e02012-08-14 15:09:57 -0700777 add sp, #16 @ strip the extra frame
Ian Rogers9329bbb2013-02-08 19:56:30 -0800778 .cfi_adjust_cfa_offset -16
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700779 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
Ian Rogersce9eca62011-10-07 17:11:03 -0700780 cmp r0, #0 @ success if result is non-null
Ian Rogersae675992011-10-09 17:10:22 -0700781 bxne lr @ return on success
Ian Rogersce9eca62011-10-07 17:11:03 -0700782 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700783END art_quick_check_and_alloc_array
Ian Rogersb886da82011-09-23 16:27:54 -0700784
Ian Rogers0eb7d7e2012-01-31 21:12:32 -0800785 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700786 * Called by managed code to allocate an array in a special case for FILLED_NEW_ARRAY.
Ian Rogers0eb7d7e2012-01-31 21:12:32 -0800787 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800788 .extern artCheckAndAllocArrayFromCodeWithAccessCheck
Ian Rogers468532e2013-08-05 10:56:33 -0700789ENTRY art_quick_check_and_alloc_array_with_access_check
Ian Rogers0eb7d7e2012-01-31 21:12:32 -0800790 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case of GC
791 mov r3, r9 @ pass Thread::Current
buzbee865e6e02012-08-14 15:09:57 -0700792 mov r12, sp
793 str r12, [sp, #-16]! @ expand the frame and pass SP
Ian Rogers9329bbb2013-02-08 19:56:30 -0800794 .pad #16
795 .cfi_adjust_cfa_offset 16
Ian Rogers0eb7d7e2012-01-31 21:12:32 -0800796 @ artCheckAndAllocArrayFromCodeWithAccessCheck(type_idx, method, count, Thread* , SP)
797 bl artCheckAndAllocArrayFromCodeWithAccessCheck
buzbee865e6e02012-08-14 15:09:57 -0700798 add sp, #16 @ strip the extra frame
Ian Rogers9329bbb2013-02-08 19:56:30 -0800799 .cfi_adjust_cfa_offset -16
Ian Rogers0eb7d7e2012-01-31 21:12:32 -0800800 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
801 cmp r0, #0 @ success if result is non-null
802 bxne lr @ return on success
803 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700804END art_quick_check_and_alloc_array_with_access_check
Ian Rogers0eb7d7e2012-01-31 21:12:32 -0800805
Ian Rogersdfcdf1a2011-10-10 17:50:35 -0700806 /*
Ian Rogers57b86d42012-03-27 16:05:41 -0700807 * Called by managed code when the value in rSUSPEND has been decremented to 0.
Ian Rogersdfcdf1a2011-10-10 17:50:35 -0700808 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800809 .extern artTestSuspendFromCode
810ENTRY art_quick_test_suspend
Ian Rogers474b6da2012-09-25 00:20:38 -0700811 ldrh r0, [rSELF, #THREAD_FLAGS_OFFSET]
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700812 mov rSUSPEND, #SUSPEND_CHECK_INTERVAL @ reset rSUSPEND to SUSPEND_CHECK_INTERVAL
813 cmp r0, #0 @ check Thread::Current()->suspend_count_ == 0
Ian Rogers306057f2012-11-26 12:45:53 -0800814 bxeq lr @ return if suspend_count_ == 0
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700815 mov r0, rSELF
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700816 SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves for stack crawl
buzbeec10717a2011-10-09 14:40:13 -0700817 mov r1, sp
Ian Rogers4a510d82011-10-09 14:30:24 -0700818 bl artTestSuspendFromCode @ (Thread*, SP)
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700819 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
Ian Rogers9329bbb2013-02-08 19:56:30 -0800820END art_quick_test_suspend
Ian Rogers4f0d07c2011-10-06 23:38:47 -0700821
Ian Rogersdfcdf1a2011-10-10 17:50:35 -0700822 /*
823 * Called by managed code that is attempting to call a method on a proxy class. On entry
Ian Rogersaf6e67a2013-01-16 08:38:37 -0800824 * r0 holds the proxy method and r1 holds the receiver; r2 and r3 may contain arguments. The
825 * frame size of the invoked proxy method agrees with a ref and args callee save frame.
Ian Rogersdfcdf1a2011-10-10 17:50:35 -0700826 */
Jeff Hao5fa60c32013-04-04 17:57:01 -0700827 .extern artQuickProxyInvokeHandler
Ian Rogers9329bbb2013-02-08 19:56:30 -0800828ENTRY art_quick_proxy_invoke_handler
Ian Rogersdfcdf1a2011-10-10 17:50:35 -0700829 SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
830 str r0, [sp, #0] @ place proxy method at bottom of frame
831 mov r2, r9 @ pass Thread::Current
Ian Rogersaf6e67a2013-01-16 08:38:37 -0800832 mov r3, sp @ pass SP
Jeff Hao5fa60c32013-04-04 17:57:01 -0700833 blx artQuickProxyInvokeHandler @ (Method* proxy method, receiver, Thread*, SP)
Ian Rogersdfcdf1a2011-10-10 17:50:35 -0700834 ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_
Ian Rogers466bb252011-10-14 03:29:56 -0700835 ldr lr, [sp, #44] @ restore lr
Ian Rogers466bb252011-10-14 03:29:56 -0700836 add sp, #48 @ pop frame
Jeff Haod4c3f7d2013-02-14 14:14:44 -0800837 .cfi_adjust_cfa_offset -48
Ian Rogersdfcdf1a2011-10-10 17:50:35 -0700838 cmp r12, #0 @ success if no exception is pending
839 bxeq lr @ return on success
840 DELIVER_PENDING_EXCEPTION
Ian Rogers9329bbb2013-02-08 19:56:30 -0800841END art_quick_proxy_invoke_handler
Ian Rogersdfcdf1a2011-10-10 17:50:35 -0700842
Ian Rogers468532e2013-08-05 10:56:33 -0700843 .extern artQuickResolutionTrampoline
844ENTRY art_quick_resolution_trampoline
Ian Rogers7db619b2013-01-16 18:35:48 -0800845 SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
Ian Rogers468532e2013-08-05 10:56:33 -0700846 mov r2, r9 @ pass Thread::Current
847 mov r3, sp @ pass SP
848 blx artQuickResolutionTrampoline @ (Method* called, receiver, Thread*, SP)
849 cmp r0, #0 @ is code pointer null?
850 beq 1f @ goto exception
851 mov r12, r0
852 ldr r0, [sp, #0] @ load resolved method in r0
853 ldr r1, [sp, #8] @ restore non-callee save r1
854 ldrd r2, [sp, #12] @ restore non-callee saves r2-r3
855 ldr lr, [sp, #44] @ restore lr
856 add sp, #48 @ rewind sp
857 .cfi_adjust_cfa_offset -48
858 bx r12 @ tail-call into actual code
8591:
860 RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
861 DELIVER_PENDING_EXCEPTION
862END art_quick_resolution_trampoline
863
864 .extern artQuickToInterpreterBridge
865ENTRY art_quick_to_interpreter_bridge
866 SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
Ian Rogers7db619b2013-01-16 18:35:48 -0800867 mov r1, r9 @ pass Thread::Current
868 mov r2, sp @ pass SP
Ian Rogers468532e2013-08-05 10:56:33 -0700869 blx artQuickToInterpreterBridge @ (Method* method, Thread*, SP)
Ian Rogers7db619b2013-01-16 18:35:48 -0800870 ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_
871 ldr lr, [sp, #44] @ restore lr
872 add sp, #48 @ pop frame
Jeff Haod4c3f7d2013-02-14 14:14:44 -0800873 .cfi_adjust_cfa_offset -48
Ian Rogers7db619b2013-01-16 18:35:48 -0800874 cmp r12, #0 @ success if no exception is pending
875 bxeq lr @ return on success
876 DELIVER_PENDING_EXCEPTION
Ian Rogers468532e2013-08-05 10:56:33 -0700877END art_quick_to_interpreter_bridge
Ian Rogers7db619b2013-01-16 18:35:48 -0800878
jeffhaoe343b762011-12-05 16:36:44 -0800879 /*
jeffhao0791adc2012-04-04 11:14:32 -0700880 * Routine that intercepts method calls and returns.
jeffhaoe343b762011-12-05 16:36:44 -0800881 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800882 .extern artInstrumentationMethodEntryFromCode
883 .extern artInstrumentationMethodExitFromCode
Ian Rogers468532e2013-08-05 10:56:33 -0700884ENTRY art_quick_instrumentation_entry
Ian Rogers62d6c772013-02-27 08:32:07 -0800885 SETUP_REF_AND_ARGS_CALLEE_SAVE_FRAME
886 str r0, [sp, #4] @ preserve r0
887 mov r12, sp @ remember sp
888 str lr, [sp, #-16]! @ expand the frame and pass LR
889 .pad #16
Ian Rogers9329bbb2013-02-08 19:56:30 -0800890 .cfi_adjust_cfa_offset 16
Ian Rogers62d6c772013-02-27 08:32:07 -0800891 .cfi_rel_offset lr, 0
892 mov r2, r9 @ pass Thread::Current
893 mov r3, r12 @ pass SP
894 blx artInstrumentationMethodEntryFromCode @ (Method*, Object*, Thread*, SP, LR)
895 add sp, #16 @ remove out argument and padding from stack
Ian Rogers9329bbb2013-02-08 19:56:30 -0800896 .cfi_adjust_cfa_offset -16
Ian Rogers62d6c772013-02-27 08:32:07 -0800897 mov r12, r0 @ r12 holds reference to code
898 ldr r0, [sp, #4] @ restore r0
899 RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME
Ian Rogers468532e2013-08-05 10:56:33 -0700900 blx r12 @ call method with lr set to art_quick_instrumentation_exit
901END art_quick_instrumentation_entry
902 .type art_quick_instrumentation_exit, #function
903 .global art_quick_instrumentation_exit
904art_quick_instrumentation_exit:
Ian Rogers9329bbb2013-02-08 19:56:30 -0800905 .cfi_startproc
906 .fnstart
Ian Rogers62d6c772013-02-27 08:32:07 -0800907 mov lr, #0 @ link register is to here, so clobber with 0 for later checks
908 SETUP_REF_ONLY_CALLEE_SAVE_FRAME
Ian Rogers306057f2012-11-26 12:45:53 -0800909 mov r12, sp @ remember bottom of caller's frame
jeffhaoe343b762011-12-05 16:36:44 -0800910 push {r0-r1} @ save return value
Ian Rogers9329bbb2013-02-08 19:56:30 -0800911 .save {r0-r1}
912 .cfi_adjust_cfa_offset 8
913 .cfi_rel_offset r0, 0
914 .cfi_rel_offset r1, 4
Ian Rogers62d6c772013-02-27 08:32:07 -0800915 sub sp, #8 @ space for return value argument
Ian Rogers9329bbb2013-02-08 19:56:30 -0800916 .pad #8
917 .cfi_adjust_cfa_offset 8
Ian Rogers62d6c772013-02-27 08:32:07 -0800918 strd r0, [sp] @ r0/r1 -> [sp] for fpr_res
919 mov r2, r0 @ pass return value as gpr_res
920 mov r3, r1
Ian Rogers306057f2012-11-26 12:45:53 -0800921 mov r0, r9 @ pass Thread::Current
922 mov r1, r12 @ pass SP
Ian Rogers62d6c772013-02-27 08:32:07 -0800923 blx artInstrumentationMethodExitFromCode @ (Thread*, SP, gpr_res, fpr_res)
Ian Rogers306057f2012-11-26 12:45:53 -0800924 add sp, #8
Ian Rogers9329bbb2013-02-08 19:56:30 -0800925 .cfi_adjust_cfa_offset -8
Ian Rogers62d6c772013-02-27 08:32:07 -0800926
Ian Rogers306057f2012-11-26 12:45:53 -0800927 mov r2, r0 @ link register saved by instrumentation
928 mov lr, r1 @ r1 is holding link register if we're to bounce to deoptimize
jeffhaoe343b762011-12-05 16:36:44 -0800929 pop {r0, r1} @ restore return value
Ian Rogers62d6c772013-02-27 08:32:07 -0800930 add sp, #32 @ remove callee save frame
931 .cfi_adjust_cfa_offset -32
Ian Rogers306057f2012-11-26 12:45:53 -0800932 bx r2 @ return
Ian Rogers468532e2013-08-05 10:56:33 -0700933END art_quick_instrumentation_exit
Ian Rogers306057f2012-11-26 12:45:53 -0800934
Ian Rogers306057f2012-11-26 12:45:53 -0800935 /*
Ian Rogers62d6c772013-02-27 08:32:07 -0800936 * Instrumentation has requested that we deoptimize into the interpreter. The deoptimization
937 * will long jump to the upcall with a special exception of -1.
Ian Rogers306057f2012-11-26 12:45:53 -0800938 */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800939 .extern artDeoptimize
Ian Rogers9329bbb2013-02-08 19:56:30 -0800940ENTRY art_quick_deoptimize
Jeff Hao14dd5a82013-04-11 10:23:36 -0700941 SETUP_SAVE_ALL_CALLEE_SAVE_FRAME
Ian Rogers62d6c772013-02-27 08:32:07 -0800942 mov r0, r9 @ Set up args.
943 mov r1, sp
944 blx artDeoptimize @ artDeoptimize(Thread*, SP)
Ian Rogers9329bbb2013-02-08 19:56:30 -0800945END art_quick_deoptimize
jeffhaoe343b762011-12-05 16:36:44 -0800946
Ian Rogers324e1902012-09-09 12:17:52 -0700947 /*
948 * Signed 64-bit integer multiply.
949 *
950 * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
951 * WX
952 * x YZ
953 * --------
954 * ZW ZX
955 * YW YX
956 *
957 * The low word of the result holds ZX, the high word holds
958 * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because
959 * it doesn't fit in the low 64 bits.
960 *
961 * Unlike most ARM math operations, multiply instructions have
962 * restrictions on using the same register more than once (Rd and Rm
963 * cannot be the same).
964 */
965 /* mul-long vAA, vBB, vCC */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800966ENTRY art_quick_mul_long
Ian Rogers324e1902012-09-09 12:17:52 -0700967 push {r9 - r10}
Ian Rogers9329bbb2013-02-08 19:56:30 -0800968 .save {r9 - r10}
969 .cfi_adjust_cfa_offset 8
970 .cfi_rel_offset r9, 0
971 .cfi_rel_offset r10, 4
Ian Rogers324e1902012-09-09 12:17:52 -0700972 mul ip, r2, r1 @ ip<- ZxW
973 umull r9, r10, r2, r0 @ r9/r10 <- ZxX
974 mla r2, r0, r3, ip @ r2<- YxX + (ZxW)
975 add r10, r2, r10 @ r10<- r10 + low(ZxW + (YxX))
976 mov r0,r9
977 mov r1,r10
978 pop {r9 - r10}
Ian Rogers9329bbb2013-02-08 19:56:30 -0800979 .cfi_adjust_cfa_offset -8
Ian Rogers324e1902012-09-09 12:17:52 -0700980 bx lr
Ian Rogers9329bbb2013-02-08 19:56:30 -0800981END art_quick_mul_long
Ian Rogers324e1902012-09-09 12:17:52 -0700982
buzbee54330722011-08-23 16:46:55 -0700983 /*
984 * Long integer shift. This is different from the generic 32/64-bit
985 * binary operations because vAA/vBB are 64-bit but vCC (the shift
986 * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low
987 * 6 bits.
988 * On entry:
989 * r0: low word
990 * r1: high word
991 * r2: shift count
992 */
993 /* shl-long vAA, vBB, vCC */
Ian Rogers9329bbb2013-02-08 19:56:30 -0800994ENTRY art_quick_shl_long
buzbee54330722011-08-23 16:46:55 -0700995 and r2, r2, #63 @ r2<- r2 & 0x3f
996 mov r1, r1, asl r2 @ r1<- r1 << r2
997 rsb r3, r2, #32 @ r3<- 32 - r2
998 orr r1, r1, r0, lsr r3 @ r1<- r1 | (r0 << (32-r2))
999 subs ip, r2, #32 @ ip<- r2 - 32
1000 movpl r1, r0, asl ip @ if r2 >= 32, r1<- r0 << (r2-32)
1001 mov r0, r0, asl r2 @ r0<- r0 << r2
1002 bx lr
Ian Rogers9329bbb2013-02-08 19:56:30 -08001003END art_quick_shl_long
buzbee54330722011-08-23 16:46:55 -07001004
buzbee54330722011-08-23 16:46:55 -07001005 /*
1006 * Long integer shift. This is different from the generic 32/64-bit
1007 * binary operations because vAA/vBB are 64-bit but vCC (the shift
1008 * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low
1009 * 6 bits.
1010 * On entry:
1011 * r0: low word
1012 * r1: high word
1013 * r2: shift count
1014 */
1015 /* shr-long vAA, vBB, vCC */
Ian Rogers9329bbb2013-02-08 19:56:30 -08001016ENTRY art_quick_shr_long
buzbee54330722011-08-23 16:46:55 -07001017 and r2, r2, #63 @ r0<- r0 & 0x3f
1018 mov r0, r0, lsr r2 @ r0<- r2 >> r2
1019 rsb r3, r2, #32 @ r3<- 32 - r2
1020 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
1021 subs ip, r2, #32 @ ip<- r2 - 32
1022 movpl r0, r1, asr ip @ if r2 >= 32, r0<-r1 >> (r2-32)
1023 mov r1, r1, asr r2 @ r1<- r1 >> r2
1024 bx lr
Ian Rogers9329bbb2013-02-08 19:56:30 -08001025END art_quick_shr_long
buzbee54330722011-08-23 16:46:55 -07001026
buzbee54330722011-08-23 16:46:55 -07001027 /*
1028 * Long integer shift. This is different from the generic 32/64-bit
1029 * binary operations because vAA/vBB are 64-bit but vCC (the shift
1030 * distance) is 32-bit. Also, Dalvik requires us to ignore all but the low
1031 * 6 bits.
1032 * On entry:
1033 * r0: low word
1034 * r1: high word
1035 * r2: shift count
1036 */
1037 /* ushr-long vAA, vBB, vCC */
Ian Rogers9329bbb2013-02-08 19:56:30 -08001038ENTRY art_quick_ushr_long
buzbee54330722011-08-23 16:46:55 -07001039 and r2, r2, #63 @ r0<- r0 & 0x3f
1040 mov r0, r0, lsr r2 @ r0<- r2 >> r2
1041 rsb r3, r2, #32 @ r3<- 32 - r2
1042 orr r0, r0, r1, asl r3 @ r0<- r0 | (r1 << (32-r2))
1043 subs ip, r2, #32 @ ip<- r2 - 32
1044 movpl r0, r1, lsr ip @ if r2 >= 32, r0<-r1 >>> (r2-32)
1045 mov r1, r1, lsr r2 @ r1<- r1 >>> r2
1046 bx lr
Ian Rogers9329bbb2013-02-08 19:56:30 -08001047END art_quick_ushr_long
buzbeefc9e6fa2012-03-23 15:14:29 -07001048
buzbeefc9e6fa2012-03-23 15:14:29 -07001049 /*
1050 * String's indexOf.
1051 *
1052 * On entry:
1053 * r0: string object (known non-null)
jeffhao86e46712012-08-08 17:30:59 -07001054 * r1: char to match (known <= 0xFFFF)
buzbeefc9e6fa2012-03-23 15:14:29 -07001055 * r2: Starting offset in string data
1056 */
Ian Rogers9329bbb2013-02-08 19:56:30 -08001057ENTRY art_quick_indexof
buzbeefc9e6fa2012-03-23 15:14:29 -07001058 push {r4, r10-r11, lr} @ 4 words of callee saves
Ian Rogers9329bbb2013-02-08 19:56:30 -08001059 .save {r4, r10-r11, lr}
1060 .cfi_adjust_cfa_offset 16
1061 .cfi_rel_offset r4, 0
1062 .cfi_rel_offset r10, 4
1063 .cfi_rel_offset r11, 8
1064 .cfi_rel_offset lr, 12
buzbeefc9e6fa2012-03-23 15:14:29 -07001065 ldr r3, [r0, #STRING_COUNT_OFFSET]
1066 ldr r12, [r0, #STRING_OFFSET_OFFSET]
1067 ldr r0, [r0, #STRING_VALUE_OFFSET]
1068
1069 /* Clamp start to [0..count] */
1070 cmp r2, #0
1071 movlt r2, #0
1072 cmp r2, r3
1073 movgt r2, r3
1074
1075 /* Build a pointer to the start of string data */
1076 add r0, #STRING_DATA_OFFSET
1077 add r0, r0, r12, lsl #1
1078
1079 /* Save a copy in r12 to later compute result */
1080 mov r12, r0
1081
1082 /* Build pointer to start of data to compare and pre-bias */
1083 add r0, r0, r2, lsl #1
1084 sub r0, #2
1085
1086 /* Compute iteration count */
1087 sub r2, r3, r2
1088
1089 /*
1090 * At this point we have:
1091 * r0: start of data to test
1092 * r1: char to compare
1093 * r2: iteration count
1094 * r12: original start of string data
1095 * r3, r4, r10, r11 available for loading string data
1096 */
1097
1098 subs r2, #4
1099 blt indexof_remainder
1100
1101indexof_loop4:
1102 ldrh r3, [r0, #2]!
1103 ldrh r4, [r0, #2]!
1104 ldrh r10, [r0, #2]!
1105 ldrh r11, [r0, #2]!
1106 cmp r3, r1
1107 beq match_0
1108 cmp r4, r1
1109 beq match_1
1110 cmp r10, r1
1111 beq match_2
1112 cmp r11, r1
1113 beq match_3
1114 subs r2, #4
1115 bge indexof_loop4
1116
1117indexof_remainder:
1118 adds r2, #4
1119 beq indexof_nomatch
1120
1121indexof_loop1:
1122 ldrh r3, [r0, #2]!
1123 cmp r3, r1
1124 beq match_3
1125 subs r2, #1
1126 bne indexof_loop1
1127
1128indexof_nomatch:
1129 mov r0, #-1
1130 pop {r4, r10-r11, pc}
1131
1132match_0:
1133 sub r0, #6
1134 sub r0, r12
1135 asr r0, r0, #1
1136 pop {r4, r10-r11, pc}
1137match_1:
1138 sub r0, #4
1139 sub r0, r12
1140 asr r0, r0, #1
1141 pop {r4, r10-r11, pc}
1142match_2:
1143 sub r0, #2
1144 sub r0, r12
1145 asr r0, r0, #1
1146 pop {r4, r10-r11, pc}
1147match_3:
1148 sub r0, r12
1149 asr r0, r0, #1
1150 pop {r4, r10-r11, pc}
Ian Rogers9329bbb2013-02-08 19:56:30 -08001151END art_quick_indexof
buzbeefc9e6fa2012-03-23 15:14:29 -07001152
1153 /*
1154 * String's compareTo.
1155 *
1156 * Requires rARG0/rARG1 to have been previously checked for null. Will
1157 * return negative if this's string is < comp, 0 if they are the
1158 * same and positive if >.
1159 *
1160 * On entry:
1161 * r0: this object pointer
1162 * r1: comp object pointer
1163 *
1164 */
buzbeefc9e6fa2012-03-23 15:14:29 -07001165 .extern __memcmp16
Ian Rogers9329bbb2013-02-08 19:56:30 -08001166ENTRY art_quick_string_compareto
buzbeefc9e6fa2012-03-23 15:14:29 -07001167 mov r2, r0 @ this to r2, opening up r0 for return value
1168 subs r0, r2, r1 @ Same?
1169 bxeq lr
1170
1171 push {r4, r7-r12, lr} @ 8 words - keep alignment
Ian Rogers9329bbb2013-02-08 19:56:30 -08001172 .save {r4, r7-r12, lr}
1173 .cfi_adjust_cfa_offset 32
1174 .cfi_rel_offset r4, 0
1175 .cfi_rel_offset r7, 4
1176 .cfi_rel_offset r8, 8
1177 .cfi_rel_offset r9, 12
1178 .cfi_rel_offset r10, 16
1179 .cfi_rel_offset r11, 20
1180 .cfi_rel_offset r12, 24
1181 .cfi_rel_offset lr, 28
buzbeefc9e6fa2012-03-23 15:14:29 -07001182
1183 ldr r4, [r2, #STRING_OFFSET_OFFSET]
1184 ldr r9, [r1, #STRING_OFFSET_OFFSET]
1185 ldr r7, [r2, #STRING_COUNT_OFFSET]
1186 ldr r10, [r1, #STRING_COUNT_OFFSET]
1187 ldr r2, [r2, #STRING_VALUE_OFFSET]
1188 ldr r1, [r1, #STRING_VALUE_OFFSET]
1189
1190 /*
1191 * At this point, we have:
1192 * value: r2/r1
1193 * offset: r4/r9
1194 * count: r7/r10
1195 * We're going to compute
1196 * r11 <- countDiff
1197 * r10 <- minCount
1198 */
1199 subs r11, r7, r10
1200 movls r10, r7
1201
1202 /* Now, build pointers to the string data */
1203 add r2, r2, r4, lsl #1
1204 add r1, r1, r9, lsl #1
1205 /*
1206 * Note: data pointers point to previous element so we can use pre-index
1207 * mode with base writeback.
1208 */
1209 add r2, #STRING_DATA_OFFSET-2 @ offset to contents[-1]
1210 add r1, #STRING_DATA_OFFSET-2 @ offset to contents[-1]
1211
1212 /*
1213 * At this point we have:
1214 * r2: *this string data
1215 * r1: *comp string data
1216 * r10: iteration count for comparison
1217 * r11: value to return if the first part of the string is equal
1218 * r0: reserved for result
1219 * r3, r4, r7, r8, r9, r12 available for loading string data
1220 */
1221
1222 subs r10, #2
1223 blt do_remainder2
1224
1225 /*
1226 * Unroll the first two checks so we can quickly catch early mismatch
1227 * on long strings (but preserve incoming alignment)
1228 */
1229
1230 ldrh r3, [r2, #2]!
1231 ldrh r4, [r1, #2]!
1232 ldrh r7, [r2, #2]!
1233 ldrh r8, [r1, #2]!
1234 subs r0, r3, r4
1235 subeqs r0, r7, r8
1236 bne done
1237 cmp r10, #28
1238 bgt do_memcmp16
1239 subs r10, #3
1240 blt do_remainder
1241
1242loopback_triple:
1243 ldrh r3, [r2, #2]!
1244 ldrh r4, [r1, #2]!
1245 ldrh r7, [r2, #2]!
1246 ldrh r8, [r1, #2]!
1247 ldrh r9, [r2, #2]!
1248 ldrh r12,[r1, #2]!
1249 subs r0, r3, r4
1250 subeqs r0, r7, r8
1251 subeqs r0, r9, r12
1252 bne done
1253 subs r10, #3
1254 bge loopback_triple
1255
1256do_remainder:
1257 adds r10, #3
1258 beq returnDiff
1259
1260loopback_single:
1261 ldrh r3, [r2, #2]!
1262 ldrh r4, [r1, #2]!
1263 subs r0, r3, r4
1264 bne done
1265 subs r10, #1
1266 bne loopback_single
1267
1268returnDiff:
1269 mov r0, r11
1270 pop {r4, r7-r12, pc}
1271
1272do_remainder2:
1273 adds r10, #2
1274 bne loopback_single
1275 mov r0, r11
1276 pop {r4, r7-r12, pc}
1277
1278 /* Long string case */
1279do_memcmp16:
1280 mov r7, r11
1281 add r0, r2, #2
1282 add r1, r1, #2
1283 mov r2, r10
1284 bl __memcmp16
1285 cmp r0, #0
1286 moveq r0, r7
1287done:
1288 pop {r4, r7-r12, pc}
Ian Rogers9329bbb2013-02-08 19:56:30 -08001289END art_quick_string_compareto