Remove kExceptionPending flag from thread and codegen.
Code just checks if exception_ is NULL instead. Compiled code simply
clears the exception_ field for MOVE_EXCEPTION instead of calling a
helper.
Change-Id: Iefaa780f66c327c3d20598bd71d3c14d7a9c8119
diff --git a/src/compiler/codegen/arm/call_arm.cc b/src/compiler/codegen/arm/call_arm.cc
index 9696bca..cb3af5e 100644
--- a/src/compiler/codegen/arm/call_arm.cc
+++ b/src/compiler/codegen/arm/call_arm.cc
@@ -541,6 +541,18 @@
GenMemBarrier(cu, kStoreLoad);
}
+void ArmCodegen::GenMoveException(CompilationUnit* cu, RegLocation rl_dest)
+{
+ int ex_offset = Thread::ExceptionOffset().Int32Value();
+ RegLocation rl_result = EvalLoc(cu, rl_dest, kCoreReg, true);
+ int reset_reg = AllocTemp(cu);
+ LoadWordDisp(cu, rARM_SELF, ex_offset, rl_result.low_reg);
+ LoadConstant(cu, reset_reg, 0);
+ StoreWordDisp(cu, rARM_SELF, ex_offset, reset_reg);
+ FreeTemp(cu, reset_reg);
+ StoreValue(cu, rl_dest, rl_result);
+}
+
/*
* Mark garbage collection card. Skip if the value we're storing is null.
*/
diff --git a/src/compiler/codegen/arm/codegen_arm.h b/src/compiler/codegen/arm/codegen_arm.h
index ca39e5a..8d99049 100644
--- a/src/compiler/codegen/arm/codegen_arm.h
+++ b/src/compiler/codegen/arm/codegen_arm.h
@@ -138,6 +138,7 @@
virtual void GenMemBarrier(CompilationUnit* cu, MemBarrierKind barrier_kind);
virtual void GenMonitorEnter(CompilationUnit* cu, int opt_flags, RegLocation rl_src);
virtual void GenMonitorExit(CompilationUnit* cu, int opt_flags, RegLocation rl_src);
+ virtual void GenMoveException(CompilationUnit* cu, RegLocation rl_dest);
virtual void GenMultiplyByTwoBitMultiplier(CompilationUnit* cu, RegLocation rl_src,
RegLocation rl_result, int lit, int first_bit,
int second_bit);
diff --git a/src/compiler/codegen/codegen.h b/src/compiler/codegen/codegen.h
index 7a85ce8..595a1db 100644
--- a/src/compiler/codegen/codegen.h
+++ b/src/compiler/codegen/codegen.h
@@ -130,7 +130,6 @@
void GenConstClass(CompilationUnit* cu, uint32_t type_idx, RegLocation rl_dest);
void GenConstString(CompilationUnit* cu, uint32_t string_idx, RegLocation rl_dest);
void GenNewInstance(CompilationUnit* cu, uint32_t type_idx, RegLocation rl_dest);
- void GenMoveException(CompilationUnit* cu, RegLocation rl_dest);
void GenThrow(CompilationUnit* cu, RegLocation rl_src);
void GenInstanceof(CompilationUnit* cu, uint32_t type_idx, RegLocation rl_dest,
RegLocation rl_src);
@@ -332,6 +331,7 @@
virtual void GenMemBarrier(CompilationUnit* cu, MemBarrierKind barrier_kind) = 0;
virtual void GenMonitorEnter(CompilationUnit* cu, int opt_flags, RegLocation rl_src) = 0;
virtual void GenMonitorExit(CompilationUnit* cu, int opt_flags, RegLocation rl_src) = 0;
+ virtual void GenMoveException(CompilationUnit* cu, RegLocation rl_dest) = 0;
virtual void GenMultiplyByTwoBitMultiplier(CompilationUnit* cu, RegLocation rl_src,
RegLocation rl_result, int lit, int first_bit,
int second_bit) = 0;
diff --git a/src/compiler/codegen/gen_common.cc b/src/compiler/codegen/gen_common.cc
index 57cf2a5..e1054db 100644
--- a/src/compiler/codegen/gen_common.cc
+++ b/src/compiler/codegen/gen_common.cc
@@ -915,20 +915,6 @@
StoreValue(cu, rl_dest, rl_result);
}
-void Codegen::GenMoveException(CompilationUnit* cu, RegLocation rl_dest)
-{
- FlushAllRegs(cu); /* Everything to home location */
- int func_offset = ENTRYPOINT_OFFSET(pGetAndClearException);
- if (cu->instruction_set == kX86) {
- // Runtime helper will load argument for x86.
- CallRuntimeHelperReg(cu, func_offset, TargetReg(kArg0), false);
- } else {
- CallRuntimeHelperReg(cu, func_offset, TargetReg(kSelf), false);
- }
- RegLocation rl_result = GetReturn(cu, false);
- StoreValue(cu, rl_dest, rl_result);
-}
-
void Codegen::GenThrow(CompilationUnit* cu, RegLocation rl_src)
{
FlushAllRegs(cu);
diff --git a/src/compiler/codegen/mips/call_mips.cc b/src/compiler/codegen/mips/call_mips.cc
index f14ebab..76c9fbd 100644
--- a/src/compiler/codegen/mips/call_mips.cc
+++ b/src/compiler/codegen/mips/call_mips.cc
@@ -294,6 +294,18 @@
MarkSafepointPC(cu, call_inst);
}
+void MipsCodegen::GenMoveException(CompilationUnit* cu, RegLocation rl_dest)
+{
+ int ex_offset = Thread::ExceptionOffset().Int32Value();
+ RegLocation rl_result = EvalLoc(cu, rl_dest, kCoreReg, true);
+ int reset_reg = AllocTemp(cu);
+ LoadWordDisp(cu, rMIPS_SELF, ex_offset, rl_result.low_reg);
+ LoadConstant(cu, reset_reg, 0);
+ StoreWordDisp(cu, rMIPS_SELF, ex_offset, reset_reg);
+ FreeTemp(cu, reset_reg);
+ StoreValue(cu, rl_dest, rl_result);
+}
+
/*
* Mark garbage collection card. Skip if the value we're storing is null.
*/
diff --git a/src/compiler/codegen/mips/codegen_mips.h b/src/compiler/codegen/mips/codegen_mips.h
index 4178f2e..fcd5669 100644
--- a/src/compiler/codegen/mips/codegen_mips.h
+++ b/src/compiler/codegen/mips/codegen_mips.h
@@ -138,6 +138,7 @@
virtual void GenMemBarrier(CompilationUnit* cu, MemBarrierKind barrier_kind);
virtual void GenMonitorEnter(CompilationUnit* cu, int opt_flags, RegLocation rl_src);
virtual void GenMonitorExit(CompilationUnit* cu, int opt_flags, RegLocation rl_src);
+ virtual void GenMoveException(CompilationUnit* cu, RegLocation rl_dest);
virtual void GenMultiplyByTwoBitMultiplier(CompilationUnit* cu, RegLocation rl_src,
RegLocation rl_result, int lit, int first_bit,
int second_bit);
diff --git a/src/compiler/codegen/mir_to_lir.cc b/src/compiler/codegen/mir_to_lir.cc
index 1d64661..2bc0f86 100644
--- a/src/compiler/codegen/mir_to_lir.cc
+++ b/src/compiler/codegen/mir_to_lir.cc
@@ -85,6 +85,7 @@
case Instruction::MOVE_EXCEPTION:
cg->GenMoveException(cu, rl_dest);
break;
+
case Instruction::RETURN_VOID:
if (((cu->access_flags & kAccConstructor) != 0) &&
cu->compiler->RequiresConstructorBarrier(Thread::Current(), cu->dex_file,
diff --git a/src/compiler/codegen/x86/call_x86.cc b/src/compiler/codegen/x86/call_x86.cc
index 80de901..727c5e8 100644
--- a/src/compiler/codegen/x86/call_x86.cc
+++ b/src/compiler/codegen/x86/call_x86.cc
@@ -191,6 +191,15 @@
branch2->target = NewLIR0(cu, kPseudoTargetLabel);
}
+void X86Codegen::GenMoveException(CompilationUnit* cu, RegLocation rl_dest)
+{
+ int ex_offset = Thread::ExceptionOffset().Int32Value();
+ RegLocation rl_result = EvalLoc(cu, rl_dest, kCoreReg, true);
+ NewLIR2(cu, kX86Mov32RT, rl_result.low_reg, ex_offset);
+ NewLIR2(cu, kX86Mov32TI, ex_offset, 0);
+ StoreValue(cu, rl_dest, rl_result);
+}
+
/*
* Mark garbage collection card. Skip if the value we're storing is null.
*/
diff --git a/src/compiler/codegen/x86/codegen_x86.h b/src/compiler/codegen/x86/codegen_x86.h
index f467e83..25f4461 100644
--- a/src/compiler/codegen/x86/codegen_x86.h
+++ b/src/compiler/codegen/x86/codegen_x86.h
@@ -139,6 +139,7 @@
virtual void GenMemBarrier(CompilationUnit* cu, MemBarrierKind barrier_kind);
virtual void GenMonitorEnter(CompilationUnit* cu, int opt_flags, RegLocation rl_src);
virtual void GenMonitorExit(CompilationUnit* cu, int opt_flags, RegLocation rl_src);
+ virtual void GenMoveException(CompilationUnit* cu, RegLocation rl_dest);
virtual void GenMultiplyByTwoBitMultiplier(CompilationUnit* cu, RegLocation rl_src,
RegLocation rl_result, int lit, int first_bit,
int second_bit);