Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index 8f1c9c090dfbdf6e1de38ed34c1f028a2efbe8b0..425acdbd48c70ad6a2894e05162c13888c84af6a 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -1414,12 +1414,9 @@ void LCodeGen::DoDivI(LDivI* instr) { |
// Check for (kMinInt / -1). |
if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) { |
- Label left_not_min_int; |
__ cmp(left, Operand(kMinInt)); |
- __ b(ne, &left_not_min_int); |
- __ cmp(right, Operand(-1)); |
+ __ cmp(right, Operand(-1), eq); |
Sven Panne
2013/12/12 13:43:23
Is conditional non-execution of 2 instructions rea
Rodolph Perfetta
2013/12/13 11:31:14
conditional execution of two "simple" instructions
|
DeoptimizeIf(eq, instr->environment()); |
- __ bind(&left_not_min_int); |
} |
if (CpuFeatures::IsSupported(SUDIV)) { |
@@ -1518,12 +1515,9 @@ void LCodeGen::DoMathFloorOfDiv(LMathFloorOfDiv* instr) { |
// Check for (kMinInt / -1). |
if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) { |
- Label left_not_min_int; |
__ cmp(left, Operand(kMinInt)); |
- __ b(ne, &left_not_min_int); |
- __ cmp(right, Operand(-1)); |
+ __ cmp(right, Operand(-1), eq); |
Sven Panne
2013/12/12 13:43:23
Same here...
|
DeoptimizeIf(eq, instr->environment()); |
- __ bind(&left_not_min_int); |
} |
// Check for (0 / -x) that will produce negative zero. |
@@ -1892,8 +1886,7 @@ void LCodeGen::DoValueOf(LValueOf* instr) { |
// If the object is not a value type, return the object. |
__ CompareObjectType(input, map, map, JS_VALUE_TYPE); |
__ Move(result, input, ne); |
- __ b(ne, &done); |
- __ ldr(result, FieldMemOperand(input, JSValue::kValueOffset)); |
+ __ ldr(result, FieldMemOperand(input, JSValue::kValueOffset), eq); |
__ bind(&done); |
} |
@@ -3447,16 +3440,12 @@ void LCodeGen::DoArgumentsLength(LArgumentsLength* instr) { |
// If no arguments adaptor frame the number of arguments is fixed. |
__ cmp(fp, elem); |
__ mov(result, Operand(scope()->num_parameters())); |
- __ b(eq, &done); |
// Arguments adaptor frame present. Get argument length from there. |
- __ ldr(result, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); |
+ __ ldr(result, MemOperand(fp, StandardFrameConstants::kCallerFPOffset), ne); |
Sven Panne
2013/12/12 13:43:23
... and here (3 instructions now)
Rodolph Perfetta
2013/12/13 11:31:14
Here the answer would depend on the surrounding co
Benedikt Meurer
2014/01/02 06:49:28
Reverted this one.
|
__ ldr(result, |
- MemOperand(result, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
- __ SmiUntag(result); |
- |
- // Argument length is in result register. |
- __ bind(&done); |
+ MemOperand(result, ArgumentsAdaptorFrameConstants::kLengthOffset), ne); |
+ __ SmiUntag(result, LeaveCC, ne); |
} |
@@ -3878,16 +3867,13 @@ void LCodeGen::DoMathPowHalf(LMathPowHalf* instr) { |
// Note that according to ECMA-262 15.8.2.13: |
// Math.pow(-Infinity, 0.5) == Infinity |
// Math.sqrt(-Infinity) == NaN |
- Label done; |
__ vmov(temp, -V8_INFINITY, scratch0()); |
__ VFPCompareAndSetFlags(input, temp); |
__ vneg(result, temp, eq); |
- __ b(&done, eq); |
// Add +0 to convert -0 to +0. |
- __ vadd(result, input, kDoubleRegZero); |
- __ vsqrt(result, result); |
- __ bind(&done); |
+ __ vadd(result, input, kDoubleRegZero, ne); |
Sven Panne
2013/12/12 13:43:23
... and here.
Rodolph Perfetta
2013/12/13 11:31:14
vadd and especially vsqrt are complex instructions
Benedikt Meurer
2014/01/02 06:49:28
Done.
|
+ __ vsqrt(result, result, ne); |
} |
@@ -5587,14 +5573,11 @@ void LCodeGen::EmitIsConstructCall(Register temp1, Register temp2) { |
__ ldr(temp1, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); |
// Skip the arguments adaptor frame if it exists. |
- Label check_frame_marker; |
__ ldr(temp2, MemOperand(temp1, StandardFrameConstants::kContextOffset)); |
__ cmp(temp2, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); |
- __ b(ne, &check_frame_marker); |
- __ ldr(temp1, MemOperand(temp1, StandardFrameConstants::kCallerFPOffset)); |
+ __ ldr(temp1, MemOperand(temp1, StandardFrameConstants::kCallerFPOffset), eq); |
// Check the marker in the calling frame. |
- __ bind(&check_frame_marker); |
__ ldr(temp1, MemOperand(temp1, StandardFrameConstants::kMarkerOffset)); |
__ cmp(temp1, Operand(Smi::FromInt(StackFrame::CONSTRUCT))); |
} |