Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(173)

Side by Side Diff: src/compiler/x64/code-generator-x64.cc

Issue 1858323003: [turbofan] Length and index2 are unsigned in CheckedLoad/CheckedStore. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: git cl try Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/code-generator-impl.h ('k') | test/cctest/cctest.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/ast/scopes.h" 7 #include "src/ast/scopes.h"
8 #include "src/compiler/code-generator-impl.h" 8 #include "src/compiler/code-generator-impl.h"
9 #include "src/compiler/gap-resolver.h" 9 #include "src/compiler/gap-resolver.h"
10 #include "src/compiler/node-matchers.h" 10 #include "src/compiler/node-matchers.h"
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 CpuFeatureScope avx_scope(masm(), AVX); \ 367 CpuFeatureScope avx_scope(masm(), AVX); \
368 if (instr->InputAt(1)->IsDoubleRegister()) { \ 368 if (instr->InputAt(1)->IsDoubleRegister()) { \
369 __ asm_instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0), \ 369 __ asm_instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0), \
370 i.InputDoubleRegister(1)); \ 370 i.InputDoubleRegister(1)); \
371 } else { \ 371 } else { \
372 __ asm_instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0), \ 372 __ asm_instr(i.OutputDoubleRegister(), i.InputDoubleRegister(0), \
373 i.InputOperand(1)); \ 373 i.InputOperand(1)); \
374 } \ 374 } \
375 } while (0) 375 } while (0)
376 376
377
378 #define ASSEMBLE_CHECKED_LOAD_FLOAT(asm_instr) \ 377 #define ASSEMBLE_CHECKED_LOAD_FLOAT(asm_instr) \
379 do { \ 378 do { \
380 auto result = i.OutputDoubleRegister(); \ 379 auto result = i.OutputDoubleRegister(); \
381 auto buffer = i.InputRegister(0); \ 380 auto buffer = i.InputRegister(0); \
382 auto index1 = i.InputRegister(1); \ 381 auto index1 = i.InputRegister(1); \
383 auto index2 = i.InputInt32(2); \ 382 auto index2 = i.InputUint32(2); \
384 OutOfLineCode* ool; \ 383 OutOfLineCode* ool; \
385 if (instr->InputAt(3)->IsRegister()) { \ 384 if (instr->InputAt(3)->IsRegister()) { \
386 auto length = i.InputRegister(3); \ 385 auto length = i.InputRegister(3); \
387 DCHECK_EQ(0, index2); \ 386 DCHECK_EQ(0, index2); \
388 __ cmpl(index1, length); \ 387 __ cmpl(index1, length); \
389 ool = new (zone()) OutOfLineLoadNaN(this, result); \ 388 ool = new (zone()) OutOfLineLoadNaN(this, result); \
390 } else { \ 389 } else { \
391 auto length = i.InputInt32(3); \ 390 auto length = i.InputUint32(3); \
392 DCHECK_LE(index2, length); \ 391 DCHECK_LE(index2, length); \
393 __ cmpq(index1, Immediate(length - index2)); \ 392 __ cmpl(index1, Immediate(length - index2)); \
394 class OutOfLineLoadFloat final : public OutOfLineCode { \ 393 class OutOfLineLoadFloat final : public OutOfLineCode { \
395 public: \ 394 public: \
396 OutOfLineLoadFloat(CodeGenerator* gen, XMMRegister result, \ 395 OutOfLineLoadFloat(CodeGenerator* gen, XMMRegister result, \
397 Register buffer, Register index1, int32_t index2, \ 396 Register buffer, Register index1, int32_t index2, \
398 int32_t length) \ 397 int32_t length) \
399 : OutOfLineCode(gen), \ 398 : OutOfLineCode(gen), \
400 result_(result), \ 399 result_(result), \
401 buffer_(buffer), \ 400 buffer_(buffer), \
402 index1_(index1), \ 401 index1_(index1), \
403 index2_(index2), \ 402 index2_(index2), \
(...skipping 16 matching lines...) Expand all
420 int32_t const length_; \ 419 int32_t const length_; \
421 }; \ 420 }; \
422 ool = new (zone()) \ 421 ool = new (zone()) \
423 OutOfLineLoadFloat(this, result, buffer, index1, index2, length); \ 422 OutOfLineLoadFloat(this, result, buffer, index1, index2, length); \
424 } \ 423 } \
425 __ j(above_equal, ool->entry()); \ 424 __ j(above_equal, ool->entry()); \
426 __ asm_instr(result, Operand(buffer, index1, times_1, index2)); \ 425 __ asm_instr(result, Operand(buffer, index1, times_1, index2)); \
427 __ bind(ool->exit()); \ 426 __ bind(ool->exit()); \
428 } while (false) 427 } while (false)
429 428
430
431 #define ASSEMBLE_CHECKED_LOAD_INTEGER(asm_instr) \ 429 #define ASSEMBLE_CHECKED_LOAD_INTEGER(asm_instr) \
432 do { \ 430 do { \
433 auto result = i.OutputRegister(); \ 431 auto result = i.OutputRegister(); \
434 auto buffer = i.InputRegister(0); \ 432 auto buffer = i.InputRegister(0); \
435 auto index1 = i.InputRegister(1); \ 433 auto index1 = i.InputRegister(1); \
436 auto index2 = i.InputInt32(2); \ 434 auto index2 = i.InputUint32(2); \
437 OutOfLineCode* ool; \ 435 OutOfLineCode* ool; \
438 if (instr->InputAt(3)->IsRegister()) { \ 436 if (instr->InputAt(3)->IsRegister()) { \
439 auto length = i.InputRegister(3); \ 437 auto length = i.InputRegister(3); \
440 DCHECK_EQ(0, index2); \ 438 DCHECK_EQ(0, index2); \
441 __ cmpl(index1, length); \ 439 __ cmpl(index1, length); \
442 ool = new (zone()) OutOfLineLoadZero(this, result); \ 440 ool = new (zone()) OutOfLineLoadZero(this, result); \
443 } else { \ 441 } else { \
444 auto length = i.InputInt32(3); \ 442 auto length = i.InputUint32(3); \
445 DCHECK_LE(index2, length); \ 443 DCHECK_LE(index2, length); \
446 __ cmpq(index1, Immediate(length - index2)); \ 444 __ cmpl(index1, Immediate(length - index2)); \
447 class OutOfLineLoadInteger final : public OutOfLineCode { \ 445 class OutOfLineLoadInteger final : public OutOfLineCode { \
448 public: \ 446 public: \
449 OutOfLineLoadInteger(CodeGenerator* gen, Register result, \ 447 OutOfLineLoadInteger(CodeGenerator* gen, Register result, \
450 Register buffer, Register index1, int32_t index2, \ 448 Register buffer, Register index1, int32_t index2, \
451 int32_t length) \ 449 int32_t length) \
452 : OutOfLineCode(gen), \ 450 : OutOfLineCode(gen), \
453 result_(result), \ 451 result_(result), \
454 buffer_(buffer), \ 452 buffer_(buffer), \
455 index1_(index1), \ 453 index1_(index1), \
456 index2_(index2), \ 454 index2_(index2), \
(...skipping 19 matching lines...) Expand all
476 int32_t const length_; \ 474 int32_t const length_; \
477 }; \ 475 }; \
478 ool = new (zone()) \ 476 ool = new (zone()) \
479 OutOfLineLoadInteger(this, result, buffer, index1, index2, length); \ 477 OutOfLineLoadInteger(this, result, buffer, index1, index2, length); \
480 } \ 478 } \
481 __ j(above_equal, ool->entry()); \ 479 __ j(above_equal, ool->entry()); \
482 __ asm_instr(result, Operand(buffer, index1, times_1, index2)); \ 480 __ asm_instr(result, Operand(buffer, index1, times_1, index2)); \
483 __ bind(ool->exit()); \ 481 __ bind(ool->exit()); \
484 } while (false) 482 } while (false)
485 483
486
487 #define ASSEMBLE_CHECKED_STORE_FLOAT(asm_instr) \ 484 #define ASSEMBLE_CHECKED_STORE_FLOAT(asm_instr) \
488 do { \ 485 do { \
489 auto buffer = i.InputRegister(0); \ 486 auto buffer = i.InputRegister(0); \
490 auto index1 = i.InputRegister(1); \ 487 auto index1 = i.InputRegister(1); \
491 auto index2 = i.InputInt32(2); \ 488 auto index2 = i.InputUint32(2); \
492 auto value = i.InputDoubleRegister(4); \ 489 auto value = i.InputDoubleRegister(4); \
493 if (instr->InputAt(3)->IsRegister()) { \ 490 if (instr->InputAt(3)->IsRegister()) { \
494 auto length = i.InputRegister(3); \ 491 auto length = i.InputRegister(3); \
495 DCHECK_EQ(0, index2); \ 492 DCHECK_EQ(0, index2); \
496 Label done; \ 493 Label done; \
497 __ cmpl(index1, length); \ 494 __ cmpl(index1, length); \
498 __ j(above_equal, &done, Label::kNear); \ 495 __ j(above_equal, &done, Label::kNear); \
499 __ asm_instr(Operand(buffer, index1, times_1, index2), value); \ 496 __ asm_instr(Operand(buffer, index1, times_1, index2), value); \
500 __ bind(&done); \ 497 __ bind(&done); \
501 } else { \ 498 } else { \
502 auto length = i.InputInt32(3); \ 499 auto length = i.InputUint32(3); \
503 DCHECK_LE(index2, length); \ 500 DCHECK_LE(index2, length); \
504 __ cmpq(index1, Immediate(length - index2)); \ 501 __ cmpl(index1, Immediate(length - index2)); \
505 class OutOfLineStoreFloat final : public OutOfLineCode { \ 502 class OutOfLineStoreFloat final : public OutOfLineCode { \
506 public: \ 503 public: \
507 OutOfLineStoreFloat(CodeGenerator* gen, Register buffer, \ 504 OutOfLineStoreFloat(CodeGenerator* gen, Register buffer, \
508 Register index1, int32_t index2, int32_t length, \ 505 Register index1, int32_t index2, int32_t length, \
509 XMMRegister value) \ 506 XMMRegister value) \
510 : OutOfLineCode(gen), \ 507 : OutOfLineCode(gen), \
511 buffer_(buffer), \ 508 buffer_(buffer), \
512 index1_(index1), \ 509 index1_(index1), \
513 index2_(index2), \ 510 index2_(index2), \
514 length_(length), \ 511 length_(length), \
(...skipping 15 matching lines...) Expand all
530 XMMRegister const value_; \ 527 XMMRegister const value_; \
531 }; \ 528 }; \
532 auto ool = new (zone()) \ 529 auto ool = new (zone()) \
533 OutOfLineStoreFloat(this, buffer, index1, index2, length, value); \ 530 OutOfLineStoreFloat(this, buffer, index1, index2, length, value); \
534 __ j(above_equal, ool->entry()); \ 531 __ j(above_equal, ool->entry()); \
535 __ asm_instr(Operand(buffer, index1, times_1, index2), value); \ 532 __ asm_instr(Operand(buffer, index1, times_1, index2), value); \
536 __ bind(ool->exit()); \ 533 __ bind(ool->exit()); \
537 } \ 534 } \
538 } while (false) 535 } while (false)
539 536
540
541 #define ASSEMBLE_CHECKED_STORE_INTEGER_IMPL(asm_instr, Value) \ 537 #define ASSEMBLE_CHECKED_STORE_INTEGER_IMPL(asm_instr, Value) \
542 do { \ 538 do { \
543 auto buffer = i.InputRegister(0); \ 539 auto buffer = i.InputRegister(0); \
544 auto index1 = i.InputRegister(1); \ 540 auto index1 = i.InputRegister(1); \
545 auto index2 = i.InputInt32(2); \ 541 auto index2 = i.InputUint32(2); \
546 if (instr->InputAt(3)->IsRegister()) { \ 542 if (instr->InputAt(3)->IsRegister()) { \
547 auto length = i.InputRegister(3); \ 543 auto length = i.InputRegister(3); \
548 DCHECK_EQ(0, index2); \ 544 DCHECK_EQ(0, index2); \
549 Label done; \ 545 Label done; \
550 __ cmpl(index1, length); \ 546 __ cmpl(index1, length); \
551 __ j(above_equal, &done, Label::kNear); \ 547 __ j(above_equal, &done, Label::kNear); \
552 __ asm_instr(Operand(buffer, index1, times_1, index2), value); \ 548 __ asm_instr(Operand(buffer, index1, times_1, index2), value); \
553 __ bind(&done); \ 549 __ bind(&done); \
554 } else { \ 550 } else { \
555 auto length = i.InputInt32(3); \ 551 auto length = i.InputUint32(3); \
556 DCHECK_LE(index2, length); \ 552 DCHECK_LE(index2, length); \
557 __ cmpq(index1, Immediate(length - index2)); \ 553 __ cmpl(index1, Immediate(length - index2)); \
558 class OutOfLineStoreInteger final : public OutOfLineCode { \ 554 class OutOfLineStoreInteger final : public OutOfLineCode { \
559 public: \ 555 public: \
560 OutOfLineStoreInteger(CodeGenerator* gen, Register buffer, \ 556 OutOfLineStoreInteger(CodeGenerator* gen, Register buffer, \
561 Register index1, int32_t index2, int32_t length, \ 557 Register index1, int32_t index2, int32_t length, \
562 Value value) \ 558 Value value) \
563 : OutOfLineCode(gen), \ 559 : OutOfLineCode(gen), \
564 buffer_(buffer), \ 560 buffer_(buffer), \
565 index1_(index1), \ 561 index1_(index1), \
566 index2_(index2), \ 562 index2_(index2), \
567 length_(length), \ 563 length_(length), \
(...skipping 15 matching lines...) Expand all
583 Value const value_; \ 579 Value const value_; \
584 }; \ 580 }; \
585 auto ool = new (zone()) \ 581 auto ool = new (zone()) \
586 OutOfLineStoreInteger(this, buffer, index1, index2, length, value); \ 582 OutOfLineStoreInteger(this, buffer, index1, index2, length, value); \
587 __ j(above_equal, ool->entry()); \ 583 __ j(above_equal, ool->entry()); \
588 __ asm_instr(Operand(buffer, index1, times_1, index2), value); \ 584 __ asm_instr(Operand(buffer, index1, times_1, index2), value); \
589 __ bind(ool->exit()); \ 585 __ bind(ool->exit()); \
590 } \ 586 } \
591 } while (false) 587 } while (false)
592 588
593
594 #define ASSEMBLE_CHECKED_STORE_INTEGER(asm_instr) \ 589 #define ASSEMBLE_CHECKED_STORE_INTEGER(asm_instr) \
595 do { \ 590 do { \
596 if (instr->InputAt(4)->IsRegister()) { \ 591 if (instr->InputAt(4)->IsRegister()) { \
597 Register value = i.InputRegister(4); \ 592 Register value = i.InputRegister(4); \
598 ASSEMBLE_CHECKED_STORE_INTEGER_IMPL(asm_instr, Register); \ 593 ASSEMBLE_CHECKED_STORE_INTEGER_IMPL(asm_instr, Register); \
599 } else { \ 594 } else { \
600 Immediate value = i.InputImmediate(4); \ 595 Immediate value = i.InputImmediate(4); \
601 ASSEMBLE_CHECKED_STORE_INTEGER_IMPL(asm_instr, Immediate); \ 596 ASSEMBLE_CHECKED_STORE_INTEGER_IMPL(asm_instr, Immediate); \
602 } \ 597 } \
603 } while (false) 598 } while (false)
(...skipping 1690 matching lines...) Expand 10 before | Expand all | Expand 10 after
2294 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; 2289 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
2295 __ Nop(padding_size); 2290 __ Nop(padding_size);
2296 } 2291 }
2297 } 2292 }
2298 2293
2299 #undef __ 2294 #undef __
2300 2295
2301 } // namespace compiler 2296 } // namespace compiler
2302 } // namespace internal 2297 } // namespace internal
2303 } // namespace v8 2298 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/code-generator-impl.h ('k') | test/cctest/cctest.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698