Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 | 1 |
| 2 // Copyright 2012 the V8 project authors. All rights reserved. | 2 // Copyright 2012 the V8 project authors. All rights reserved. |
| 3 // Use of this source code is governed by a BSD-style license that can be | 3 // Use of this source code is governed by a BSD-style license that can be |
| 4 // found in the LICENSE file. | 4 // found in the LICENSE file. |
| 5 | 5 |
| 6 #include <limits.h> // For LONG_MIN, LONG_MAX. | 6 #include <limits.h> // For LONG_MIN, LONG_MAX. |
| 7 | 7 |
| 8 #if V8_TARGET_ARCH_MIPS | 8 #if V8_TARGET_ARCH_MIPS |
| 9 | 9 |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 4279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4290 | 4290 |
| 4291 void MacroAssembler::SmiToDoubleFPURegister(Register smi, | 4291 void MacroAssembler::SmiToDoubleFPURegister(Register smi, |
| 4292 FPURegister value, | 4292 FPURegister value, |
| 4293 Register scratch1) { | 4293 Register scratch1) { |
| 4294 sra(scratch1, smi, kSmiTagSize); | 4294 sra(scratch1, smi, kSmiTagSize); |
| 4295 mtc1(scratch1, value); | 4295 mtc1(scratch1, value); |
| 4296 cvt_d_w(value, value); | 4296 cvt_d_w(value, value); |
| 4297 } | 4297 } |
| 4298 | 4298 |
| 4299 | 4299 |
| 4300 void MacroAssembler::AdduAndCheckForOverflow(Register dst, Register left, | 4300 void MacroAssembler::AdduAndCheckForOverflow( |
| 4301 const Operand& right, | 4301 Register dst, Register left, const Operand& right, Label* overflow_label, |
| 4302 Register overflow_dst, | 4302 Label* no_overflow_label, Register scratch, BranchDelaySlot bd) { |
| 4303 Register scratch) { | 4303 DCHECK(overflow_label || no_overflow_label); |
| 4304 if (right.is_reg()) { | 4304 if (right.is_reg()) { |
| 4305 AdduAndCheckForOverflow(dst, left, right.rm(), overflow_dst, scratch); | 4305 AdduAndCheckForOverflow(dst, left, right.rm(), overflow_label, |
| 4306 no_overflow_label, scratch, bd); | |
| 4306 } else { | 4307 } else { |
| 4307 if (dst.is(left)) { | 4308 if (IsMipsArchVariant(kMips32r6)) { |
| 4308 mov(scratch, left); // Preserve left. | 4309 DCHECK(!left.is(t9)); |
| 4309 Addu(dst, left, right.immediate()); // Left is overwritten. | 4310 Register right_reg = t9; |
| 4310 xor_(scratch, dst, scratch); // Original left. | 4311 li(right_reg, Operand(right)); |
| 4311 // Load right since xori takes uint16 as immediate. | 4312 AdduAndCheckForOverflow(dst, left, right_reg, overflow_label, |
| 4312 Addu(t9, zero_reg, right); | 4313 no_overflow_label); |
| 4313 xor_(overflow_dst, dst, t9); | |
| 4314 and_(overflow_dst, overflow_dst, scratch); | |
| 4315 } else { | 4314 } else { |
| 4316 Addu(dst, left, right.immediate()); | 4315 Register overflow_dst = t9; |
| 4317 xor_(overflow_dst, dst, left); | 4316 if (dst.is(left)) { |
| 4318 // Load right since xori takes uint16 as immediate. | 4317 mov(scratch, left); // Preserve left. |
| 4319 Addu(t9, zero_reg, right); | 4318 Addu(dst, left, right.immediate()); // Left is overwritten. |
| 4320 xor_(scratch, dst, t9); | 4319 xor_(scratch, dst, scratch); // Original left. |
| 4321 and_(overflow_dst, scratch, overflow_dst); | 4320 // Load right since xori takes uint16 as immediate. |
| 4321 Addu(overflow_dst, zero_reg, right); | |
| 4322 xor_(overflow_dst, dst, overflow_dst); | |
| 4323 and_(overflow_dst, overflow_dst, scratch); | |
| 4324 } else { | |
| 4325 Addu(dst, left, right.immediate()); | |
| 4326 xor_(overflow_dst, dst, left); | |
| 4327 // Load right since xori takes uint16 as immediate. | |
| 4328 Addu(scratch, zero_reg, right); | |
| 4329 xor_(scratch, dst, scratch); | |
| 4330 and_(overflow_dst, scratch, overflow_dst); | |
| 4331 } | |
| 4332 Branch(overflow_label, lt, overflow_dst, Operand(zero_reg)); | |
| 4333 if (no_overflow_label) bc(no_overflow_label); | |
|
paul.l...
2015/11/13 02:16:20
This is not r6, you cannot use 'bc' here can you?
| |
| 4322 } | 4334 } |
| 4323 } | 4335 } |
| 4324 } | 4336 } |
| 4325 | 4337 |
| 4326 | 4338 |
| 4327 void MacroAssembler::AdduAndCheckForOverflow(Register dst, Register left, | 4339 void MacroAssembler::AdduAndCheckForOverflow( |
| 4328 Register right, | 4340 Register dst, Register left, Register right, Label* overflow_label, |
| 4329 Register overflow_dst, | 4341 Label* no_overflow_label, Register scratch, BranchDelaySlot bd) { |
| 4330 Register scratch) { | 4342 if (IsMipsArchVariant(kMips32r6)) { |
| 4331 DCHECK(!dst.is(overflow_dst)); | 4343 if (!overflow_label) { |
| 4332 DCHECK(!dst.is(scratch)); | 4344 DCHECK(no_overflow_label); |
| 4333 DCHECK(!overflow_dst.is(scratch)); | 4345 DCHECK(!dst.is(scratch)); |
| 4334 DCHECK(!overflow_dst.is(left)); | 4346 DCHECK(!dst.is(t9)); |
| 4335 DCHECK(!overflow_dst.is(right)); | 4347 Register left_reg = left.is(dst) ? scratch : left; |
| 4348 Register right_reg = right.is(dst) ? t9 : right; | |
| 4349 DCHECK(!dst.is(left_reg)); | |
| 4350 DCHECK(!dst.is(right_reg)); | |
| 4351 Move(left_reg, left); | |
| 4352 Move(right_reg, right); | |
| 4353 addu(dst, left, right); | |
| 4354 bnvc(left_reg, right_reg, no_overflow_label); | |
| 4355 } else { | |
| 4356 bovc(left, right, overflow_label); | |
| 4357 addu(dst, left, right); | |
| 4358 if (no_overflow_label) bc(no_overflow_label); | |
| 4359 } | |
| 4360 } else { | |
| 4361 Register overflow_dst = t9; | |
| 4362 DCHECK(!dst.is(scratch)); | |
| 4363 DCHECK(!dst.is(overflow_dst)); | |
| 4364 DCHECK(!scratch.is(overflow_dst)); | |
| 4365 DCHECK(!left.is(overflow_dst)); | |
| 4366 DCHECK(!right.is(overflow_dst)); | |
| 4336 | 4367 |
| 4337 if (left.is(right) && dst.is(left)) { | 4368 if (left.is(right) && dst.is(left)) { |
| 4338 DCHECK(!dst.is(t9)); | 4369 mov(overflow_dst, right); |
| 4339 DCHECK(!scratch.is(t9)); | 4370 right = overflow_dst; |
| 4340 DCHECK(!left.is(t9)); | 4371 } |
| 4341 DCHECK(!right.is(t9)); | |
| 4342 DCHECK(!overflow_dst.is(t9)); | |
| 4343 mov(t9, right); | |
| 4344 right = t9; | |
| 4345 } | |
| 4346 | 4372 |
| 4347 if (dst.is(left)) { | 4373 if (dst.is(left)) { |
| 4348 mov(scratch, left); // Preserve left. | 4374 mov(scratch, left); // Preserve left. |
| 4349 addu(dst, left, right); // Left is overwritten. | 4375 addu(dst, left, right); // Left is overwritten. |
| 4350 xor_(scratch, dst, scratch); // Original left. | 4376 xor_(scratch, dst, scratch); // Original left. |
| 4351 xor_(overflow_dst, dst, right); | 4377 xor_(overflow_dst, dst, right); |
| 4352 and_(overflow_dst, overflow_dst, scratch); | 4378 and_(overflow_dst, overflow_dst, scratch); |
| 4353 } else if (dst.is(right)) { | 4379 } else if (dst.is(right)) { |
| 4354 mov(scratch, right); // Preserve right. | 4380 mov(scratch, right); // Preserve right. |
| 4355 addu(dst, left, right); // Right is overwritten. | 4381 addu(dst, left, right); // Right is overwritten. |
| 4356 xor_(scratch, dst, scratch); // Original right. | 4382 xor_(scratch, dst, scratch); // Original right. |
| 4357 xor_(overflow_dst, dst, left); | 4383 xor_(overflow_dst, dst, left); |
| 4358 and_(overflow_dst, overflow_dst, scratch); | 4384 and_(overflow_dst, overflow_dst, scratch); |
| 4359 } else { | 4385 } else { |
| 4360 addu(dst, left, right); | 4386 addu(dst, left, right); |
| 4361 xor_(overflow_dst, dst, left); | 4387 xor_(overflow_dst, dst, left); |
| 4362 xor_(scratch, dst, right); | 4388 xor_(scratch, dst, right); |
| 4363 and_(overflow_dst, scratch, overflow_dst); | 4389 and_(overflow_dst, scratch, overflow_dst); |
| 4390 } | |
| 4391 if (!overflow_label) { | |
| 4392 DCHECK(no_overflow_label); | |
| 4393 Branch(no_overflow_label, ge, overflow_dst, Operand(zero_reg)); | |
| 4394 } else { | |
| 4395 Branch(overflow_label, lt, overflow_dst, Operand(zero_reg)); | |
| 4396 if (no_overflow_label) bc(no_overflow_label); | |
| 4397 } | |
| 4364 } | 4398 } |
| 4365 } | 4399 } |
| 4366 | 4400 |
| 4367 | 4401 |
| 4368 void MacroAssembler::SubuAndCheckForOverflow(Register dst, Register left, | 4402 void MacroAssembler::SubuAndCheckForOverflow(Register dst, Register left, |
| 4369 const Operand& right, | 4403 const Operand& right, |
| 4370 Register overflow_dst, | 4404 Register overflow_dst, |
| 4371 Register scratch) { | 4405 Register scratch) { |
| 4372 if (right.is_reg()) { | 4406 if (right.is_reg()) { |
| 4373 SubuAndCheckForOverflow(dst, left, right.rm(), overflow_dst, scratch); | 4407 SubuAndCheckForOverflow(dst, left, right.rm(), overflow_dst, scratch); |
| (...skipping 1479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5853 if (mag.shift > 0) sra(result, result, mag.shift); | 5887 if (mag.shift > 0) sra(result, result, mag.shift); |
| 5854 srl(at, dividend, 31); | 5888 srl(at, dividend, 31); |
| 5855 Addu(result, result, Operand(at)); | 5889 Addu(result, result, Operand(at)); |
| 5856 } | 5890 } |
| 5857 | 5891 |
| 5858 | 5892 |
| 5859 } // namespace internal | 5893 } // namespace internal |
| 5860 } // namespace v8 | 5894 } // namespace v8 |
| 5861 | 5895 |
| 5862 #endif // V8_TARGET_ARCH_MIPS | 5896 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |