| 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 // Required to get M_E etc. in MSVC. | 7 // Required to get M_E etc. in MSVC. |
| 8 #if defined(_WIN32) | 8 #if defined(_WIN32) |
| 9 #define _USE_MATH_DEFINES | 9 #define _USE_MATH_DEFINES |
| 10 #endif | 10 #endif |
| (...skipping 1081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1092 break; | 1092 break; |
| 1093 } | 1093 } |
| 1094 case AsmTyper::kMathClz32: { | 1094 case AsmTyper::kMathClz32: { |
| 1095 VisitCallArgs(call); | 1095 VisitCallArgs(call); |
| 1096 DCHECK(call_type == kAstI32); | 1096 DCHECK(call_type == kAstI32); |
| 1097 current_function_builder_->Emit(kExprI32Clz); | 1097 current_function_builder_->Emit(kExprI32Clz); |
| 1098 break; | 1098 break; |
| 1099 } | 1099 } |
| 1100 case AsmTyper::kMathAbs: { | 1100 case AsmTyper::kMathAbs: { |
| 1101 if (call_type == kAstI32) { | 1101 if (call_type == kAstI32) { |
| 1102 uint32_t tmp = current_function_builder_->AddLocal(kAstI32); | 1102 WasmTemporary tmp(current_function_builder_, kAstI32); |
| 1103 | 1103 |
| 1104 // if set_local(tmp, x) < 0 | 1104 // if set_local(tmp, x) < 0 |
| 1105 Visit(call->arguments()->at(0)); | 1105 Visit(call->arguments()->at(0)); |
| 1106 current_function_builder_->EmitSetLocal(tmp); | 1106 current_function_builder_->EmitSetLocal(tmp.index()); |
| 1107 byte code[] = {WASM_I8(0)}; | 1107 byte code[] = {WASM_I8(0)}; |
| 1108 current_function_builder_->EmitCode(code, sizeof(code)); | 1108 current_function_builder_->EmitCode(code, sizeof(code)); |
| 1109 current_function_builder_->Emit(kExprI32LtS); | 1109 current_function_builder_->Emit(kExprI32LtS); |
| 1110 current_function_builder_->Emit(kExprIf); | 1110 current_function_builder_->Emit(kExprIf); |
| 1111 | 1111 |
| 1112 // then (0 - tmp) | 1112 // then (0 - tmp) |
| 1113 current_function_builder_->EmitCode(code, sizeof(code)); | 1113 current_function_builder_->EmitCode(code, sizeof(code)); |
| 1114 current_function_builder_->EmitGetLocal(tmp); | 1114 current_function_builder_->EmitGetLocal(tmp.index()); |
| 1115 current_function_builder_->Emit(kExprI32Sub); | 1115 current_function_builder_->Emit(kExprI32Sub); |
| 1116 | 1116 |
| 1117 // else tmp | 1117 // else tmp |
| 1118 current_function_builder_->Emit(kExprElse); | 1118 current_function_builder_->Emit(kExprElse); |
| 1119 current_function_builder_->EmitGetLocal(tmp); | 1119 current_function_builder_->EmitGetLocal(tmp.index()); |
| 1120 // end | 1120 // end |
| 1121 current_function_builder_->Emit(kExprEnd); | 1121 current_function_builder_->Emit(kExprEnd); |
| 1122 | 1122 |
| 1123 } else if (call_type == kAstF32) { | 1123 } else if (call_type == kAstF32) { |
| 1124 VisitCallArgs(call); | 1124 VisitCallArgs(call); |
| 1125 current_function_builder_->Emit(kExprF32Abs); | 1125 current_function_builder_->Emit(kExprF32Abs); |
| 1126 } else if (call_type == kAstF64) { | 1126 } else if (call_type == kAstF64) { |
| 1127 VisitCallArgs(call); | 1127 VisitCallArgs(call); |
| 1128 current_function_builder_->Emit(kExprF64Abs); | 1128 current_function_builder_->Emit(kExprF64Abs); |
| 1129 } else { | 1129 } else { |
| 1130 UNREACHABLE(); | 1130 UNREACHABLE(); |
| 1131 } | 1131 } |
| 1132 break; | 1132 break; |
| 1133 } | 1133 } |
| 1134 case AsmTyper::kMathMin: { | 1134 case AsmTyper::kMathMin: { |
| 1135 // TODO(bradnelson): Change wasm to match Math.min in asm.js mode. | 1135 // TODO(bradnelson): Change wasm to match Math.min in asm.js mode. |
| 1136 if (call_type == kAstI32) { | 1136 if (call_type == kAstI32) { |
| 1137 uint32_t tmp_x = current_function_builder_->AddLocal(kAstI32); | 1137 WasmTemporary tmp_x(current_function_builder_, kAstI32); |
| 1138 uint32_t tmp_y = current_function_builder_->AddLocal(kAstI32); | 1138 WasmTemporary tmp_y(current_function_builder_, kAstI32); |
| 1139 | 1139 |
| 1140 // if set_local(tmp_x, x) < set_local(tmp_y, y) | 1140 // if set_local(tmp_x, x) < set_local(tmp_y, y) |
| 1141 Visit(call->arguments()->at(0)); | 1141 Visit(call->arguments()->at(0)); |
| 1142 current_function_builder_->EmitSetLocal(tmp_x); | 1142 current_function_builder_->EmitSetLocal(tmp_x.index()); |
| 1143 | 1143 |
| 1144 Visit(call->arguments()->at(1)); | 1144 Visit(call->arguments()->at(1)); |
| 1145 current_function_builder_->EmitSetLocal(tmp_y); | 1145 current_function_builder_->EmitSetLocal(tmp_y.index()); |
| 1146 | 1146 |
| 1147 current_function_builder_->Emit(kExprI32LeS); | 1147 current_function_builder_->Emit(kExprI32LeS); |
| 1148 current_function_builder_->Emit(kExprIf); | 1148 current_function_builder_->Emit(kExprIf); |
| 1149 | 1149 |
| 1150 // then tmp_x | 1150 // then tmp_x |
| 1151 current_function_builder_->EmitGetLocal(tmp_x); | 1151 current_function_builder_->EmitGetLocal(tmp_x.index()); |
| 1152 | 1152 |
| 1153 // else tmp_y | 1153 // else tmp_y |
| 1154 current_function_builder_->Emit(kExprElse); | 1154 current_function_builder_->Emit(kExprElse); |
| 1155 current_function_builder_->EmitGetLocal(tmp_y); | 1155 current_function_builder_->EmitGetLocal(tmp_y.index()); |
| 1156 current_function_builder_->Emit(kExprEnd); | 1156 current_function_builder_->Emit(kExprEnd); |
| 1157 | 1157 |
| 1158 } else if (call_type == kAstF32) { | 1158 } else if (call_type == kAstF32) { |
| 1159 VisitCallArgs(call); | 1159 VisitCallArgs(call); |
| 1160 current_function_builder_->Emit(kExprF32Min); | 1160 current_function_builder_->Emit(kExprF32Min); |
| 1161 } else if (call_type == kAstF64) { | 1161 } else if (call_type == kAstF64) { |
| 1162 VisitCallArgs(call); | 1162 VisitCallArgs(call); |
| 1163 current_function_builder_->Emit(kExprF64Min); | 1163 current_function_builder_->Emit(kExprF64Min); |
| 1164 } else { | 1164 } else { |
| 1165 UNREACHABLE(); | 1165 UNREACHABLE(); |
| 1166 } | 1166 } |
| 1167 break; | 1167 break; |
| 1168 } | 1168 } |
| 1169 case AsmTyper::kMathMax: { | 1169 case AsmTyper::kMathMax: { |
| 1170 // TODO(bradnelson): Change wasm to match Math.max in asm.js mode. | 1170 // TODO(bradnelson): Change wasm to match Math.max in asm.js mode. |
| 1171 if (call_type == kAstI32) { | 1171 if (call_type == kAstI32) { |
| 1172 uint32_t tmp_x = current_function_builder_->AddLocal(kAstI32); | 1172 WasmTemporary tmp_x(current_function_builder_, kAstI32); |
| 1173 uint32_t tmp_y = current_function_builder_->AddLocal(kAstI32); | 1173 WasmTemporary tmp_y(current_function_builder_, kAstI32); |
| 1174 | 1174 |
| 1175 // if set_local(tmp_x, x) < set_local(tmp_y, y) | 1175 // if set_local(tmp_x, x) < set_local(tmp_y, y) |
| 1176 Visit(call->arguments()->at(0)); | 1176 Visit(call->arguments()->at(0)); |
| 1177 | 1177 |
| 1178 current_function_builder_->EmitSetLocal(tmp_x); | 1178 current_function_builder_->EmitSetLocal(tmp_x.index()); |
| 1179 | 1179 |
| 1180 Visit(call->arguments()->at(1)); | 1180 Visit(call->arguments()->at(1)); |
| 1181 current_function_builder_->EmitSetLocal(tmp_y); | 1181 current_function_builder_->EmitSetLocal(tmp_y.index()); |
| 1182 | 1182 |
| 1183 current_function_builder_->Emit(kExprI32LeS); | 1183 current_function_builder_->Emit(kExprI32LeS); |
| 1184 current_function_builder_->Emit(kExprIf); | 1184 current_function_builder_->Emit(kExprIf); |
| 1185 | 1185 |
| 1186 // then tmp_y | 1186 // then tmp_y |
| 1187 current_function_builder_->EmitGetLocal(tmp_y); | 1187 current_function_builder_->EmitGetLocal(tmp_y.index()); |
| 1188 | 1188 |
| 1189 // else tmp_x | 1189 // else tmp_x |
| 1190 current_function_builder_->Emit(kExprElse); | 1190 current_function_builder_->Emit(kExprElse); |
| 1191 current_function_builder_->EmitGetLocal(tmp_x); | 1191 current_function_builder_->EmitGetLocal(tmp_x.index()); |
| 1192 current_function_builder_->Emit(kExprEnd); | 1192 current_function_builder_->Emit(kExprEnd); |
| 1193 | 1193 |
| 1194 } else if (call_type == kAstF32) { | 1194 } else if (call_type == kAstF32) { |
| 1195 VisitCallArgs(call); | 1195 VisitCallArgs(call); |
| 1196 current_function_builder_->Emit(kExprF32Max); | 1196 current_function_builder_->Emit(kExprF32Max); |
| 1197 } else if (call_type == kAstF64) { | 1197 } else if (call_type == kAstF64) { |
| 1198 VisitCallArgs(call); | 1198 VisitCallArgs(call); |
| 1199 current_function_builder_->Emit(kExprF64Max); | 1199 current_function_builder_->Emit(kExprF64Max); |
| 1200 } else { | 1200 } else { |
| 1201 UNREACHABLE(); | 1201 UNREACHABLE(); |
| (...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1788 AsmWasmBuilderImpl impl(isolate_, zone_, literal_, typer_); | 1788 AsmWasmBuilderImpl impl(isolate_, zone_, literal_, typer_); |
| 1789 impl.Build(); | 1789 impl.Build(); |
| 1790 *foreign_args = impl.GetForeignArgs(); | 1790 *foreign_args = impl.GetForeignArgs(); |
| 1791 ZoneBuffer* buffer = new (zone_) ZoneBuffer(zone_); | 1791 ZoneBuffer* buffer = new (zone_) ZoneBuffer(zone_); |
| 1792 impl.builder_->WriteTo(*buffer); | 1792 impl.builder_->WriteTo(*buffer); |
| 1793 return buffer; | 1793 return buffer; |
| 1794 } | 1794 } |
| 1795 } // namespace wasm | 1795 } // namespace wasm |
| 1796 } // namespace internal | 1796 } // namespace internal |
| 1797 } // namespace v8 | 1797 } // namespace v8 |
| OLD | NEW |