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

Side by Side Diff: src/compiler/ia32/instruction-selector-ia32.cc

Issue 1721103003: [turbofan] Introduce DeoptimizeIf And DeoptimizeUnless common operators. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add comments Created 4 years, 10 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
« no previous file with comments | « src/compiler/common-operator-reducer.cc ('k') | src/compiler/instruction.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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/base/adapters.h" 5 #include "src/base/adapters.h"
6 #include "src/compiler/instruction-selector-impl.h" 6 #include "src/compiler/instruction-selector-impl.h"
7 #include "src/compiler/node-matchers.h" 7 #include "src/compiler/node-matchers.h"
8 #include "src/compiler/node-properties.h" 8 #include "src/compiler/node-properties.h"
9 9
10 namespace v8 { 10 namespace v8 {
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(), 397 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(),
398 offset_operand, length_operand, value_operand, offset_operand, 398 offset_operand, length_operand, value_operand, offset_operand,
399 g.UseImmediate(buffer)); 399 g.UseImmediate(buffer));
400 } else { 400 } else {
401 Emit(opcode | AddressingModeField::encode(kMode_MR1), g.NoOutput(), 401 Emit(opcode | AddressingModeField::encode(kMode_MR1), g.NoOutput(),
402 offset_operand, length_operand, value_operand, g.UseRegister(buffer), 402 offset_operand, length_operand, value_operand, g.UseRegister(buffer),
403 offset_operand); 403 offset_operand);
404 } 404 }
405 } 405 }
406 406
407 namespace {
407 408
408 // Shared routine for multiple binary operations. 409 // Shared routine for multiple binary operations.
409 static void VisitBinop(InstructionSelector* selector, Node* node, 410 void VisitBinop(InstructionSelector* selector, Node* node,
410 InstructionCode opcode, FlagsContinuation* cont) { 411 InstructionCode opcode, FlagsContinuation* cont) {
411 IA32OperandGenerator g(selector); 412 IA32OperandGenerator g(selector);
412 Int32BinopMatcher m(node); 413 Int32BinopMatcher m(node);
413 Node* left = m.left().node(); 414 Node* left = m.left().node();
414 Node* right = m.right().node(); 415 Node* right = m.right().node();
415 InstructionOperand inputs[4]; 416 InstructionOperand inputs[4];
416 size_t input_count = 0; 417 size_t input_count = 0;
417 InstructionOperand outputs[2]; 418 InstructionOperand outputs[2];
418 size_t output_count = 0; 419 size_t output_count = 0;
419 420
420 // TODO(turbofan): match complex addressing modes. 421 // TODO(turbofan): match complex addressing modes.
(...skipping 28 matching lines...) Expand all
449 outputs[output_count++] = g.DefineSameAsFirst(node); 450 outputs[output_count++] = g.DefineSameAsFirst(node);
450 if (cont->IsSet()) { 451 if (cont->IsSet()) {
451 outputs[output_count++] = g.DefineAsByteRegister(cont->result()); 452 outputs[output_count++] = g.DefineAsByteRegister(cont->result());
452 } 453 }
453 454
454 DCHECK_NE(0u, input_count); 455 DCHECK_NE(0u, input_count);
455 DCHECK_NE(0u, output_count); 456 DCHECK_NE(0u, output_count);
456 DCHECK_GE(arraysize(inputs), input_count); 457 DCHECK_GE(arraysize(inputs), input_count);
457 DCHECK_GE(arraysize(outputs), output_count); 458 DCHECK_GE(arraysize(outputs), output_count);
458 459
459 selector->Emit(cont->Encode(opcode), output_count, outputs, input_count, 460 opcode = cont->Encode(opcode);
460 inputs); 461 if (cont->IsDeoptimize()) {
462 selector->EmitDeoptimize(opcode, output_count, outputs, input_count, inputs,
463 cont->frame_state());
464 } else {
465 selector->Emit(opcode, output_count, outputs, input_count, inputs);
466 }
461 } 467 }
462 468
463 469
464 // Shared routine for multiple binary operations. 470 // Shared routine for multiple binary operations.
465 static void VisitBinop(InstructionSelector* selector, Node* node, 471 void VisitBinop(InstructionSelector* selector, Node* node,
466 InstructionCode opcode) { 472 InstructionCode opcode) {
467 FlagsContinuation cont; 473 FlagsContinuation cont;
468 VisitBinop(selector, node, opcode, &cont); 474 VisitBinop(selector, node, opcode, &cont);
469 } 475 }
470 476
477 } // namespace
471 478
472 void InstructionSelector::VisitWord32And(Node* node) { 479 void InstructionSelector::VisitWord32And(Node* node) {
473 VisitBinop(this, node, kIA32And); 480 VisitBinop(this, node, kIA32And);
474 } 481 }
475 482
476 483
477 void InstructionSelector::VisitWord32Or(Node* node) { 484 void InstructionSelector::VisitWord32Or(Node* node) {
478 VisitBinop(this, node, kIA32Or); 485 VisitBinop(this, node, kIA32Or);
479 } 486 }
480 487
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 AddressingMode addressing_mode = 1007 AddressingMode addressing_mode =
1001 g.GetEffectiveAddressMemoryOperand(left, inputs, &input_count); 1008 g.GetEffectiveAddressMemoryOperand(left, inputs, &input_count);
1002 opcode |= AddressingModeField::encode(addressing_mode); 1009 opcode |= AddressingModeField::encode(addressing_mode);
1003 opcode = cont->Encode(opcode); 1010 opcode = cont->Encode(opcode);
1004 inputs[input_count++] = right; 1011 inputs[input_count++] = right;
1005 1012
1006 if (cont->IsBranch()) { 1013 if (cont->IsBranch()) {
1007 inputs[input_count++] = g.Label(cont->true_block()); 1014 inputs[input_count++] = g.Label(cont->true_block());
1008 inputs[input_count++] = g.Label(cont->false_block()); 1015 inputs[input_count++] = g.Label(cont->false_block());
1009 selector->Emit(opcode, 0, nullptr, input_count, inputs); 1016 selector->Emit(opcode, 0, nullptr, input_count, inputs);
1017 } else if (cont->IsDeoptimize()) {
1018 selector->EmitDeoptimize(opcode, 0, nullptr, input_count, inputs,
1019 cont->frame_state());
1010 } else { 1020 } else {
1011 DCHECK(cont->IsSet()); 1021 DCHECK(cont->IsSet());
1012 InstructionOperand output = g.DefineAsRegister(cont->result()); 1022 InstructionOperand output = g.DefineAsRegister(cont->result());
1013 selector->Emit(opcode, 1, &output, input_count, inputs); 1023 selector->Emit(opcode, 1, &output, input_count, inputs);
1014 } 1024 }
1015 } 1025 }
1016 1026
1017 // Determines if {input} of {node} can be replaced by a memory operand. 1027 // Determines if {input} of {node} can be replaced by a memory operand.
1018 bool CanUseMemoryOperand(InstructionSelector* selector, InstructionCode opcode, 1028 bool CanUseMemoryOperand(InstructionSelector* selector, InstructionCode opcode,
1019 Node* node, Node* input) { 1029 Node* node, Node* input) {
1020 if (input->opcode() != IrOpcode::kLoad || !selector->CanCover(node, input)) { 1030 if (input->opcode() != IrOpcode::kLoad || !selector->CanCover(node, input)) {
1021 return false; 1031 return false;
1022 } 1032 }
1023 MachineRepresentation load_representation = 1033 MachineRepresentation load_representation =
1024 LoadRepresentationOf(input->op()).representation(); 1034 LoadRepresentationOf(input->op()).representation();
1025 if (load_representation == MachineRepresentation::kWord32 || 1035 if (load_representation == MachineRepresentation::kWord32 ||
1026 load_representation == MachineRepresentation::kTagged) { 1036 load_representation == MachineRepresentation::kTagged) {
1027 return opcode == kIA32Cmp || opcode == kIA32Test; 1037 return opcode == kIA32Cmp || opcode == kIA32Test;
1028 } 1038 }
1029 return false; 1039 return false;
1030 } 1040 }
1031 1041
1032 // Shared routine for multiple compare operations. 1042 // Shared routine for multiple compare operations.
1033 void VisitCompare(InstructionSelector* selector, InstructionCode opcode, 1043 void VisitCompare(InstructionSelector* selector, InstructionCode opcode,
1034 InstructionOperand left, InstructionOperand right, 1044 InstructionOperand left, InstructionOperand right,
1035 FlagsContinuation* cont) { 1045 FlagsContinuation* cont) {
1036 IA32OperandGenerator g(selector); 1046 IA32OperandGenerator g(selector);
1047 opcode = cont->Encode(opcode);
1037 if (cont->IsBranch()) { 1048 if (cont->IsBranch()) {
1038 selector->Emit(cont->Encode(opcode), g.NoOutput(), left, right, 1049 selector->Emit(opcode, g.NoOutput(), left, right,
1039 g.Label(cont->true_block()), g.Label(cont->false_block())); 1050 g.Label(cont->true_block()), g.Label(cont->false_block()));
1051 } else if (cont->IsDeoptimize()) {
1052 selector->EmitDeoptimize(opcode, g.NoOutput(), left, right,
1053 cont->frame_state());
1040 } else { 1054 } else {
1041 DCHECK(cont->IsSet()); 1055 DCHECK(cont->IsSet());
1042 selector->Emit(cont->Encode(opcode), g.DefineAsByteRegister(cont->result()), 1056 selector->Emit(opcode, g.DefineAsByteRegister(cont->result()), left, right);
1043 left, right);
1044 } 1057 }
1045 } 1058 }
1046 1059
1047 1060
1048 // Shared routine for multiple compare operations. 1061 // Shared routine for multiple compare operations.
1049 void VisitCompare(InstructionSelector* selector, InstructionCode opcode, 1062 void VisitCompare(InstructionSelector* selector, InstructionCode opcode,
1050 Node* left, Node* right, FlagsContinuation* cont, 1063 Node* left, Node* right, FlagsContinuation* cont,
1051 bool commutative) { 1064 bool commutative) {
1052 IA32OperandGenerator g(selector); 1065 IA32OperandGenerator g(selector);
1053 if (commutative && g.CanBeBetterLeftOperand(right)) { 1066 if (commutative && g.CanBeBetterLeftOperand(right)) {
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 LoadMatcher<ExternalReferenceMatcher> mleft(m.left().node()); 1131 LoadMatcher<ExternalReferenceMatcher> mleft(m.left().node());
1119 ExternalReference js_stack_limit = 1132 ExternalReference js_stack_limit =
1120 ExternalReference::address_of_stack_limit(selector->isolate()); 1133 ExternalReference::address_of_stack_limit(selector->isolate());
1121 if (mleft.object().Is(js_stack_limit) && mleft.index().Is(0)) { 1134 if (mleft.object().Is(js_stack_limit) && mleft.index().Is(0)) {
1122 // Compare(Load(js_stack_limit), LoadStackPointer) 1135 // Compare(Load(js_stack_limit), LoadStackPointer)
1123 if (!node->op()->HasProperty(Operator::kCommutative)) cont->Commute(); 1136 if (!node->op()->HasProperty(Operator::kCommutative)) cont->Commute();
1124 InstructionCode opcode = cont->Encode(kIA32StackCheck); 1137 InstructionCode opcode = cont->Encode(kIA32StackCheck);
1125 if (cont->IsBranch()) { 1138 if (cont->IsBranch()) {
1126 selector->Emit(opcode, g.NoOutput(), g.Label(cont->true_block()), 1139 selector->Emit(opcode, g.NoOutput(), g.Label(cont->true_block()),
1127 g.Label(cont->false_block())); 1140 g.Label(cont->false_block()));
1141 } else if (cont->IsDeoptimize()) {
1142 selector->EmitDeoptimize(opcode, 0, nullptr, 0, nullptr,
1143 cont->frame_state());
1128 } else { 1144 } else {
1129 DCHECK(cont->IsSet()); 1145 DCHECK(cont->IsSet());
1130 selector->Emit(opcode, g.DefineAsRegister(cont->result())); 1146 selector->Emit(opcode, g.DefineAsRegister(cont->result()));
1131 } 1147 }
1132 return; 1148 return;
1133 } 1149 }
1134 } 1150 }
1135 VisitWordCompare(selector, node, kIA32Cmp, cont); 1151 VisitWordCompare(selector, node, kIA32Cmp, cont);
1136 } 1152 }
1137 1153
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1220 break; 1236 break;
1221 } 1237 }
1222 1238
1223 // Continuation could not be combined with a compare, emit compare against 0. 1239 // Continuation could not be combined with a compare, emit compare against 0.
1224 IA32OperandGenerator g(selector); 1240 IA32OperandGenerator g(selector);
1225 VisitCompare(selector, kIA32Cmp, g.Use(value), g.TempImmediate(0), cont); 1241 VisitCompare(selector, kIA32Cmp, g.Use(value), g.TempImmediate(0), cont);
1226 } 1242 }
1227 1243
1228 } // namespace 1244 } // namespace
1229 1245
1230
1231 void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch, 1246 void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch,
1232 BasicBlock* fbranch) { 1247 BasicBlock* fbranch) {
1233 FlagsContinuation cont(kNotEqual, tbranch, fbranch); 1248 FlagsContinuation cont(kNotEqual, tbranch, fbranch);
1234 VisitWordCompareZero(this, branch, branch->InputAt(0), &cont); 1249 VisitWordCompareZero(this, branch, branch->InputAt(0), &cont);
1235 } 1250 }
1236 1251
1252 void InstructionSelector::VisitDeoptimizeIf(Node* node) {
1253 FlagsContinuation cont =
1254 FlagsContinuation::ForDeoptimize(kNotEqual, node->InputAt(1));
1255 VisitWordCompareZero(this, node, node->InputAt(0), &cont);
1256 }
1257
1258 void InstructionSelector::VisitDeoptimizeUnless(Node* node) {
1259 FlagsContinuation cont =
1260 FlagsContinuation::ForDeoptimize(kEqual, node->InputAt(1));
1261 VisitWordCompareZero(this, node, node->InputAt(0), &cont);
1262 }
1237 1263
1238 void InstructionSelector::VisitSwitch(Node* node, const SwitchInfo& sw) { 1264 void InstructionSelector::VisitSwitch(Node* node, const SwitchInfo& sw) {
1239 IA32OperandGenerator g(this); 1265 IA32OperandGenerator g(this);
1240 InstructionOperand value_operand = g.UseRegister(node->InputAt(0)); 1266 InstructionOperand value_operand = g.UseRegister(node->InputAt(0));
1241 1267
1242 // Emit either ArchTableSwitch or ArchLookupSwitch. 1268 // Emit either ArchTableSwitch or ArchLookupSwitch.
1243 size_t table_space_cost = 4 + sw.value_range; 1269 size_t table_space_cost = 4 + sw.value_range;
1244 size_t table_time_cost = 3; 1270 size_t table_time_cost = 3;
1245 size_t lookup_space_cost = 3 + 2 * sw.case_count; 1271 size_t lookup_space_cost = 3 + 2 * sw.case_count;
1246 size_t lookup_time_cost = sw.case_count; 1272 size_t lookup_time_cost = sw.case_count;
(...skipping 10 matching lines...) Expand all
1257 // Generate a table lookup. 1283 // Generate a table lookup.
1258 return EmitTableSwitch(sw, index_operand); 1284 return EmitTableSwitch(sw, index_operand);
1259 } 1285 }
1260 1286
1261 // Generate a sequence of conditional jumps. 1287 // Generate a sequence of conditional jumps.
1262 return EmitLookupSwitch(sw, value_operand); 1288 return EmitLookupSwitch(sw, value_operand);
1263 } 1289 }
1264 1290
1265 1291
1266 void InstructionSelector::VisitWord32Equal(Node* const node) { 1292 void InstructionSelector::VisitWord32Equal(Node* const node) {
1267 FlagsContinuation cont(kEqual, node); 1293 FlagsContinuation cont = FlagsContinuation::ForSet(kEqual, node);
1268 Int32BinopMatcher m(node); 1294 Int32BinopMatcher m(node);
1269 if (m.right().Is(0)) { 1295 if (m.right().Is(0)) {
1270 return VisitWordCompareZero(this, m.node(), m.left().node(), &cont); 1296 return VisitWordCompareZero(this, m.node(), m.left().node(), &cont);
1271 } 1297 }
1272 VisitWordCompare(this, node, &cont); 1298 VisitWordCompare(this, node, &cont);
1273 } 1299 }
1274 1300
1275 1301
1276 void InstructionSelector::VisitInt32LessThan(Node* node) { 1302 void InstructionSelector::VisitInt32LessThan(Node* node) {
1277 FlagsContinuation cont(kSignedLessThan, node); 1303 FlagsContinuation cont = FlagsContinuation::ForSet(kSignedLessThan, node);
1278 VisitWordCompare(this, node, &cont); 1304 VisitWordCompare(this, node, &cont);
1279 } 1305 }
1280 1306
1281 1307
1282 void InstructionSelector::VisitInt32LessThanOrEqual(Node* node) { 1308 void InstructionSelector::VisitInt32LessThanOrEqual(Node* node) {
1283 FlagsContinuation cont(kSignedLessThanOrEqual, node); 1309 FlagsContinuation cont =
1310 FlagsContinuation::ForSet(kSignedLessThanOrEqual, node);
1284 VisitWordCompare(this, node, &cont); 1311 VisitWordCompare(this, node, &cont);
1285 } 1312 }
1286 1313
1287 1314
1288 void InstructionSelector::VisitUint32LessThan(Node* node) { 1315 void InstructionSelector::VisitUint32LessThan(Node* node) {
1289 FlagsContinuation cont(kUnsignedLessThan, node); 1316 FlagsContinuation cont = FlagsContinuation::ForSet(kUnsignedLessThan, node);
1290 VisitWordCompare(this, node, &cont); 1317 VisitWordCompare(this, node, &cont);
1291 } 1318 }
1292 1319
1293 1320
1294 void InstructionSelector::VisitUint32LessThanOrEqual(Node* node) { 1321 void InstructionSelector::VisitUint32LessThanOrEqual(Node* node) {
1295 FlagsContinuation cont(kUnsignedLessThanOrEqual, node); 1322 FlagsContinuation cont =
1323 FlagsContinuation::ForSet(kUnsignedLessThanOrEqual, node);
1296 VisitWordCompare(this, node, &cont); 1324 VisitWordCompare(this, node, &cont);
1297 } 1325 }
1298 1326
1299 1327
1300 void InstructionSelector::VisitInt32AddWithOverflow(Node* node) { 1328 void InstructionSelector::VisitInt32AddWithOverflow(Node* node) {
1301 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { 1329 if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
1302 FlagsContinuation cont(kOverflow, ovf); 1330 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
1303 return VisitBinop(this, node, kIA32Add, &cont); 1331 return VisitBinop(this, node, kIA32Add, &cont);
1304 } 1332 }
1305 FlagsContinuation cont; 1333 FlagsContinuation cont;
1306 VisitBinop(this, node, kIA32Add, &cont); 1334 VisitBinop(this, node, kIA32Add, &cont);
1307 } 1335 }
1308 1336
1309 1337
1310 void InstructionSelector::VisitInt32SubWithOverflow(Node* node) { 1338 void InstructionSelector::VisitInt32SubWithOverflow(Node* node) {
1311 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { 1339 if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
1312 FlagsContinuation cont(kOverflow, ovf); 1340 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
1313 return VisitBinop(this, node, kIA32Sub, &cont); 1341 return VisitBinop(this, node, kIA32Sub, &cont);
1314 } 1342 }
1315 FlagsContinuation cont; 1343 FlagsContinuation cont;
1316 VisitBinop(this, node, kIA32Sub, &cont); 1344 VisitBinop(this, node, kIA32Sub, &cont);
1317 } 1345 }
1318 1346
1319 1347
1320 void InstructionSelector::VisitFloat32Equal(Node* node) { 1348 void InstructionSelector::VisitFloat32Equal(Node* node) {
1321 FlagsContinuation cont(kUnorderedEqual, node); 1349 FlagsContinuation cont = FlagsContinuation::ForSet(kUnorderedEqual, node);
1322 VisitFloat32Compare(this, node, &cont); 1350 VisitFloat32Compare(this, node, &cont);
1323 } 1351 }
1324 1352
1325 1353
1326 void InstructionSelector::VisitFloat32LessThan(Node* node) { 1354 void InstructionSelector::VisitFloat32LessThan(Node* node) {
1327 FlagsContinuation cont(kUnsignedGreaterThan, node); 1355 FlagsContinuation cont =
1356 FlagsContinuation::ForSet(kUnsignedGreaterThan, node);
1328 VisitFloat32Compare(this, node, &cont); 1357 VisitFloat32Compare(this, node, &cont);
1329 } 1358 }
1330 1359
1331 1360
1332 void InstructionSelector::VisitFloat32LessThanOrEqual(Node* node) { 1361 void InstructionSelector::VisitFloat32LessThanOrEqual(Node* node) {
1333 FlagsContinuation cont(kUnsignedGreaterThanOrEqual, node); 1362 FlagsContinuation cont =
1363 FlagsContinuation::ForSet(kUnsignedGreaterThanOrEqual, node);
1334 VisitFloat32Compare(this, node, &cont); 1364 VisitFloat32Compare(this, node, &cont);
1335 } 1365 }
1336 1366
1337 1367
1338 void InstructionSelector::VisitFloat64Equal(Node* node) { 1368 void InstructionSelector::VisitFloat64Equal(Node* node) {
1339 FlagsContinuation cont(kUnorderedEqual, node); 1369 FlagsContinuation cont = FlagsContinuation::ForSet(kUnorderedEqual, node);
1340 VisitFloat64Compare(this, node, &cont); 1370 VisitFloat64Compare(this, node, &cont);
1341 } 1371 }
1342 1372
1343 1373
1344 void InstructionSelector::VisitFloat64LessThan(Node* node) { 1374 void InstructionSelector::VisitFloat64LessThan(Node* node) {
1345 FlagsContinuation cont(kUnsignedGreaterThan, node); 1375 FlagsContinuation cont =
1376 FlagsContinuation::ForSet(kUnsignedGreaterThan, node);
1346 VisitFloat64Compare(this, node, &cont); 1377 VisitFloat64Compare(this, node, &cont);
1347 } 1378 }
1348 1379
1349 1380
1350 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { 1381 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) {
1351 FlagsContinuation cont(kUnsignedGreaterThanOrEqual, node); 1382 FlagsContinuation cont =
1383 FlagsContinuation::ForSet(kUnsignedGreaterThanOrEqual, node);
1352 VisitFloat64Compare(this, node, &cont); 1384 VisitFloat64Compare(this, node, &cont);
1353 } 1385 }
1354 1386
1355 1387
1356 void InstructionSelector::VisitFloat64ExtractLowWord32(Node* node) { 1388 void InstructionSelector::VisitFloat64ExtractLowWord32(Node* node) {
1357 IA32OperandGenerator g(this); 1389 IA32OperandGenerator g(this);
1358 Emit(kSSEFloat64ExtractLowWord32, g.DefineAsRegister(node), 1390 Emit(kSSEFloat64ExtractLowWord32, g.DefineAsRegister(node),
1359 g.Use(node->InputAt(0))); 1391 g.Use(node->InputAt(0)));
1360 } 1392 }
1361 1393
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1412 MachineOperatorBuilder::kFloat64RoundTruncate | 1444 MachineOperatorBuilder::kFloat64RoundTruncate |
1413 MachineOperatorBuilder::kFloat32RoundTiesEven | 1445 MachineOperatorBuilder::kFloat32RoundTiesEven |
1414 MachineOperatorBuilder::kFloat64RoundTiesEven; 1446 MachineOperatorBuilder::kFloat64RoundTiesEven;
1415 } 1447 }
1416 return flags; 1448 return flags;
1417 } 1449 }
1418 1450
1419 } // namespace compiler 1451 } // namespace compiler
1420 } // namespace internal 1452 } // namespace internal
1421 } // namespace v8 1453 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/common-operator-reducer.cc ('k') | src/compiler/instruction.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698