Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(287)

Side by Side Diff: src/a64/assembler-a64.cc

Issue 194753002: A64: Fix Fmov with signalling NaN literals. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/a64/assembler-a64.h ('k') | src/a64/macro-assembler-a64.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // 2 //
3 // Redistribution and use in source and binary forms, with or without 3 // Redistribution and use in source and binary forms, with or without
4 // modification, are permitted provided that the following conditions are 4 // modification, are permitted provided that the following conditions are
5 // met: 5 // met:
6 // 6 //
7 // * Redistributions of source code must retain the above copyright 7 // * Redistributions of source code must retain the above copyright
8 // notice, this list of conditions and the following disclaimer. 8 // notice, this list of conditions and the following disclaimer.
9 // * Redistributions in binary form must reproduce the above 9 // * Redistributions in binary form must reproduce the above
10 // copyright notice, this list of conditions and the following 10 // copyright notice, this list of conditions and the following
(...skipping 1395 matching lines...) Expand 10 before | Expand all | Expand 10 after
1406 1406
1407 1407
1408 void Assembler::ldrsw(const Register& rt, const MemOperand& src) { 1408 void Assembler::ldrsw(const Register& rt, const MemOperand& src) {
1409 ASSERT(rt.Is64Bits()); 1409 ASSERT(rt.Is64Bits());
1410 LoadStore(rt, src, LDRSW_x); 1410 LoadStore(rt, src, LDRSW_x);
1411 } 1411 }
1412 1412
1413 1413
1414 void Assembler::ldr(const Register& rt, uint64_t imm) { 1414 void Assembler::ldr(const Register& rt, uint64_t imm) {
1415 // TODO(all): Constant pool may be garbage collected. Hence we cannot store 1415 // TODO(all): Constant pool may be garbage collected. Hence we cannot store
1416 // TODO(all): arbitrary values in them. Manually move it for now. 1416 // arbitrary values in them. Manually move it for now. Fix
1417 // TODO(all): Fix MacroAssembler::Fmov when this is implemented. 1417 // MacroAssembler::Fmov when this is implemented.
1418 UNIMPLEMENTED(); 1418 UNIMPLEMENTED();
1419 } 1419 }
1420 1420
1421 1421
1422 void Assembler::ldr(const FPRegister& ft, double imm) { 1422 void Assembler::ldr(const FPRegister& ft, double imm) {
1423 // TODO(all): Constant pool may be garbage collected. Hence we cannot store 1423 // TODO(all): Constant pool may be garbage collected. Hence we cannot store
1424 // TODO(all): arbitrary values in them. Manually move it for now. 1424 // arbitrary values in them. Manually move it for now. Fix
1425 // TODO(all): Fix MacroAssembler::Fmov when this is implemented. 1425 // MacroAssembler::Fmov when this is implemented.
1426 UNIMPLEMENTED(); 1426 UNIMPLEMENTED();
1427 } 1427 }
1428 1428
1429
1430 void Assembler::ldr(const FPRegister& ft, float imm) {
1431 // TODO(all): Constant pool may be garbage collected. Hence we cannot store
1432 // arbitrary values in them. Manually move it for now. Fix
1433 // MacroAssembler::Fmov when this is implemented.
1434 UNIMPLEMENTED();
1435 }
1436
1429 1437
1430 void Assembler::mov(const Register& rd, const Register& rm) { 1438 void Assembler::mov(const Register& rd, const Register& rm) {
1431 // Moves involving the stack pointer are encoded as add immediate with 1439 // Moves involving the stack pointer are encoded as add immediate with
1432 // second operand of zero. Otherwise, orr with first operand zr is 1440 // second operand of zero. Otherwise, orr with first operand zr is
1433 // used. 1441 // used.
1434 if (rd.IsSP() || rm.IsSP()) { 1442 if (rd.IsSP() || rm.IsSP()) {
1435 add(rd, rm, 0); 1443 add(rd, rm, 0);
1436 } else { 1444 } else {
1437 orr(rd, AppropriateZeroRegFor(rd), rm); 1445 orr(rd, AppropriateZeroRegFor(rd), rm);
1438 } 1446 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1470 Emit(DSB | ImmBarrierDomain(domain) | ImmBarrierType(type)); 1478 Emit(DSB | ImmBarrierDomain(domain) | ImmBarrierType(type));
1471 } 1479 }
1472 1480
1473 1481
1474 void Assembler::isb() { 1482 void Assembler::isb() {
1475 Emit(ISB | ImmBarrierDomain(FullSystem) | ImmBarrierType(BarrierAll)); 1483 Emit(ISB | ImmBarrierDomain(FullSystem) | ImmBarrierType(BarrierAll));
1476 } 1484 }
1477 1485
1478 1486
1479 void Assembler::fmov(FPRegister fd, double imm) { 1487 void Assembler::fmov(FPRegister fd, double imm) {
1480 if (fd.Is64Bits() && IsImmFP64(imm)) { 1488 ASSERT(fd.Is64Bits());
1481 Emit(FMOV_d_imm | Rd(fd) | ImmFP64(imm)); 1489 ASSERT(IsImmFP64(imm));
1482 } else if (fd.Is32Bits() && IsImmFP32(imm)) { 1490 Emit(FMOV_d_imm | Rd(fd) | ImmFP64(imm));
1483 Emit(FMOV_s_imm | Rd(fd) | ImmFP32(static_cast<float>(imm)));
1484 } else if ((imm == 0.0) && (copysign(1.0, imm) == 1.0)) {
1485 Register zr = AppropriateZeroRegFor(fd);
1486 fmov(fd, zr);
1487 } else {
1488 ldr(fd, imm);
1489 }
1490 } 1491 }
1491 1492
1492 1493
1494 void Assembler::fmov(FPRegister fd, float imm) {
1495 ASSERT(fd.Is32Bits());
1496 ASSERT(IsImmFP32(imm));
1497 Emit(FMOV_s_imm | Rd(fd) | ImmFP32(imm));
1498 }
1499
1500
1493 void Assembler::fmov(Register rd, FPRegister fn) { 1501 void Assembler::fmov(Register rd, FPRegister fn) {
1494 ASSERT(rd.SizeInBits() == fn.SizeInBits()); 1502 ASSERT(rd.SizeInBits() == fn.SizeInBits());
1495 FPIntegerConvertOp op = rd.Is32Bits() ? FMOV_ws : FMOV_xd; 1503 FPIntegerConvertOp op = rd.Is32Bits() ? FMOV_ws : FMOV_xd;
1496 Emit(op | Rd(rd) | Rn(fn)); 1504 Emit(op | Rd(rd) | Rn(fn));
1497 } 1505 }
1498 1506
1499 1507
1500 void Assembler::fmov(FPRegister fd, Register rn) { 1508 void Assembler::fmov(FPRegister fd, Register rn) {
1501 ASSERT(fd.SizeInBits() == rn.SizeInBits()); 1509 ASSERT(fd.SizeInBits() == rn.SizeInBits());
1502 FPIntegerConvertOp op = fd.Is32Bits() ? FMOV_sw : FMOV_dx; 1510 FPIntegerConvertOp op = fd.Is32Bits() ? FMOV_sw : FMOV_dx;
(...skipping 1236 matching lines...) Expand 10 before | Expand all | Expand 10 after
2739 // code. 2747 // code.
2740 #ifdef ENABLE_DEBUGGER_SUPPORT 2748 #ifdef ENABLE_DEBUGGER_SUPPORT
2741 RecordRelocInfo(RelocInfo::CONST_POOL, static_cast<intptr_t>(size)); 2749 RecordRelocInfo(RelocInfo::CONST_POOL, static_cast<intptr_t>(size));
2742 #endif 2750 #endif
2743 } 2751 }
2744 2752
2745 2753
2746 } } // namespace v8::internal 2754 } } // namespace v8::internal
2747 2755
2748 #endif // V8_TARGET_ARCH_A64 2756 #endif // V8_TARGET_ARCH_A64
OLDNEW
« no previous file with comments | « src/a64/assembler-a64.h ('k') | src/a64/macro-assembler-a64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698