| 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 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 InstructionSelectorTester m; | 253 InstructionSelectorTester m; |
| 254 m.Return( | 254 m.Return( |
| 255 m.Projection(1, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); | 255 m.Projection(1, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); |
| 256 m.SelectInstructions(); | 256 m.SelectInstructions(); |
| 257 CHECK_EQ(1, m.code.size()); | 257 CHECK_EQ(1, m.code.size()); |
| 258 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 258 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 259 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 259 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |
| 260 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 260 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 261 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 261 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |
| 262 CHECK_EQ(2, m.code[0]->InputCount()); | 262 CHECK_EQ(2, m.code[0]->InputCount()); |
| 263 CHECK_EQ(1, m.code[0]->OutputCount()); | 263 CHECK_LE(1, m.code[0]->OutputCount()); |
| 264 } | 264 } |
| 265 { | 265 { |
| 266 InstructionSelectorTester m; | 266 InstructionSelectorTester m; |
| 267 m.Return( | 267 m.Return( |
| 268 m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); | 268 m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); |
| 269 m.SelectInstructions(); | 269 m.SelectInstructions(); |
| 270 CHECK_EQ(1, m.code.size()); | 270 CHECK_EQ(1, m.code.size()); |
| 271 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 271 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 272 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 272 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |
| 273 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 273 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |
| 274 CHECK_EQ(2, m.code[0]->InputCount()); | 274 CHECK_EQ(2, m.code[0]->InputCount()); |
| 275 CHECK_EQ(1, m.code[0]->OutputCount()); | 275 CHECK_LE(1, m.code[0]->OutputCount()); |
| 276 } | 276 } |
| 277 { | 277 { |
| 278 InstructionSelectorTester m; | 278 InstructionSelectorTester m; |
| 279 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); | 279 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); |
| 280 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 280 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |
| 281 m.SelectInstructions(); | 281 m.SelectInstructions(); |
| 282 CHECK_LE(1, m.code.size()); | 282 CHECK_LE(1, m.code.size()); |
| 283 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 283 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 284 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 284 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |
| 285 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 285 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 304 m.Return(m.Projection( | 304 m.Return(m.Projection( |
| 305 1, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); | 305 1, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); |
| 306 m.SelectInstructions(); | 306 m.SelectInstructions(); |
| 307 CHECK_EQ(1, m.code.size()); | 307 CHECK_EQ(1, m.code.size()); |
| 308 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 308 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 309 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 309 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 310 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 310 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 311 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 311 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |
| 312 CHECK_EQ(2, m.code[0]->InputCount()); | 312 CHECK_EQ(2, m.code[0]->InputCount()); |
| 313 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 313 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 314 CHECK_EQ(1, m.code[0]->OutputCount()); | 314 CHECK_LE(1, m.code[0]->OutputCount()); |
| 315 } | 315 } |
| 316 { | 316 { |
| 317 InstructionSelectorTester m; | 317 InstructionSelectorTester m; |
| 318 m.Return(m.Projection( | 318 m.Return(m.Projection( |
| 319 1, m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)))); | 319 1, m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)))); |
| 320 m.SelectInstructions(); | 320 m.SelectInstructions(); |
| 321 CHECK_EQ(1, m.code.size()); | 321 CHECK_EQ(1, m.code.size()); |
| 322 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 322 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 323 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 323 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 324 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 324 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 325 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 325 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |
| 326 CHECK_EQ(2, m.code[0]->InputCount()); | 326 CHECK_EQ(2, m.code[0]->InputCount()); |
| 327 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 327 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 328 CHECK_EQ(1, m.code[0]->OutputCount()); | 328 CHECK_LE(1, m.code[0]->OutputCount()); |
| 329 } | 329 } |
| 330 { | 330 { |
| 331 InstructionSelectorTester m; | 331 InstructionSelectorTester m; |
| 332 m.Return(m.Projection( | 332 m.Return(m.Projection( |
| 333 0, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); | 333 0, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); |
| 334 m.SelectInstructions(); | 334 m.SelectInstructions(); |
| 335 CHECK_EQ(1, m.code.size()); | 335 CHECK_EQ(1, m.code.size()); |
| 336 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 336 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 337 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 337 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 338 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 338 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |
| 339 CHECK_EQ(2, m.code[0]->InputCount()); | 339 CHECK_EQ(2, m.code[0]->InputCount()); |
| 340 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 340 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 341 CHECK_EQ(1, m.code[0]->OutputCount()); | 341 CHECK_LE(1, m.code[0]->OutputCount()); |
| 342 } | 342 } |
| 343 { | 343 { |
| 344 InstructionSelectorTester m; | 344 InstructionSelectorTester m; |
| 345 m.Return(m.Projection( | 345 m.Return(m.Projection( |
| 346 0, m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)))); | 346 0, m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)))); |
| 347 m.SelectInstructions(); | 347 m.SelectInstructions(); |
| 348 CHECK_EQ(1, m.code.size()); | 348 CHECK_EQ(1, m.code.size()); |
| 349 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 349 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 350 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 350 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 351 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 351 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |
| 352 CHECK_EQ(2, m.code[0]->InputCount()); | 352 CHECK_EQ(2, m.code[0]->InputCount()); |
| 353 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); | 353 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 354 CHECK_EQ(1, m.code[0]->OutputCount()); | 354 CHECK_LE(1, m.code[0]->OutputCount()); |
| 355 } | 355 } |
| 356 { | 356 { |
| 357 InstructionSelectorTester m; | 357 InstructionSelectorTester m; |
| 358 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); | 358 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); |
| 359 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 359 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |
| 360 m.SelectInstructions(); | 360 m.SelectInstructions(); |
| 361 CHECK_LE(1, m.code.size()); | 361 CHECK_LE(1, m.code.size()); |
| 362 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 362 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 363 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); | 363 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 364 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 364 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 m.Return(m.Projection( | 398 m.Return(m.Projection( |
| 399 1, m.NewNode(odpi.op, m.Parameter(0), | 399 1, m.NewNode(odpi.op, m.Parameter(0), |
| 400 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); | 400 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); |
| 401 m.SelectInstructions(); | 401 m.SelectInstructions(); |
| 402 CHECK_EQ(1, m.code.size()); | 402 CHECK_EQ(1, m.code.size()); |
| 403 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 403 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 404 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); | 404 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); |
| 405 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 405 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 406 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 406 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |
| 407 CHECK_EQ(3, m.code[0]->InputCount()); | 407 CHECK_EQ(3, m.code[0]->InputCount()); |
| 408 CHECK_EQ(1, m.code[0]->OutputCount()); | 408 CHECK_LE(1, m.code[0]->OutputCount()); |
| 409 } | 409 } |
| 410 { | 410 { |
| 411 InstructionSelectorTester m; | 411 InstructionSelectorTester m; |
| 412 m.Return(m.Projection( | 412 m.Return(m.Projection( |
| 413 1, m.NewNode(odpi.op, | 413 1, m.NewNode(odpi.op, |
| 414 m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), | 414 m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), |
| 415 m.Parameter(2)))); | 415 m.Parameter(2)))); |
| 416 m.SelectInstructions(); | 416 m.SelectInstructions(); |
| 417 CHECK_EQ(1, m.code.size()); | 417 CHECK_EQ(1, m.code.size()); |
| 418 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 418 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 419 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); | 419 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); |
| 420 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 420 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 421 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 421 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |
| 422 CHECK_EQ(3, m.code[0]->InputCount()); | 422 CHECK_EQ(3, m.code[0]->InputCount()); |
| 423 CHECK_EQ(1, m.code[0]->OutputCount()); | 423 CHECK_LE(1, m.code[0]->OutputCount()); |
| 424 } | 424 } |
| 425 { | 425 { |
| 426 InstructionSelectorTester m; | 426 InstructionSelectorTester m; |
| 427 m.Return(m.Projection( | 427 m.Return(m.Projection( |
| 428 0, m.NewNode(odpi.op, m.Parameter(0), | 428 0, m.NewNode(odpi.op, m.Parameter(0), |
| 429 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); | 429 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); |
| 430 m.SelectInstructions(); | 430 m.SelectInstructions(); |
| 431 CHECK_EQ(1, m.code.size()); | 431 CHECK_EQ(1, m.code.size()); |
| 432 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 432 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 433 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); | 433 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); |
| 434 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 434 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |
| 435 CHECK_EQ(3, m.code[0]->InputCount()); | 435 CHECK_EQ(3, m.code[0]->InputCount()); |
| 436 CHECK_EQ(1, m.code[0]->OutputCount()); | 436 CHECK_LE(1, m.code[0]->OutputCount()); |
| 437 } | 437 } |
| 438 { | 438 { |
| 439 InstructionSelectorTester m; | 439 InstructionSelectorTester m; |
| 440 m.Return(m.Projection( | 440 m.Return(m.Projection( |
| 441 0, m.NewNode(odpi.op, | 441 0, m.NewNode(odpi.op, |
| 442 m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), | 442 m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), |
| 443 m.Parameter(2)))); | 443 m.Parameter(2)))); |
| 444 m.SelectInstructions(); | 444 m.SelectInstructions(); |
| 445 CHECK_EQ(1, m.code.size()); | 445 CHECK_EQ(1, m.code.size()); |
| 446 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 446 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 447 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); | 447 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); |
| 448 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 448 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |
| 449 CHECK_EQ(3, m.code[0]->InputCount()); | 449 CHECK_EQ(3, m.code[0]->InputCount()); |
| 450 CHECK_EQ(1, m.code[0]->OutputCount()); | 450 CHECK_LE(1, m.code[0]->OutputCount()); |
| 451 } | 451 } |
| 452 { | 452 { |
| 453 InstructionSelectorTester m; | 453 InstructionSelectorTester m; |
| 454 Node* node = | 454 Node* node = |
| 455 m.NewNode(odpi.op, m.Parameter(0), | 455 m.NewNode(odpi.op, m.Parameter(0), |
| 456 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))); | 456 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))); |
| 457 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 457 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |
| 458 m.SelectInstructions(); | 458 m.SelectInstructions(); |
| 459 CHECK_LE(1, m.code.size()); | 459 CHECK_LE(1, m.code.size()); |
| 460 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 460 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 m.NewNode(shift.op, m.Parameter(1), | 498 m.NewNode(shift.op, m.Parameter(1), |
| 499 m.Int32Constant(imm))))); | 499 m.Int32Constant(imm))))); |
| 500 m.SelectInstructions(); | 500 m.SelectInstructions(); |
| 501 CHECK_EQ(1, m.code.size()); | 501 CHECK_EQ(1, m.code.size()); |
| 502 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 502 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 503 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); | 503 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); |
| 504 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 504 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 505 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 505 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |
| 506 CHECK_EQ(3, m.code[0]->InputCount()); | 506 CHECK_EQ(3, m.code[0]->InputCount()); |
| 507 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); | 507 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); |
| 508 CHECK_EQ(1, m.code[0]->OutputCount()); | 508 CHECK_LE(1, m.code[0]->OutputCount()); |
| 509 } | 509 } |
| 510 { | 510 { |
| 511 InstructionSelectorTester m; | 511 InstructionSelectorTester m; |
| 512 m.Return(m.Projection( | 512 m.Return(m.Projection( |
| 513 1, m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), | 513 1, m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), |
| 514 m.Int32Constant(imm)), | 514 m.Int32Constant(imm)), |
| 515 m.Parameter(1)))); | 515 m.Parameter(1)))); |
| 516 m.SelectInstructions(); | 516 m.SelectInstructions(); |
| 517 CHECK_EQ(1, m.code.size()); | 517 CHECK_EQ(1, m.code.size()); |
| 518 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 518 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 519 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); | 519 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); |
| 520 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); | 520 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); |
| 521 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); | 521 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |
| 522 CHECK_EQ(3, m.code[0]->InputCount()); | 522 CHECK_EQ(3, m.code[0]->InputCount()); |
| 523 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); | 523 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); |
| 524 CHECK_EQ(1, m.code[0]->OutputCount()); | 524 CHECK_LE(1, m.code[0]->OutputCount()); |
| 525 } | 525 } |
| 526 { | 526 { |
| 527 InstructionSelectorTester m; | 527 InstructionSelectorTester m; |
| 528 m.Return(m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), | 528 m.Return(m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), |
| 529 m.NewNode(shift.op, m.Parameter(1), | 529 m.NewNode(shift.op, m.Parameter(1), |
| 530 m.Int32Constant(imm))))); | 530 m.Int32Constant(imm))))); |
| 531 m.SelectInstructions(); | 531 m.SelectInstructions(); |
| 532 CHECK_EQ(1, m.code.size()); | 532 CHECK_EQ(1, m.code.size()); |
| 533 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 533 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 534 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); | 534 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); |
| 535 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 535 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |
| 536 CHECK_EQ(3, m.code[0]->InputCount()); | 536 CHECK_EQ(3, m.code[0]->InputCount()); |
| 537 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); | 537 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); |
| 538 CHECK_EQ(1, m.code[0]->OutputCount()); | 538 CHECK_LE(1, m.code[0]->OutputCount()); |
| 539 } | 539 } |
| 540 { | 540 { |
| 541 InstructionSelectorTester m; | 541 InstructionSelectorTester m; |
| 542 m.Return(m.Projection( | 542 m.Return(m.Projection( |
| 543 0, m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), | 543 0, m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), |
| 544 m.Int32Constant(imm)), | 544 m.Int32Constant(imm)), |
| 545 m.Parameter(1)))); | 545 m.Parameter(1)))); |
| 546 m.SelectInstructions(); | 546 m.SelectInstructions(); |
| 547 CHECK_EQ(1, m.code.size()); | 547 CHECK_EQ(1, m.code.size()); |
| 548 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); | 548 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 549 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); | 549 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); |
| 550 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); | 550 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); |
| 551 CHECK_EQ(3, m.code[0]->InputCount()); | 551 CHECK_EQ(3, m.code[0]->InputCount()); |
| 552 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); | 552 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); |
| 553 CHECK_EQ(1, m.code[0]->OutputCount()); | 553 CHECK_LE(1, m.code[0]->OutputCount()); |
| 554 } | 554 } |
| 555 { | 555 { |
| 556 InstructionSelectorTester m; | 556 InstructionSelectorTester m; |
| 557 Node* node = m.NewNode( | 557 Node* node = m.NewNode( |
| 558 odpi.op, m.Parameter(0), | 558 odpi.op, m.Parameter(0), |
| 559 m.NewNode(shift.op, m.Parameter(1), m.Int32Constant(imm))); | 559 m.NewNode(shift.op, m.Parameter(1), m.Int32Constant(imm))); |
| 560 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); | 560 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); |
| 561 m.SelectInstructions(); | 561 m.SelectInstructions(); |
| 562 CHECK_LE(1, m.code.size()); | 562 CHECK_LE(1, m.code.size()); |
| 563 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); | 563 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| (...skipping 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1746 m.Return(m.Int32Constant(0)); | 1746 m.Return(m.Int32Constant(0)); |
| 1747 m.SelectInstructions(); | 1747 m.SelectInstructions(); |
| 1748 CHECK_EQ(1, m.code.size()); | 1748 CHECK_EQ(1, m.code.size()); |
| 1749 CHECK_EQ(dpi.test_arch_opcode, m.code[0]->arch_opcode()); | 1749 CHECK_EQ(dpi.test_arch_opcode, m.code[0]->arch_opcode()); |
| 1750 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); | 1750 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |
| 1751 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); | 1751 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1752 CHECK_EQ(kEqual, m.code[0]->flags_condition()); | 1752 CHECK_EQ(kEqual, m.code[0]->flags_condition()); |
| 1753 } | 1753 } |
| 1754 } | 1754 } |
| 1755 } | 1755 } |
| 1756 |
| 1757 |
| 1758 TEST(InstructionSelectorBranchWithODPIP) { |
| 1759 ODPIs odpis; |
| 1760 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { |
| 1761 ODPI odpi = *i; |
| 1762 { |
| 1763 InstructionSelectorTester m; |
| 1764 MLabel blocka, blockb; |
| 1765 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); |
| 1766 m.Branch(m.Projection(1, node), &blocka, &blockb); |
| 1767 m.Bind(&blocka); |
| 1768 m.Return(m.Int32Constant(0)); |
| 1769 m.Bind(&blockb); |
| 1770 m.Return(m.Projection(0, node)); |
| 1771 m.SelectInstructions(); |
| 1772 CHECK_EQ(1, m.code.size()); |
| 1773 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 1774 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |
| 1775 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1776 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |
| 1777 } |
| 1778 { |
| 1779 InstructionSelectorTester m; |
| 1780 MLabel blocka, blockb; |
| 1781 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); |
| 1782 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), |
| 1783 &blocka, &blockb); |
| 1784 m.Bind(&blocka); |
| 1785 m.Return(m.Int32Constant(0)); |
| 1786 m.Bind(&blockb); |
| 1787 m.Return(m.Projection(0, node)); |
| 1788 m.SelectInstructions(); |
| 1789 CHECK_EQ(1, m.code.size()); |
| 1790 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 1791 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |
| 1792 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1793 CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); |
| 1794 } |
| 1795 { |
| 1796 InstructionSelectorTester m; |
| 1797 MLabel blocka, blockb; |
| 1798 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); |
| 1799 m.Branch(m.Word32Equal(m.Int32Constant(0), m.Projection(1, node)), |
| 1800 &blocka, &blockb); |
| 1801 m.Bind(&blocka); |
| 1802 m.Return(m.Int32Constant(0)); |
| 1803 m.Bind(&blockb); |
| 1804 m.Return(m.Projection(0, node)); |
| 1805 m.SelectInstructions(); |
| 1806 CHECK_EQ(1, m.code.size()); |
| 1807 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 1808 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); |
| 1809 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1810 CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); |
| 1811 } |
| 1812 } |
| 1813 } |
| 1814 |
| 1815 |
| 1816 TEST(InstructionSelectorBranchWithODPIImm) { |
| 1817 ODPIs odpis; |
| 1818 Immediates immediates; |
| 1819 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { |
| 1820 ODPI odpi = *i; |
| 1821 for (Immediates::const_iterator j = immediates.begin(); |
| 1822 j != immediates.end(); ++j) { |
| 1823 int32_t imm = *j; |
| 1824 { |
| 1825 InstructionSelectorTester m; |
| 1826 MLabel blocka, blockb; |
| 1827 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); |
| 1828 m.Branch(m.Projection(1, node), &blocka, &blockb); |
| 1829 m.Bind(&blocka); |
| 1830 m.Return(m.Int32Constant(0)); |
| 1831 m.Bind(&blockb); |
| 1832 m.Return(m.Projection(0, node)); |
| 1833 m.SelectInstructions(); |
| 1834 CHECK_EQ(1, m.code.size()); |
| 1835 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 1836 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 1837 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1838 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |
| 1839 CHECK_LE(2, m.code[0]->InputCount()); |
| 1840 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 1841 } |
| 1842 { |
| 1843 InstructionSelectorTester m; |
| 1844 MLabel blocka, blockb; |
| 1845 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)); |
| 1846 m.Branch(m.Projection(1, node), &blocka, &blockb); |
| 1847 m.Bind(&blocka); |
| 1848 m.Return(m.Int32Constant(0)); |
| 1849 m.Bind(&blockb); |
| 1850 m.Return(m.Projection(0, node)); |
| 1851 m.SelectInstructions(); |
| 1852 CHECK_EQ(1, m.code.size()); |
| 1853 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 1854 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 1855 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1856 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); |
| 1857 CHECK_LE(2, m.code[0]->InputCount()); |
| 1858 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 1859 } |
| 1860 { |
| 1861 InstructionSelectorTester m; |
| 1862 MLabel blocka, blockb; |
| 1863 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); |
| 1864 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), |
| 1865 &blocka, &blockb); |
| 1866 m.Bind(&blocka); |
| 1867 m.Return(m.Int32Constant(0)); |
| 1868 m.Bind(&blockb); |
| 1869 m.Return(m.Projection(0, node)); |
| 1870 m.SelectInstructions(); |
| 1871 CHECK_EQ(1, m.code.size()); |
| 1872 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); |
| 1873 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 1874 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1875 CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); |
| 1876 CHECK_LE(2, m.code[0]->InputCount()); |
| 1877 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 1878 } |
| 1879 { |
| 1880 InstructionSelectorTester m; |
| 1881 MLabel blocka, blockb; |
| 1882 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)); |
| 1883 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), |
| 1884 &blocka, &blockb); |
| 1885 m.Bind(&blocka); |
| 1886 m.Return(m.Int32Constant(0)); |
| 1887 m.Bind(&blockb); |
| 1888 m.Return(m.Projection(0, node)); |
| 1889 m.SelectInstructions(); |
| 1890 CHECK_EQ(1, m.code.size()); |
| 1891 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); |
| 1892 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); |
| 1893 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); |
| 1894 CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); |
| 1895 CHECK_LE(2, m.code[0]->InputCount()); |
| 1896 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); |
| 1897 } |
| 1898 } |
| 1899 } |
| 1900 } |
| OLD | NEW |