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/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 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1041 break; | 1041 break; |
1042 case kSSEFloat64Mul: | 1042 case kSSEFloat64Mul: |
1043 __ mulsd(i.InputDoubleRegister(0), i.InputOperand(1)); | 1043 __ mulsd(i.InputDoubleRegister(0), i.InputOperand(1)); |
1044 break; | 1044 break; |
1045 case kSSEFloat64Div: | 1045 case kSSEFloat64Div: |
1046 __ divsd(i.InputDoubleRegister(0), i.InputOperand(1)); | 1046 __ divsd(i.InputDoubleRegister(0), i.InputOperand(1)); |
1047 // Don't delete this mov. It may improve performance on some CPUs, | 1047 // Don't delete this mov. It may improve performance on some CPUs, |
1048 // when there is a (v)mulsd depending on the result. | 1048 // when there is a (v)mulsd depending on the result. |
1049 __ movaps(i.OutputDoubleRegister(), i.OutputDoubleRegister()); | 1049 __ movaps(i.OutputDoubleRegister(), i.OutputDoubleRegister()); |
1050 break; | 1050 break; |
| 1051 case kSSEFloat32Max: { |
| 1052 Label compare_nan, compare_swap, done_compare; |
| 1053 if (instr->InputAt(1)->IsFPRegister()) { |
| 1054 __ ucomiss(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); |
| 1055 } else { |
| 1056 __ ucomiss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 1057 } |
| 1058 auto ool = |
| 1059 new (zone()) OutOfLineLoadFloat32NaN(this, i.OutputDoubleRegister()); |
| 1060 __ j(parity_even, ool->entry()); |
| 1061 __ j(above, &done_compare, Label::kNear); |
| 1062 __ j(below, &compare_swap, Label::kNear); |
| 1063 __ movmskps(i.TempRegister(0), i.InputDoubleRegister(0)); |
| 1064 __ test(i.TempRegister(0), Immediate(1)); |
| 1065 __ j(zero, &done_compare, Label::kNear); |
| 1066 __ bind(&compare_swap); |
| 1067 if (instr->InputAt(1)->IsFPRegister()) { |
| 1068 __ movss(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); |
| 1069 } else { |
| 1070 __ movss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 1071 } |
| 1072 __ bind(&done_compare); |
| 1073 __ bind(ool->exit()); |
| 1074 break; |
| 1075 } |
| 1076 |
1051 case kSSEFloat64Max: { | 1077 case kSSEFloat64Max: { |
1052 Label compare_nan, compare_swap, done_compare; | 1078 Label compare_nan, compare_swap, done_compare; |
1053 if (instr->InputAt(1)->IsFPRegister()) { | 1079 if (instr->InputAt(1)->IsFPRegister()) { |
1054 __ ucomisd(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); | 1080 __ ucomisd(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); |
1055 } else { | 1081 } else { |
1056 __ ucomisd(i.InputDoubleRegister(0), i.InputOperand(1)); | 1082 __ ucomisd(i.InputDoubleRegister(0), i.InputOperand(1)); |
1057 } | 1083 } |
1058 auto ool = | 1084 auto ool = |
1059 new (zone()) OutOfLineLoadFloat64NaN(this, i.OutputDoubleRegister()); | 1085 new (zone()) OutOfLineLoadFloat64NaN(this, i.OutputDoubleRegister()); |
1060 __ j(parity_even, ool->entry()); | 1086 __ j(parity_even, ool->entry()); |
1061 __ j(above, &done_compare, Label::kNear); | 1087 __ j(above, &done_compare, Label::kNear); |
1062 __ j(below, &compare_swap, Label::kNear); | 1088 __ j(below, &compare_swap, Label::kNear); |
1063 __ movmskpd(i.TempRegister(0), i.InputDoubleRegister(0)); | 1089 __ movmskpd(i.TempRegister(0), i.InputDoubleRegister(0)); |
1064 __ test(i.TempRegister(0), Immediate(1)); | 1090 __ test(i.TempRegister(0), Immediate(1)); |
1065 __ j(zero, &done_compare, Label::kNear); | 1091 __ j(zero, &done_compare, Label::kNear); |
1066 __ bind(&compare_swap); | 1092 __ bind(&compare_swap); |
1067 if (instr->InputAt(1)->IsFPRegister()) { | 1093 if (instr->InputAt(1)->IsFPRegister()) { |
1068 __ movsd(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); | 1094 __ movsd(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); |
1069 } else { | 1095 } else { |
1070 __ movsd(i.InputDoubleRegister(0), i.InputOperand(1)); | 1096 __ movsd(i.InputDoubleRegister(0), i.InputOperand(1)); |
1071 } | 1097 } |
1072 __ bind(&done_compare); | 1098 __ bind(&done_compare); |
1073 __ bind(ool->exit()); | 1099 __ bind(ool->exit()); |
1074 break; | 1100 break; |
1075 } | 1101 } |
| 1102 case kSSEFloat32Min: { |
| 1103 Label compare_swap, done_compare; |
| 1104 if (instr->InputAt(1)->IsFPRegister()) { |
| 1105 __ ucomiss(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); |
| 1106 } else { |
| 1107 __ ucomiss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 1108 } |
| 1109 auto ool = |
| 1110 new (zone()) OutOfLineLoadFloat32NaN(this, i.OutputDoubleRegister()); |
| 1111 __ j(parity_even, ool->entry()); |
| 1112 __ j(below, &done_compare, Label::kNear); |
| 1113 __ j(above, &compare_swap, Label::kNear); |
| 1114 if (instr->InputAt(1)->IsFPRegister()) { |
| 1115 __ movmskps(i.TempRegister(0), i.InputDoubleRegister(1)); |
| 1116 } else { |
| 1117 __ movss(kScratchDoubleReg, i.InputOperand(1)); |
| 1118 __ movmskps(i.TempRegister(0), kScratchDoubleReg); |
| 1119 } |
| 1120 __ test(i.TempRegister(0), Immediate(1)); |
| 1121 __ j(zero, &done_compare, Label::kNear); |
| 1122 __ bind(&compare_swap); |
| 1123 if (instr->InputAt(1)->IsFPRegister()) { |
| 1124 __ movss(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); |
| 1125 } else { |
| 1126 __ movss(i.InputDoubleRegister(0), i.InputOperand(1)); |
| 1127 } |
| 1128 __ bind(&done_compare); |
| 1129 __ bind(ool->exit()); |
| 1130 break; |
| 1131 } |
1076 case kSSEFloat64Min: { | 1132 case kSSEFloat64Min: { |
1077 Label compare_swap, done_compare; | 1133 Label compare_swap, done_compare; |
1078 if (instr->InputAt(1)->IsFPRegister()) { | 1134 if (instr->InputAt(1)->IsFPRegister()) { |
1079 __ ucomisd(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); | 1135 __ ucomisd(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); |
1080 } else { | 1136 } else { |
1081 __ ucomisd(i.InputDoubleRegister(0), i.InputOperand(1)); | 1137 __ ucomisd(i.InputDoubleRegister(0), i.InputOperand(1)); |
1082 } | 1138 } |
1083 auto ool = | 1139 auto ool = |
1084 new (zone()) OutOfLineLoadFloat64NaN(this, i.OutputDoubleRegister()); | 1140 new (zone()) OutOfLineLoadFloat64NaN(this, i.OutputDoubleRegister()); |
1085 __ j(parity_even, ool->entry()); | 1141 __ j(parity_even, ool->entry()); |
(...skipping 1126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2212 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; | 2268 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; |
2213 __ Nop(padding_size); | 2269 __ Nop(padding_size); |
2214 } | 2270 } |
2215 } | 2271 } |
2216 | 2272 |
2217 #undef __ | 2273 #undef __ |
2218 | 2274 |
2219 } // namespace compiler | 2275 } // namespace compiler |
2220 } // namespace internal | 2276 } // namespace internal |
2221 } // namespace v8 | 2277 } // namespace v8 |
OLD | NEW |