| 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 <limits> | 5 #include <limits> |
| 6 | 6 |
| 7 #include "test/unittests/compiler/instruction-selector-unittest.h" | 7 #include "test/unittests/compiler/instruction-selector-unittest.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| 11 namespace compiler { | 11 namespace compiler { |
| 12 | 12 |
| 13 namespace { | 13 namespace { |
| 14 | 14 |
| 15 typedef RawMachineAssembler::Label MLabel; | |
| 16 typedef Node* (RawMachineAssembler::*Constructor)(Node*, Node*); | 15 typedef Node* (RawMachineAssembler::*Constructor)(Node*, Node*); |
| 17 | 16 |
| 18 | 17 |
| 19 // Data processing instructions. | 18 // Data processing instructions. |
| 20 struct DPI { | 19 struct DPI { |
| 21 Constructor constructor; | 20 Constructor constructor; |
| 22 const char* constructor_name; | 21 const char* constructor_name; |
| 23 ArchOpcode arch_opcode; | 22 ArchOpcode arch_opcode; |
| 24 ArchOpcode reverse_arch_opcode; | 23 ArchOpcode reverse_arch_opcode; |
| 25 ArchOpcode test_arch_opcode; | 24 ArchOpcode test_arch_opcode; |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 239 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); |
| 241 EXPECT_EQ(1U, s[0]->OutputCount()); | 240 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 242 } | 241 } |
| 243 } | 242 } |
| 244 } | 243 } |
| 245 | 244 |
| 246 | 245 |
| 247 TEST_P(InstructionSelectorDPITest, BranchWithParameters) { | 246 TEST_P(InstructionSelectorDPITest, BranchWithParameters) { |
| 248 const DPI dpi = GetParam(); | 247 const DPI dpi = GetParam(); |
| 249 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 248 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 250 MLabel a, b; | 249 RawMachineLabel a, b; |
| 251 m.Branch((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), &a, &b); | 250 m.Branch((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), &a, &b); |
| 252 m.Bind(&a); | 251 m.Bind(&a); |
| 253 m.Return(m.Int32Constant(1)); | 252 m.Return(m.Int32Constant(1)); |
| 254 m.Bind(&b); | 253 m.Bind(&b); |
| 255 m.Return(m.Int32Constant(0)); | 254 m.Return(m.Int32Constant(0)); |
| 256 Stream s = m.Build(); | 255 Stream s = m.Build(); |
| 257 ASSERT_EQ(1U, s.size()); | 256 ASSERT_EQ(1U, s.size()); |
| 258 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 257 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 259 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 258 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 260 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 259 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 261 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 260 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 262 } | 261 } |
| 263 | 262 |
| 264 | 263 |
| 265 TEST_P(InstructionSelectorDPITest, BranchWithImmediate) { | 264 TEST_P(InstructionSelectorDPITest, BranchWithImmediate) { |
| 266 const DPI dpi = GetParam(); | 265 const DPI dpi = GetParam(); |
| 267 TRACED_FOREACH(int32_t, imm, kImmediates) { | 266 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 268 StreamBuilder m(this, kMachInt32, kMachInt32); | 267 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 269 MLabel a, b; | 268 RawMachineLabel a, b; |
| 270 m.Branch((m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), &a, | 269 m.Branch((m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), &a, |
| 271 &b); | 270 &b); |
| 272 m.Bind(&a); | 271 m.Bind(&a); |
| 273 m.Return(m.Int32Constant(1)); | 272 m.Return(m.Int32Constant(1)); |
| 274 m.Bind(&b); | 273 m.Bind(&b); |
| 275 m.Return(m.Int32Constant(0)); | 274 m.Return(m.Int32Constant(0)); |
| 276 Stream s = m.Build(); | 275 Stream s = m.Build(); |
| 277 ASSERT_EQ(1U, s.size()); | 276 ASSERT_EQ(1U, s.size()); |
| 278 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 277 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 279 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 278 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 280 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 279 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 281 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 280 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 282 } | 281 } |
| 283 TRACED_FOREACH(int32_t, imm, kImmediates) { | 282 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 284 StreamBuilder m(this, kMachInt32, kMachInt32); | 283 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 285 MLabel a, b; | 284 RawMachineLabel a, b; |
| 286 m.Branch((m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)), &a, | 285 m.Branch((m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)), &a, |
| 287 &b); | 286 &b); |
| 288 m.Bind(&a); | 287 m.Bind(&a); |
| 289 m.Return(m.Int32Constant(1)); | 288 m.Return(m.Int32Constant(1)); |
| 290 m.Bind(&b); | 289 m.Bind(&b); |
| 291 m.Return(m.Int32Constant(0)); | 290 m.Return(m.Int32Constant(0)); |
| 292 Stream s = m.Build(); | 291 Stream s = m.Build(); |
| 293 ASSERT_EQ(1U, s.size()); | 292 ASSERT_EQ(1U, s.size()); |
| 294 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 293 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 295 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 294 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 296 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 295 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 297 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 296 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 298 } | 297 } |
| 299 } | 298 } |
| 300 | 299 |
| 301 | 300 |
| 302 TEST_P(InstructionSelectorDPITest, BranchWithShiftByParameter) { | 301 TEST_P(InstructionSelectorDPITest, BranchWithShiftByParameter) { |
| 303 const DPI dpi = GetParam(); | 302 const DPI dpi = GetParam(); |
| 304 TRACED_FOREACH(Shift, shift, kShifts) { | 303 TRACED_FOREACH(Shift, shift, kShifts) { |
| 305 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); | 304 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); |
| 306 MLabel a, b; | 305 RawMachineLabel a, b; |
| 307 m.Branch((m.*dpi.constructor)( | 306 m.Branch((m.*dpi.constructor)( |
| 308 m.Parameter(0), | 307 m.Parameter(0), |
| 309 (m.*shift.constructor)(m.Parameter(1), m.Parameter(2))), | 308 (m.*shift.constructor)(m.Parameter(1), m.Parameter(2))), |
| 310 &a, &b); | 309 &a, &b); |
| 311 m.Bind(&a); | 310 m.Bind(&a); |
| 312 m.Return(m.Int32Constant(1)); | 311 m.Return(m.Int32Constant(1)); |
| 313 m.Bind(&b); | 312 m.Bind(&b); |
| 314 m.Return(m.Int32Constant(0)); | 313 m.Return(m.Int32Constant(0)); |
| 315 Stream s = m.Build(); | 314 Stream s = m.Build(); |
| 316 ASSERT_EQ(1U, s.size()); | 315 ASSERT_EQ(1U, s.size()); |
| 317 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 316 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 318 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 317 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| 319 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 318 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 320 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 319 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 321 } | 320 } |
| 322 TRACED_FOREACH(Shift, shift, kShifts) { | 321 TRACED_FOREACH(Shift, shift, kShifts) { |
| 323 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); | 322 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); |
| 324 MLabel a, b; | 323 RawMachineLabel a, b; |
| 325 m.Branch((m.*dpi.constructor)( | 324 m.Branch((m.*dpi.constructor)( |
| 326 (m.*shift.constructor)(m.Parameter(0), m.Parameter(1)), | 325 (m.*shift.constructor)(m.Parameter(0), m.Parameter(1)), |
| 327 m.Parameter(2)), | 326 m.Parameter(2)), |
| 328 &a, &b); | 327 &a, &b); |
| 329 m.Bind(&a); | 328 m.Bind(&a); |
| 330 m.Return(m.Int32Constant(1)); | 329 m.Return(m.Int32Constant(1)); |
| 331 m.Bind(&b); | 330 m.Bind(&b); |
| 332 m.Return(m.Int32Constant(0)); | 331 m.Return(m.Int32Constant(0)); |
| 333 Stream s = m.Build(); | 332 Stream s = m.Build(); |
| 334 ASSERT_EQ(1U, s.size()); | 333 ASSERT_EQ(1U, s.size()); |
| 335 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 334 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 336 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 335 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| 337 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 336 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 338 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 337 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 339 } | 338 } |
| 340 } | 339 } |
| 341 | 340 |
| 342 | 341 |
| 343 TEST_P(InstructionSelectorDPITest, BranchWithShiftByImmediate) { | 342 TEST_P(InstructionSelectorDPITest, BranchWithShiftByImmediate) { |
| 344 const DPI dpi = GetParam(); | 343 const DPI dpi = GetParam(); |
| 345 TRACED_FOREACH(Shift, shift, kShifts) { | 344 TRACED_FOREACH(Shift, shift, kShifts) { |
| 346 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { | 345 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { |
| 347 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 346 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 348 MLabel a, b; | 347 RawMachineLabel a, b; |
| 349 m.Branch((m.*dpi.constructor)(m.Parameter(0), | 348 m.Branch((m.*dpi.constructor)(m.Parameter(0), |
| 350 (m.*shift.constructor)( | 349 (m.*shift.constructor)( |
| 351 m.Parameter(1), m.Int32Constant(imm))), | 350 m.Parameter(1), m.Int32Constant(imm))), |
| 352 &a, &b); | 351 &a, &b); |
| 353 m.Bind(&a); | 352 m.Bind(&a); |
| 354 m.Return(m.Int32Constant(1)); | 353 m.Return(m.Int32Constant(1)); |
| 355 m.Bind(&b); | 354 m.Bind(&b); |
| 356 m.Return(m.Int32Constant(0)); | 355 m.Return(m.Int32Constant(0)); |
| 357 Stream s = m.Build(); | 356 Stream s = m.Build(); |
| 358 ASSERT_EQ(1U, s.size()); | 357 ASSERT_EQ(1U, s.size()); |
| 359 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 358 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 360 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); | 359 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); |
| 361 ASSERT_EQ(5U, s[0]->InputCount()); | 360 ASSERT_EQ(5U, s[0]->InputCount()); |
| 362 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 361 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); |
| 363 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 362 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 364 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 363 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 365 } | 364 } |
| 366 } | 365 } |
| 367 TRACED_FOREACH(Shift, shift, kShifts) { | 366 TRACED_FOREACH(Shift, shift, kShifts) { |
| 368 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { | 367 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { |
| 369 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 368 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 370 MLabel a, b; | 369 RawMachineLabel a, b; |
| 371 m.Branch((m.*dpi.constructor)( | 370 m.Branch((m.*dpi.constructor)( |
| 372 (m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm)), | 371 (m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm)), |
| 373 m.Parameter(1)), | 372 m.Parameter(1)), |
| 374 &a, &b); | 373 &a, &b); |
| 375 m.Bind(&a); | 374 m.Bind(&a); |
| 376 m.Return(m.Int32Constant(1)); | 375 m.Return(m.Int32Constant(1)); |
| 377 m.Bind(&b); | 376 m.Bind(&b); |
| 378 m.Return(m.Int32Constant(0)); | 377 m.Return(m.Int32Constant(0)); |
| 379 Stream s = m.Build(); | 378 Stream s = m.Build(); |
| 380 ASSERT_EQ(1U, s.size()); | 379 ASSERT_EQ(1U, s.size()); |
| 381 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 380 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 382 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); | 381 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); |
| 383 ASSERT_EQ(5U, s[0]->InputCount()); | 382 ASSERT_EQ(5U, s[0]->InputCount()); |
| 384 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 383 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); |
| 385 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 384 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 386 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 385 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 387 } | 386 } |
| 388 } | 387 } |
| 389 } | 388 } |
| 390 | 389 |
| 391 | 390 |
| 392 TEST_P(InstructionSelectorDPITest, BranchIfZeroWithParameters) { | 391 TEST_P(InstructionSelectorDPITest, BranchIfZeroWithParameters) { |
| 393 const DPI dpi = GetParam(); | 392 const DPI dpi = GetParam(); |
| 394 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 393 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 395 MLabel a, b; | 394 RawMachineLabel a, b; |
| 396 m.Branch(m.Word32Equal((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), | 395 m.Branch(m.Word32Equal((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), |
| 397 m.Int32Constant(0)), | 396 m.Int32Constant(0)), |
| 398 &a, &b); | 397 &a, &b); |
| 399 m.Bind(&a); | 398 m.Bind(&a); |
| 400 m.Return(m.Int32Constant(1)); | 399 m.Return(m.Int32Constant(1)); |
| 401 m.Bind(&b); | 400 m.Bind(&b); |
| 402 m.Return(m.Int32Constant(0)); | 401 m.Return(m.Int32Constant(0)); |
| 403 Stream s = m.Build(); | 402 Stream s = m.Build(); |
| 404 ASSERT_EQ(1U, s.size()); | 403 ASSERT_EQ(1U, s.size()); |
| 405 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 404 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 406 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 405 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 407 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 406 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 408 EXPECT_EQ(kEqual, s[0]->flags_condition()); | 407 EXPECT_EQ(kEqual, s[0]->flags_condition()); |
| 409 } | 408 } |
| 410 | 409 |
| 411 | 410 |
| 412 TEST_P(InstructionSelectorDPITest, BranchIfNotZeroWithParameters) { | 411 TEST_P(InstructionSelectorDPITest, BranchIfNotZeroWithParameters) { |
| 413 const DPI dpi = GetParam(); | 412 const DPI dpi = GetParam(); |
| 414 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 413 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 415 MLabel a, b; | 414 RawMachineLabel a, b; |
| 416 m.Branch( | 415 m.Branch( |
| 417 m.Word32NotEqual((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), | 416 m.Word32NotEqual((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), |
| 418 m.Int32Constant(0)), | 417 m.Int32Constant(0)), |
| 419 &a, &b); | 418 &a, &b); |
| 420 m.Bind(&a); | 419 m.Bind(&a); |
| 421 m.Return(m.Int32Constant(1)); | 420 m.Return(m.Int32Constant(1)); |
| 422 m.Bind(&b); | 421 m.Bind(&b); |
| 423 m.Return(m.Int32Constant(0)); | 422 m.Return(m.Int32Constant(0)); |
| 424 Stream s = m.Build(); | 423 Stream s = m.Build(); |
| 425 ASSERT_EQ(1U, s.size()); | 424 ASSERT_EQ(1U, s.size()); |
| 426 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 425 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 427 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 426 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 428 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 427 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 429 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 428 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 430 } | 429 } |
| 431 | 430 |
| 432 | 431 |
| 433 TEST_P(InstructionSelectorDPITest, BranchIfZeroWithImmediate) { | 432 TEST_P(InstructionSelectorDPITest, BranchIfZeroWithImmediate) { |
| 434 const DPI dpi = GetParam(); | 433 const DPI dpi = GetParam(); |
| 435 TRACED_FOREACH(int32_t, imm, kImmediates) { | 434 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 436 StreamBuilder m(this, kMachInt32, kMachInt32); | 435 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 437 MLabel a, b; | 436 RawMachineLabel a, b; |
| 438 m.Branch(m.Word32Equal( | 437 m.Branch(m.Word32Equal( |
| 439 (m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), | 438 (m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), |
| 440 m.Int32Constant(0)), | 439 m.Int32Constant(0)), |
| 441 &a, &b); | 440 &a, &b); |
| 442 m.Bind(&a); | 441 m.Bind(&a); |
| 443 m.Return(m.Int32Constant(1)); | 442 m.Return(m.Int32Constant(1)); |
| 444 m.Bind(&b); | 443 m.Bind(&b); |
| 445 m.Return(m.Int32Constant(0)); | 444 m.Return(m.Int32Constant(0)); |
| 446 Stream s = m.Build(); | 445 Stream s = m.Build(); |
| 447 ASSERT_EQ(1U, s.size()); | 446 ASSERT_EQ(1U, s.size()); |
| 448 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 447 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 449 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 448 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 450 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 449 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 451 EXPECT_EQ(kEqual, s[0]->flags_condition()); | 450 EXPECT_EQ(kEqual, s[0]->flags_condition()); |
| 452 } | 451 } |
| 453 TRACED_FOREACH(int32_t, imm, kImmediates) { | 452 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 454 StreamBuilder m(this, kMachInt32, kMachInt32); | 453 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 455 MLabel a, b; | 454 RawMachineLabel a, b; |
| 456 m.Branch(m.Word32Equal( | 455 m.Branch(m.Word32Equal( |
| 457 (m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)), | 456 (m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)), |
| 458 m.Int32Constant(0)), | 457 m.Int32Constant(0)), |
| 459 &a, &b); | 458 &a, &b); |
| 460 m.Bind(&a); | 459 m.Bind(&a); |
| 461 m.Return(m.Int32Constant(1)); | 460 m.Return(m.Int32Constant(1)); |
| 462 m.Bind(&b); | 461 m.Bind(&b); |
| 463 m.Return(m.Int32Constant(0)); | 462 m.Return(m.Int32Constant(0)); |
| 464 Stream s = m.Build(); | 463 Stream s = m.Build(); |
| 465 ASSERT_EQ(1U, s.size()); | 464 ASSERT_EQ(1U, s.size()); |
| 466 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 465 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 467 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 466 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 468 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 467 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 469 EXPECT_EQ(kEqual, s[0]->flags_condition()); | 468 EXPECT_EQ(kEqual, s[0]->flags_condition()); |
| 470 } | 469 } |
| 471 } | 470 } |
| 472 | 471 |
| 473 | 472 |
| 474 TEST_P(InstructionSelectorDPITest, BranchIfNotZeroWithImmediate) { | 473 TEST_P(InstructionSelectorDPITest, BranchIfNotZeroWithImmediate) { |
| 475 const DPI dpi = GetParam(); | 474 const DPI dpi = GetParam(); |
| 476 TRACED_FOREACH(int32_t, imm, kImmediates) { | 475 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 477 StreamBuilder m(this, kMachInt32, kMachInt32); | 476 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 478 MLabel a, b; | 477 RawMachineLabel a, b; |
| 479 m.Branch(m.Word32NotEqual( | 478 m.Branch(m.Word32NotEqual( |
| 480 (m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), | 479 (m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), |
| 481 m.Int32Constant(0)), | 480 m.Int32Constant(0)), |
| 482 &a, &b); | 481 &a, &b); |
| 483 m.Bind(&a); | 482 m.Bind(&a); |
| 484 m.Return(m.Int32Constant(1)); | 483 m.Return(m.Int32Constant(1)); |
| 485 m.Bind(&b); | 484 m.Bind(&b); |
| 486 m.Return(m.Int32Constant(0)); | 485 m.Return(m.Int32Constant(0)); |
| 487 Stream s = m.Build(); | 486 Stream s = m.Build(); |
| 488 ASSERT_EQ(1U, s.size()); | 487 ASSERT_EQ(1U, s.size()); |
| 489 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 488 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 490 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 489 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 491 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 490 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 492 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 491 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 493 } | 492 } |
| 494 TRACED_FOREACH(int32_t, imm, kImmediates) { | 493 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 495 StreamBuilder m(this, kMachInt32, kMachInt32); | 494 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 496 MLabel a, b; | 495 RawMachineLabel a, b; |
| 497 m.Branch(m.Word32NotEqual( | 496 m.Branch(m.Word32NotEqual( |
| 498 (m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)), | 497 (m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)), |
| 499 m.Int32Constant(0)), | 498 m.Int32Constant(0)), |
| 500 &a, &b); | 499 &a, &b); |
| 501 m.Bind(&a); | 500 m.Bind(&a); |
| 502 m.Return(m.Int32Constant(1)); | 501 m.Return(m.Int32Constant(1)); |
| 503 m.Bind(&b); | 502 m.Bind(&b); |
| 504 m.Return(m.Int32Constant(0)); | 503 m.Return(m.Int32Constant(0)); |
| 505 Stream s = m.Build(); | 504 Stream s = m.Build(); |
| 506 ASSERT_EQ(1U, s.size()); | 505 ASSERT_EQ(1U, s.size()); |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 885 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 884 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 886 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 885 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 887 } | 886 } |
| 888 } | 887 } |
| 889 } | 888 } |
| 890 | 889 |
| 891 | 890 |
| 892 TEST_P(InstructionSelectorODPITest, BranchWithParameters) { | 891 TEST_P(InstructionSelectorODPITest, BranchWithParameters) { |
| 893 const ODPI odpi = GetParam(); | 892 const ODPI odpi = GetParam(); |
| 894 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 893 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 895 MLabel a, b; | 894 RawMachineLabel a, b; |
| 896 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); | 895 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); |
| 897 m.Branch(m.Projection(1, n), &a, &b); | 896 m.Branch(m.Projection(1, n), &a, &b); |
| 898 m.Bind(&a); | 897 m.Bind(&a); |
| 899 m.Return(m.Int32Constant(0)); | 898 m.Return(m.Int32Constant(0)); |
| 900 m.Bind(&b); | 899 m.Bind(&b); |
| 901 m.Return(m.Projection(0, n)); | 900 m.Return(m.Projection(0, n)); |
| 902 Stream s = m.Build(); | 901 Stream s = m.Build(); |
| 903 ASSERT_EQ(1U, s.size()); | 902 ASSERT_EQ(1U, s.size()); |
| 904 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 903 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 905 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 904 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 906 EXPECT_EQ(4U, s[0]->InputCount()); | 905 EXPECT_EQ(4U, s[0]->InputCount()); |
| 907 EXPECT_EQ(1U, s[0]->OutputCount()); | 906 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 908 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 907 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 909 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 908 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 910 } | 909 } |
| 911 | 910 |
| 912 | 911 |
| 913 TEST_P(InstructionSelectorODPITest, BranchWithImmediate) { | 912 TEST_P(InstructionSelectorODPITest, BranchWithImmediate) { |
| 914 const ODPI odpi = GetParam(); | 913 const ODPI odpi = GetParam(); |
| 915 TRACED_FOREACH(int32_t, imm, kImmediates) { | 914 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 916 StreamBuilder m(this, kMachInt32, kMachInt32); | 915 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 917 MLabel a, b; | 916 RawMachineLabel a, b; |
| 918 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm)); | 917 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm)); |
| 919 m.Branch(m.Projection(1, n), &a, &b); | 918 m.Branch(m.Projection(1, n), &a, &b); |
| 920 m.Bind(&a); | 919 m.Bind(&a); |
| 921 m.Return(m.Int32Constant(0)); | 920 m.Return(m.Int32Constant(0)); |
| 922 m.Bind(&b); | 921 m.Bind(&b); |
| 923 m.Return(m.Projection(0, n)); | 922 m.Return(m.Projection(0, n)); |
| 924 Stream s = m.Build(); | 923 Stream s = m.Build(); |
| 925 ASSERT_EQ(1U, s.size()); | 924 ASSERT_EQ(1U, s.size()); |
| 926 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 925 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 927 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 926 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 928 ASSERT_EQ(4U, s[0]->InputCount()); | 927 ASSERT_EQ(4U, s[0]->InputCount()); |
| 929 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); | 928 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); |
| 930 EXPECT_EQ(1U, s[0]->OutputCount()); | 929 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 931 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 930 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 932 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 931 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 933 } | 932 } |
| 934 TRACED_FOREACH(int32_t, imm, kImmediates) { | 933 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 935 StreamBuilder m(this, kMachInt32, kMachInt32); | 934 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 936 MLabel a, b; | 935 RawMachineLabel a, b; |
| 937 Node* n = (m.*odpi.constructor)(m.Int32Constant(imm), m.Parameter(0)); | 936 Node* n = (m.*odpi.constructor)(m.Int32Constant(imm), m.Parameter(0)); |
| 938 m.Branch(m.Projection(1, n), &a, &b); | 937 m.Branch(m.Projection(1, n), &a, &b); |
| 939 m.Bind(&a); | 938 m.Bind(&a); |
| 940 m.Return(m.Int32Constant(0)); | 939 m.Return(m.Int32Constant(0)); |
| 941 m.Bind(&b); | 940 m.Bind(&b); |
| 942 m.Return(m.Projection(0, n)); | 941 m.Return(m.Projection(0, n)); |
| 943 Stream s = m.Build(); | 942 Stream s = m.Build(); |
| 944 ASSERT_EQ(1U, s.size()); | 943 ASSERT_EQ(1U, s.size()); |
| 945 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode()); | 944 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode()); |
| 946 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 945 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 947 ASSERT_EQ(4U, s[0]->InputCount()); | 946 ASSERT_EQ(4U, s[0]->InputCount()); |
| 948 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); | 947 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); |
| 949 EXPECT_EQ(1U, s[0]->OutputCount()); | 948 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 950 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 949 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 951 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 950 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 952 } | 951 } |
| 953 } | 952 } |
| 954 | 953 |
| 955 | 954 |
| 956 TEST_P(InstructionSelectorODPITest, BranchIfZeroWithParameters) { | 955 TEST_P(InstructionSelectorODPITest, BranchIfZeroWithParameters) { |
| 957 const ODPI odpi = GetParam(); | 956 const ODPI odpi = GetParam(); |
| 958 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 957 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 959 MLabel a, b; | 958 RawMachineLabel a, b; |
| 960 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); | 959 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); |
| 961 m.Branch(m.Word32Equal(m.Projection(1, n), m.Int32Constant(0)), &a, &b); | 960 m.Branch(m.Word32Equal(m.Projection(1, n), m.Int32Constant(0)), &a, &b); |
| 962 m.Bind(&a); | 961 m.Bind(&a); |
| 963 m.Return(m.Projection(0, n)); | 962 m.Return(m.Projection(0, n)); |
| 964 m.Bind(&b); | 963 m.Bind(&b); |
| 965 m.Return(m.Int32Constant(0)); | 964 m.Return(m.Int32Constant(0)); |
| 966 Stream s = m.Build(); | 965 Stream s = m.Build(); |
| 967 ASSERT_EQ(1U, s.size()); | 966 ASSERT_EQ(1U, s.size()); |
| 968 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 967 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 969 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 968 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 970 EXPECT_EQ(4U, s[0]->InputCount()); | 969 EXPECT_EQ(4U, s[0]->InputCount()); |
| 971 EXPECT_EQ(1U, s[0]->OutputCount()); | 970 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 972 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 971 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 973 EXPECT_EQ(kNotOverflow, s[0]->flags_condition()); | 972 EXPECT_EQ(kNotOverflow, s[0]->flags_condition()); |
| 974 } | 973 } |
| 975 | 974 |
| 976 | 975 |
| 977 TEST_P(InstructionSelectorODPITest, BranchIfNotZeroWithParameters) { | 976 TEST_P(InstructionSelectorODPITest, BranchIfNotZeroWithParameters) { |
| 978 const ODPI odpi = GetParam(); | 977 const ODPI odpi = GetParam(); |
| 979 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 978 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 980 MLabel a, b; | 979 RawMachineLabel a, b; |
| 981 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); | 980 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); |
| 982 m.Branch(m.Word32NotEqual(m.Projection(1, n), m.Int32Constant(0)), &a, &b); | 981 m.Branch(m.Word32NotEqual(m.Projection(1, n), m.Int32Constant(0)), &a, &b); |
| 983 m.Bind(&a); | 982 m.Bind(&a); |
| 984 m.Return(m.Projection(0, n)); | 983 m.Return(m.Projection(0, n)); |
| 985 m.Bind(&b); | 984 m.Bind(&b); |
| 986 m.Return(m.Int32Constant(0)); | 985 m.Return(m.Int32Constant(0)); |
| 987 Stream s = m.Build(); | 986 Stream s = m.Build(); |
| 988 ASSERT_EQ(1U, s.size()); | 987 ASSERT_EQ(1U, s.size()); |
| 989 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 988 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 990 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 989 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| (...skipping 1789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2780 EXPECT_EQ(kArmClz, s[0]->arch_opcode()); | 2779 EXPECT_EQ(kArmClz, s[0]->arch_opcode()); |
| 2781 ASSERT_EQ(1U, s[0]->InputCount()); | 2780 ASSERT_EQ(1U, s[0]->InputCount()); |
| 2782 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); | 2781 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
| 2783 ASSERT_EQ(1U, s[0]->OutputCount()); | 2782 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 2784 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); | 2783 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 2785 } | 2784 } |
| 2786 | 2785 |
| 2787 } // namespace compiler | 2786 } // namespace compiler |
| 2788 } // namespace internal | 2787 } // namespace internal |
| 2789 } // namespace v8 | 2788 } // namespace v8 |
| OLD | NEW |