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 |