Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 "src/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
| 6 | 6 |
| 7 #include "src/arm64/frames-arm64.h" | 7 #include "src/arm64/frames-arm64.h" |
| 8 #include "src/arm64/macro-assembler-arm64.h" | 8 #include "src/arm64/macro-assembler-arm64.h" |
| 9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
| 10 #include "src/compiler/code-generator-impl.h" | 10 #include "src/compiler/code-generator-impl.h" |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 26 : InstructionOperandConverter(gen, instr) {} | 26 : InstructionOperandConverter(gen, instr) {} |
| 27 | 27 |
| 28 DoubleRegister InputFloat32Register(size_t index) { | 28 DoubleRegister InputFloat32Register(size_t index) { |
| 29 return InputDoubleRegister(index).S(); | 29 return InputDoubleRegister(index).S(); |
| 30 } | 30 } |
| 31 | 31 |
| 32 DoubleRegister InputFloat64Register(size_t index) { | 32 DoubleRegister InputFloat64Register(size_t index) { |
| 33 return InputDoubleRegister(index); | 33 return InputDoubleRegister(index); |
| 34 } | 34 } |
| 35 | 35 |
| 36 CPURegister InputFloat32OrZeroRegister(size_t index) { | |
| 37 if (instr_->InputAt(index)->IsImmediate()) { | |
| 38 DCHECK(instr_->InputAt(index)->IsImmediate() && | |
| 39 (InputFloat32(index) == 0.0f) && | |
| 40 (copysignf(1.0f, InputFloat32(index)) > 0.0f)); | |
|
Benedikt Meurer
2016/05/03 17:33:20
Use std::signbit or bit_cast<int32_t>(InputFloat32
martyn.capewell
2016/05/04 09:47:47
Done.
| |
| 41 return wzr; | |
| 42 } | |
| 43 DCHECK(instr_->InputAt(index)->IsDoubleRegister()); | |
| 44 return InputDoubleRegister(index).S(); | |
| 45 } | |
| 46 | |
| 47 CPURegister InputFloat64OrZeroRegister(size_t index) { | |
| 48 if (instr_->InputAt(index)->IsImmediate()) { | |
| 49 DCHECK(instr_->InputAt(index)->IsImmediate() && | |
| 50 (InputDouble(index) == 0.0f) && | |
| 51 (copysign(1.0, InputDouble(index)) > 0.0)); | |
|
Benedikt Meurer
2016/05/03 17:33:20
Use std::signbit or bit_cast<int64_t>(InputFloat64
martyn.capewell
2016/05/04 09:47:47
Done.
| |
| 52 return xzr; | |
| 53 } | |
| 54 DCHECK(instr_->InputAt(index)->IsDoubleRegister()); | |
| 55 return InputDoubleRegister(index); | |
| 56 } | |
| 57 | |
| 36 size_t OutputCount() { return instr_->OutputCount(); } | 58 size_t OutputCount() { return instr_->OutputCount(); } |
| 37 | 59 |
| 38 DoubleRegister OutputFloat32Register() { return OutputDoubleRegister().S(); } | 60 DoubleRegister OutputFloat32Register() { return OutputDoubleRegister().S(); } |
| 39 | 61 |
| 40 DoubleRegister OutputFloat64Register() { return OutputDoubleRegister(); } | 62 DoubleRegister OutputFloat64Register() { return OutputDoubleRegister(); } |
| 41 | 63 |
| 42 Register InputRegister32(size_t index) { | 64 Register InputRegister32(size_t index) { |
| 43 return ToRegister(instr_->InputAt(index)).W(); | 65 return ToRegister(instr_->InputAt(index)).W(); |
| 44 } | 66 } |
| 45 | 67 |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 409 auto buffer = i.InputRegister(0); \ | 431 auto buffer = i.InputRegister(0); \ |
| 410 auto offset = i.InputRegister32(1); \ | 432 auto offset = i.InputRegister32(1); \ |
| 411 auto length = i.InputOperand32(2); \ | 433 auto length = i.InputOperand32(2); \ |
| 412 __ Cmp(offset, length); \ | 434 __ Cmp(offset, length); \ |
| 413 auto ool = new (zone()) OutOfLineLoadZero(this, result); \ | 435 auto ool = new (zone()) OutOfLineLoadZero(this, result); \ |
| 414 __ B(hs, ool->entry()); \ | 436 __ B(hs, ool->entry()); \ |
| 415 __ asm_instr(result, MemOperand(buffer, offset, UXTW)); \ | 437 __ asm_instr(result, MemOperand(buffer, offset, UXTW)); \ |
| 416 __ Bind(ool->exit()); \ | 438 __ Bind(ool->exit()); \ |
| 417 } while (0) | 439 } while (0) |
| 418 | 440 |
| 419 | 441 #define ASSEMBLE_CHECKED_STORE_FLOAT(width) \ |
| 420 #define ASSEMBLE_CHECKED_STORE_FLOAT(width) \ | 442 do { \ |
| 421 do { \ | 443 auto buffer = i.InputRegister(0); \ |
| 422 auto buffer = i.InputRegister(0); \ | 444 auto offset = i.InputRegister32(1); \ |
| 423 auto offset = i.InputRegister32(1); \ | 445 auto length = i.InputOperand32(2); \ |
| 424 auto length = i.InputOperand32(2); \ | 446 auto value = i.InputFloat##width##OrZeroRegister(3); \ |
| 425 auto value = i.InputFloat##width##Register(3); \ | 447 __ Cmp(offset, length); \ |
| 426 __ Cmp(offset, length); \ | 448 Label done; \ |
| 427 Label done; \ | 449 __ B(hs, &done); \ |
| 428 __ B(hs, &done); \ | 450 __ Str(value, MemOperand(buffer, offset, UXTW)); \ |
| 429 __ Str(value, MemOperand(buffer, offset, UXTW)); \ | 451 __ Bind(&done); \ |
| 430 __ Bind(&done); \ | |
| 431 } while (0) | 452 } while (0) |
| 432 | 453 |
| 433 | |
| 434 #define ASSEMBLE_CHECKED_STORE_INTEGER(asm_instr) \ | 454 #define ASSEMBLE_CHECKED_STORE_INTEGER(asm_instr) \ |
| 435 do { \ | 455 do { \ |
| 436 auto buffer = i.InputRegister(0); \ | 456 auto buffer = i.InputRegister(0); \ |
| 437 auto offset = i.InputRegister32(1); \ | 457 auto offset = i.InputRegister32(1); \ |
| 438 auto length = i.InputOperand32(2); \ | 458 auto length = i.InputOperand32(2); \ |
| 439 auto value = i.InputRegister32(3); \ | 459 auto value = i.InputOrZeroRegister32(3); \ |
| 440 __ Cmp(offset, length); \ | 460 __ Cmp(offset, length); \ |
| 441 Label done; \ | 461 Label done; \ |
| 442 __ B(hs, &done); \ | 462 __ B(hs, &done); \ |
| 443 __ asm_instr(value, MemOperand(buffer, offset, UXTW)); \ | 463 __ asm_instr(value, MemOperand(buffer, offset, UXTW)); \ |
| 444 __ Bind(&done); \ | 464 __ Bind(&done); \ |
| 445 } while (0) | 465 } while (0) |
| 446 | 466 |
| 447 | |
| 448 #define ASSEMBLE_CHECKED_STORE_INTEGER_64(asm_instr) \ | 467 #define ASSEMBLE_CHECKED_STORE_INTEGER_64(asm_instr) \ |
| 449 do { \ | 468 do { \ |
| 450 auto buffer = i.InputRegister(0); \ | 469 auto buffer = i.InputRegister(0); \ |
| 451 auto offset = i.InputRegister32(1); \ | 470 auto offset = i.InputRegister32(1); \ |
| 452 auto length = i.InputOperand32(2); \ | 471 auto length = i.InputOperand32(2); \ |
| 453 auto value = i.InputRegister(3); \ | 472 auto value = i.InputOrZeroRegister64(3); \ |
| 454 __ Cmp(offset, length); \ | 473 __ Cmp(offset, length); \ |
| 455 Label done; \ | 474 Label done; \ |
| 456 __ B(hs, &done); \ | 475 __ B(hs, &done); \ |
| 457 __ asm_instr(value, MemOperand(buffer, offset, UXTW)); \ | 476 __ asm_instr(value, MemOperand(buffer, offset, UXTW)); \ |
| 458 __ Bind(&done); \ | 477 __ Bind(&done); \ |
| 459 } while (0) | 478 } while (0) |
| 460 | 479 |
| 461 | |
| 462 #define ASSEMBLE_SHIFT(asm_instr, width) \ | 480 #define ASSEMBLE_SHIFT(asm_instr, width) \ |
| 463 do { \ | 481 do { \ |
| 464 if (instr->InputAt(1)->IsRegister()) { \ | 482 if (instr->InputAt(1)->IsRegister()) { \ |
| 465 __ asm_instr(i.OutputRegister##width(), i.InputRegister##width(0), \ | 483 __ asm_instr(i.OutputRegister##width(), i.InputRegister##width(0), \ |
| 466 i.InputRegister##width(1)); \ | 484 i.InputRegister##width(1)); \ |
| 467 } else { \ | 485 } else { \ |
| 468 uint32_t imm = \ | 486 uint32_t imm = \ |
| 469 static_cast<uint32_t>(i.InputOperand##width(1).ImmediateValue()); \ | 487 static_cast<uint32_t>(i.InputOperand##width(1).ImmediateValue()); \ |
| 470 __ asm_instr(i.OutputRegister##width(), i.InputRegister##width(0), \ | 488 __ asm_instr(i.OutputRegister##width(), i.InputRegister##width(0), \ |
| 471 imm % (width)); \ | 489 imm % (width)); \ |
| (...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1330 case kArm64U64MoveFloat64: | 1348 case kArm64U64MoveFloat64: |
| 1331 __ Fmov(i.OutputRegister(), i.InputDoubleRegister(0)); | 1349 __ Fmov(i.OutputRegister(), i.InputDoubleRegister(0)); |
| 1332 break; | 1350 break; |
| 1333 case kArm64Ldrb: | 1351 case kArm64Ldrb: |
| 1334 __ Ldrb(i.OutputRegister(), i.MemoryOperand()); | 1352 __ Ldrb(i.OutputRegister(), i.MemoryOperand()); |
| 1335 break; | 1353 break; |
| 1336 case kArm64Ldrsb: | 1354 case kArm64Ldrsb: |
| 1337 __ Ldrsb(i.OutputRegister(), i.MemoryOperand()); | 1355 __ Ldrsb(i.OutputRegister(), i.MemoryOperand()); |
| 1338 break; | 1356 break; |
| 1339 case kArm64Strb: | 1357 case kArm64Strb: |
| 1340 __ Strb(i.InputRegister(2), i.MemoryOperand()); | 1358 __ Strb(i.InputOrZeroRegister64(2), i.MemoryOperand()); |
| 1341 break; | 1359 break; |
| 1342 case kArm64Ldrh: | 1360 case kArm64Ldrh: |
| 1343 __ Ldrh(i.OutputRegister(), i.MemoryOperand()); | 1361 __ Ldrh(i.OutputRegister(), i.MemoryOperand()); |
| 1344 break; | 1362 break; |
| 1345 case kArm64Ldrsh: | 1363 case kArm64Ldrsh: |
| 1346 __ Ldrsh(i.OutputRegister(), i.MemoryOperand()); | 1364 __ Ldrsh(i.OutputRegister(), i.MemoryOperand()); |
| 1347 break; | 1365 break; |
| 1348 case kArm64Strh: | 1366 case kArm64Strh: |
| 1349 __ Strh(i.InputRegister(2), i.MemoryOperand()); | 1367 __ Strh(i.InputOrZeroRegister64(2), i.MemoryOperand()); |
| 1350 break; | 1368 break; |
| 1351 case kArm64LdrW: | 1369 case kArm64LdrW: |
| 1352 __ Ldr(i.OutputRegister32(), i.MemoryOperand()); | 1370 __ Ldr(i.OutputRegister32(), i.MemoryOperand()); |
| 1353 break; | 1371 break; |
| 1354 case kArm64StrW: | 1372 case kArm64StrW: |
| 1355 __ Str(i.InputRegister32(2), i.MemoryOperand()); | 1373 __ Str(i.InputOrZeroRegister32(2), i.MemoryOperand()); |
| 1356 break; | 1374 break; |
| 1357 case kArm64Ldr: | 1375 case kArm64Ldr: |
| 1358 __ Ldr(i.OutputRegister(), i.MemoryOperand()); | 1376 __ Ldr(i.OutputRegister(), i.MemoryOperand()); |
| 1359 break; | 1377 break; |
| 1360 case kArm64Str: | 1378 case kArm64Str: |
| 1361 __ Str(i.InputRegister(2), i.MemoryOperand()); | 1379 __ Str(i.InputOrZeroRegister64(2), i.MemoryOperand()); |
| 1362 break; | 1380 break; |
| 1363 case kArm64LdrS: | 1381 case kArm64LdrS: |
| 1364 __ Ldr(i.OutputDoubleRegister().S(), i.MemoryOperand()); | 1382 __ Ldr(i.OutputDoubleRegister().S(), i.MemoryOperand()); |
| 1365 break; | 1383 break; |
| 1366 case kArm64StrS: | 1384 case kArm64StrS: |
| 1367 __ Str(i.InputDoubleRegister(2).S(), i.MemoryOperand()); | 1385 __ Str(i.InputFloat32OrZeroRegister(2), i.MemoryOperand()); |
| 1368 break; | 1386 break; |
| 1369 case kArm64LdrD: | 1387 case kArm64LdrD: |
| 1370 __ Ldr(i.OutputDoubleRegister(), i.MemoryOperand()); | 1388 __ Ldr(i.OutputDoubleRegister(), i.MemoryOperand()); |
| 1371 break; | 1389 break; |
| 1372 case kArm64StrD: | 1390 case kArm64StrD: |
| 1373 __ Str(i.InputDoubleRegister(2), i.MemoryOperand()); | 1391 __ Str(i.InputFloat64OrZeroRegister(2), i.MemoryOperand()); |
| 1374 break; | 1392 break; |
| 1375 case kCheckedLoadInt8: | 1393 case kCheckedLoadInt8: |
| 1376 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrsb); | 1394 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrsb); |
| 1377 break; | 1395 break; |
| 1378 case kCheckedLoadUint8: | 1396 case kCheckedLoadUint8: |
| 1379 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrb); | 1397 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrb); |
| 1380 break; | 1398 break; |
| 1381 case kCheckedLoadInt16: | 1399 case kCheckedLoadInt16: |
| 1382 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrsh); | 1400 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrsh); |
| 1383 break; | 1401 break; |
| (...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1857 padding_size -= kInstructionSize; | 1875 padding_size -= kInstructionSize; |
| 1858 } | 1876 } |
| 1859 } | 1877 } |
| 1860 } | 1878 } |
| 1861 | 1879 |
| 1862 #undef __ | 1880 #undef __ |
| 1863 | 1881 |
| 1864 } // namespace compiler | 1882 } // namespace compiler |
| 1865 } // namespace internal | 1883 } // namespace internal |
| 1866 } // namespace v8 | 1884 } // namespace v8 |
| OLD | NEW |