OLD | NEW |
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/compiler/code-generator-impl.h" | 7 #include "src/compiler/code-generator-impl.h" |
8 #include "src/compiler/gap-resolver.h" | 8 #include "src/compiler/gap-resolver.h" |
9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 // Fall through. | 457 // Fall through. |
458 case kUnsignedLessThanOrEqual: | 458 case kUnsignedLessThanOrEqual: |
459 __ j(below_equal, tlabel); | 459 __ j(below_equal, tlabel); |
460 break; | 460 break; |
461 case kUnorderedGreaterThan: | 461 case kUnorderedGreaterThan: |
462 __ j(parity_even, tlabel); | 462 __ j(parity_even, tlabel); |
463 // Fall through. | 463 // Fall through. |
464 case kUnsignedGreaterThan: | 464 case kUnsignedGreaterThan: |
465 __ j(above, tlabel); | 465 __ j(above, tlabel); |
466 break; | 466 break; |
| 467 case kOverflow: |
| 468 __ j(overflow, tlabel); |
| 469 break; |
| 470 case kNotOverflow: |
| 471 __ j(no_overflow, tlabel); |
| 472 break; |
467 } | 473 } |
468 if (!fallthru) __ jmp(flabel, flabel_distance); // no fallthru to flabel. | 474 if (!fallthru) __ jmp(flabel, flabel_distance); // no fallthru to flabel. |
469 __ bind(&done); | 475 __ bind(&done); |
470 } | 476 } |
471 | 477 |
472 | 478 |
473 // Assembles boolean materializations after an instruction. | 479 // Assembles boolean materializations after an instruction. |
474 void CodeGenerator::AssembleArchBoolean(Instruction* instr, | 480 void CodeGenerator::AssembleArchBoolean(Instruction* instr, |
475 FlagsCondition condition) { | 481 FlagsCondition condition) { |
476 IA32OperandConverter i(this, instr); | 482 IA32OperandConverter i(this, instr); |
477 Label done; | 483 Label done; |
478 | 484 |
479 // Materialize a full 32-bit 1 or 0 value. | 485 // Materialize a full 32-bit 1 or 0 value. The result register is always the |
| 486 // last output of the instruction. |
480 Label check; | 487 Label check; |
481 Register reg = i.OutputRegister(); | 488 ASSERT_NE(0, instr->OutputCount()); |
| 489 Register reg = i.OutputRegister(instr->OutputCount() - 1); |
482 Condition cc = no_condition; | 490 Condition cc = no_condition; |
483 switch (condition) { | 491 switch (condition) { |
484 case kUnorderedEqual: | 492 case kUnorderedEqual: |
485 __ j(parity_odd, &check, Label::kNear); | 493 __ j(parity_odd, &check, Label::kNear); |
486 __ mov(reg, Immediate(0)); | 494 __ mov(reg, Immediate(0)); |
487 __ jmp(&done, Label::kNear); | 495 __ jmp(&done, Label::kNear); |
488 // Fall through. | 496 // Fall through. |
489 case kEqual: | 497 case kEqual: |
490 cc = equal; | 498 cc = equal; |
491 break; | 499 break; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 cc = below_equal; | 542 cc = below_equal; |
535 break; | 543 break; |
536 case kUnorderedGreaterThan: | 544 case kUnorderedGreaterThan: |
537 __ j(parity_odd, &check, Label::kNear); | 545 __ j(parity_odd, &check, Label::kNear); |
538 __ mov(reg, Immediate(1)); | 546 __ mov(reg, Immediate(1)); |
539 __ jmp(&done, Label::kNear); | 547 __ jmp(&done, Label::kNear); |
540 // Fall through. | 548 // Fall through. |
541 case kUnsignedGreaterThan: | 549 case kUnsignedGreaterThan: |
542 cc = above; | 550 cc = above; |
543 break; | 551 break; |
| 552 case kOverflow: |
| 553 cc = overflow; |
| 554 break; |
| 555 case kNotOverflow: |
| 556 cc = no_overflow; |
| 557 break; |
544 } | 558 } |
545 __ bind(&check); | 559 __ bind(&check); |
546 if (reg.is_byte_register()) { | 560 if (reg.is_byte_register()) { |
547 // setcc for byte registers (al, bl, cl, dl). | 561 // setcc for byte registers (al, bl, cl, dl). |
548 __ setcc(cc, reg); | 562 __ setcc(cc, reg); |
549 __ movzx_b(reg, reg); | 563 __ movzx_b(reg, reg); |
550 } else { | 564 } else { |
551 // Emit a branch to set a register to either 1 or 0. | 565 // Emit a branch to set a register to either 1 or 0. |
552 Label set; | 566 Label set; |
553 __ j(cc, &set, Label::kNear); | 567 __ j(cc, &set, Label::kNear); |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
933 return false; | 947 return false; |
934 } | 948 } |
935 return *(code->instruction_start() + start_pc) == | 949 return *(code->instruction_start() + start_pc) == |
936 v8::internal::Assembler::kNopByte; | 950 v8::internal::Assembler::kNopByte; |
937 } | 951 } |
938 | 952 |
939 #endif // DEBUG | 953 #endif // DEBUG |
940 } | 954 } |
941 } | 955 } |
942 } // namespace v8::internal::compiler | 956 } // namespace v8::internal::compiler |
OLD | NEW |