| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/wasm-compiler.h" | 5 #include "src/compiler/wasm-compiler.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "src/isolate-inl.h" | 9 #include "src/isolate-inl.h" |
| 10 | 10 |
| (...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 const Operator* op; | 646 const Operator* op; |
| 647 MachineOperatorBuilder* m = jsgraph()->machine(); | 647 MachineOperatorBuilder* m = jsgraph()->machine(); |
| 648 switch (opcode) { | 648 switch (opcode) { |
| 649 case wasm::kExprI32Eqz: | 649 case wasm::kExprI32Eqz: |
| 650 op = m->Word32Equal(); | 650 op = m->Word32Equal(); |
| 651 return graph()->NewNode(op, input, jsgraph()->Int32Constant(0)); | 651 return graph()->NewNode(op, input, jsgraph()->Int32Constant(0)); |
| 652 case wasm::kExprF32Abs: | 652 case wasm::kExprF32Abs: |
| 653 op = m->Float32Abs(); | 653 op = m->Float32Abs(); |
| 654 break; | 654 break; |
| 655 case wasm::kExprF32Neg: { | 655 case wasm::kExprF32Neg: { |
| 656 if (m->Float32Neg().IsSupported()) { | 656 op = m->Float32Neg(); |
| 657 op = m->Float32Neg().op(); | 657 break; |
| 658 break; | |
| 659 } else { | |
| 660 return BuildF32Neg(input); | |
| 661 } | |
| 662 } | 658 } |
| 663 case wasm::kExprF32Sqrt: | 659 case wasm::kExprF32Sqrt: |
| 664 op = m->Float32Sqrt(); | 660 op = m->Float32Sqrt(); |
| 665 break; | 661 break; |
| 666 case wasm::kExprF64Abs: | 662 case wasm::kExprF64Abs: |
| 667 op = m->Float64Abs(); | 663 op = m->Float64Abs(); |
| 668 break; | 664 break; |
| 669 case wasm::kExprF64Neg: { | 665 case wasm::kExprF64Neg: { |
| 670 if (m->Float64Neg().IsSupported()) { | 666 op = m->Float64Neg(); |
| 671 op = m->Float64Neg().op(); | 667 break; |
| 672 break; | |
| 673 } else { | |
| 674 return BuildF64Neg(input); | |
| 675 } | |
| 676 } | 668 } |
| 677 case wasm::kExprF64Sqrt: | 669 case wasm::kExprF64Sqrt: |
| 678 op = m->Float64Sqrt(); | 670 op = m->Float64Sqrt(); |
| 679 break; | 671 break; |
| 680 case wasm::kExprI32SConvertF64: | 672 case wasm::kExprI32SConvertF64: |
| 681 return BuildI32SConvertF64(input, position); | 673 return BuildI32SConvertF64(input, position); |
| 682 case wasm::kExprI32UConvertF64: | 674 case wasm::kExprI32UConvertF64: |
| 683 return BuildI32UConvertF64(input, position); | 675 return BuildI32UConvertF64(input, position); |
| 684 case wasm::kExprI32AsmjsSConvertF64: | 676 case wasm::kExprI32AsmjsSConvertF64: |
| 685 return BuildI32AsmjsSConvertF64(input); | 677 return BuildI32AsmjsSConvertF64(input); |
| (...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1151 m->Word32Sar(), | 1143 m->Word32Sar(), |
| 1152 graph()->NewNode(m->Word32Shl(), result, shiftBitCount), | 1144 graph()->NewNode(m->Word32Shl(), result, shiftBitCount), |
| 1153 shiftBitCount); | 1145 shiftBitCount); |
| 1154 } | 1146 } |
| 1155 } | 1147 } |
| 1156 } | 1148 } |
| 1157 | 1149 |
| 1158 return result; | 1150 return result; |
| 1159 } | 1151 } |
| 1160 | 1152 |
| 1161 Node* WasmGraphBuilder::BuildF32Neg(Node* input) { | |
| 1162 Node* result = | |
| 1163 Unop(wasm::kExprF32ReinterpretI32, | |
| 1164 Binop(wasm::kExprI32Xor, Unop(wasm::kExprI32ReinterpretF32, input), | |
| 1165 jsgraph()->Int32Constant(0x80000000))); | |
| 1166 | |
| 1167 return result; | |
| 1168 } | |
| 1169 | |
| 1170 Node* WasmGraphBuilder::BuildF64Neg(Node* input) { | |
| 1171 #if WASM_64 | |
| 1172 Node* result = | |
| 1173 Unop(wasm::kExprF64ReinterpretI64, | |
| 1174 Binop(wasm::kExprI64Xor, Unop(wasm::kExprI64ReinterpretF64, input), | |
| 1175 jsgraph()->Int64Constant(0x8000000000000000))); | |
| 1176 | |
| 1177 return result; | |
| 1178 #else | |
| 1179 MachineOperatorBuilder* m = jsgraph()->machine(); | |
| 1180 | |
| 1181 Node* old_high_word = graph()->NewNode(m->Float64ExtractHighWord32(), input); | |
| 1182 Node* new_high_word = Binop(wasm::kExprI32Xor, old_high_word, | |
| 1183 jsgraph()->Int32Constant(0x80000000)); | |
| 1184 | |
| 1185 return graph()->NewNode(m->Float64InsertHighWord32(), input, new_high_word); | |
| 1186 #endif | |
| 1187 } | |
| 1188 | |
| 1189 Node* WasmGraphBuilder::BuildF32CopySign(Node* left, Node* right) { | 1153 Node* WasmGraphBuilder::BuildF32CopySign(Node* left, Node* right) { |
| 1190 Node* result = Unop( | 1154 Node* result = Unop( |
| 1191 wasm::kExprF32ReinterpretI32, | 1155 wasm::kExprF32ReinterpretI32, |
| 1192 Binop(wasm::kExprI32Ior, | 1156 Binop(wasm::kExprI32Ior, |
| 1193 Binop(wasm::kExprI32And, Unop(wasm::kExprI32ReinterpretF32, left), | 1157 Binop(wasm::kExprI32And, Unop(wasm::kExprI32ReinterpretF32, left), |
| 1194 jsgraph()->Int32Constant(0x7fffffff)), | 1158 jsgraph()->Int32Constant(0x7fffffff)), |
| 1195 Binop(wasm::kExprI32And, Unop(wasm::kExprI32ReinterpretF32, right), | 1159 Binop(wasm::kExprI32And, Unop(wasm::kExprI32ReinterpretF32, right), |
| 1196 jsgraph()->Int32Constant(0x80000000)))); | 1160 jsgraph()->Int32Constant(0x80000000)))); |
| 1197 | 1161 |
| 1198 return result; | 1162 return result; |
| (...skipping 2297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3496 function_->code_start_offset), | 3460 function_->code_start_offset), |
| 3497 compile_ms); | 3461 compile_ms); |
| 3498 } | 3462 } |
| 3499 | 3463 |
| 3500 return code; | 3464 return code; |
| 3501 } | 3465 } |
| 3502 | 3466 |
| 3503 } // namespace compiler | 3467 } // namespace compiler |
| 3504 } // namespace internal | 3468 } // namespace internal |
| 3505 } // namespace v8 | 3469 } // namespace v8 |
| OLD | NEW |