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 976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
987 if (i.OutputRegister(0).code() == i.InputRegister(1).code() || | 987 if (i.OutputRegister(0).code() == i.InputRegister(1).code() || |
988 i.OutputRegister(0).code() == i.InputRegister(3).code()) { | 988 i.OutputRegister(0).code() == i.InputRegister(3).code()) { |
989 // We cannot write to the output register directly, because it would | 989 // We cannot write to the output register directly, because it would |
990 // overwrite an input for adc. We have to use the temp register. | 990 // overwrite an input for adc. We have to use the temp register. |
991 use_temp = true; | 991 use_temp = true; |
992 __ Move(i.TempRegister(0), i.InputRegister(0)); | 992 __ Move(i.TempRegister(0), i.InputRegister(0)); |
993 __ add(i.TempRegister(0), i.InputRegister(2)); | 993 __ add(i.TempRegister(0), i.InputRegister(2)); |
994 } else { | 994 } else { |
995 __ add(i.OutputRegister(0), i.InputRegister(2)); | 995 __ add(i.OutputRegister(0), i.InputRegister(2)); |
996 } | 996 } |
997 __ adc(i.InputRegister(1), Operand(i.InputRegister(3))); | |
998 if (i.OutputRegister(1).code() != i.InputRegister(1).code()) { | 997 if (i.OutputRegister(1).code() != i.InputRegister(1).code()) { |
999 __ Move(i.OutputRegister(1), i.InputRegister(1)); | 998 __ Move(i.OutputRegister(1), i.InputRegister(1)); |
1000 } | 999 } |
| 1000 __ adc(i.OutputRegister(1), Operand(i.InputRegister(3))); |
1001 if (use_temp) { | 1001 if (use_temp) { |
1002 __ Move(i.OutputRegister(0), i.TempRegister(0)); | 1002 __ Move(i.OutputRegister(0), i.TempRegister(0)); |
1003 } | 1003 } |
1004 break; | 1004 break; |
1005 } | 1005 } |
1006 case kX87SubPair: { | 1006 case kX87SubPair: { |
1007 // i.OutputRegister(0) == i.InputRegister(0) ... left low word. | 1007 // i.OutputRegister(0) == i.InputRegister(0) ... left low word. |
1008 // i.InputRegister(1) ... left high word. | 1008 // i.InputRegister(1) ... left high word. |
1009 // i.InputRegister(2) ... right low word. | 1009 // i.InputRegister(2) ... right low word. |
1010 // i.InputRegister(3) ... right high word. | 1010 // i.InputRegister(3) ... right high word. |
1011 bool use_temp = false; | 1011 bool use_temp = false; |
1012 if (i.OutputRegister(0).code() == i.InputRegister(1).code() || | 1012 if (i.OutputRegister(0).code() == i.InputRegister(1).code() || |
1013 i.OutputRegister(0).code() == i.InputRegister(3).code()) { | 1013 i.OutputRegister(0).code() == i.InputRegister(3).code()) { |
1014 // We cannot write to the output register directly, because it would | 1014 // We cannot write to the output register directly, because it would |
1015 // overwrite an input for adc. We have to use the temp register. | 1015 // overwrite an input for adc. We have to use the temp register. |
1016 use_temp = true; | 1016 use_temp = true; |
1017 __ Move(i.TempRegister(0), i.InputRegister(0)); | 1017 __ Move(i.TempRegister(0), i.InputRegister(0)); |
1018 __ sub(i.TempRegister(0), i.InputRegister(2)); | 1018 __ sub(i.TempRegister(0), i.InputRegister(2)); |
1019 } else { | 1019 } else { |
1020 __ sub(i.OutputRegister(0), i.InputRegister(2)); | 1020 __ sub(i.OutputRegister(0), i.InputRegister(2)); |
1021 } | 1021 } |
1022 __ sbb(i.InputRegister(1), Operand(i.InputRegister(3))); | |
1023 if (i.OutputRegister(1).code() != i.InputRegister(1).code()) { | 1022 if (i.OutputRegister(1).code() != i.InputRegister(1).code()) { |
1024 __ Move(i.OutputRegister(1), i.InputRegister(1)); | 1023 __ Move(i.OutputRegister(1), i.InputRegister(1)); |
1025 } | 1024 } |
| 1025 __ sbb(i.OutputRegister(1), Operand(i.InputRegister(3))); |
1026 if (use_temp) { | 1026 if (use_temp) { |
1027 __ Move(i.OutputRegister(0), i.TempRegister(0)); | 1027 __ Move(i.OutputRegister(0), i.TempRegister(0)); |
1028 } | 1028 } |
1029 break; | 1029 break; |
1030 } | 1030 } |
1031 case kX87MulPair: { | 1031 case kX87MulPair: { |
1032 __ imul(i.OutputRegister(1), i.InputOperand(0)); | 1032 __ imul(i.OutputRegister(1), i.InputOperand(0)); |
1033 __ mov(i.TempRegister(0), i.InputOperand(1)); | 1033 __ mov(i.TempRegister(0), i.InputOperand(1)); |
1034 __ imul(i.TempRegister(0), i.InputOperand(2)); | 1034 __ imul(i.TempRegister(0), i.InputOperand(2)); |
1035 __ add(i.OutputRegister(1), i.TempRegister(0)); | 1035 __ add(i.OutputRegister(1), i.TempRegister(0)); |
(...skipping 1700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2736 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; | 2736 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; |
2737 __ Nop(padding_size); | 2737 __ Nop(padding_size); |
2738 } | 2738 } |
2739 } | 2739 } |
2740 | 2740 |
2741 #undef __ | 2741 #undef __ |
2742 | 2742 |
2743 } // namespace compiler | 2743 } // namespace compiler |
2744 } // namespace internal | 2744 } // namespace internal |
2745 } // namespace v8 | 2745 } // namespace v8 |
OLD | NEW |