Index: src/s390/macro-assembler-s390.cc |
diff --git a/src/s390/macro-assembler-s390.cc b/src/s390/macro-assembler-s390.cc |
index f4fae498b40535a1594d69213d1af14fd7eafd50..51085b036b2491b3b381b85769a61bb8a9f414f4 100644 |
--- a/src/s390/macro-assembler-s390.cc |
+++ b/src/s390/macro-assembler-s390.cc |
@@ -2188,89 +2188,6 @@ void MacroAssembler::StoreNumberToDoubleElements( |
FixedDoubleArray::kHeaderSize - elements_offset)); |
} |
-void MacroAssembler::AddAndCheckForOverflow(Register dst, Register left, |
- Register right, |
- Register overflow_dst, |
- Register scratch) { |
- DCHECK(!dst.is(overflow_dst)); |
- DCHECK(!dst.is(scratch)); |
- DCHECK(!overflow_dst.is(scratch)); |
- DCHECK(!overflow_dst.is(left)); |
- DCHECK(!overflow_dst.is(right)); |
- |
- // TODO(joransiu): Optimize paths for left == right. |
- bool left_is_right = left.is(right); |
- |
- // C = A+B; C overflows if A/B have same sign and C has diff sign than A |
- if (dst.is(left)) { |
- LoadRR(scratch, left); // Preserve left. |
- AddP(dst, left, right); // Left is overwritten. |
- XorP(overflow_dst, scratch, dst); // Original left. |
- if (!left_is_right) XorP(scratch, dst, right); |
- } else if (dst.is(right)) { |
- LoadRR(scratch, right); // Preserve right. |
- AddP(dst, left, right); // Right is overwritten. |
- XorP(overflow_dst, dst, left); |
- if (!left_is_right) XorP(scratch, dst, scratch); |
- } else { |
- AddP(dst, left, right); |
- XorP(overflow_dst, dst, left); |
- if (!left_is_right) XorP(scratch, dst, right); |
- } |
- if (!left_is_right) AndP(overflow_dst, scratch, overflow_dst); |
- LoadAndTestRR(overflow_dst, overflow_dst); |
-} |
- |
-void MacroAssembler::AddAndCheckForOverflow(Register dst, Register left, |
- intptr_t right, |
- Register overflow_dst, |
- Register scratch) { |
- DCHECK(!dst.is(overflow_dst)); |
- DCHECK(!dst.is(scratch)); |
- DCHECK(!overflow_dst.is(scratch)); |
- DCHECK(!overflow_dst.is(left)); |
- |
- mov(r1, Operand(right)); |
- AddAndCheckForOverflow(dst, left, r1, overflow_dst, scratch); |
-} |
- |
-void MacroAssembler::SubAndCheckForOverflow(Register dst, Register left, |
- Register right, |
- Register overflow_dst, |
- Register scratch) { |
- DCHECK(!dst.is(overflow_dst)); |
- DCHECK(!dst.is(scratch)); |
- DCHECK(!overflow_dst.is(scratch)); |
- DCHECK(!overflow_dst.is(left)); |
- DCHECK(!overflow_dst.is(right)); |
- |
- // C = A-B; C overflows if A/B have diff signs and C has diff sign than A |
- if (dst.is(left)) { |
- LoadRR(scratch, left); // Preserve left. |
- SubP(dst, left, right); // Left is overwritten. |
- XorP(overflow_dst, dst, scratch); |
- XorP(scratch, right); |
- AndP(overflow_dst, scratch /*, SetRC*/); |
- LoadAndTestRR(overflow_dst, overflow_dst); |
- // Should be okay to remove rc |
- } else if (dst.is(right)) { |
- LoadRR(scratch, right); // Preserve right. |
- SubP(dst, left, right); // Right is overwritten. |
- XorP(overflow_dst, dst, left); |
- XorP(scratch, left); |
- AndP(overflow_dst, scratch /*, SetRC*/); |
- LoadAndTestRR(overflow_dst, overflow_dst); |
- // Should be okay to remove rc |
- } else { |
- SubP(dst, left, right); |
- XorP(overflow_dst, dst, left); |
- XorP(scratch, left, right); |
- AndP(overflow_dst, scratch /*, SetRC*/); |
- LoadAndTestRR(overflow_dst, overflow_dst); |
- // Should be okay to remove rc |
- } |
-} |
- |
void MacroAssembler::CompareMap(Register obj, Register scratch, Handle<Map> map, |
Label* early_success) { |
LoadP(scratch, FieldMemOperand(obj, HeapObject::kMapOffset)); |
@@ -4159,15 +4076,18 @@ void MacroAssembler::SubP_ExtendSrc(Register dst, Register src) { |
// Subtract 32-bit (Register = Register - Register) |
void MacroAssembler::Sub32(Register dst, Register src1, Register src2) { |
// Use non-clobbering version if possible |
- if (CpuFeatures::IsSupported(DISTINCT_OPS) && !dst.is(src1)) { |
+ if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
srk(dst, src1, src2); |
return; |
} |
if (!dst.is(src1) && !dst.is(src2)) lr(dst, src1); |
// In scenario where we have dst = src - dst, we need to swap and negate |
if (!dst.is(src1) && dst.is(src2)) { |
- sr(dst, src1); // dst = (dst - src) |
+ Label done; |
lcr(dst, dst); // dst = -dst |
+ b(overflow, &done); |
+ ar(dst, src1); // dst = dst + src |
+ bind(&done); |
} else { |
sr(dst, src2); |
} |
@@ -4176,15 +4096,18 @@ void MacroAssembler::Sub32(Register dst, Register src1, Register src2) { |
// Subtract Pointer Sized (Register = Register - Register) |
void MacroAssembler::SubP(Register dst, Register src1, Register src2) { |
// Use non-clobbering version if possible |
- if (CpuFeatures::IsSupported(DISTINCT_OPS) && !dst.is(src1)) { |
+ if (CpuFeatures::IsSupported(DISTINCT_OPS)) { |
SubP_RRR(dst, src1, src2); |
return; |
} |
if (!dst.is(src1) && !dst.is(src2)) LoadRR(dst, src1); |
// In scenario where we have dst = src - dst, we need to swap and negate |
if (!dst.is(src1) && dst.is(src2)) { |
- SubP(dst, src1); // dst = (dst - src) |
+ Label done; |
LoadComplementRR(dst, dst); // dst = -dst |
+ b(overflow, &done); |
+ AddP(dst, src1); // dst = dst + src |
+ bind(&done); |
} else { |
SubP(dst, src2); |
} |
@@ -4202,8 +4125,8 @@ void MacroAssembler::SubP_ExtendSrc(Register dst, Register src1, |
// In scenario where we have dst = src - dst, we need to swap and negate |
if (!dst.is(src1) && dst.is(src2)) { |
lgfr(dst, dst); // Sign extend this operand first. |
- SubP(dst, src1); // dst = (dst - src) |
LoadComplementRR(dst, dst); // dst = -dst |
+ AddP(dst, src1); // dst = -dst + src |
} else { |
sgfr(dst, src2); |
} |
@@ -5182,6 +5105,16 @@ void MacroAssembler::LoadAndTestP(Register dst, const MemOperand& mem) { |
#endif |
} |
+// Load On Condition Pointer Sized (Reg <- Reg) |
+void MacroAssembler::LoadOnConditionP(Condition cond, Register dst, |
+ Register src) { |
+#if V8_TARGET_ARCH_S390X |
+ locgr(cond, dst, src); |
+#else |
+ locr(cond, dst, src); |
+#endif |
+} |
+ |
// Load Double Precision (64-bit) Floating Point number from memory |
void MacroAssembler::LoadDouble(DoubleRegister dst, const MemOperand& mem) { |
// for 32bit and 64bit we all use 64bit floating point regs |