| OLD | NEW |
| 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 <list> | 5 #include <list> |
| 6 | 6 |
| 7 #include "test/cctest/compiler/instruction-selector-tester.h" | 7 #include "test/cctest/compiler/instruction-selector-tester.h" |
| 8 #include "test/cctest/compiler/value-helper.h" | 8 #include "test/cctest/compiler/value-helper.h" |
| 9 | 9 |
| 10 using namespace v8::internal; | 10 using namespace v8::internal; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 DPI sub = {machine.Int32Sub(), kArmSub, kArmRsb, kArmCmp}; | 38 DPI sub = {machine.Int32Sub(), kArmSub, kArmRsb, kArmCmp}; |
| 39 push_back(sub); | 39 push_back(sub); |
| 40 } | 40 } |
| 41 }; | 41 }; |
| 42 | 42 |
| 43 | 43 |
| 44 struct ODPI { | 44 struct ODPI { |
| 45 Operator* op; | 45 Operator* op; |
| 46 ArchOpcode arch_opcode; | 46 ArchOpcode arch_opcode; |
| 47 ArchOpcode reverse_arch_opcode; | 47 ArchOpcode reverse_arch_opcode; |
| 48 FlagsCondition condition; |
| 49 FlagsCondition negated_condition; |
| 48 }; | 50 }; |
| 49 | 51 |
| 50 | 52 |
| 51 // ARM data processing instructions with overflow. | 53 // ARM data processing instructions with overflow. |
| 52 class ODPIs V8_FINAL : public std::list<ODPI>, private HandleAndZoneScope { | 54 class ODPIs V8_FINAL : public std::list<ODPI>, private HandleAndZoneScope { |
| 53 public: | 55 public: |
| 54 ODPIs() { | 56 ODPIs() { |
| 55 MachineOperatorBuilder machine(main_zone()); | 57 MachineOperatorBuilder machine(main_zone()); |
| 56 ODPI add = {machine.Int32AddWithOverflow(), kArmAdd, kArmAdd}; | 58 ODPI sadd = {machine.Int32AddWithOverflow(), kArmAdd, kArmAdd, kOverflow, |
| 57 push_back(add); | 59 kNotOverflow}; |
| 58 ODPI sub = {machine.Int32SubWithOverflow(), kArmSub, kArmRsb}; | 60 push_back(sadd); |
| 59 push_back(sub); | 61 ODPI ssub = {machine.Int32SubWithOverflow(), kArmSub, kArmRsb, kOverflow, |
| 62 kNotOverflow}; |
| 63 push_back(ssub); |
| 64 ODPI uadd = {machine.Uint32AddWithOverflow(), kArmAdd, kArmAdd, |
| 65 kUnsignedGreaterThanOrEqual, kUnsignedLessThan}; |
| 66 push_back(uadd); |
| 67 ODPI usub = {machine.Uint32SubWithOverflow(), kArmSub, kArmRsb, |
| 68 kUnsignedLessThan, kUnsignedGreaterThanOrEqual}; |
| 69 push_back(usub); |
| 60 } | 70 } |
| 61 }; | 71 }; |
| 62 | 72 |
| 63 | 73 |
| 64 // ARM immediates. | 74 // ARM immediates. |
| 65 class Immediates V8_FINAL : public std::list<int32_t> { | 75 class Immediates V8_FINAL : public std::list<int32_t> { |
| 66 public: | 76 public: |
| 67 Immediates() { | 77 Immediates() { |
| 68 for (uint32_t imm8 = 0; imm8 < 256; ++imm8) { | 78 for (uint32_t imm8 = 0; imm8 < 256; ++imm8) { |
| 69 for (uint32_t rot4 = 0; rot4 < 32; rot4 += 2) { | 79 for (uint32_t rot4 = 0; rot4 < 32; rot4 += 2) { |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 ODPI odpi = *i; | 290 ODPI odpi = *i; |
| 281 { | 291 { |
| 282 InstructionSelectorTester m; | 292 InstructionSelectorTester m; |
| 283 m.Return( | 293 m.Return( |
| 284 m.Projection(1, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); | 294 m.Projection(1, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); |
| 285 m.SelectInstructions(); | 295 m.SelectInstructions(); |
| 286 CHECK_EQ(1, m.code.size()); | 296 CHECK_EQ(1, m.code.size()); |
| 287 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 297 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 288 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 298 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |
| 289 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 299 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 290 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 300 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 291 CHECK_EQ(2, m.code[0]->InputCount()); | 301 CHECK_EQ(2, m.code[0]->InputCount()); |
| 292 CHECK_LE(1, m.code[0]->OutputCount()); | 302 CHECK_LE(1, m.code[0]->OutputCount()); |
| 293 } | 303 } |
| 294 { | 304 { |
| 295 InstructionSelectorTester m; | 305 InstructionSelectorTester m; |
| 296 m.Return( | 306 m.Return( |
| 297 m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); | 307 m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); |
| 298 m.SelectInstructions(); | 308 m.SelectInstructions(); |
| 299 CHECK_EQ(1, m.code.size()); | 309 CHECK_EQ(1, m.code.size()); |
| 300 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 310 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 301 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 311 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |
| 302 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 312 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |
| 303 CHECK_EQ(2, m.code[0]->InputCount()); | 313 CHECK_EQ(2, m.code[0]->InputCount()); |
| 304 CHECK_LE(1, m.code[0]->OutputCount()); | 314 CHECK_LE(1, m.code[0]->OutputCount()); |
| 305 } | 315 } |
| 306 { | 316 { |
| 307 InstructionSelectorTester m; | 317 InstructionSelectorTester m; |
| 308 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); | 318 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); |
| 309 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 319 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |
| 310 m.SelectInstructions(); | 320 m.SelectInstructions(); |
| 311 CHECK_LE(1, m.code.size()); | 321 CHECK_LE(1, m.code.size()); |
| 312 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 322 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 313 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 323 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |
| 314 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 324 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 315 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 325 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 316 CHECK_EQ(2, m.code[0]->InputCount()); | 326 CHECK_EQ(2, m.code[0]->InputCount()); |
| 317 CHECK_EQ(2, m.code[0]->OutputCount()); | 327 CHECK_EQ(2, m.code[0]->OutputCount()); |
| 318 } | 328 } |
| 319 } | 329 } |
| 320 } | 330 } |
| 321 | 331 |
| 322 | 332 |
| 323 TEST(InstructionSelectorODPIImm) { | 333 TEST(InstructionSelectorODPIImm) { |
| 324 ODPIs odpis; | 334 ODPIs odpis; |
| 325 Immediates immediates; | 335 Immediates immediates; |
| 326 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { | 336 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { |
| 327 ODPI odpi = *i; | 337 ODPI odpi = *i; |
| 328 for (Immediates::const_iterator j = immediates.begin(); | 338 for (Immediates::const_iterator j = immediates.begin(); |
| 329 j != immediates.end(); ++j) { | 339 j != immediates.end(); ++j) { |
| 330 int32_t imm = *j; | 340 int32_t imm = *j; |
| 331 { | 341 { |
| 332 InstructionSelectorTester m; | 342 InstructionSelectorTester m; |
| 333 m.Return(m.Projection( | 343 m.Return(m.Projection( |
| 334 1, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); | 344 1, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); |
| 335 m.SelectInstructions(); | 345 m.SelectInstructions(); |
| 336 CHECK_EQ(1, m.code.size()); | 346 CHECK_EQ(1, m.code.size()); |
| 337 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 347 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 338 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 348 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 339 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 349 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 340 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 350 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 341 CHECK_EQ(2, m.code[0]->InputCount()); | 351 CHECK_EQ(2, m.code[0]->InputCount()); |
| 342 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 352 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 343 CHECK_LE(1, m.code[0]->OutputCount()); | 353 CHECK_LE(1, m.code[0]->OutputCount()); |
| 344 } | 354 } |
| 345 { | 355 { |
| 346 InstructionSelectorTester m; | 356 InstructionSelectorTester m; |
| 347 m.Return(m.Projection( | 357 m.Return(m.Projection( |
| 348 1, m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)))); | 358 1, m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)))); |
| 349 m.SelectInstructions(); | 359 m.SelectInstructions(); |
| 350 CHECK_EQ(1, m.code.size()); | 360 CHECK_EQ(1, m.code.size()); |
| 351 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 361 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 352 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 362 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 353 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 363 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 354 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 364 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 355 CHECK_EQ(2, m.code[0]->InputCount()); | 365 CHECK_EQ(2, m.code[0]->InputCount()); |
| 356 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 366 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 357 CHECK_LE(1, m.code[0]->OutputCount()); | 367 CHECK_LE(1, m.code[0]->OutputCount()); |
| 358 } | 368 } |
| 359 { | 369 { |
| 360 InstructionSelectorTester m; | 370 InstructionSelectorTester m; |
| 361 m.Return(m.Projection( | 371 m.Return(m.Projection( |
| 362 0, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); | 372 0, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); |
| 363 m.SelectInstructions(); | 373 m.SelectInstructions(); |
| 364 CHECK_EQ(1, m.code.size()); | 374 CHECK_EQ(1, m.code.size()); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 384 } | 394 } |
| 385 { | 395 { |
| 386 InstructionSelectorTester m; | 396 InstructionSelectorTester m; |
| 387 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); | 397 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); |
| 388 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 398 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |
| 389 m.SelectInstructions(); | 399 m.SelectInstructions(); |
| 390 CHECK_LE(1, m.code.size()); | 400 CHECK_LE(1, m.code.size()); |
| 391 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 401 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 392 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 402 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 393 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 403 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 394 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 404 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 395 CHECK_EQ(2, m.code[0]->InputCount()); | 405 CHECK_EQ(2, m.code[0]->InputCount()); |
| 396 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 406 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 397 CHECK_EQ(2, m.code[0]->OutputCount()); | 407 CHECK_EQ(2, m.code[0]->OutputCount()); |
| 398 } | 408 } |
| 399 { | 409 { |
| 400 InstructionSelectorTester m; | 410 InstructionSelectorTester m; |
| 401 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)); | 411 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)); |
| 402 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 412 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |
| 403 m.SelectInstructions(); | 413 m.SelectInstructions(); |
| 404 CHECK_LE(1, m.code.size()); | 414 CHECK_LE(1, m.code.size()); |
| 405 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 415 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 406 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 416 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 407 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 417 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 408 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 418 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 409 CHECK_EQ(2, m.code[0]->InputCount()); | 419 CHECK_EQ(2, m.code[0]->InputCount()); |
| 410 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 420 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 411 CHECK_EQ(2, m.code[0]->OutputCount()); | 421 CHECK_EQ(2, m.code[0]->OutputCount()); |
| 412 } | 422 } |
| 413 } | 423 } |
| 414 } | 424 } |
| 415 } | 425 } |
| 416 | 426 |
| 417 | 427 |
| 418 TEST(InstructionSelectorODPIAndShiftP) { | 428 TEST(InstructionSelectorODPIAndShiftP) { |
| 419 ODPIs odpis; | 429 ODPIs odpis; |
| 420 Shifts shifts; | 430 Shifts shifts; |
| 421 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { | 431 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { |
| 422 ODPI odpi = *i; | 432 ODPI odpi = *i; |
| 423 for (Shifts::const_iterator j = shifts.begin(); j != shifts.end(); ++j) { | 433 for (Shifts::const_iterator j = shifts.begin(); j != shifts.end(); ++j) { |
| 424 Shift shift = *j; | 434 Shift shift = *j; |
| 425 { | 435 { |
| 426 InstructionSelectorTester m; | 436 InstructionSelectorTester m; |
| 427 m.Return(m.Projection( | 437 m.Return(m.Projection( |
| 428 1, m.NewNode(odpi.op, m.Parameter(0), | 438 1, m.NewNode(odpi.op, m.Parameter(0), |
| 429 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); | 439 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); |
| 430 m.SelectInstructions(); | 440 m.SelectInstructions(); |
| 431 CHECK_EQ(1, m.code.size()); | 441 CHECK_EQ(1, m.code.size()); |
| 432 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 442 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 433 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); | 443 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); |
| 434 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 444 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 435 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 445 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 436 CHECK_EQ(3, m.code[0]->InputCount()); | 446 CHECK_EQ(3, m.code[0]->InputCount()); |
| 437 CHECK_LE(1, m.code[0]->OutputCount()); | 447 CHECK_LE(1, m.code[0]->OutputCount()); |
| 438 } | 448 } |
| 439 { | 449 { |
| 440 InstructionSelectorTester m; | 450 InstructionSelectorTester m; |
| 441 m.Return(m.Projection( | 451 m.Return(m.Projection( |
| 442 1, m.NewNode(odpi.op, | 452 1, m.NewNode(odpi.op, |
| 443 m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), | 453 m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), |
| 444 m.Parameter(2)))); | 454 m.Parameter(2)))); |
| 445 m.SelectInstructions(); | 455 m.SelectInstructions(); |
| 446 CHECK_EQ(1, m.code.size()); | 456 CHECK_EQ(1, m.code.size()); |
| 447 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 457 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 448 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); | 458 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); |
| 449 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 459 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 450 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 460 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 451 CHECK_EQ(3, m.code[0]->InputCount()); | 461 CHECK_EQ(3, m.code[0]->InputCount()); |
| 452 CHECK_LE(1, m.code[0]->OutputCount()); | 462 CHECK_LE(1, m.code[0]->OutputCount()); |
| 453 } | 463 } |
| 454 { | 464 { |
| 455 InstructionSelectorTester m; | 465 InstructionSelectorTester m; |
| 456 m.Return(m.Projection( | 466 m.Return(m.Projection( |
| 457 0, m.NewNode(odpi.op, m.Parameter(0), | 467 0, m.NewNode(odpi.op, m.Parameter(0), |
| 458 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); | 468 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); |
| 459 m.SelectInstructions(); | 469 m.SelectInstructions(); |
| 460 CHECK_EQ(1, m.code.size()); | 470 CHECK_EQ(1, m.code.size()); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 482 InstructionSelectorTester m; | 492 InstructionSelectorTester m; |
| 483 Node* node = | 493 Node* node = |
| 484 m.NewNode(odpi.op, m.Parameter(0), | 494 m.NewNode(odpi.op, m.Parameter(0), |
| 485 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))); | 495 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))); |
| 486 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 496 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |
| 487 m.SelectInstructions(); | 497 m.SelectInstructions(); |
| 488 CHECK_LE(1, m.code.size()); | 498 CHECK_LE(1, m.code.size()); |
| 489 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 499 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 490 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); | 500 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); |
| 491 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 501 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 492 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 502 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 493 CHECK_EQ(3, m.code[0]->InputCount()); | 503 CHECK_EQ(3, m.code[0]->InputCount()); |
| 494 CHECK_EQ(2, m.code[0]->OutputCount()); | 504 CHECK_EQ(2, m.code[0]->OutputCount()); |
| 495 } | 505 } |
| 496 { | 506 { |
| 497 InstructionSelectorTester m; | 507 InstructionSelectorTester m; |
| 498 Node* node = m.NewNode( | 508 Node* node = m.NewNode( |
| 499 odpi.op, m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), | 509 odpi.op, m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), |
| 500 m.Parameter(2)); | 510 m.Parameter(2)); |
| 501 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 511 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |
| 502 m.SelectInstructions(); | 512 m.SelectInstructions(); |
| 503 CHECK_LE(1, m.code.size()); | 513 CHECK_LE(1, m.code.size()); |
| 504 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 514 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 505 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); | 515 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); |
| 506 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 516 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 507 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 517 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 508 CHECK_EQ(3, m.code[0]->InputCount()); | 518 CHECK_EQ(3, m.code[0]->InputCount()); |
| 509 CHECK_EQ(2, m.code[0]->OutputCount()); | 519 CHECK_EQ(2, m.code[0]->OutputCount()); |
| 510 } | 520 } |
| 511 } | 521 } |
| 512 } | 522 } |
| 513 } | 523 } |
| 514 | 524 |
| 515 | 525 |
| 516 TEST(InstructionSelectorODPIAndShiftImm) { | 526 TEST(InstructionSelectorODPIAndShiftImm) { |
| 517 ODPIs odpis; | 527 ODPIs odpis; |
| 518 Shifts shifts; | 528 Shifts shifts; |
| 519 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { | 529 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { |
| 520 ODPI odpi = *i; | 530 ODPI odpi = *i; |
| 521 for (Shifts::const_iterator j = shifts.begin(); j != shifts.end(); ++j) { | 531 for (Shifts::const_iterator j = shifts.begin(); j != shifts.end(); ++j) { |
| 522 Shift shift = *j; | 532 Shift shift = *j; |
| 523 for (int32_t imm = shift.i_low; imm <= shift.i_high; ++imm) { | 533 for (int32_t imm = shift.i_low; imm <= shift.i_high; ++imm) { |
| 524 { | 534 { |
| 525 InstructionSelectorTester m; | 535 InstructionSelectorTester m; |
| 526 m.Return(m.Projection(1, m.NewNode(odpi.op, m.Parameter(0), | 536 m.Return(m.Projection(1, m.NewNode(odpi.op, m.Parameter(0), |
| 527 m.NewNode(shift.op, m.Parameter(1), | 537 m.NewNode(shift.op, m.Parameter(1), |
| 528 m.Int32Constant(imm))))); | 538 m.Int32Constant(imm))))); |
| 529 m.SelectInstructions(); | 539 m.SelectInstructions(); |
| 530 CHECK_EQ(1, m.code.size()); | 540 CHECK_EQ(1, m.code.size()); |
| 531 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 541 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 532 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); | 542 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); |
| 533 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 543 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 534 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 544 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 535 CHECK_EQ(3, m.code[0]->InputCount()); | 545 CHECK_EQ(3, m.code[0]->InputCount()); |
| 536 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); | 546 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); |
| 537 CHECK_LE(1, m.code[0]->OutputCount()); | 547 CHECK_LE(1, m.code[0]->OutputCount()); |
| 538 } | 548 } |
| 539 { | 549 { |
| 540 InstructionSelectorTester m; | 550 InstructionSelectorTester m; |
| 541 m.Return(m.Projection( | 551 m.Return(m.Projection( |
| 542 1, m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), | 552 1, m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), |
| 543 m.Int32Constant(imm)), | 553 m.Int32Constant(imm)), |
| 544 m.Parameter(1)))); | 554 m.Parameter(1)))); |
| 545 m.SelectInstructions(); | 555 m.SelectInstructions(); |
| 546 CHECK_EQ(1, m.code.size()); | 556 CHECK_EQ(1, m.code.size()); |
| 547 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 557 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 548 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); | 558 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); |
| 549 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 559 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 550 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 560 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 551 CHECK_EQ(3, m.code[0]->InputCount()); | 561 CHECK_EQ(3, m.code[0]->InputCount()); |
| 552 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); | 562 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); |
| 553 CHECK_LE(1, m.code[0]->OutputCount()); | 563 CHECK_LE(1, m.code[0]->OutputCount()); |
| 554 } | 564 } |
| 555 { | 565 { |
| 556 InstructionSelectorTester m; | 566 InstructionSelectorTester m; |
| 557 m.Return(m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), | 567 m.Return(m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), |
| 558 m.NewNode(shift.op, m.Parameter(1), | 568 m.NewNode(shift.op, m.Parameter(1), |
| 559 m.Int32Constant(imm))))); | 569 m.Int32Constant(imm))))); |
| 560 m.SelectInstructions(); | 570 m.SelectInstructions(); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 585 InstructionSelectorTester m; | 595 InstructionSelectorTester m; |
| 586 Node* node = m.NewNode( | 596 Node* node = m.NewNode( |
| 587 odpi.op, m.Parameter(0), | 597 odpi.op, m.Parameter(0), |
| 588 m.NewNode(shift.op, m.Parameter(1), m.Int32Constant(imm))); | 598 m.NewNode(shift.op, m.Parameter(1), m.Int32Constant(imm))); |
| 589 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 599 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |
| 590 m.SelectInstructions(); | 600 m.SelectInstructions(); |
| 591 CHECK_LE(1, m.code.size()); | 601 CHECK_LE(1, m.code.size()); |
| 592 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 602 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 593 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); | 603 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); |
| 594 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 604 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 595 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 605 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 596 CHECK_EQ(3, m.code[0]->InputCount()); | 606 CHECK_EQ(3, m.code[0]->InputCount()); |
| 597 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); | 607 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); |
| 598 CHECK_EQ(2, m.code[0]->OutputCount()); | 608 CHECK_EQ(2, m.code[0]->OutputCount()); |
| 599 } | 609 } |
| 600 { | 610 { |
| 601 InstructionSelectorTester m; | 611 InstructionSelectorTester m; |
| 602 Node* node = m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), | 612 Node* node = m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), |
| 603 m.Int32Constant(imm)), | 613 m.Int32Constant(imm)), |
| 604 m.Parameter(1)); | 614 m.Parameter(1)); |
| 605 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 615 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |
| 606 m.SelectInstructions(); | 616 m.SelectInstructions(); |
| 607 CHECK_LE(1, m.code.size()); | 617 CHECK_LE(1, m.code.size()); |
| 608 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 618 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 609 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); | 619 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); |
| 610 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 620 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 611 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 621 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 612 CHECK_EQ(3, m.code[0]->InputCount()); | 622 CHECK_EQ(3, m.code[0]->InputCount()); |
| 613 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); | 623 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); |
| 614 CHECK_EQ(2, m.code[0]->OutputCount()); | 624 CHECK_EQ(2, m.code[0]->OutputCount()); |
| 615 } | 625 } |
| 616 } | 626 } |
| 617 } | 627 } |
| 618 } | 628 } |
| 619 } | 629 } |
| 620 | 630 |
| 621 | 631 |
| (...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1729 m.Branch(m.Projection(1, node), &blocka, &blockb); | 1739 m.Branch(m.Projection(1, node), &blocka, &blockb); |
| 1730 m.Bind(&blocka); | 1740 m.Bind(&blocka); |
| 1731 m.Return(m.Int32Constant(0)); | 1741 m.Return(m.Int32Constant(0)); |
| 1732 m.Bind(&blockb); | 1742 m.Bind(&blockb); |
| 1733 m.Return(m.Projection(0, node)); | 1743 m.Return(m.Projection(0, node)); |
| 1734 m.SelectInstructions(); | 1744 m.SelectInstructions(); |
| 1735 CHECK_EQ(1, m.code.size()); | 1745 CHECK_EQ(1, m.code.size()); |
| 1736 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 1746 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 1737 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 1747 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |
| 1738 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 1748 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1739 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 1749 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 1740 } | 1750 } |
| 1741 { | 1751 { |
| 1742 InstructionSelectorTester m; | 1752 InstructionSelectorTester m; |
| 1743 MLabel blocka, blockb; | 1753 MLabel blocka, blockb; |
| 1744 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); | 1754 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); |
| 1745 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), | 1755 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), |
| 1746 &blocka, &blockb); | 1756 &blocka, &blockb); |
| 1747 m.Bind(&blocka); | 1757 m.Bind(&blocka); |
| 1748 m.Return(m.Int32Constant(0)); | 1758 m.Return(m.Int32Constant(0)); |
| 1749 m.Bind(&blockb); | 1759 m.Bind(&blockb); |
| 1750 m.Return(m.Projection(0, node)); | 1760 m.Return(m.Projection(0, node)); |
| 1751 m.SelectInstructions(); | 1761 m.SelectInstructions(); |
| 1752 CHECK_EQ(1, m.code.size()); | 1762 CHECK_EQ(1, m.code.size()); |
| 1753 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 1763 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 1754 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 1764 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |
| 1755 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 1765 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1756 CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); | 1766 CHECK_EQ(odpi.negated_condition, m.code[0]->flags_condition()); |
| 1757 } | 1767 } |
| 1758 { | 1768 { |
| 1759 InstructionSelectorTester m; | 1769 InstructionSelectorTester m; |
| 1760 MLabel blocka, blockb; | 1770 MLabel blocka, blockb; |
| 1761 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); | 1771 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); |
| 1762 m.Branch(m.Word32Equal(m.Int32Constant(0), m.Projection(1, node)), | 1772 m.Branch(m.Word32Equal(m.Int32Constant(0), m.Projection(1, node)), |
| 1763 &blocka, &blockb); | 1773 &blocka, &blockb); |
| 1764 m.Bind(&blocka); | 1774 m.Bind(&blocka); |
| 1765 m.Return(m.Int32Constant(0)); | 1775 m.Return(m.Int32Constant(0)); |
| 1766 m.Bind(&blockb); | 1776 m.Bind(&blockb); |
| 1767 m.Return(m.Projection(0, node)); | 1777 m.Return(m.Projection(0, node)); |
| 1768 m.SelectInstructions(); | 1778 m.SelectInstructions(); |
| 1769 CHECK_EQ(1, m.code.size()); | 1779 CHECK_EQ(1, m.code.size()); |
| 1770 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 1780 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 1771 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 1781 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |
| 1772 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 1782 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1773 CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); | 1783 CHECK_EQ(odpi.negated_condition, m.code[0]->flags_condition()); |
| 1774 } | 1784 } |
| 1775 } | 1785 } |
| 1776 } | 1786 } |
| 1777 | 1787 |
| 1778 | 1788 |
| 1779 TEST(InstructionSelectorBranchWithODPIImm) { | 1789 TEST(InstructionSelectorBranchWithODPIImm) { |
| 1780 ODPIs odpis; | 1790 ODPIs odpis; |
| 1781 Immediates immediates; | 1791 Immediates immediates; |
| 1782 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { | 1792 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { |
| 1783 ODPI odpi = *i; | 1793 ODPI odpi = *i; |
| 1784 for (Immediates::const_iterator j = immediates.begin(); | 1794 for (Immediates::const_iterator j = immediates.begin(); |
| 1785 j != immediates.end(); ++j) { | 1795 j != immediates.end(); ++j) { |
| 1786 int32_t imm = *j; | 1796 int32_t imm = *j; |
| 1787 { | 1797 { |
| 1788 InstructionSelectorTester m; | 1798 InstructionSelectorTester m; |
| 1789 MLabel blocka, blockb; | 1799 MLabel blocka, blockb; |
| 1790 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); | 1800 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); |
| 1791 m.Branch(m.Projection(1, node), &blocka, &blockb); | 1801 m.Branch(m.Projection(1, node), &blocka, &blockb); |
| 1792 m.Bind(&blocka); | 1802 m.Bind(&blocka); |
| 1793 m.Return(m.Int32Constant(0)); | 1803 m.Return(m.Int32Constant(0)); |
| 1794 m.Bind(&blockb); | 1804 m.Bind(&blockb); |
| 1795 m.Return(m.Projection(0, node)); | 1805 m.Return(m.Projection(0, node)); |
| 1796 m.SelectInstructions(); | 1806 m.SelectInstructions(); |
| 1797 CHECK_EQ(1, m.code.size()); | 1807 CHECK_EQ(1, m.code.size()); |
| 1798 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 1808 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 1799 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 1809 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 1800 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 1810 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1801 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 1811 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 1802 CHECK_LE(2, m.code[0]->InputCount()); | 1812 CHECK_LE(2, m.code[0]->InputCount()); |
| 1803 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 1813 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 1804 } | 1814 } |
| 1805 { | 1815 { |
| 1806 InstructionSelectorTester m; | 1816 InstructionSelectorTester m; |
| 1807 MLabel blocka, blockb; | 1817 MLabel blocka, blockb; |
| 1808 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)); | 1818 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)); |
| 1809 m.Branch(m.Projection(1, node), &blocka, &blockb); | 1819 m.Branch(m.Projection(1, node), &blocka, &blockb); |
| 1810 m.Bind(&blocka); | 1820 m.Bind(&blocka); |
| 1811 m.Return(m.Int32Constant(0)); | 1821 m.Return(m.Int32Constant(0)); |
| 1812 m.Bind(&blockb); | 1822 m.Bind(&blockb); |
| 1813 m.Return(m.Projection(0, node)); | 1823 m.Return(m.Projection(0, node)); |
| 1814 m.SelectInstructions(); | 1824 m.SelectInstructions(); |
| 1815 CHECK_EQ(1, m.code.size()); | 1825 CHECK_EQ(1, m.code.size()); |
| 1816 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 1826 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 1817 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 1827 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 1818 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 1828 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1819 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 1829 CHECK_EQ(odpi.condition, m.code[0]->flags_condition()); |
| 1820 CHECK_LE(2, m.code[0]->InputCount()); | 1830 CHECK_LE(2, m.code[0]->InputCount()); |
| 1821 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 1831 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 1822 } | 1832 } |
| 1823 { | 1833 { |
| 1824 InstructionSelectorTester m; | 1834 InstructionSelectorTester m; |
| 1825 MLabel blocka, blockb; | 1835 MLabel blocka, blockb; |
| 1826 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); | 1836 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); |
| 1827 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), | 1837 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), |
| 1828 &blocka, &blockb); | 1838 &blocka, &blockb); |
| 1829 m.Bind(&blocka); | 1839 m.Bind(&blocka); |
| 1830 m.Return(m.Int32Constant(0)); | 1840 m.Return(m.Int32Constant(0)); |
| 1831 m.Bind(&blockb); | 1841 m.Bind(&blockb); |
| 1832 m.Return(m.Projection(0, node)); | 1842 m.Return(m.Projection(0, node)); |
| 1833 m.SelectInstructions(); | 1843 m.SelectInstructions(); |
| 1834 CHECK_EQ(1, m.code.size()); | 1844 CHECK_EQ(1, m.code.size()); |
| 1835 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 1845 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 1836 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 1846 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 1837 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 1847 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1838 CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); | 1848 CHECK_EQ(odpi.negated_condition, m.code[0]->flags_condition()); |
| 1839 CHECK_LE(2, m.code[0]->InputCount()); | 1849 CHECK_LE(2, m.code[0]->InputCount()); |
| 1840 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 1850 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 1841 } | 1851 } |
| 1842 { | 1852 { |
| 1843 InstructionSelectorTester m; | 1853 InstructionSelectorTester m; |
| 1844 MLabel blocka, blockb; | 1854 MLabel blocka, blockb; |
| 1845 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)); | 1855 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)); |
| 1846 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), | 1856 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), |
| 1847 &blocka, &blockb); | 1857 &blocka, &blockb); |
| 1848 m.Bind(&blocka); | 1858 m.Bind(&blocka); |
| 1849 m.Return(m.Int32Constant(0)); | 1859 m.Return(m.Int32Constant(0)); |
| 1850 m.Bind(&blockb); | 1860 m.Bind(&blockb); |
| 1851 m.Return(m.Projection(0, node)); | 1861 m.Return(m.Projection(0, node)); |
| 1852 m.SelectInstructions(); | 1862 m.SelectInstructions(); |
| 1853 CHECK_EQ(1, m.code.size()); | 1863 CHECK_EQ(1, m.code.size()); |
| 1854 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 1864 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 1855 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 1865 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 1856 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 1866 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1857 CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); | 1867 CHECK_EQ(odpi.negated_condition, m.code[0]->flags_condition()); |
| 1858 CHECK_LE(2, m.code[0]->InputCount()); | 1868 CHECK_LE(2, m.code[0]->InputCount()); |
| 1859 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 1869 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 1860 } | 1870 } |
| 1861 } | 1871 } |
| 1862 } | 1872 } |
| 1863 } | 1873 } |
| OLD | NEW |