| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <limits.h> // For LONG_MIN, LONG_MAX. | 5 #include <limits.h> // For LONG_MIN, LONG_MAX. |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_MIPS64 | 7 #if V8_TARGET_ARCH_MIPS64 |
| 8 | 8 |
| 9 #include "src/base/division-by-constant.h" | 9 #include "src/base/division-by-constant.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 6284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6295 // Check that neither is a smi. | 6295 // Check that neither is a smi. |
| 6296 STATIC_ASSERT(kSmiTag == 0); | 6296 STATIC_ASSERT(kSmiTag == 0); |
| 6297 And(scratch1, first, Operand(second)); | 6297 And(scratch1, first, Operand(second)); |
| 6298 JumpIfSmi(scratch1, failure); | 6298 JumpIfSmi(scratch1, failure); |
| 6299 JumpIfNonSmisNotBothSequentialOneByteStrings(first, second, scratch1, | 6299 JumpIfNonSmisNotBothSequentialOneByteStrings(first, second, scratch1, |
| 6300 scratch2, failure); | 6300 scratch2, failure); |
| 6301 } | 6301 } |
| 6302 | 6302 |
| 6303 void MacroAssembler::Float32Max(FPURegister dst, FPURegister src1, | 6303 void MacroAssembler::Float32Max(FPURegister dst, FPURegister src1, |
| 6304 FPURegister src2, Label* out_of_line) { | 6304 FPURegister src2, Label* out_of_line) { |
| 6305 DCHECK(!src1.is(src2)); | 6305 if (src1.is(src2)) { |
| 6306 Move_s(dst, src1); |
| 6307 return; |
| 6308 } |
| 6306 | 6309 |
| 6307 // Check if one of operands is NaN. | 6310 // Check if one of operands is NaN. |
| 6308 BranchF32(nullptr, out_of_line, eq, src1, src2); | 6311 BranchF32(nullptr, out_of_line, eq, src1, src2); |
| 6309 | 6312 |
| 6310 if (kArchVariant >= kMips64r6) { | 6313 if (kArchVariant >= kMips64r6) { |
| 6311 max_s(dst, src1, src2); | 6314 max_s(dst, src1, src2); |
| 6312 } else { | 6315 } else { |
| 6313 Label return_left, return_right, done; | 6316 Label return_left, return_right, done; |
| 6314 | 6317 |
| 6315 c(OLT, S, src1, src2); | 6318 BranchF32(&return_right, nullptr, lt, src1, src2); |
| 6316 bc1t(&return_right); | 6319 BranchF32(&return_left, nullptr, lt, src2, src1); |
| 6317 nop(); | |
| 6318 | |
| 6319 c(OLT, S, src2, src1); | |
| 6320 bc1t(&return_left); | |
| 6321 nop(); | |
| 6322 | 6320 |
| 6323 // Operands are equal, but check for +/-0. | 6321 // Operands are equal, but check for +/-0. |
| 6324 mfc1(t8, src1); | 6322 mfc1(t8, src1); |
| 6325 dsll32(t8, t8, 0); | 6323 dsll32(t8, t8, 0); |
| 6326 beq(t8, zero_reg, &return_left); | 6324 Branch(&return_left, eq, t8, Operand(zero_reg)); |
| 6327 nop(); | 6325 Branch(&return_right); |
| 6328 b(&return_right); | |
| 6329 nop(); | |
| 6330 | 6326 |
| 6331 bind(&return_right); | 6327 bind(&return_right); |
| 6332 if (!src2.is(dst)) { | 6328 if (!src2.is(dst)) { |
| 6333 Move_s(dst, src2); | 6329 Move_s(dst, src2); |
| 6334 } | 6330 } |
| 6335 b(&done); | 6331 Branch(&done); |
| 6336 nop(); | |
| 6337 | 6332 |
| 6338 bind(&return_left); | 6333 bind(&return_left); |
| 6339 if (!src1.is(dst)) { | 6334 if (!src1.is(dst)) { |
| 6340 Move_s(dst, src1); | 6335 Move_s(dst, src1); |
| 6341 } | 6336 } |
| 6342 | 6337 |
| 6343 bind(&done); | 6338 bind(&done); |
| 6344 } | 6339 } |
| 6345 } | 6340 } |
| 6346 | 6341 |
| 6347 void MacroAssembler::Float32MaxOutOfLine(FPURegister dst, FPURegister src1, | 6342 void MacroAssembler::Float32MaxOutOfLine(FPURegister dst, FPURegister src1, |
| 6348 FPURegister src2) { | 6343 FPURegister src2) { |
| 6349 DCHECK(!src1.is(src2)); | |
| 6350 add_s(dst, src1, src2); | 6344 add_s(dst, src1, src2); |
| 6351 } | 6345 } |
| 6352 | 6346 |
| 6353 void MacroAssembler::Float32Min(FPURegister dst, FPURegister src1, | 6347 void MacroAssembler::Float32Min(FPURegister dst, FPURegister src1, |
| 6354 FPURegister src2, Label* out_of_line) { | 6348 FPURegister src2, Label* out_of_line) { |
| 6355 DCHECK(!src1.is(src2)); | 6349 if (src1.is(src2)) { |
| 6350 Move_s(dst, src1); |
| 6351 return; |
| 6352 } |
| 6356 | 6353 |
| 6357 // Check if one of operands is NaN. | 6354 // Check if one of operands is NaN. |
| 6358 BranchF32(nullptr, out_of_line, eq, src1, src2); | 6355 BranchF32(nullptr, out_of_line, eq, src1, src2); |
| 6359 | 6356 |
| 6360 if (kArchVariant >= kMips64r6) { | 6357 if (kArchVariant >= kMips64r6) { |
| 6361 min_s(dst, src1, src2); | 6358 min_s(dst, src1, src2); |
| 6362 } else { | 6359 } else { |
| 6363 Label return_left, return_right, done; | 6360 Label return_left, return_right, done; |
| 6364 | 6361 |
| 6365 c(OLT, S, src1, src2); | 6362 BranchF32(&return_left, nullptr, lt, src1, src2); |
| 6366 bc1t(&return_left); | 6363 BranchF32(&return_right, nullptr, lt, src2, src1); |
| 6367 nop(); | |
| 6368 | |
| 6369 c(OLT, S, src2, src1); | |
| 6370 bc1t(&return_right); | |
| 6371 nop(); | |
| 6372 | 6364 |
| 6373 // Left equals right => check for -0. | 6365 // Left equals right => check for -0. |
| 6374 mfc1(t8, src1); | 6366 mfc1(t8, src1); |
| 6375 dsll32(t8, t8, 0); | 6367 dsll32(t8, t8, 0); |
| 6376 beq(t8, zero_reg, &return_right); | 6368 Branch(&return_right, eq, t8, Operand(zero_reg)); |
| 6377 nop(); | 6369 Branch(&return_left); |
| 6378 b(&return_left); | |
| 6379 nop(); | |
| 6380 | 6370 |
| 6381 bind(&return_right); | 6371 bind(&return_right); |
| 6382 if (!src2.is(dst)) { | 6372 if (!src2.is(dst)) { |
| 6383 Move_s(dst, src2); | 6373 Move_s(dst, src2); |
| 6384 } | 6374 } |
| 6385 b(&done); | 6375 Branch(&done); |
| 6386 nop(); | |
| 6387 | 6376 |
| 6388 bind(&return_left); | 6377 bind(&return_left); |
| 6389 if (!src1.is(dst)) { | 6378 if (!src1.is(dst)) { |
| 6390 Move_s(dst, src1); | 6379 Move_s(dst, src1); |
| 6391 } | 6380 } |
| 6392 | 6381 |
| 6393 bind(&done); | 6382 bind(&done); |
| 6394 } | 6383 } |
| 6395 } | 6384 } |
| 6396 | 6385 |
| 6397 void MacroAssembler::Float32MinOutOfLine(FPURegister dst, FPURegister src1, | 6386 void MacroAssembler::Float32MinOutOfLine(FPURegister dst, FPURegister src1, |
| 6398 FPURegister src2) { | 6387 FPURegister src2) { |
| 6399 DCHECK(!src1.is(src2)); | |
| 6400 add_s(dst, src1, src2); | 6388 add_s(dst, src1, src2); |
| 6401 } | 6389 } |
| 6402 | 6390 |
| 6403 void MacroAssembler::Float64Max(FPURegister dst, FPURegister src1, | 6391 void MacroAssembler::Float64Max(FPURegister dst, FPURegister src1, |
| 6404 FPURegister src2, Label* out_of_line) { | 6392 FPURegister src2, Label* out_of_line) { |
| 6405 DCHECK(!src1.is(src2)); | 6393 if (src1.is(src2)) { |
| 6394 Move_d(dst, src1); |
| 6395 return; |
| 6396 } |
| 6406 | 6397 |
| 6407 // Check if one of operands is NaN. | 6398 // Check if one of operands is NaN. |
| 6408 BranchF64(nullptr, out_of_line, eq, src1, src2); | 6399 BranchF64(nullptr, out_of_line, eq, src1, src2); |
| 6409 | 6400 |
| 6410 if (kArchVariant >= kMips64r6) { | 6401 if (kArchVariant >= kMips64r6) { |
| 6411 max_d(dst, src1, src2); | 6402 max_d(dst, src1, src2); |
| 6412 } else { | 6403 } else { |
| 6413 Label return_left, return_right, done; | 6404 Label return_left, return_right, done; |
| 6414 | 6405 |
| 6415 c(OLT, D, src1, src2); | 6406 BranchF64(&return_right, nullptr, lt, src1, src2); |
| 6416 bc1t(&return_right); | 6407 BranchF64(&return_left, nullptr, lt, src2, src1); |
| 6417 nop(); | |
| 6418 | |
| 6419 c(OLT, D, src2, src1); | |
| 6420 bc1t(&return_left); | |
| 6421 nop(); | |
| 6422 | 6408 |
| 6423 // Left equals right => check for -0. | 6409 // Left equals right => check for -0. |
| 6424 dmfc1(t8, src1); | 6410 dmfc1(t8, src1); |
| 6425 beq(t8, zero_reg, &return_left); | 6411 Branch(&return_left, eq, t8, Operand(zero_reg)); |
| 6426 nop(); | 6412 Branch(&return_right); |
| 6427 b(&return_right); | |
| 6428 nop(); | |
| 6429 | 6413 |
| 6430 bind(&return_right); | 6414 bind(&return_right); |
| 6431 if (!src2.is(dst)) { | 6415 if (!src2.is(dst)) { |
| 6432 Move_d(dst, src2); | 6416 Move_d(dst, src2); |
| 6433 } | 6417 } |
| 6434 b(&done); | 6418 Branch(&done); |
| 6435 nop(); | |
| 6436 | 6419 |
| 6437 bind(&return_left); | 6420 bind(&return_left); |
| 6438 if (!src1.is(dst)) { | 6421 if (!src1.is(dst)) { |
| 6439 Move_d(dst, src1); | 6422 Move_d(dst, src1); |
| 6440 } | 6423 } |
| 6441 | 6424 |
| 6442 bind(&done); | 6425 bind(&done); |
| 6443 } | 6426 } |
| 6444 } | 6427 } |
| 6445 | 6428 |
| 6446 void MacroAssembler::Float64MaxOutOfLine(FPURegister dst, FPURegister src1, | 6429 void MacroAssembler::Float64MaxOutOfLine(FPURegister dst, FPURegister src1, |
| 6447 FPURegister src2) { | 6430 FPURegister src2) { |
| 6448 DCHECK(!src1.is(src2)); | |
| 6449 add_d(dst, src1, src2); | 6431 add_d(dst, src1, src2); |
| 6450 } | 6432 } |
| 6451 | 6433 |
| 6452 void MacroAssembler::Float64Min(FPURegister dst, FPURegister src1, | 6434 void MacroAssembler::Float64Min(FPURegister dst, FPURegister src1, |
| 6453 FPURegister src2, Label* out_of_line) { | 6435 FPURegister src2, Label* out_of_line) { |
| 6454 DCHECK(!src1.is(src2)); | 6436 if (src1.is(src2)) { |
| 6437 Move_d(dst, src1); |
| 6438 return; |
| 6439 } |
| 6455 | 6440 |
| 6456 // Check if one of operands is NaN. | 6441 // Check if one of operands is NaN. |
| 6457 BranchF64(nullptr, out_of_line, eq, src1, src2); | 6442 BranchF64(nullptr, out_of_line, eq, src1, src2); |
| 6458 | 6443 |
| 6459 if (kArchVariant >= kMips64r6) { | 6444 if (kArchVariant >= kMips64r6) { |
| 6460 min_d(dst, src1, src2); | 6445 min_d(dst, src1, src2); |
| 6461 } else { | 6446 } else { |
| 6462 Label return_left, return_right, done; | 6447 Label return_left, return_right, done; |
| 6463 | 6448 |
| 6464 c(OLT, D, src1, src2); | 6449 BranchF64(&return_left, nullptr, lt, src1, src2); |
| 6465 bc1t(&return_left); | 6450 BranchF64(&return_right, nullptr, lt, src2, src1); |
| 6466 nop(); | |
| 6467 | |
| 6468 c(OLT, D, src2, src1); | |
| 6469 bc1t(&return_right); | |
| 6470 nop(); | |
| 6471 | 6451 |
| 6472 // Left equals right => check for -0. | 6452 // Left equals right => check for -0. |
| 6473 dmfc1(t8, src1); | 6453 dmfc1(t8, src1); |
| 6474 beq(t8, zero_reg, &return_right); | 6454 Branch(&return_right, eq, t8, Operand(zero_reg)); |
| 6475 nop(); | 6455 Branch(&return_left); |
| 6476 b(&return_left); | |
| 6477 nop(); | |
| 6478 | 6456 |
| 6479 bind(&return_right); | 6457 bind(&return_right); |
| 6480 if (!src2.is(dst)) { | 6458 if (!src2.is(dst)) { |
| 6481 Move_d(dst, src2); | 6459 Move_d(dst, src2); |
| 6482 } | 6460 } |
| 6483 b(&done); | 6461 Branch(&done); |
| 6484 nop(); | |
| 6485 | 6462 |
| 6486 bind(&return_left); | 6463 bind(&return_left); |
| 6487 if (!src1.is(dst)) { | 6464 if (!src1.is(dst)) { |
| 6488 Move_d(dst, src1); | 6465 Move_d(dst, src1); |
| 6489 } | 6466 } |
| 6490 | 6467 |
| 6491 bind(&done); | 6468 bind(&done); |
| 6492 } | 6469 } |
| 6493 } | 6470 } |
| 6494 | 6471 |
| 6495 void MacroAssembler::Float64MinOutOfLine(FPURegister dst, FPURegister src1, | 6472 void MacroAssembler::Float64MinOutOfLine(FPURegister dst, FPURegister src1, |
| 6496 FPURegister src2) { | 6473 FPURegister src2) { |
| 6497 DCHECK(!src1.is(src2)); | |
| 6498 add_d(dst, src1, src2); | 6474 add_d(dst, src1, src2); |
| 6499 } | 6475 } |
| 6500 | 6476 |
| 6501 void MacroAssembler::JumpIfBothInstanceTypesAreNotSequentialOneByte( | 6477 void MacroAssembler::JumpIfBothInstanceTypesAreNotSequentialOneByte( |
| 6502 Register first, Register second, Register scratch1, Register scratch2, | 6478 Register first, Register second, Register scratch1, Register scratch2, |
| 6503 Label* failure) { | 6479 Label* failure) { |
| 6504 const int kFlatOneByteStringMask = | 6480 const int kFlatOneByteStringMask = |
| 6505 kIsNotStringMask | kStringEncodingMask | kStringRepresentationMask; | 6481 kIsNotStringMask | kStringEncodingMask | kStringRepresentationMask; |
| 6506 const int kFlatOneByteStringTag = | 6482 const int kFlatOneByteStringTag = |
| 6507 kStringTag | kOneByteStringTag | kSeqStringTag; | 6483 kStringTag | kOneByteStringTag | kSeqStringTag; |
| (...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7045 if (mag.shift > 0) sra(result, result, mag.shift); | 7021 if (mag.shift > 0) sra(result, result, mag.shift); |
| 7046 srl(at, dividend, 31); | 7022 srl(at, dividend, 31); |
| 7047 Addu(result, result, Operand(at)); | 7023 Addu(result, result, Operand(at)); |
| 7048 } | 7024 } |
| 7049 | 7025 |
| 7050 | 7026 |
| 7051 } // namespace internal | 7027 } // namespace internal |
| 7052 } // namespace v8 | 7028 } // namespace v8 |
| 7053 | 7029 |
| 7054 #endif // V8_TARGET_ARCH_MIPS64 | 7030 #endif // V8_TARGET_ARCH_MIPS64 |
| OLD | NEW |