OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
857 | 857 |
858 | 858 |
859 void LCodeGen::DoMulI(LMulI* instr) { | 859 void LCodeGen::DoMulI(LMulI* instr) { |
860 Register left = ToRegister(instr->InputAt(0)); | 860 Register left = ToRegister(instr->InputAt(0)); |
861 LOperand* right = instr->InputAt(1); | 861 LOperand* right = instr->InputAt(1); |
862 | 862 |
863 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { | 863 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { |
864 __ movl(kScratchRegister, left); | 864 __ movl(kScratchRegister, left); |
865 } | 865 } |
866 | 866 |
867 bool can_overflow = | |
868 instr->hydrogen()->CheckFlag(HValue::kCanOverflow); | |
867 if (right->IsConstantOperand()) { | 869 if (right->IsConstantOperand()) { |
868 int right_value = ToInteger32(LConstantOperand::cast(right)); | 870 int right_value = ToInteger32(LConstantOperand::cast(right)); |
869 __ imull(left, left, Immediate(right_value)); | 871 if (right_value == -1) { |
872 __ negl(left); | |
873 } else if (right_value == 0) { | |
William Hesse
2011/03/17 12:55:06
If BailoutOnMinusZero is true, we always bail out
Lasse Reichstein
2011/03/17 18:11:55
Yes, I noticed too that we bail out even if we don
| |
874 __ xorl(left, left); | |
875 } else if (right_value == 2) { | |
876 __ addl(left, left); | |
877 } else if (!can_overflow) { | |
878 // If the multiplication is known to not overflow, we | |
879 // can use operations that don't set the overflow flag | |
880 // correctly. | |
881 switch (right_value) { | |
882 case 1: | |
883 // Do nothing. | |
884 break; | |
885 case 3: | |
886 __ leal(left, Operand(left, left, times_2, 0)); | |
887 break; | |
888 case 4: | |
889 __ shll(left, Immediate(2)); | |
890 break; | |
891 case 5: | |
892 __ leal(left, Operand(left, left, times_4, 0)); | |
893 break; | |
894 case 8: | |
895 __ shll(left, Immediate(3)); | |
896 break; | |
897 case 9: | |
898 __ leal(left, Operand(left, left, times_8, 0)); | |
899 break; | |
900 case 16: | |
901 __ shll(left, Immediate(4)); | |
902 break; | |
903 default: | |
904 __ imull(left, left, Immediate(right_value)); | |
905 break; | |
906 } | |
907 } else { | |
908 __ imull(left, left, Immediate(right_value)); | |
909 } | |
870 } else if (right->IsStackSlot()) { | 910 } else if (right->IsStackSlot()) { |
871 __ imull(left, ToOperand(right)); | 911 __ imull(left, ToOperand(right)); |
872 } else { | 912 } else { |
873 __ imull(left, ToRegister(right)); | 913 __ imull(left, ToRegister(right)); |
874 } | 914 } |
875 | 915 |
876 if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) { | 916 if (can_overflow) { |
877 DeoptimizeIf(overflow, instr->environment()); | 917 DeoptimizeIf(overflow, instr->environment()); |
878 } | 918 } |
879 | 919 |
880 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { | 920 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { |
881 // Bail out if the result is supposed to be negative zero. | 921 // Bail out if the result is supposed to be negative zero. |
882 NearLabel done; | 922 NearLabel done; |
883 __ testl(left, left); | 923 __ testl(left, left); |
884 __ j(not_zero, &done); | 924 __ j(not_zero, &done); |
885 if (right->IsConstantOperand()) { | 925 if (right->IsConstantOperand()) { |
886 if (ToInteger32(LConstantOperand::cast(right)) <= 0) { | 926 if (ToInteger32(LConstantOperand::cast(right)) <= 0) { |
(...skipping 2891 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3778 RegisterEnvironmentForDeoptimization(environment); | 3818 RegisterEnvironmentForDeoptimization(environment); |
3779 ASSERT(osr_pc_offset_ == -1); | 3819 ASSERT(osr_pc_offset_ == -1); |
3780 osr_pc_offset_ = masm()->pc_offset(); | 3820 osr_pc_offset_ = masm()->pc_offset(); |
3781 } | 3821 } |
3782 | 3822 |
3783 #undef __ | 3823 #undef __ |
3784 | 3824 |
3785 } } // namespace v8::internal | 3825 } } // namespace v8::internal |
3786 | 3826 |
3787 #endif // V8_TARGET_ARCH_X64 | 3827 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |