/* * Class: org_apache_harmony_drlvm_thread_ThreadHelper * Method: getThreadIdOffset * Signature: ()I */ VMEXPORT jint JNICALL Java_org_apache_harmony_drlvm_thread_ThreadHelper_getThreadIdOffset(JNIEnv *env, jclass klass) { return (jint)hythread_get_thread_id_offset(); }
/** * Generates fast path of monitor enter * the code should not contains safepoint. * * @param[in] ss buffer to put the assembly code to * @param[in] input_param1 register which should point to the object lockword. * If input_param1 == ecx it reduces one register mov. * the code use and do not restore ecx, edx, eax registers * * @return 0 if success in eax register */ char* gen_monitorenter_fast_path_helper(char *ss, const R_Opnd & input_param1) { if (&input_param1 != &ecx_opnd) { ss = mov(ss, ecx_opnd, input_param1); } #ifdef ASM_MONITOR_HELPER //get self_id ss = gen_hythread_self_helper(ss); ss = mov(ss, edx_opnd, M_Base_Opnd(eax_reg, hythread_get_thread_id_offset())); // mov edx,dword [eax+off] ss = mov(ss, eax_opnd, M_Base_Opnd(ecx_reg, 2), size_16); // mov ax,word[ecx+2] ss = alu(ss, cmp_opc, edx_opnd, eax_opnd, size_16); // cmp dx,ax ss = branch8(ss, Condition_NZ, Imm_Opnd(size_8, 0)); // jnz check_zero char *check_zero = ((char *)ss) - 1; //; ax==dx it's safe to do inc ss = mov(ss, eax_opnd, M_Base_Opnd(ecx_reg, 1), size_8); // mov al, byte[ecx+1] //rec_inc: ss = alu(ss, add_opc, eax_opnd, Imm_Opnd(size_8, 0x8), size_8); // add al,0x8 ss = branch8(ss, Condition_C, Imm_Opnd(size_8, 0)); // jc failed char *failed1 = ((char *)ss) - 1; ss = mov(ss, M_Base_Opnd(ecx_reg, 1), eax_opnd, size_8); // mov byte[ecx+1],al ss = ret(ss, Imm_Opnd(4)); // ret 4 signed offset = (signed)ss - (signed)check_zero - 1; *check_zero = (char)offset; //check_zero: ss = test(ss, eax_opnd, eax_opnd, size_16); // test ax,ax ss = branch8(ss, Condition_NZ, Imm_Opnd(size_8, 0)); // jnz failed char *failed2 = ((char *)ss) - 1; ss = prefix(ss, lock_prefix); //; here ax==0. ss = cmpxchg(ss, M_Base_Opnd(ecx_reg, 2), edx_opnd, size_16); // lock cmpxchg16 [ecx+2],dx ss = branch8(ss, Condition_NZ, Imm_Opnd(size_8, 0)); // jnz failed char *failed3 = ((char *)ss) - 1; #ifdef LOCK_RESERVATION ss = mov(ss, eax_opnd, M_Base_Opnd(ecx_reg, 1), size_8); // mov al, byte[ecx+1] ss = test(ss, eax_opnd, Imm_Opnd(size_8, 0x4), size_8); // test al,0x4 ss = branch8(ss, Condition_NZ, Imm_Opnd(size_8, 0)); // jnz finish char *finish = ((char *)ss) - 1; ss = alu(ss, add_opc, eax_opnd, Imm_Opnd(size_8, 0x8), size_8); // add al,0x8 ss = mov(ss, M_Base_Opnd(ecx_reg, 1), eax_opnd, size_8); // mov byte[ecx+1],al offset = (signed)ss - (signed)finish - 1; *finish = (char)offset; //finish: #endif ss = ret(ss, Imm_Opnd(4)); // ret 4 offset = (signed)ss - (signed)failed1 - 1; *failed1 = (char)offset; //failed: offset = (signed)ss - (signed)failed2 - 1; *failed2 = (char)offset; offset = (signed)ss - (signed)failed3 - 1; *failed3 = (char)offset; #endif //ASM_MONITOR_HELPER // the second attempt to lock monitor ss = push(ss, ecx_opnd); ss = call(ss, (char *)hythread_thin_monitor_try_enter); ss = alu(ss, add_opc, esp_opnd, Imm_Opnd(4)); // pop parameters return ss; }