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

Side by Side Diff: runtime/vm/flow_graph_compiler_ia32.cc

Issue 11791051: Support immediate and memory operands for PushArgumentInstr in optimized code. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: really handle constant operands Created 7 years, 11 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 | « runtime/vm/flow_graph_compiler.cc ('k') | runtime/vm/flow_graph_compiler_x64.cc » ('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 (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32.
6 #if defined(TARGET_ARCH_IA32) 6 #if defined(TARGET_ARCH_IA32)
7 7
8 #include "vm/flow_graph_compiler.h" 8 #include "vm/flow_graph_compiler.h"
9 9
10 #include "lib/error.h" 10 #include "lib/error.h"
(...skipping 1318 matching lines...) Expand 10 before | Expand all | Expand 10 after
1329 ASSERT(offset == (xmm_regs_count * kDoubleSize)); 1329 ASSERT(offset == (xmm_regs_count * kDoubleSize));
1330 __ addl(ESP, Immediate(offset)); 1330 __ addl(ESP, Immediate(offset));
1331 } 1331 }
1332 } 1332 }
1333 1333
1334 1334
1335 #undef __ 1335 #undef __
1336 #define __ compiler_->assembler()-> 1336 #define __ compiler_->assembler()->
1337 1337
1338 1338
1339 static Address ToStackSlotAddress(Location loc) {
1340 const intptr_t index = loc.stack_index();
1341 if (index < 0) {
1342 const intptr_t offset = (1 - index) * kWordSize;
1343 return Address(EBP, offset);
1344 } else {
1345 const intptr_t offset =
1346 (ParsedFunction::kFirstLocalSlotIndex - index) * kWordSize;
1347 return Address(EBP, offset);
1348 }
1349 }
1350
1351
1352 void ParallelMoveResolver::EmitMove(int index) { 1339 void ParallelMoveResolver::EmitMove(int index) {
1353 MoveOperands* move = moves_[index]; 1340 MoveOperands* move = moves_[index];
1354 const Location source = move->src(); 1341 const Location source = move->src();
1355 const Location destination = move->dest(); 1342 const Location destination = move->dest();
1356 1343
1357 if (source.IsRegister()) { 1344 if (source.IsRegister()) {
1358 if (destination.IsRegister()) { 1345 if (destination.IsRegister()) {
1359 __ movl(destination.reg(), source.reg()); 1346 __ movl(destination.reg(), source.reg());
1360 } else { 1347 } else {
1361 ASSERT(destination.IsStackSlot()); 1348 ASSERT(destination.IsStackSlot());
1362 __ movl(ToStackSlotAddress(destination), source.reg()); 1349 __ movl(destination.ToStackSlotAddress(), source.reg());
1363 } 1350 }
1364 } else if (source.IsStackSlot()) { 1351 } else if (source.IsStackSlot()) {
1365 if (destination.IsRegister()) { 1352 if (destination.IsRegister()) {
1366 __ movl(destination.reg(), ToStackSlotAddress(source)); 1353 __ movl(destination.reg(), source.ToStackSlotAddress());
1367 } else { 1354 } else {
1368 ASSERT(destination.IsStackSlot()); 1355 ASSERT(destination.IsStackSlot());
1369 MoveMemoryToMemory(ToStackSlotAddress(destination), 1356 MoveMemoryToMemory(destination.ToStackSlotAddress(),
1370 ToStackSlotAddress(source)); 1357 source.ToStackSlotAddress());
1371 } 1358 }
1372 } else if (source.IsXmmRegister()) { 1359 } else if (source.IsXmmRegister()) {
1373 if (destination.IsXmmRegister()) { 1360 if (destination.IsXmmRegister()) {
1374 // Optimization manual recommends using MOVAPS for register 1361 // Optimization manual recommends using MOVAPS for register
1375 // to register moves. 1362 // to register moves.
1376 __ movaps(destination.xmm_reg(), source.xmm_reg()); 1363 __ movaps(destination.xmm_reg(), source.xmm_reg());
1377 } else { 1364 } else {
1378 ASSERT(destination.IsDoubleStackSlot()); 1365 ASSERT(destination.IsDoubleStackSlot());
1379 __ movsd(ToStackSlotAddress(destination), source.xmm_reg()); 1366 __ movsd(destination.ToStackSlotAddress(), source.xmm_reg());
1380 } 1367 }
1381 } else if (source.IsDoubleStackSlot()) { 1368 } else if (source.IsDoubleStackSlot()) {
1382 if (destination.IsXmmRegister()) { 1369 if (destination.IsXmmRegister()) {
1383 __ movsd(destination.xmm_reg(), ToStackSlotAddress(source)); 1370 __ movsd(destination.xmm_reg(), source.ToStackSlotAddress());
1384 } else { 1371 } else {
1385 ASSERT(destination.IsDoubleStackSlot()); 1372 ASSERT(destination.IsDoubleStackSlot());
1386 __ movsd(XMM0, ToStackSlotAddress(source)); 1373 __ movsd(XMM0, source.ToStackSlotAddress());
1387 __ movsd(ToStackSlotAddress(destination), XMM0); 1374 __ movsd(destination.ToStackSlotAddress(), XMM0);
1388 } 1375 }
1389 } else { 1376 } else {
1390 ASSERT(source.IsConstant()); 1377 ASSERT(source.IsConstant());
1391 if (destination.IsRegister()) { 1378 if (destination.IsRegister()) {
1392 const Object& constant = source.constant(); 1379 const Object& constant = source.constant();
1393 if (constant.IsSmi() && (Smi::Cast(constant).Value() == 0)) { 1380 if (constant.IsSmi() && (Smi::Cast(constant).Value() == 0)) {
1394 __ xorl(destination.reg(), destination.reg()); 1381 __ xorl(destination.reg(), destination.reg());
1395 } else { 1382 } else {
1396 __ LoadObject(destination.reg(), constant); 1383 __ LoadObject(destination.reg(), constant);
1397 } 1384 }
1398 } else { 1385 } else {
1399 ASSERT(destination.IsStackSlot()); 1386 ASSERT(destination.IsStackSlot());
1400 StoreObject(ToStackSlotAddress(destination), source.constant()); 1387 StoreObject(destination.ToStackSlotAddress(), source.constant());
1401 } 1388 }
1402 } 1389 }
1403 1390
1404 move->Eliminate(); 1391 move->Eliminate();
1405 } 1392 }
1406 1393
1407 1394
1408 void ParallelMoveResolver::EmitSwap(int index) { 1395 void ParallelMoveResolver::EmitSwap(int index) {
1409 MoveOperands* move = moves_[index]; 1396 MoveOperands* move = moves_[index];
1410 const Location source = move->src(); 1397 const Location source = move->src();
1411 const Location destination = move->dest(); 1398 const Location destination = move->dest();
1412 1399
1413 if (source.IsRegister() && destination.IsRegister()) { 1400 if (source.IsRegister() && destination.IsRegister()) {
1414 __ xchgl(destination.reg(), source.reg()); 1401 __ xchgl(destination.reg(), source.reg());
1415 } else if (source.IsRegister() && destination.IsStackSlot()) { 1402 } else if (source.IsRegister() && destination.IsStackSlot()) {
1416 Exchange(source.reg(), ToStackSlotAddress(destination)); 1403 Exchange(source.reg(), destination.ToStackSlotAddress());
1417 } else if (source.IsStackSlot() && destination.IsRegister()) { 1404 } else if (source.IsStackSlot() && destination.IsRegister()) {
1418 Exchange(destination.reg(), ToStackSlotAddress(source)); 1405 Exchange(destination.reg(), source.ToStackSlotAddress());
1419 } else if (source.IsStackSlot() && destination.IsStackSlot()) { 1406 } else if (source.IsStackSlot() && destination.IsStackSlot()) {
1420 Exchange(ToStackSlotAddress(destination), ToStackSlotAddress(source)); 1407 Exchange(destination.ToStackSlotAddress(), source.ToStackSlotAddress());
1421 } else if (source.IsXmmRegister() && destination.IsXmmRegister()) { 1408 } else if (source.IsXmmRegister() && destination.IsXmmRegister()) {
1422 __ movaps(XMM0, source.xmm_reg()); 1409 __ movaps(XMM0, source.xmm_reg());
1423 __ movaps(source.xmm_reg(), destination.xmm_reg()); 1410 __ movaps(source.xmm_reg(), destination.xmm_reg());
1424 __ movaps(destination.xmm_reg(), XMM0); 1411 __ movaps(destination.xmm_reg(), XMM0);
1425 } else if (source.IsXmmRegister() || destination.IsXmmRegister()) { 1412 } else if (source.IsXmmRegister() || destination.IsXmmRegister()) {
1426 ASSERT(destination.IsDoubleStackSlot() || source.IsDoubleStackSlot()); 1413 ASSERT(destination.IsDoubleStackSlot() || source.IsDoubleStackSlot());
1427 XmmRegister reg = source.IsXmmRegister() ? source.xmm_reg() 1414 XmmRegister reg = source.IsXmmRegister() ? source.xmm_reg()
1428 : destination.xmm_reg(); 1415 : destination.xmm_reg();
1429 Address slot_address = 1416 Address slot_address = source.IsXmmRegister()
1430 ToStackSlotAddress(source.IsXmmRegister() ? destination : source); 1417 ? destination.ToStackSlotAddress()
1418 : source.ToStackSlotAddress();
1431 1419
1432 __ movsd(XMM0, slot_address); 1420 __ movsd(XMM0, slot_address);
1433 __ movsd(slot_address, reg); 1421 __ movsd(slot_address, reg);
1434 __ movaps(reg, XMM0); 1422 __ movaps(reg, XMM0);
1435 } else { 1423 } else {
1436 UNREACHABLE(); 1424 UNREACHABLE();
1437 } 1425 }
1438 1426
1439 // The swap of source and destination has executed a move from source to 1427 // The swap of source and destination has executed a move from source to
1440 // destination. 1428 // destination.
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1499 __ popl(ECX); 1487 __ popl(ECX);
1500 __ popl(EAX); 1488 __ popl(EAX);
1501 } 1489 }
1502 1490
1503 1491
1504 #undef __ 1492 #undef __
1505 1493
1506 } // namespace dart 1494 } // namespace dart
1507 1495
1508 #endif // defined TARGET_ARCH_IA32 1496 #endif // defined TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_compiler.cc ('k') | runtime/vm/flow_graph_compiler_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698