| 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/compilation-info.h" | 7 #include "src/compilation-info.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 873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 884 if (i.OutputRegister(0).code() == i.InputRegister(1).code() || | 884 if (i.OutputRegister(0).code() == i.InputRegister(1).code() || |
| 885 i.OutputRegister(0).code() == i.InputRegister(3).code()) { | 885 i.OutputRegister(0).code() == i.InputRegister(3).code()) { |
| 886 // We cannot write to the output register directly, because it would | 886 // We cannot write to the output register directly, because it would |
| 887 // overwrite an input for adc. We have to use the temp register. | 887 // overwrite an input for adc. We have to use the temp register. |
| 888 use_temp = true; | 888 use_temp = true; |
| 889 __ Move(i.TempRegister(0), i.InputRegister(0)); | 889 __ Move(i.TempRegister(0), i.InputRegister(0)); |
| 890 __ add(i.TempRegister(0), i.InputRegister(2)); | 890 __ add(i.TempRegister(0), i.InputRegister(2)); |
| 891 } else { | 891 } else { |
| 892 __ add(i.OutputRegister(0), i.InputRegister(2)); | 892 __ add(i.OutputRegister(0), i.InputRegister(2)); |
| 893 } | 893 } |
| 894 __ adc(i.InputRegister(1), Operand(i.InputRegister(3))); | |
| 895 if (i.OutputRegister(1).code() != i.InputRegister(1).code()) { | 894 if (i.OutputRegister(1).code() != i.InputRegister(1).code()) { |
| 896 __ Move(i.OutputRegister(1), i.InputRegister(1)); | 895 __ Move(i.OutputRegister(1), i.InputRegister(1)); |
| 897 } | 896 } |
| 897 __ adc(i.OutputRegister(1), Operand(i.InputRegister(3))); |
| 898 if (use_temp) { | 898 if (use_temp) { |
| 899 __ Move(i.OutputRegister(0), i.TempRegister(0)); | 899 __ Move(i.OutputRegister(0), i.TempRegister(0)); |
| 900 } | 900 } |
| 901 break; | 901 break; |
| 902 } | 902 } |
| 903 case kIA32SubPair: { | 903 case kIA32SubPair: { |
| 904 // i.OutputRegister(0) == i.InputRegister(0) ... left low word. | 904 // i.OutputRegister(0) == i.InputRegister(0) ... left low word. |
| 905 // i.InputRegister(1) ... left high word. | 905 // i.InputRegister(1) ... left high word. |
| 906 // i.InputRegister(2) ... right low word. | 906 // i.InputRegister(2) ... right low word. |
| 907 // i.InputRegister(3) ... right high word. | 907 // i.InputRegister(3) ... right high word. |
| 908 bool use_temp = false; | 908 bool use_temp = false; |
| 909 if (i.OutputRegister(0).code() == i.InputRegister(1).code() || | 909 if (i.OutputRegister(0).code() == i.InputRegister(1).code() || |
| 910 i.OutputRegister(0).code() == i.InputRegister(3).code()) { | 910 i.OutputRegister(0).code() == i.InputRegister(3).code()) { |
| 911 // We cannot write to the output register directly, because it would | 911 // We cannot write to the output register directly, because it would |
| 912 // overwrite an input for adc. We have to use the temp register. | 912 // overwrite an input for adc. We have to use the temp register. |
| 913 use_temp = true; | 913 use_temp = true; |
| 914 __ Move(i.TempRegister(0), i.InputRegister(0)); | 914 __ Move(i.TempRegister(0), i.InputRegister(0)); |
| 915 __ sub(i.TempRegister(0), i.InputRegister(2)); | 915 __ sub(i.TempRegister(0), i.InputRegister(2)); |
| 916 } else { | 916 } else { |
| 917 __ sub(i.OutputRegister(0), i.InputRegister(2)); | 917 __ sub(i.OutputRegister(0), i.InputRegister(2)); |
| 918 } | 918 } |
| 919 __ sbb(i.InputRegister(1), Operand(i.InputRegister(3))); | |
| 920 if (i.OutputRegister(1).code() != i.InputRegister(1).code()) { | 919 if (i.OutputRegister(1).code() != i.InputRegister(1).code()) { |
| 921 __ Move(i.OutputRegister(1), i.InputRegister(1)); | 920 __ Move(i.OutputRegister(1), i.InputRegister(1)); |
| 922 } | 921 } |
| 922 __ sbb(i.OutputRegister(1), Operand(i.InputRegister(3))); |
| 923 if (use_temp) { | 923 if (use_temp) { |
| 924 __ Move(i.OutputRegister(0), i.TempRegister(0)); | 924 __ Move(i.OutputRegister(0), i.TempRegister(0)); |
| 925 } | 925 } |
| 926 break; | 926 break; |
| 927 } | 927 } |
| 928 case kIA32MulPair: { | 928 case kIA32MulPair: { |
| 929 __ imul(i.OutputRegister(1), i.InputOperand(0)); | 929 __ imul(i.OutputRegister(1), i.InputOperand(0)); |
| 930 __ mov(i.TempRegister(0), i.InputOperand(1)); | 930 __ mov(i.TempRegister(0), i.InputOperand(1)); |
| 931 __ imul(i.TempRegister(0), i.InputOperand(2)); | 931 __ imul(i.TempRegister(0), i.InputOperand(2)); |
| 932 __ add(i.OutputRegister(1), i.TempRegister(0)); | 932 __ add(i.OutputRegister(1), i.TempRegister(0)); |
| (...skipping 1368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2301 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; | 2301 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; |
| 2302 __ Nop(padding_size); | 2302 __ Nop(padding_size); |
| 2303 } | 2303 } |
| 2304 } | 2304 } |
| 2305 | 2305 |
| 2306 #undef __ | 2306 #undef __ |
| 2307 | 2307 |
| 2308 } // namespace compiler | 2308 } // namespace compiler |
| 2309 } // namespace internal | 2309 } // namespace internal |
| 2310 } // namespace v8 | 2310 } // namespace v8 |
| OLD | NEW |