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/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 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 do { \ | 378 do { \ |
379 FrameScope scope(masm(), StackFrame::MANUAL); \ | 379 FrameScope scope(masm(), StackFrame::MANUAL); \ |
380 __ PrepareCallCFunction(0, 2, kScratchReg); \ | 380 __ PrepareCallCFunction(0, 2, kScratchReg); \ |
381 __ MovToFloatParameters(i.InputDoubleRegister(0), \ | 381 __ MovToFloatParameters(i.InputDoubleRegister(0), \ |
382 i.InputDoubleRegister(1)); \ | 382 i.InputDoubleRegister(1)); \ |
383 __ CallCFunction(ExternalReference::mod_two_doubles_operation(isolate()), \ | 383 __ CallCFunction(ExternalReference::mod_two_doubles_operation(isolate()), \ |
384 0, 2); \ | 384 0, 2); \ |
385 __ MovFromFloatResult(i.OutputDoubleRegister()); \ | 385 __ MovFromFloatResult(i.OutputDoubleRegister()); \ |
386 } while (0) | 386 } while (0) |
387 | 387 |
| 388 #define ASSEMBLE_IEEE754_UNOP(name) \ |
| 389 do { \ |
| 390 /* TODO(bmeurer): We should really get rid of this special instruction, */ \ |
| 391 /* and generate a CallAddress instruction instead. */ \ |
| 392 FrameScope scope(masm(), StackFrame::MANUAL); \ |
| 393 __ PrepareCallCFunction(0, 1, kScratchReg); \ |
| 394 __ MovToFloatParameter(i.InputDoubleRegister(0)); \ |
| 395 __ CallCFunction(ExternalReference::ieee754_##name##_function(isolate()), \ |
| 396 0, 1); \ |
| 397 /* Move the result in the double result register. */ \ |
| 398 __ MovFromFloatResult(i.OutputDoubleRegister()); \ |
| 399 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ |
| 400 } while (0) |
| 401 |
| 402 #define ASSEMBLE_IEEE754_BINOP(name) \ |
| 403 do { \ |
| 404 /* TODO(bmeurer): We should really get rid of this special instruction, */ \ |
| 405 /* and generate a CallAddress instruction instead. */ \ |
| 406 FrameScope scope(masm(), StackFrame::MANUAL); \ |
| 407 __ PrepareCallCFunction(0, 2, kScratchReg); \ |
| 408 __ MovToFloatParameters(i.InputDoubleRegister(0), \ |
| 409 i.InputDoubleRegister(1)); \ |
| 410 __ CallCFunction(ExternalReference::ieee754_##name##_function(isolate()), \ |
| 411 0, 2); \ |
| 412 /* Move the result in the double result register. */ \ |
| 413 __ MovFromFloatResult(i.OutputDoubleRegister()); \ |
| 414 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ |
| 415 } while (0) |
| 416 |
388 #define ASSEMBLE_FLOAT_MAX(double_scratch_reg, general_scratch_reg) \ | 417 #define ASSEMBLE_FLOAT_MAX(double_scratch_reg, general_scratch_reg) \ |
389 do { \ | 418 do { \ |
390 Label ge, done; \ | 419 Label ge, done; \ |
391 __ cdbr(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); \ | 420 __ cdbr(i.InputDoubleRegister(0), i.InputDoubleRegister(1)); \ |
392 __ bge(&ge, Label::kNear); \ | 421 __ bge(&ge, Label::kNear); \ |
393 __ Move(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); \ | 422 __ Move(i.OutputDoubleRegister(), i.InputDoubleRegister(1)); \ |
394 __ b(&done, Label::kNear); \ | 423 __ b(&done, Label::kNear); \ |
395 __ bind(&ge); \ | 424 __ bind(&ge); \ |
396 __ Move(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); \ | 425 __ Move(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); \ |
397 __ bind(&done); \ | 426 __ bind(&done); \ |
(...skipping 814 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1212 v8::internal::Assembler::FIDBRA_ROUND_TOWARD_POS_INF); | 1241 v8::internal::Assembler::FIDBRA_ROUND_TOWARD_POS_INF); |
1213 break; | 1242 break; |
1214 case kS390_TruncateFloat: | 1243 case kS390_TruncateFloat: |
1215 __ fiebra(i.OutputDoubleRegister(), i.InputDoubleRegister(0), | 1244 __ fiebra(i.OutputDoubleRegister(), i.InputDoubleRegister(0), |
1216 v8::internal::Assembler::FIDBRA_ROUND_TOWARD_0); | 1245 v8::internal::Assembler::FIDBRA_ROUND_TOWARD_0); |
1217 break; | 1246 break; |
1218 // Double operations | 1247 // Double operations |
1219 case kS390_ModDouble: | 1248 case kS390_ModDouble: |
1220 ASSEMBLE_FLOAT_MODULO(); | 1249 ASSEMBLE_FLOAT_MODULO(); |
1221 break; | 1250 break; |
1222 case kS390_LogDouble: { | 1251 case kIeee754Float64Atan: |
1223 // TODO(bmeurer): We should really get rid of this special instruction, | 1252 ASSEMBLE_IEEE754_UNOP(atan); |
1224 // and generate a CallAddress instruction instead. | |
1225 FrameScope scope(masm(), StackFrame::MANUAL); | |
1226 __ PrepareCallCFunction(0, 1, kScratchReg); | |
1227 __ MovToFloatParameter(i.InputDoubleRegister(0)); | |
1228 __ CallCFunction(ExternalReference::ieee754_log_function(isolate()), 0, | |
1229 1); | |
1230 // Move the result in the double result register. | |
1231 __ MovFromFloatResult(i.OutputDoubleRegister()); | |
1232 break; | 1253 break; |
1233 } | 1254 case kIeee754Float64Atan2: |
| 1255 ASSEMBLE_IEEE754_BINOP(atan2); |
| 1256 break; |
| 1257 case kIeee754Float64Log: |
| 1258 ASSEMBLE_IEEE754_UNOP(log); |
| 1259 break; |
| 1260 case kIeee754Float64Log1p: |
| 1261 ASSEMBLE_IEEE754_UNOP(log1p); |
| 1262 break; |
1234 case kS390_Neg: | 1263 case kS390_Neg: |
1235 __ LoadComplementRR(i.OutputRegister(), i.InputRegister(0)); | 1264 __ LoadComplementRR(i.OutputRegister(), i.InputRegister(0)); |
1236 break; | 1265 break; |
1237 case kS390_MaxDouble: | 1266 case kS390_MaxDouble: |
1238 ASSEMBLE_FLOAT_MAX(kScratchDoubleReg, kScratchReg); | 1267 ASSEMBLE_FLOAT_MAX(kScratchDoubleReg, kScratchReg); |
1239 break; | 1268 break; |
1240 case kS390_MinDouble: | 1269 case kS390_MinDouble: |
1241 ASSEMBLE_FLOAT_MIN(kScratchDoubleReg, kScratchReg); | 1270 ASSEMBLE_FLOAT_MIN(kScratchDoubleReg, kScratchReg); |
1242 break; | 1271 break; |
1243 case kS390_AbsDouble: | 1272 case kS390_AbsDouble: |
(...skipping 922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2166 padding_size -= 2; | 2195 padding_size -= 2; |
2167 } | 2196 } |
2168 } | 2197 } |
2169 } | 2198 } |
2170 | 2199 |
2171 #undef __ | 2200 #undef __ |
2172 | 2201 |
2173 } // namespace compiler | 2202 } // namespace compiler |
2174 } // namespace internal | 2203 } // namespace internal |
2175 } // namespace v8 | 2204 } // namespace v8 |
OLD | NEW |