diff options
| -rw-r--r-- | runtime/arch/arm/asm_support_arm.S | 17 | ||||
| -rw-r--r-- | runtime/arch/arm/jni_entrypoints_arm.S | 11 | ||||
| -rw-r--r-- | runtime/arch/arm/portable_entrypoints_arm.S | 2 | ||||
| -rw-r--r-- | runtime/arch/arm/quick_entrypoints_arm.S | 176 |
4 files changed, 115 insertions, 91 deletions
diff --git a/runtime/arch/arm/asm_support_arm.S b/runtime/arch/arm/asm_support_arm.S index 559788f1ba..ee4484b96c 100644 --- a/runtime/arch/arm/asm_support_arm.S +++ b/runtime/arch/arm/asm_support_arm.S @@ -19,7 +19,24 @@ #include "asm_support_arm.h" +.cfi_sections .debug_frame +.syntax unified +.arch armv7-a +.thumb + .macro ENTRY name + .thumb_func + .type \name, #function + .global \name + /* Cache alignment for function entry */ + .balign 16 +\name: + .cfi_startproc + .fnstart +.endm + +.macro ARM_ENTRY name + .arm .type \name, #function .global \name /* Cache alignment for function entry */ diff --git a/runtime/arch/arm/jni_entrypoints_arm.S b/runtime/arch/arm/jni_entrypoints_arm.S index f51f12183c..4a69644b6c 100644 --- a/runtime/arch/arm/jni_entrypoints_arm.S +++ b/runtime/arch/arm/jni_entrypoints_arm.S @@ -16,8 +16,6 @@ #include "asm_support_arm.S" - .cfi_sections .debug_frame - /* * Jni dlsym lookup stub. */ @@ -34,11 +32,14 @@ ENTRY art_jni_dlsym_lookup_stub mov r12, r0 @ save result in r12 add sp, #12 @ restore stack pointer .cfi_adjust_cfa_offset -12 + cbz r0, 1f @ is method code null? pop {r0, r1, r2, r3, lr} @ restore regs .cfi_adjust_cfa_offset -20 - cmp r12, #0 @ is method code null? - bxne r12 @ if non-null, tail call to method's code - bx lr @ otherwise, return to caller to handle exception + bx r12 @ if non-null, tail call to method's code +1: + .cfi_adjust_cfa_offset 20 + pop {r0, r1, r2, r3, pc} @ restore regs and return to caller to handle exception + .cfi_adjust_cfa_offset -20 END art_jni_dlsym_lookup_stub /* diff --git a/runtime/arch/arm/portable_entrypoints_arm.S b/runtime/arch/arm/portable_entrypoints_arm.S index 073efdc383..ac519d55bb 100644 --- a/runtime/arch/arm/portable_entrypoints_arm.S +++ b/runtime/arch/arm/portable_entrypoints_arm.S @@ -16,8 +16,6 @@ #include "asm_support_arm.S" - .cfi_sections .debug_frame - /* * Portable invocation stub. * On entry: diff --git a/runtime/arch/arm/quick_entrypoints_arm.S b/runtime/arch/arm/quick_entrypoints_arm.S index d9bb433c85..a77ce01562 100644 --- a/runtime/arch/arm/quick_entrypoints_arm.S +++ b/runtime/arch/arm/quick_entrypoints_arm.S @@ -16,8 +16,6 @@ #include "asm_support_arm.S" - .cfi_sections .debug_frame - /* Deliver the given exception */ .extern artDeliverExceptionFromCode /* Deliver an exception pending on a thread */ @@ -112,6 +110,18 @@ .cfi_adjust_cfa_offset -48 .endm +.macro RETURN_IF_RESULT_IS_ZERO + cbnz r0, 1f @ result non-zero branch over + bx lr @ return +1: +.endm + +.macro RETURN_IF_RESULT_IS_NON_ZERO + cbz r0, 1f @ result zero branch over + bx lr @ return +1: +.endm + /* * Macro that set calls through to artDeliverPendingExceptionFromCode, where the pending * exception is Thread::Current()->exception_ @@ -218,8 +228,9 @@ ENTRY \c_name .cfi_adjust_cfa_offset -16 mov r12, r1 @ save Method*->code_ RESTORE_REF_AND_ARGS_CALLEE_SAVE_FRAME - cmp r0, #0 @ did we find the target? - bxne r12 @ tail call to target if so + cbz r0, 1f @ did we find the target? if not go to exception delivery + bx r12 @ tail call to target +1: DELIVER_PENDING_EXCEPTION END \c_name .endm @@ -281,7 +292,7 @@ END art_quick_invoke_stub /* * On entry r0 is uint32_t* gprs_ and r1 is uint32_t* fprs_ */ -ENTRY art_quick_do_long_jump +ARM_ENTRY art_quick_do_long_jump vldm r1, {s0-s31} @ load all fprs from argument fprs_ ldr r2, [r0, #60] @ r2 = r15 (PC from gprs_ 60=4*15) add r0, r0, #12 @ increment r0 to skip gprs_[0..2] 12=4*3 @@ -302,8 +313,7 @@ ENTRY art_quick_handle_fill_data mov r3, sp @ pass SP bl artHandleFillArrayDataFromCode @ (Array*, const DexFile::Payload*, Thread*, SP) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success? - bxeq lr @ return on success + RETURN_IF_RESULT_IS_ZERO DELIVER_PENDING_EXCEPTION END art_quick_handle_fill_data @@ -325,12 +335,11 @@ END art_quick_lock_object .extern artUnlockObjectFromCode ENTRY art_quick_unlock_object SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves in case exception allocation triggers GC - mov r1, r9 @ pass Thread::Current - mov r2, sp @ pass SP - bl artUnlockObjectFromCode @ (Object* obj, Thread*, SP) + mov r1, r9 @ pass Thread::Current + mov r2, sp @ pass SP + bl artUnlockObjectFromCode @ (Object* obj, Thread*, SP) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success? - bxeq lr @ return on success + RETURN_IF_RESULT_IS_ZERO DELIVER_PENDING_EXCEPTION END art_quick_unlock_object @@ -344,8 +353,7 @@ ENTRY art_quick_check_cast mov r3, sp @ pass SP bl artCheckCastFromCode @ (Class* a, Class* b, Thread*, SP) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success? - bxeq lr @ return on success + RETURN_IF_RESULT_IS_ZERO DELIVER_PENDING_EXCEPTION END art_quick_check_cast @@ -360,8 +368,7 @@ ENTRY art_quick_can_put_array_element mov r3, sp @ pass SP bl artCanPutArrayElementFromCode @ (Object* element, Class* array_class, Thread*, SP) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success? - bxeq lr @ return on success + RETURN_IF_RESULT_IS_ZERO DELIVER_PENDING_EXCEPTION END art_quick_can_put_array_element @@ -378,8 +385,7 @@ ENTRY art_quick_initialize_static_storage @ artInitializeStaticStorageFromCode(uint32_t type_idx, Method* referrer, Thread*, SP) bl artInitializeStaticStorageFromCode RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success if result is non-null - bxne lr @ return on success + RETURN_IF_RESULT_IS_NON_ZERO DELIVER_PENDING_EXCEPTION END art_quick_initialize_static_storage @@ -394,8 +400,7 @@ ENTRY art_quick_initialize_type @ artInitializeTypeFromCode(uint32_t type_idx, Method* referrer, Thread*, SP) bl artInitializeTypeFromCode RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success if result is non-null - bxne lr @ return on success + RETURN_IF_RESULT_IS_NON_ZERO DELIVER_PENDING_EXCEPTION END art_quick_initialize_type @@ -411,8 +416,7 @@ ENTRY art_quick_initialize_type_and_verify_access @ artInitializeTypeAndVerifyAccessFromCode(uint32_t type_idx, Method* referrer, Thread*, SP) bl artInitializeTypeAndVerifyAccessFromCode RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success if result is non-null - bxne lr @ return on success + RETURN_IF_RESULT_IS_NON_ZERO DELIVER_PENDING_EXCEPTION END art_quick_initialize_type_and_verify_access @@ -426,10 +430,11 @@ ENTRY art_quick_get32_static mov r2, r9 @ pass Thread::Current mov r3, sp @ pass SP bl artGet32StaticFromCode @ (uint32_t field_idx, const Method* referrer, Thread*, SP) - ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ + ldr r1, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r12, #0 @ success if no exception is pending - bxeq lr @ return on success + cbnz r1, 1f @ success if no exception pending + bx lr @ return on success +1: DELIVER_PENDING_EXCEPTION END art_quick_get32_static @@ -443,10 +448,11 @@ ENTRY art_quick_get64_static mov r2, r9 @ pass Thread::Current mov r3, sp @ pass SP bl artGet64StaticFromCode @ (uint32_t field_idx, const Method* referrer, Thread*, SP) - ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ + ldr r2, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r12, #0 @ success if no exception is pending - bxeq lr @ return on success + cbnz r2, 1f @ success if no exception pending + bx lr @ return on success +1: DELIVER_PENDING_EXCEPTION END art_quick_get64_static @@ -460,10 +466,11 @@ ENTRY art_quick_get_obj_static mov r2, r9 @ pass Thread::Current mov r3, sp @ pass SP bl artGetObjStaticFromCode @ (uint32_t field_idx, const Method* referrer, Thread*, SP) - ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ + ldr r1, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r12, #0 @ success if no exception is pending - bxeq lr @ return on success + cbnz r1, 1f @ success if no exception pending + bx lr @ return on success +1: DELIVER_PENDING_EXCEPTION END art_quick_get_obj_static @@ -479,10 +486,11 @@ ENTRY art_quick_get32_instance str r12, [sp, #-16]! @ expand the frame and pass SP bl artGet32InstanceFromCode @ (field_idx, Object*, referrer, Thread*, SP) add sp, #16 @ strip the extra frame - ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ + ldr r1, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r12, #0 @ success if no exception is pending - bxeq lr @ return on success + cbnz r1, 1f @ success if no exception pending + bx lr @ return on success +1: DELIVER_PENDING_EXCEPTION END art_quick_get32_instance @@ -501,10 +509,11 @@ ENTRY art_quick_get64_instance bl artGet64InstanceFromCode @ (field_idx, Object*, referrer, Thread*, SP) add sp, #16 @ strip the extra frame .cfi_adjust_cfa_offset -16 - ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ + ldr r2, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r12, #0 @ success if no exception is pending - bxeq lr @ return on success + cbnz r2, 1f @ success if no exception pending + bx lr @ return on success +1: DELIVER_PENDING_EXCEPTION END art_quick_get64_instance @@ -523,10 +532,11 @@ ENTRY art_quick_get_obj_instance bl artGetObjInstanceFromCode @ (field_idx, Object*, referrer, Thread*, SP) add sp, #16 @ strip the extra frame .cfi_adjust_cfa_offset -16 - ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ + ldr r1, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r12, #0 @ success if no exception is pending - bxeq lr @ return on success + cbnz r1, 1f @ success if no exception pending + bx lr @ return on success +1: DELIVER_PENDING_EXCEPTION END art_quick_get_obj_instance @@ -546,8 +556,7 @@ ENTRY art_quick_set32_static add sp, #16 @ strip the extra frame .cfi_adjust_cfa_offset -16 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success if result is 0 - bxeq lr @ return on success + RETURN_IF_RESULT_IS_ZERO DELIVER_PENDING_EXCEPTION END art_quick_set32_static @@ -572,8 +581,7 @@ ENTRY art_quick_set64_static bl artSet64StaticFromCode @ (field_idx, referrer, new_val, Thread*, SP) add sp, #16 @ release out args RESTORE_REF_ONLY_CALLEE_SAVE_FRAME @ TODO: we can clearly save an add here - cmp r0, #0 @ success if result is 0 - bxeq lr @ return on success + RETURN_IF_RESULT_IS_ZERO DELIVER_PENDING_EXCEPTION END art_quick_set64_static @@ -593,8 +601,7 @@ ENTRY art_quick_set_obj_static add sp, #16 @ strip the extra frame .cfi_adjust_cfa_offset -16 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success if result is 0 - bxeq lr @ return on success + RETURN_IF_RESULT_IS_ZERO DELIVER_PENDING_EXCEPTION END art_quick_set_obj_static @@ -618,8 +625,7 @@ ENTRY art_quick_set32_instance add sp, #16 @ release out args .cfi_adjust_cfa_offset -16 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME @ TODO: we can clearly save an add here - cmp r0, #0 @ success if result is 0 - bxeq lr @ return on success + RETURN_IF_RESULT_IS_ZERO DELIVER_PENDING_EXCEPTION END art_quick_set32_instance @@ -641,8 +647,7 @@ ENTRY art_quick_set64_instance add sp, #16 @ release out args .cfi_adjust_cfa_offset -16 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME @ TODO: we can clearly save an add here - cmp r0, #0 @ success if result is 0 - bxeq lr @ return on success + RETURN_IF_RESULT_IS_ZERO DELIVER_PENDING_EXCEPTION END art_quick_set64_instance @@ -665,8 +670,7 @@ ENTRY art_quick_set_obj_instance add sp, #16 @ release out args .cfi_adjust_cfa_offset -16 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME @ TODO: we can clearly save an add here - cmp r0, #0 @ success if result is 0 - bxeq lr @ return on success + RETURN_IF_RESULT_IS_ZERO DELIVER_PENDING_EXCEPTION END art_quick_set_obj_instance @@ -684,8 +688,7 @@ ENTRY art_quick_resolve_string @ artResolveStringFromCode(Method* referrer, uint32_t string_idx, Thread*, SP) bl artResolveStringFromCode RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success if result is non-null - bxne lr @ return on success + RETURN_IF_RESULT_IS_NON_ZERO DELIVER_PENDING_EXCEPTION END art_quick_resolve_string @@ -699,8 +702,7 @@ ENTRY art_quick_alloc_object mov r3, sp @ pass SP bl artAllocObjectFromCode @ (uint32_t type_idx, Method* method, Thread*, SP) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success if result is non-null - bxne lr @ return on success + RETURN_IF_RESULT_IS_NON_ZERO DELIVER_PENDING_EXCEPTION END art_quick_alloc_object @@ -715,8 +717,7 @@ ENTRY art_quick_alloc_object_with_access_check mov r3, sp @ pass SP bl artAllocObjectFromCodeWithAccessCheck @ (uint32_t type_idx, Method* method, Thread*, SP) RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success if result is non-null - bxne lr @ return on success + RETURN_IF_RESULT_IS_NON_ZERO DELIVER_PENDING_EXCEPTION END art_quick_alloc_object_with_access_check @@ -736,8 +737,7 @@ ENTRY art_quick_alloc_array add sp, #16 @ strip the extra frame .cfi_adjust_cfa_offset -16 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success if result is non-null - bxne lr @ return on success + RETURN_IF_RESULT_IS_NON_ZERO DELIVER_PENDING_EXCEPTION END art_quick_alloc_array @@ -758,8 +758,7 @@ ENTRY art_quick_alloc_array_with_access_check add sp, #16 @ strip the extra frame .cfi_adjust_cfa_offset -16 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success if result is non-null - bxne lr @ return on success + RETURN_IF_RESULT_IS_NON_ZERO DELIVER_PENDING_EXCEPTION END art_quick_alloc_array_with_access_check @@ -779,8 +778,7 @@ ENTRY art_quick_check_and_alloc_array add sp, #16 @ strip the extra frame .cfi_adjust_cfa_offset -16 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success if result is non-null - bxne lr @ return on success + RETURN_IF_RESULT_IS_NON_ZERO DELIVER_PENDING_EXCEPTION END art_quick_check_and_alloc_array @@ -800,8 +798,7 @@ ENTRY art_quick_check_and_alloc_array_with_access_check add sp, #16 @ strip the extra frame .cfi_adjust_cfa_offset -16 RESTORE_REF_ONLY_CALLEE_SAVE_FRAME - cmp r0, #0 @ success if result is non-null - bxne lr @ return on success + RETURN_IF_RESULT_IS_NON_ZERO DELIVER_PENDING_EXCEPTION END art_quick_check_and_alloc_array_with_access_check @@ -812,8 +809,9 @@ END art_quick_check_and_alloc_array_with_access_check ENTRY art_quick_test_suspend ldrh r0, [rSELF, #THREAD_FLAGS_OFFSET] mov rSUSPEND, #SUSPEND_CHECK_INTERVAL @ reset rSUSPEND to SUSPEND_CHECK_INTERVAL - cmp r0, #0 @ check Thread::Current()->suspend_count_ == 0 - bxeq lr @ return if suspend_count_ == 0 + cbnz r0, 1f @ check Thread::Current()->suspend_count_ == 0 + bx lr @ return if suspend_count_ == 0 +1: mov r0, rSELF SETUP_REF_ONLY_CALLEE_SAVE_FRAME @ save callee saves for stack crawl mov r1, sp @@ -833,12 +831,13 @@ ENTRY art_quick_proxy_invoke_handler mov r2, r9 @ pass Thread::Current mov r3, sp @ pass SP blx artQuickProxyInvokeHandler @ (Method* proxy method, receiver, Thread*, SP) - ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ + ldr r2, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ ldr lr, [sp, #44] @ restore lr add sp, #48 @ pop frame .cfi_adjust_cfa_offset -48 - cmp r12, #0 @ success if no exception is pending - bxeq lr @ return on success + cbnz r2, 1f @ success if no exception is pending + bx lr @ return on success +1: DELIVER_PENDING_EXCEPTION END art_quick_proxy_invoke_handler @@ -848,8 +847,7 @@ ENTRY art_quick_resolution_trampoline mov r2, r9 @ pass Thread::Current mov r3, sp @ pass SP blx artQuickResolutionTrampoline @ (Method* called, receiver, Thread*, SP) - cmp r0, #0 @ is code pointer null? - beq 1f @ goto exception + cbz r0, 1f @ is code pointer null? goto exception mov r12, r0 ldr r0, [sp, #0] @ load resolved method in r0 ldr r1, [sp, #8] @ restore non-callee save r1 @@ -869,12 +867,13 @@ ENTRY art_quick_to_interpreter_bridge mov r1, r9 @ pass Thread::Current mov r2, sp @ pass SP blx artQuickToInterpreterBridge @ (Method* method, Thread*, SP) - ldr r12, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ + ldr r2, [r9, #THREAD_EXCEPTION_OFFSET] @ load Thread::Current()->exception_ ldr lr, [sp, #44] @ restore lr add sp, #48 @ pop frame .cfi_adjust_cfa_offset -48 - cmp r12, #0 @ success if no exception is pending - bxeq lr @ return on success + cbnz r2, 1f @ success if no exception is pending + bx lr @ return on success +1: DELIVER_PENDING_EXCEPTION END art_quick_to_interpreter_bridge @@ -993,7 +992,7 @@ END art_quick_mul_long * r2: shift count */ /* shl-long vAA, vBB, vCC */ -ENTRY art_quick_shl_long +ARM_ENTRY art_quick_shl_long @ ARM code as thumb code requires spills and r2, r2, #63 @ r2<- r2 & 0x3f mov r1, r1, asl r2 @ r1<- r1 << r2 rsb r3, r2, #32 @ r3<- 32 - r2 @@ -1015,7 +1014,7 @@ END art_quick_shl_long * r2: shift count */ /* shr-long vAA, vBB, vCC */ -ENTRY art_quick_shr_long +ARM_ENTRY art_quick_shr_long @ ARM code as thumb code requires spills and r2, r2, #63 @ r0<- r0 & 0x3f mov r0, r0, lsr r2 @ r0<- r2 >> r2 rsb r3, r2, #32 @ r3<- 32 - r2 @@ -1037,7 +1036,7 @@ END art_quick_shr_long * r2: shift count */ /* ushr-long vAA, vBB, vCC */ -ENTRY art_quick_ushr_long +ARM_ENTRY art_quick_ushr_long @ ARM code as thumb code requires spills and r2, r2, #63 @ r0<- r0 & 0x3f mov r0, r0, lsr r2 @ r0<- r2 >> r2 rsb r3, r2, #32 @ r3<- 32 - r2 @@ -1070,8 +1069,10 @@ ENTRY art_quick_indexof /* Clamp start to [0..count] */ cmp r2, #0 + it lt movlt r2, #0 cmp r2, r3 + it gt movgt r2, r3 /* Build a pointer to the start of string data */ @@ -1167,8 +1168,10 @@ END art_quick_indexof .extern __memcmp16 ENTRY art_quick_string_compareto mov r2, r0 @ this to r2, opening up r0 for return value - subs r0, r2, r1 @ Same? - bxeq lr + sub r0, r2, r1 @ Same? + cbnz r0,1f + bx lr +1: @ Same strings, return. push {r4, r7-r12, lr} @ 8 words - keep alignment .save {r4, r7-r12, lr} @@ -1199,6 +1202,7 @@ ENTRY art_quick_string_compareto * r10 <- minCount */ subs r11, r7, r10 + it ls movls r10, r7 /* Now, build pointers to the string data */ @@ -1234,7 +1238,8 @@ ENTRY art_quick_string_compareto ldrh r7, [r2, #2]! ldrh r8, [r1, #2]! subs r0, r3, r4 - subeqs r0, r7, r8 + it eq + subseq r0, r7, r8 bne done cmp r10, #28 bgt do_memcmp16 @@ -1249,8 +1254,10 @@ loopback_triple: ldrh r9, [r2, #2]! ldrh r12,[r1, #2]! subs r0, r3, r4 - subeqs r0, r7, r8 - subeqs r0, r9, r12 + it eq + subseq r0, r7, r8 + it eq + subseq r0, r9, r12 bne done subs r10, #3 bge loopback_triple @@ -1285,6 +1292,7 @@ do_memcmp16: mov r2, r10 bl __memcmp16 cmp r0, #0 + it eq moveq r0, r7 done: pop {r4, r7-r12, pc} |