Chromium Code Reviews| 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 <functional> | 5 #include <functional> |
| 6 #include <limits> | 6 #include <limits> |
| 7 | 7 |
| 8 #include "test/cctest/cctest.h" | 8 #include "test/cctest/cctest.h" |
| 9 #include "test/cctest/compiler/codegen-tester.h" | 9 #include "test/cctest/compiler/codegen-tester.h" |
| 10 #include "test/cctest/compiler/value-helper.h" | 10 #include "test/cctest/compiler/value-helper.h" |
| 11 | 11 |
| 12 #if V8_TURBOFAN_TARGET | 12 #if V8_TURBOFAN_TARGET |
| 13 | 13 |
| 14 #define CHECK_UINT32_EQ(x, y) \ | |
|
Michael Starzinger
2014/08/13 15:40:05
*sigh*
Benedikt Meurer
2014/08/13 19:42:07
CheckEqualsHelper for unsigned.
titzer
2014/08/14 07:50:18
I tried that. C++ doesn't like ambiguous overloads
| |
| 15 CHECK_EQ(static_cast<int32_t>(x), static_cast<int32_t>(y)) | |
| 16 | |
| 14 using namespace v8::internal; | 17 using namespace v8::internal; |
| 15 using namespace v8::internal::compiler; | 18 using namespace v8::internal::compiler; |
| 16 | 19 |
| 17 typedef RawMachineAssembler::Label MLabel; | 20 typedef RawMachineAssembler::Label MLabel; |
| 18 | 21 |
| 19 TEST(RunInt32Add) { | 22 TEST(RunInt32Add) { |
| 20 RawMachineAssemblerTester<int32_t> m; | 23 RawMachineAssemblerTester<int32_t> m; |
| 21 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); | 24 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); |
| 22 m.Return(add); | 25 m.Return(add); |
| 23 CHECK_EQ(1, m.Call()); | 26 CHECK_EQ(1, m.Call()); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 34 return m->Int32Constant(0); | 37 return m->Int32Constant(0); |
| 35 case 3: | 38 case 3: |
| 36 return m->Int32Constant(1); | 39 return m->Int32Constant(1); |
| 37 case 4: | 40 case 4: |
| 38 return m->Int32Constant(-1); | 41 return m->Int32Constant(-1); |
| 39 case 5: | 42 case 5: |
| 40 return m->Int32Constant(0xff); | 43 return m->Int32Constant(0xff); |
| 41 case 6: | 44 case 6: |
| 42 return m->Int32Constant(0x01234567); | 45 return m->Int32Constant(0x01234567); |
| 43 case 7: | 46 case 7: |
| 44 return m->Load(kMachineWord32, m->PointerConstant(NULL)); | 47 return m->Load(mInt32, m->PointerConstant(NULL)); |
| 45 default: | 48 default: |
| 46 return NULL; | 49 return NULL; |
| 47 } | 50 } |
| 48 } | 51 } |
| 49 | 52 |
| 50 | 53 |
| 51 TEST(CodeGenInt32Binop) { | 54 TEST(CodeGenInt32Binop) { |
| 52 RawMachineAssemblerTester<void> m; | 55 RawMachineAssemblerTester<void> m; |
| 53 | 56 |
| 54 Operator* ops[] = { | 57 Operator* ops[] = { |
| 55 m.machine()->Word32And(), m.machine()->Word32Or(), | 58 m.machine()->Word32And(), m.machine()->Word32Or(), |
| 56 m.machine()->Word32Xor(), m.machine()->Word32Shl(), | 59 m.machine()->Word32Xor(), m.machine()->Word32Shl(), |
| 57 m.machine()->Word32Shr(), m.machine()->Word32Sar(), | 60 m.machine()->Word32Shr(), m.machine()->Word32Sar(), |
| 58 m.machine()->Word32Equal(), m.machine()->Int32Add(), | 61 m.machine()->Word32Equal(), m.machine()->Int32Add(), |
| 59 m.machine()->Int32Sub(), m.machine()->Int32Mul(), | 62 m.machine()->Int32Sub(), m.machine()->Int32Mul(), |
| 60 m.machine()->Int32Div(), m.machine()->Int32UDiv(), | 63 m.machine()->Int32Div(), m.machine()->Int32UDiv(), |
| 61 m.machine()->Int32Mod(), m.machine()->Int32UMod(), | 64 m.machine()->Int32Mod(), m.machine()->Int32UMod(), |
| 62 m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(), | 65 m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(), |
| 63 m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual(), | 66 m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual(), |
| 64 NULL}; | 67 NULL}; |
| 65 | 68 |
| 66 for (int i = 0; ops[i] != NULL; i++) { | 69 for (int i = 0; ops[i] != NULL; i++) { |
| 67 for (int j = 0; j < 8; j++) { | 70 for (int j = 0; j < 8; j++) { |
| 68 for (int k = 0; k < 8; k++) { | 71 for (int k = 0; k < 8; k++) { |
| 69 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | 72 RawMachineAssemblerTester<int32_t> m(mInt32, mInt32); |
| 70 Node* a = Int32Input(&m, j); | 73 Node* a = Int32Input(&m, j); |
| 71 Node* b = Int32Input(&m, k); | 74 Node* b = Int32Input(&m, k); |
| 72 m.Return(m.NewNode(ops[i], a, b)); | 75 m.Return(m.NewNode(ops[i], a, b)); |
| 73 m.GenerateCode(); | 76 m.GenerateCode(); |
| 74 } | 77 } |
| 75 } | 78 } |
| 76 } | 79 } |
| 77 } | 80 } |
| 78 | 81 |
| 79 | 82 |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 211 m->Bind(&blockb); | 214 m->Bind(&blockb); |
| 212 m->Goto(end); | 215 m->Goto(end); |
| 213 | 216 |
| 214 m->Bind(end); | 217 m->Bind(end); |
| 215 Node* phi = m->Phi(true_node, false_node); | 218 Node* phi = m->Phi(true_node, false_node); |
| 216 m->Return(phi); | 219 m->Return(phi); |
| 217 } | 220 } |
| 218 | 221 |
| 219 | 222 |
| 220 TEST(RunDiamondPhiConst) { | 223 TEST(RunDiamondPhiConst) { |
| 221 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 224 RawMachineAssemblerTester<int32_t> m(mInt32); |
| 222 int false_val = 0xFF666; | 225 int false_val = 0xFF666; |
| 223 int true_val = 0x00DDD; | 226 int true_val = 0x00DDD; |
| 224 Node* true_node = m.Int32Constant(true_val); | 227 Node* true_node = m.Int32Constant(true_val); |
| 225 Node* false_node = m.Int32Constant(false_val); | 228 Node* false_node = m.Int32Constant(false_val); |
| 226 BuildDiamondPhi(&m, m.Parameter(0), true_node, false_node); | 229 BuildDiamondPhi(&m, m.Parameter(0), true_node, false_node); |
| 227 CHECK_EQ(false_val, m.Call(0)); | 230 CHECK_EQ(false_val, m.Call(0)); |
| 228 CHECK_EQ(true_val, m.Call(1)); | 231 CHECK_EQ(true_val, m.Call(1)); |
| 229 } | 232 } |
| 230 | 233 |
| 231 | 234 |
| 232 TEST(RunDiamondPhiNumber) { | 235 TEST(RunDiamondPhiNumber) { |
| 233 RawMachineAssemblerTester<Object*> m(kMachineWord32); | 236 RawMachineAssemblerTester<Object*> m(mInt32); |
| 234 double false_val = -11.1; | 237 double false_val = -11.1; |
| 235 double true_val = 200.1; | 238 double true_val = 200.1; |
| 236 Node* true_node = m.NumberConstant(true_val); | 239 Node* true_node = m.NumberConstant(true_val); |
| 237 Node* false_node = m.NumberConstant(false_val); | 240 Node* false_node = m.NumberConstant(false_val); |
| 238 BuildDiamondPhi(&m, m.Parameter(0), true_node, false_node); | 241 BuildDiamondPhi(&m, m.Parameter(0), true_node, false_node); |
| 239 m.CheckNumber(false_val, m.Call(0)); | 242 m.CheckNumber(false_val, m.Call(0)); |
| 240 m.CheckNumber(true_val, m.Call(1)); | 243 m.CheckNumber(true_val, m.Call(1)); |
| 241 } | 244 } |
| 242 | 245 |
| 243 | 246 |
| 244 TEST(RunDiamondPhiString) { | 247 TEST(RunDiamondPhiString) { |
| 245 RawMachineAssemblerTester<Object*> m(kMachineWord32); | 248 RawMachineAssemblerTester<Object*> m(mInt32); |
| 246 const char* false_val = "false"; | 249 const char* false_val = "false"; |
| 247 const char* true_val = "true"; | 250 const char* true_val = "true"; |
| 248 Node* true_node = m.StringConstant(true_val); | 251 Node* true_node = m.StringConstant(true_val); |
| 249 Node* false_node = m.StringConstant(false_val); | 252 Node* false_node = m.StringConstant(false_val); |
| 250 BuildDiamondPhi(&m, m.Parameter(0), true_node, false_node); | 253 BuildDiamondPhi(&m, m.Parameter(0), true_node, false_node); |
| 251 m.CheckString(false_val, m.Call(0)); | 254 m.CheckString(false_val, m.Call(0)); |
| 252 m.CheckString(true_val, m.Call(1)); | 255 m.CheckString(true_val, m.Call(1)); |
| 253 } | 256 } |
| 254 | 257 |
| 255 | 258 |
| 256 TEST(RunDiamondPhiParam) { | 259 TEST(RunDiamondPhiParam) { |
| 257 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 260 RawMachineAssemblerTester<int32_t> m(mInt32, mInt32, mInt32); |
| 258 kMachineWord32); | |
| 259 BuildDiamondPhi(&m, m.Parameter(0), m.Parameter(1), m.Parameter(2)); | 261 BuildDiamondPhi(&m, m.Parameter(0), m.Parameter(1), m.Parameter(2)); |
| 260 int32_t c1 = 0x260cb75a; | 262 int32_t c1 = 0x260cb75a; |
| 261 int32_t c2 = 0xcd3e9c8b; | 263 int32_t c2 = 0xcd3e9c8b; |
| 262 int result = m.Call(0, c1, c2); | 264 int result = m.Call(0, c1, c2); |
| 263 CHECK_EQ(c2, result); | 265 CHECK_EQ(c2, result); |
| 264 result = m.Call(1, c1, c2); | 266 result = m.Call(1, c1, c2); |
| 265 CHECK_EQ(c1, result); | 267 CHECK_EQ(c1, result); |
| 266 } | 268 } |
| 267 | 269 |
| 268 | 270 |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 286 m.Bind(&body); | 288 m.Bind(&body); |
| 287 m.Goto(&header); | 289 m.Goto(&header); |
| 288 m.Bind(end); | 290 m.Bind(end); |
| 289 m.Return(phi); | 291 m.Return(phi); |
| 290 | 292 |
| 291 CHECK_EQ(false_val, m.Call()); | 293 CHECK_EQ(false_val, m.Call()); |
| 292 } | 294 } |
| 293 | 295 |
| 294 | 296 |
| 295 TEST(RunLoopPhiParam) { | 297 TEST(RunLoopPhiParam) { |
| 296 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 298 RawMachineAssemblerTester<int32_t> m(mInt32, mInt32, mInt32); |
| 297 kMachineWord32); | |
| 298 | 299 |
| 299 MLabel blocka, blockb; | 300 MLabel blocka, blockb; |
| 300 MLabel* end = m.Exit(); | 301 MLabel* end = m.Exit(); |
| 301 | 302 |
| 302 m.Goto(&blocka); | 303 m.Goto(&blocka); |
| 303 | 304 |
| 304 m.Bind(&blocka); | 305 m.Bind(&blocka); |
| 305 Node* phi = m.Phi(m.Parameter(1), m.Parameter(2)); | 306 Node* phi = m.Phi(m.Parameter(1), m.Parameter(2)); |
| 306 Node* cond = m.Phi(m.Parameter(0), m.Int32Constant(0)); | 307 Node* cond = m.Phi(m.Parameter(0), m.Int32Constant(0)); |
| 307 m.Branch(cond, &blockb, end); | 308 m.Branch(cond, &blockb, end); |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 485 m.Return(m.ChangeFloat64ToInt32(phi)); | 486 m.Return(m.ChangeFloat64ToInt32(phi)); |
| 486 | 487 |
| 487 CHECK_EQ(10, m.Call()); | 488 CHECK_EQ(10, m.Call()); |
| 488 } | 489 } |
| 489 | 490 |
| 490 | 491 |
| 491 TEST(RunLoadInt32) { | 492 TEST(RunLoadInt32) { |
| 492 RawMachineAssemblerTester<int32_t> m; | 493 RawMachineAssemblerTester<int32_t> m; |
| 493 | 494 |
| 494 int32_t p1 = 0; // loads directly from this location. | 495 int32_t p1 = 0; // loads directly from this location. |
| 495 m.Return(m.LoadFromPointer(&p1, kMachineWord32)); | 496 m.Return(m.LoadFromPointer(&p1, mInt32)); |
| 496 | 497 |
| 497 FOR_INT32_INPUTS(i) { | 498 FOR_INT32_INPUTS(i) { |
| 498 p1 = *i; | 499 p1 = *i; |
| 499 CHECK_EQ(p1, m.Call()); | 500 CHECK_EQ(p1, m.Call()); |
| 500 } | 501 } |
| 501 } | 502 } |
| 502 | 503 |
| 503 | 504 |
| 504 TEST(RunLoadInt32Offset) { | 505 TEST(RunLoadInt32Offset) { |
| 505 int32_t p1 = 0; // loads directly from this location. | 506 int32_t p1 = 0; // loads directly from this location. |
| 506 | 507 |
| 507 int32_t offsets[] = {-2000000, -100, -101, 1, 3, | 508 int32_t offsets[] = {-2000000, -100, -101, 1, 3, |
| 508 7, 120, 2000, 2000000000, 0xff}; | 509 7, 120, 2000, 2000000000, 0xff}; |
| 509 | 510 |
| 510 for (size_t i = 0; i < ARRAY_SIZE(offsets); i++) { | 511 for (size_t i = 0; i < ARRAY_SIZE(offsets); i++) { |
| 511 RawMachineAssemblerTester<int32_t> m; | 512 RawMachineAssemblerTester<int32_t> m; |
| 512 int32_t offset = offsets[i]; | 513 int32_t offset = offsets[i]; |
| 513 byte* pointer = reinterpret_cast<byte*>(&p1) - offset; | 514 byte* pointer = reinterpret_cast<byte*>(&p1) - offset; |
| 514 // generate load [#base + #index] | 515 // generate load [#base + #index] |
| 515 m.Return(m.LoadFromPointer(pointer, kMachineWord32, offset)); | 516 m.Return(m.LoadFromPointer(pointer, mInt32, offset)); |
| 516 | 517 |
| 517 FOR_INT32_INPUTS(j) { | 518 FOR_INT32_INPUTS(j) { |
| 518 p1 = *j; | 519 p1 = *j; |
| 519 CHECK_EQ(p1, m.Call()); | 520 CHECK_EQ(p1, m.Call()); |
| 520 } | 521 } |
| 521 } | 522 } |
| 522 } | 523 } |
| 523 | 524 |
| 524 | 525 |
| 525 TEST(RunLoadStoreFloat64Offset) { | 526 TEST(RunLoadStoreFloat64Offset) { |
| 526 double p1 = 0; // loads directly from this location. | 527 double p1 = 0; // loads directly from this location. |
| 527 double p2 = 0; // and stores directly into this location. | 528 double p2 = 0; // and stores directly into this location. |
| 528 | 529 |
| 529 FOR_INT32_INPUTS(i) { | 530 FOR_INT32_INPUTS(i) { |
| 530 int32_t magic = 0x2342aabb + *i * 3; | 531 int32_t magic = 0x2342aabb + *i * 3; |
| 531 RawMachineAssemblerTester<int32_t> m; | 532 RawMachineAssemblerTester<int32_t> m; |
| 532 int32_t offset = *i; | 533 int32_t offset = *i; |
| 533 byte* from = reinterpret_cast<byte*>(&p1) - offset; | 534 byte* from = reinterpret_cast<byte*>(&p1) - offset; |
| 534 byte* to = reinterpret_cast<byte*>(&p2) - offset; | 535 byte* to = reinterpret_cast<byte*>(&p2) - offset; |
| 535 // generate load [#base + #index] | 536 // generate load [#base + #index] |
| 536 Node* load = m.Load(kMachineFloat64, m.PointerConstant(from), | 537 Node* load = |
| 537 m.Int32Constant(offset)); | 538 m.Load(mFloat64, m.PointerConstant(from), m.Int32Constant(offset)); |
| 538 m.Store(kMachineFloat64, m.PointerConstant(to), m.Int32Constant(offset), | 539 m.Store(mFloat64, m.PointerConstant(to), m.Int32Constant(offset), load); |
| 539 load); | |
| 540 m.Return(m.Int32Constant(magic)); | 540 m.Return(m.Int32Constant(magic)); |
| 541 | 541 |
| 542 FOR_FLOAT64_INPUTS(j) { | 542 FOR_FLOAT64_INPUTS(j) { |
| 543 p1 = *j; | 543 p1 = *j; |
| 544 p2 = *j - 5; | 544 p2 = *j - 5; |
| 545 CHECK_EQ(magic, m.Call()); | 545 CHECK_EQ(magic, m.Call()); |
| 546 CHECK_EQ(p1, p2); | 546 CHECK_EQ(p1, p2); |
| 547 } | 547 } |
| 548 } | 548 } |
| 549 } | 549 } |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 560 // Use uint32_t because signed overflow is UB in C. | 560 // Use uint32_t because signed overflow is UB in C. |
| 561 int expected = static_cast<int32_t>(*i + *j); | 561 int expected = static_cast<int32_t>(*i + *j); |
| 562 CHECK_EQ(expected, bt.call(*i, *j)); | 562 CHECK_EQ(expected, bt.call(*i, *j)); |
| 563 } | 563 } |
| 564 } | 564 } |
| 565 } | 565 } |
| 566 | 566 |
| 567 | 567 |
| 568 TEST(RunInt32AddAndWord32SarP) { | 568 TEST(RunInt32AddAndWord32SarP) { |
| 569 { | 569 { |
| 570 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 570 RawMachineAssemblerTester<int32_t> m(mUint32, mInt32, mUint32); |
| 571 kMachineWord32); | |
| 572 m.Return(m.Int32Add(m.Parameter(0), | 571 m.Return(m.Int32Add(m.Parameter(0), |
| 573 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); | 572 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); |
| 574 FOR_UINT32_INPUTS(i) { | 573 FOR_UINT32_INPUTS(i) { |
| 575 FOR_INT32_INPUTS(j) { | 574 FOR_INT32_INPUTS(j) { |
| 576 FOR_UINT32_SHIFTS(shift) { | 575 FOR_UINT32_SHIFTS(shift) { |
| 577 // Use uint32_t because signed overflow is UB in C. | 576 // Use uint32_t because signed overflow is UB in C. |
| 578 int32_t expected = *i + (*j >> shift); | 577 int32_t expected = *i + (*j >> shift); |
| 579 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 578 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 580 } | 579 } |
| 581 } | 580 } |
| 582 } | 581 } |
| 583 } | 582 } |
| 584 { | 583 { |
| 585 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 584 RawMachineAssemblerTester<int32_t> m(mInt32, mUint32, mUint32); |
| 586 kMachineWord32); | |
| 587 m.Return(m.Int32Add(m.Word32Sar(m.Parameter(0), m.Parameter(1)), | 585 m.Return(m.Int32Add(m.Word32Sar(m.Parameter(0), m.Parameter(1)), |
| 588 m.Parameter(2))); | 586 m.Parameter(2))); |
| 589 FOR_INT32_INPUTS(i) { | 587 FOR_INT32_INPUTS(i) { |
| 590 FOR_UINT32_SHIFTS(shift) { | 588 FOR_UINT32_SHIFTS(shift) { |
| 591 FOR_UINT32_INPUTS(k) { | 589 FOR_UINT32_INPUTS(k) { |
| 592 // Use uint32_t because signed overflow is UB in C. | 590 // Use uint32_t because signed overflow is UB in C. |
| 593 int32_t expected = (*i >> shift) + *k; | 591 int32_t expected = (*i >> shift) + *k; |
| 594 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 592 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 595 } | 593 } |
| 596 } | 594 } |
| 597 } | 595 } |
| 598 } | 596 } |
| 599 } | 597 } |
| 600 | 598 |
| 601 | 599 |
| 602 TEST(RunInt32AddAndWord32ShlP) { | 600 TEST(RunInt32AddAndWord32ShlP) { |
| 603 { | 601 { |
| 604 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 602 RawMachineAssemblerTester<int32_t> m(mUint32, mInt32, mUint32); |
| 605 kMachineWord32); | |
| 606 m.Return(m.Int32Add(m.Parameter(0), | 603 m.Return(m.Int32Add(m.Parameter(0), |
| 607 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); | 604 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); |
| 608 FOR_UINT32_INPUTS(i) { | 605 FOR_UINT32_INPUTS(i) { |
| 609 FOR_INT32_INPUTS(j) { | 606 FOR_INT32_INPUTS(j) { |
| 610 FOR_UINT32_SHIFTS(shift) { | 607 FOR_UINT32_SHIFTS(shift) { |
| 611 // Use uint32_t because signed overflow is UB in C. | 608 // Use uint32_t because signed overflow is UB in C. |
| 612 int32_t expected = *i + (*j << shift); | 609 int32_t expected = *i + (*j << shift); |
| 613 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 610 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 614 } | 611 } |
| 615 } | 612 } |
| 616 } | 613 } |
| 617 } | 614 } |
| 618 { | 615 { |
| 619 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 616 RawMachineAssemblerTester<int32_t> m(mInt32, mUint32, mUint32); |
| 620 kMachineWord32); | |
| 621 m.Return(m.Int32Add(m.Word32Shl(m.Parameter(0), m.Parameter(1)), | 617 m.Return(m.Int32Add(m.Word32Shl(m.Parameter(0), m.Parameter(1)), |
| 622 m.Parameter(2))); | 618 m.Parameter(2))); |
| 623 FOR_INT32_INPUTS(i) { | 619 FOR_INT32_INPUTS(i) { |
| 624 FOR_UINT32_SHIFTS(shift) { | 620 FOR_UINT32_SHIFTS(shift) { |
| 625 FOR_UINT32_INPUTS(k) { | 621 FOR_UINT32_INPUTS(k) { |
| 626 // Use uint32_t because signed overflow is UB in C. | 622 // Use uint32_t because signed overflow is UB in C. |
| 627 int32_t expected = (*i << shift) + *k; | 623 int32_t expected = (*i << shift) + *k; |
| 628 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 624 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 629 } | 625 } |
| 630 } | 626 } |
| 631 } | 627 } |
| 632 } | 628 } |
| 633 } | 629 } |
| 634 | 630 |
| 635 | 631 |
| 636 TEST(RunInt32AddAndWord32ShrP) { | 632 TEST(RunInt32AddAndWord32ShrP) { |
| 637 { | 633 { |
| 638 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 634 RawMachineAssemblerTester<int32_t> m(mUint32, mUint32, mUint32); |
| 639 kMachineWord32); | |
| 640 m.Return(m.Int32Add(m.Parameter(0), | 635 m.Return(m.Int32Add(m.Parameter(0), |
| 641 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); | 636 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); |
| 642 FOR_UINT32_INPUTS(i) { | 637 FOR_UINT32_INPUTS(i) { |
| 643 FOR_UINT32_INPUTS(j) { | 638 FOR_UINT32_INPUTS(j) { |
| 644 FOR_UINT32_SHIFTS(shift) { | 639 FOR_UINT32_SHIFTS(shift) { |
| 645 // Use uint32_t because signed overflow is UB in C. | 640 // Use uint32_t because signed overflow is UB in C. |
| 646 int32_t expected = *i + (*j >> shift); | 641 int32_t expected = *i + (*j >> shift); |
| 647 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 642 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 648 } | 643 } |
| 649 } | 644 } |
| 650 } | 645 } |
| 651 } | 646 } |
| 652 { | 647 { |
| 653 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 648 RawMachineAssemblerTester<int32_t> m(mUint32, mUint32, mUint32); |
| 654 kMachineWord32); | |
| 655 m.Return(m.Int32Add(m.Word32Shr(m.Parameter(0), m.Parameter(1)), | 649 m.Return(m.Int32Add(m.Word32Shr(m.Parameter(0), m.Parameter(1)), |
| 656 m.Parameter(2))); | 650 m.Parameter(2))); |
| 657 FOR_UINT32_INPUTS(i) { | 651 FOR_UINT32_INPUTS(i) { |
| 658 FOR_UINT32_SHIFTS(shift) { | 652 FOR_UINT32_SHIFTS(shift) { |
| 659 FOR_UINT32_INPUTS(k) { | 653 FOR_UINT32_INPUTS(k) { |
| 660 // Use uint32_t because signed overflow is UB in C. | 654 // Use uint32_t because signed overflow is UB in C. |
| 661 int32_t expected = (*i >> shift) + *k; | 655 int32_t expected = (*i >> shift) + *k; |
| 662 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 656 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 663 } | 657 } |
| 664 } | 658 } |
| 665 } | 659 } |
| 666 } | 660 } |
| 667 } | 661 } |
| 668 | 662 |
| 669 | 663 |
| 670 TEST(RunInt32AddInBranch) { | 664 TEST(RunInt32AddInBranch) { |
| 671 static const int32_t constant = 987654321; | 665 static const int32_t constant = 987654321; |
| 672 { | 666 { |
| 673 RawMachineAssemblerTester<int32_t> m; | 667 RawMachineAssemblerTester<int32_t> m; |
| 674 Int32BinopTester bt(&m); | 668 Uint32BinopTester bt(&m); |
| 675 MLabel blocka, blockb; | 669 MLabel blocka, blockb; |
| 676 m.Branch( | 670 m.Branch( |
| 677 m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)), | 671 m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)), |
| 678 &blocka, &blockb); | 672 &blocka, &blockb); |
| 679 m.Bind(&blocka); | 673 m.Bind(&blocka); |
| 680 bt.AddReturn(m.Int32Constant(constant)); | 674 bt.AddReturn(m.Int32Constant(constant)); |
| 681 m.Bind(&blockb); | 675 m.Bind(&blockb); |
| 682 bt.AddReturn(m.Int32Constant(0 - constant)); | 676 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 683 FOR_UINT32_INPUTS(i) { | 677 FOR_UINT32_INPUTS(i) { |
| 684 FOR_UINT32_INPUTS(j) { | 678 FOR_UINT32_INPUTS(j) { |
| 685 int32_t expected = (*i + *j) == 0 ? constant : 0 - constant; | 679 int32_t expected = (*i + *j) == 0 ? constant : 0 - constant; |
| 686 CHECK_EQ(expected, bt.call(*i, *j)); | 680 CHECK_EQ(expected, bt.call(*i, *j)); |
| 687 } | 681 } |
| 688 } | 682 } |
| 689 } | 683 } |
| 690 { | 684 { |
| 691 RawMachineAssemblerTester<int32_t> m; | 685 RawMachineAssemblerTester<int32_t> m; |
| 692 Int32BinopTester bt(&m); | 686 Uint32BinopTester bt(&m); |
| 693 MLabel blocka, blockb; | 687 MLabel blocka, blockb; |
| 694 m.Branch( | 688 m.Branch( |
| 695 m.Word32NotEqual(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)), | 689 m.Word32NotEqual(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)), |
| 696 &blocka, &blockb); | 690 &blocka, &blockb); |
| 697 m.Bind(&blocka); | 691 m.Bind(&blocka); |
| 698 bt.AddReturn(m.Int32Constant(constant)); | 692 bt.AddReturn(m.Int32Constant(constant)); |
| 699 m.Bind(&blockb); | 693 m.Bind(&blockb); |
| 700 bt.AddReturn(m.Int32Constant(0 - constant)); | 694 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 701 FOR_UINT32_INPUTS(i) { | 695 FOR_UINT32_INPUTS(i) { |
| 702 FOR_UINT32_INPUTS(j) { | 696 FOR_UINT32_INPUTS(j) { |
| 703 int32_t expected = (*i + *j) != 0 ? constant : 0 - constant; | 697 int32_t expected = (*i + *j) != 0 ? constant : 0 - constant; |
| 704 CHECK_EQ(expected, bt.call(*i, *j)); | 698 CHECK_EQ(expected, bt.call(*i, *j)); |
| 705 } | 699 } |
| 706 } | 700 } |
| 707 } | 701 } |
| 708 { | 702 { |
| 709 FOR_UINT32_INPUTS(i) { | 703 FOR_UINT32_INPUTS(i) { |
| 710 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 704 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 711 MLabel blocka, blockb; | 705 MLabel blocka, blockb; |
| 712 m.Branch(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), | 706 m.Branch(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), |
| 713 m.Int32Constant(0)), | 707 m.Int32Constant(0)), |
| 714 &blocka, &blockb); | 708 &blocka, &blockb); |
| 715 m.Bind(&blocka); | 709 m.Bind(&blocka); |
| 716 m.Return(m.Int32Constant(constant)); | 710 m.Return(m.Int32Constant(constant)); |
| 717 m.Bind(&blockb); | 711 m.Bind(&blockb); |
| 718 m.Return(m.Int32Constant(0 - constant)); | 712 m.Return(m.Int32Constant(0 - constant)); |
| 719 FOR_UINT32_INPUTS(j) { | 713 FOR_UINT32_INPUTS(j) { |
| 720 int32_t expected = (*i + *j) == 0 ? constant : 0 - constant; | 714 uint32_t expected = (*i + *j) == 0 ? constant : 0 - constant; |
| 721 CHECK_EQ(expected, m.Call(*j)); | 715 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 722 } | 716 } |
| 723 } | 717 } |
| 724 } | 718 } |
| 725 { | 719 { |
| 726 FOR_UINT32_INPUTS(i) { | 720 FOR_UINT32_INPUTS(i) { |
| 727 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 721 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 728 MLabel blocka, blockb; | 722 MLabel blocka, blockb; |
| 729 m.Branch(m.Word32NotEqual(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), | 723 m.Branch(m.Word32NotEqual(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), |
| 730 m.Int32Constant(0)), | 724 m.Int32Constant(0)), |
| 731 &blocka, &blockb); | 725 &blocka, &blockb); |
| 732 m.Bind(&blocka); | 726 m.Bind(&blocka); |
| 733 m.Return(m.Int32Constant(constant)); | 727 m.Return(m.Int32Constant(constant)); |
| 734 m.Bind(&blockb); | 728 m.Bind(&blockb); |
| 735 m.Return(m.Int32Constant(0 - constant)); | 729 m.Return(m.Int32Constant(0 - constant)); |
| 736 FOR_UINT32_INPUTS(j) { | 730 FOR_UINT32_INPUTS(j) { |
| 737 int32_t expected = (*i + *j) != 0 ? constant : 0 - constant; | 731 uint32_t expected = (*i + *j) != 0 ? constant : 0 - constant; |
| 738 CHECK_EQ(expected, m.Call(*j)); | 732 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 739 } | 733 } |
| 740 } | 734 } |
| 741 } | 735 } |
| 742 { | 736 { |
| 743 RawMachineAssemblerTester<void> m; | 737 RawMachineAssemblerTester<void> m; |
| 744 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 738 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
| 745 m.machine()->Word32Shr()}; | 739 m.machine()->Word32Shr()}; |
| 746 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 740 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
| 747 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 741 RawMachineAssemblerTester<int32_t> m(mUint32, mInt32, mUint32); |
| 748 kMachineWord32); | |
| 749 MLabel blocka, blockb; | 742 MLabel blocka, blockb; |
| 750 m.Branch(m.Word32Equal(m.Int32Add(m.Parameter(0), | 743 m.Branch(m.Word32Equal(m.Int32Add(m.Parameter(0), |
| 751 m.NewNode(shops[n], m.Parameter(1), | 744 m.NewNode(shops[n], m.Parameter(1), |
| 752 m.Parameter(2))), | 745 m.Parameter(2))), |
| 753 m.Int32Constant(0)), | 746 m.Int32Constant(0)), |
| 754 &blocka, &blockb); | 747 &blocka, &blockb); |
| 755 m.Bind(&blocka); | 748 m.Bind(&blocka); |
| 756 m.Return(m.Int32Constant(constant)); | 749 m.Return(m.Int32Constant(constant)); |
| 757 m.Bind(&blockb); | 750 m.Bind(&blockb); |
| 758 m.Return(m.Int32Constant(0 - constant)); | 751 m.Return(m.Int32Constant(0 - constant)); |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 779 } | 772 } |
| 780 } | 773 } |
| 781 } | 774 } |
| 782 } | 775 } |
| 783 } | 776 } |
| 784 | 777 |
| 785 | 778 |
| 786 TEST(RunInt32AddInComparison) { | 779 TEST(RunInt32AddInComparison) { |
| 787 { | 780 { |
| 788 RawMachineAssemblerTester<int32_t> m; | 781 RawMachineAssemblerTester<int32_t> m; |
| 789 Int32BinopTester bt(&m); | 782 Uint32BinopTester bt(&m); |
| 790 bt.AddReturn( | 783 bt.AddReturn( |
| 791 m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0))); | 784 m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0))); |
| 792 FOR_UINT32_INPUTS(i) { | 785 FOR_UINT32_INPUTS(i) { |
| 793 FOR_UINT32_INPUTS(j) { | 786 FOR_UINT32_INPUTS(j) { |
| 794 int32_t expected = (*i + *j) == 0; | 787 uint32_t expected = (*i + *j) == 0; |
| 795 CHECK_EQ(expected, bt.call(*i, *j)); | 788 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 796 } | 789 } |
| 797 } | 790 } |
| 798 } | 791 } |
| 799 { | 792 { |
| 800 RawMachineAssemblerTester<int32_t> m; | 793 RawMachineAssemblerTester<int32_t> m; |
| 801 Int32BinopTester bt(&m); | 794 Uint32BinopTester bt(&m); |
| 802 bt.AddReturn( | 795 bt.AddReturn( |
| 803 m.Word32Equal(m.Int32Constant(0), m.Int32Add(bt.param0, bt.param1))); | 796 m.Word32Equal(m.Int32Constant(0), m.Int32Add(bt.param0, bt.param1))); |
| 804 FOR_UINT32_INPUTS(i) { | 797 FOR_UINT32_INPUTS(i) { |
| 805 FOR_UINT32_INPUTS(j) { | 798 FOR_UINT32_INPUTS(j) { |
| 806 int32_t expected = (*i + *j) == 0; | 799 uint32_t expected = (*i + *j) == 0; |
| 807 CHECK_EQ(expected, bt.call(*i, *j)); | 800 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 808 } | 801 } |
| 809 } | 802 } |
| 810 } | 803 } |
| 811 { | 804 { |
| 812 FOR_UINT32_INPUTS(i) { | 805 FOR_UINT32_INPUTS(i) { |
| 813 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 806 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 814 m.Return(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), | 807 m.Return(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), |
| 815 m.Int32Constant(0))); | 808 m.Int32Constant(0))); |
| 816 FOR_UINT32_INPUTS(j) { | 809 FOR_UINT32_INPUTS(j) { |
| 817 int32_t expected = (*i + *j) == 0; | 810 uint32_t expected = (*i + *j) == 0; |
| 818 CHECK_EQ(expected, m.Call(*j)); | 811 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 819 } | 812 } |
| 820 } | 813 } |
| 821 } | 814 } |
| 822 { | 815 { |
| 823 FOR_UINT32_INPUTS(i) { | 816 FOR_UINT32_INPUTS(i) { |
| 824 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 817 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 825 m.Return(m.Word32Equal(m.Int32Add(m.Parameter(0), m.Int32Constant(*i)), | 818 m.Return(m.Word32Equal(m.Int32Add(m.Parameter(0), m.Int32Constant(*i)), |
| 826 m.Int32Constant(0))); | 819 m.Int32Constant(0))); |
| 827 FOR_UINT32_INPUTS(j) { | 820 FOR_UINT32_INPUTS(j) { |
| 828 int32_t expected = (*j + *i) == 0; | 821 uint32_t expected = (*j + *i) == 0; |
| 829 CHECK_EQ(expected, m.Call(*j)); | 822 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 830 } | 823 } |
| 831 } | 824 } |
| 832 } | 825 } |
| 833 { | 826 { |
| 834 RawMachineAssemblerTester<void> m; | 827 RawMachineAssemblerTester<void> m; |
| 835 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 828 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
| 836 m.machine()->Word32Shr()}; | 829 m.machine()->Word32Shr()}; |
| 837 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 830 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
| 838 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 831 RawMachineAssemblerTester<int32_t> m(mUint32, mInt32, mUint32); |
| 839 kMachineWord32); | |
| 840 m.Return(m.Word32Equal( | 832 m.Return(m.Word32Equal( |
| 841 m.Int32Add(m.Parameter(0), | 833 m.Int32Add(m.Parameter(0), |
| 842 m.NewNode(shops[n], m.Parameter(1), m.Parameter(2))), | 834 m.NewNode(shops[n], m.Parameter(1), m.Parameter(2))), |
| 843 m.Int32Constant(0))); | 835 m.Int32Constant(0))); |
| 844 FOR_UINT32_INPUTS(i) { | 836 FOR_UINT32_INPUTS(i) { |
| 845 FOR_INT32_INPUTS(j) { | 837 FOR_INT32_INPUTS(j) { |
| 846 FOR_UINT32_SHIFTS(shift) { | 838 FOR_UINT32_SHIFTS(shift) { |
| 847 int32_t right; | 839 int32_t right; |
| 848 switch (shops[n]->opcode()) { | 840 switch (shops[n]->opcode()) { |
| 849 default: | 841 default: |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 863 } | 855 } |
| 864 } | 856 } |
| 865 } | 857 } |
| 866 } | 858 } |
| 867 } | 859 } |
| 868 } | 860 } |
| 869 | 861 |
| 870 | 862 |
| 871 TEST(RunInt32SubP) { | 863 TEST(RunInt32SubP) { |
| 872 RawMachineAssemblerTester<int32_t> m; | 864 RawMachineAssemblerTester<int32_t> m; |
| 873 Int32BinopTester bt(&m); | 865 Uint32BinopTester bt(&m); |
| 874 | 866 |
| 875 m.Return(m.Int32Sub(bt.param0, bt.param1)); | 867 m.Return(m.Int32Sub(bt.param0, bt.param1)); |
| 876 | 868 |
| 877 FOR_UINT32_INPUTS(i) { | 869 FOR_UINT32_INPUTS(i) { |
| 878 FOR_UINT32_INPUTS(j) { | 870 FOR_UINT32_INPUTS(j) { |
| 879 // Use uint32_t because signed overflow is UB in C. | 871 uint32_t expected = static_cast<int32_t>(*i - *j); |
| 880 int expected = static_cast<int32_t>(*i - *j); | 872 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 881 CHECK_EQ(expected, bt.call(*i, *j)); | |
| 882 } | 873 } |
| 883 } | 874 } |
| 884 } | 875 } |
| 885 | 876 |
| 886 | 877 |
| 887 TEST(RunInt32SubImm) { | 878 TEST(RunInt32SubImm) { |
| 888 { | 879 { |
| 889 FOR_UINT32_INPUTS(i) { | 880 FOR_UINT32_INPUTS(i) { |
| 890 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 881 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 891 m.Return(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0))); | 882 m.Return(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0))); |
| 892 FOR_UINT32_INPUTS(j) { | 883 FOR_UINT32_INPUTS(j) { |
| 893 // Use uint32_t because signed overflow is UB in C. | 884 uint32_t expected = *i - *j; |
| 894 int32_t expected = static_cast<int32_t>(*i - *j); | 885 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 895 CHECK_EQ(expected, m.Call(*j)); | |
| 896 } | 886 } |
| 897 } | 887 } |
| 898 } | 888 } |
| 899 { | 889 { |
| 900 FOR_UINT32_INPUTS(i) { | 890 FOR_UINT32_INPUTS(i) { |
| 901 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 891 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 902 m.Return(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i))); | 892 m.Return(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i))); |
| 903 FOR_UINT32_INPUTS(j) { | 893 FOR_UINT32_INPUTS(j) { |
| 904 // Use uint32_t because signed overflow is UB in C. | 894 uint32_t expected = *j - *i; |
| 905 int32_t expected = static_cast<int32_t>(*j - *i); | 895 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 906 CHECK_EQ(expected, m.Call(*j)); | |
| 907 } | 896 } |
| 908 } | 897 } |
| 909 } | 898 } |
| 910 } | 899 } |
| 911 | 900 |
| 912 | 901 |
| 913 TEST(RunInt32SubAndWord32SarP) { | 902 TEST(RunInt32SubAndWord32SarP) { |
| 914 { | 903 { |
| 915 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 904 RawMachineAssemblerTester<int32_t> m(mUint32, mInt32, mUint32); |
| 916 kMachineWord32); | |
| 917 m.Return(m.Int32Sub(m.Parameter(0), | 905 m.Return(m.Int32Sub(m.Parameter(0), |
| 918 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); | 906 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); |
| 919 FOR_UINT32_INPUTS(i) { | 907 FOR_UINT32_INPUTS(i) { |
| 920 FOR_INT32_INPUTS(j) { | 908 FOR_INT32_INPUTS(j) { |
| 921 FOR_UINT32_SHIFTS(shift) { | 909 FOR_UINT32_SHIFTS(shift) { |
| 922 // Use uint32_t because signed overflow is UB in C. | |
| 923 int32_t expected = *i - (*j >> shift); | 910 int32_t expected = *i - (*j >> shift); |
| 924 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 911 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 925 } | 912 } |
| 926 } | 913 } |
| 927 } | 914 } |
| 928 } | 915 } |
| 929 { | 916 { |
| 930 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 917 RawMachineAssemblerTester<int32_t> m(mInt32, mUint32, mUint32); |
| 931 kMachineWord32); | |
| 932 m.Return(m.Int32Sub(m.Word32Sar(m.Parameter(0), m.Parameter(1)), | 918 m.Return(m.Int32Sub(m.Word32Sar(m.Parameter(0), m.Parameter(1)), |
| 933 m.Parameter(2))); | 919 m.Parameter(2))); |
| 934 FOR_INT32_INPUTS(i) { | 920 FOR_INT32_INPUTS(i) { |
| 935 FOR_UINT32_SHIFTS(shift) { | 921 FOR_UINT32_SHIFTS(shift) { |
| 936 FOR_UINT32_INPUTS(k) { | 922 FOR_UINT32_INPUTS(k) { |
| 937 // Use uint32_t because signed overflow is UB in C. | |
| 938 int32_t expected = (*i >> shift) - *k; | 923 int32_t expected = (*i >> shift) - *k; |
| 939 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 924 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 940 } | 925 } |
| 941 } | 926 } |
| 942 } | 927 } |
| 943 } | 928 } |
| 944 } | 929 } |
| 945 | 930 |
| 946 | 931 |
| 947 TEST(RunInt32SubAndWord32ShlP) { | 932 TEST(RunInt32SubAndWord32ShlP) { |
| 948 { | 933 { |
| 949 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 934 RawMachineAssemblerTester<int32_t> m(mUint32, mInt32, mUint32); |
| 950 kMachineWord32); | |
| 951 m.Return(m.Int32Sub(m.Parameter(0), | 935 m.Return(m.Int32Sub(m.Parameter(0), |
| 952 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); | 936 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); |
| 953 FOR_UINT32_INPUTS(i) { | 937 FOR_UINT32_INPUTS(i) { |
| 954 FOR_INT32_INPUTS(j) { | 938 FOR_INT32_INPUTS(j) { |
| 955 FOR_UINT32_SHIFTS(shift) { | 939 FOR_UINT32_SHIFTS(shift) { |
| 956 // Use uint32_t because signed overflow is UB in C. | |
| 957 int32_t expected = *i - (*j << shift); | 940 int32_t expected = *i - (*j << shift); |
| 958 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 941 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 959 } | 942 } |
| 960 } | 943 } |
| 961 } | 944 } |
| 962 } | 945 } |
| 963 { | 946 { |
| 964 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 947 RawMachineAssemblerTester<int32_t> m(mInt32, mUint32, mUint32); |
| 965 kMachineWord32); | |
| 966 m.Return(m.Int32Sub(m.Word32Shl(m.Parameter(0), m.Parameter(1)), | 948 m.Return(m.Int32Sub(m.Word32Shl(m.Parameter(0), m.Parameter(1)), |
| 967 m.Parameter(2))); | 949 m.Parameter(2))); |
| 968 FOR_INT32_INPUTS(i) { | 950 FOR_INT32_INPUTS(i) { |
| 969 FOR_UINT32_SHIFTS(shift) { | 951 FOR_UINT32_SHIFTS(shift) { |
| 970 FOR_UINT32_INPUTS(k) { | 952 FOR_UINT32_INPUTS(k) { |
| 971 // Use uint32_t because signed overflow is UB in C. | 953 // Use uint32_t because signed overflow is UB in C. |
| 972 int32_t expected = (*i << shift) - *k; | 954 int32_t expected = (*i << shift) - *k; |
| 973 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 955 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 974 } | 956 } |
| 975 } | 957 } |
| 976 } | 958 } |
| 977 } | 959 } |
| 978 } | 960 } |
| 979 | 961 |
| 980 | 962 |
| 981 TEST(RunInt32SubAndWord32ShrP) { | 963 TEST(RunInt32SubAndWord32ShrP) { |
| 982 { | 964 { |
| 983 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 965 RawMachineAssemblerTester<uint32_t> m(mUint32, mUint32, mUint32); |
| 984 kMachineWord32); | |
| 985 m.Return(m.Int32Sub(m.Parameter(0), | 966 m.Return(m.Int32Sub(m.Parameter(0), |
| 986 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); | 967 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); |
| 987 FOR_UINT32_INPUTS(i) { | 968 FOR_UINT32_INPUTS(i) { |
| 988 FOR_UINT32_INPUTS(j) { | 969 FOR_UINT32_INPUTS(j) { |
| 989 FOR_UINT32_SHIFTS(shift) { | 970 FOR_UINT32_SHIFTS(shift) { |
| 990 // Use uint32_t because signed overflow is UB in C. | 971 // Use uint32_t because signed overflow is UB in C. |
| 991 int32_t expected = *i - (*j >> shift); | 972 int32_t expected = *i - (*j >> shift); |
| 992 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 973 CHECK_UINT32_EQ(expected, m.Call(*i, *j, shift)); |
| 993 } | 974 } |
| 994 } | 975 } |
| 995 } | 976 } |
| 996 } | 977 } |
| 997 { | 978 { |
| 998 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 979 RawMachineAssemblerTester<uint32_t> m(mUint32, mUint32, mUint32); |
| 999 kMachineWord32); | |
| 1000 m.Return(m.Int32Sub(m.Word32Shr(m.Parameter(0), m.Parameter(1)), | 980 m.Return(m.Int32Sub(m.Word32Shr(m.Parameter(0), m.Parameter(1)), |
| 1001 m.Parameter(2))); | 981 m.Parameter(2))); |
| 1002 FOR_UINT32_INPUTS(i) { | 982 FOR_UINT32_INPUTS(i) { |
| 1003 FOR_UINT32_SHIFTS(shift) { | 983 FOR_UINT32_SHIFTS(shift) { |
| 1004 FOR_UINT32_INPUTS(k) { | 984 FOR_UINT32_INPUTS(k) { |
| 1005 // Use uint32_t because signed overflow is UB in C. | 985 // Use uint32_t because signed overflow is UB in C. |
| 1006 int32_t expected = (*i >> shift) - *k; | 986 int32_t expected = (*i >> shift) - *k; |
| 1007 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 987 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 1008 } | 988 } |
| 1009 } | 989 } |
| 1010 } | 990 } |
| 1011 } | 991 } |
| 1012 } | 992 } |
| 1013 | 993 |
| 1014 | 994 |
| 1015 TEST(RunInt32SubInBranch) { | 995 TEST(RunInt32SubInBranch) { |
| 1016 static const int constant = 987654321; | 996 static const int constant = 987654321; |
| 1017 { | 997 { |
| 1018 RawMachineAssemblerTester<int32_t> m; | 998 RawMachineAssemblerTester<int32_t> m; |
| 1019 Int32BinopTester bt(&m); | 999 Uint32BinopTester bt(&m); |
| 1020 MLabel blocka, blockb; | 1000 MLabel blocka, blockb; |
| 1021 m.Branch( | 1001 m.Branch( |
| 1022 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), | 1002 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), |
| 1023 &blocka, &blockb); | 1003 &blocka, &blockb); |
| 1024 m.Bind(&blocka); | 1004 m.Bind(&blocka); |
| 1025 bt.AddReturn(m.Int32Constant(constant)); | 1005 bt.AddReturn(m.Int32Constant(constant)); |
| 1026 m.Bind(&blockb); | 1006 m.Bind(&blockb); |
| 1027 bt.AddReturn(m.Int32Constant(0 - constant)); | 1007 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 1028 FOR_UINT32_INPUTS(i) { | 1008 FOR_UINT32_INPUTS(i) { |
| 1029 FOR_UINT32_INPUTS(j) { | 1009 FOR_UINT32_INPUTS(j) { |
| 1030 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant; | 1010 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant; |
| 1031 CHECK_EQ(expected, bt.call(*i, *j)); | 1011 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1032 } | 1012 } |
| 1033 } | 1013 } |
| 1034 } | 1014 } |
| 1035 { | 1015 { |
| 1036 RawMachineAssemblerTester<int32_t> m; | 1016 RawMachineAssemblerTester<int32_t> m; |
| 1037 Int32BinopTester bt(&m); | 1017 Uint32BinopTester bt(&m); |
| 1038 MLabel blocka, blockb; | 1018 MLabel blocka, blockb; |
| 1039 m.Branch( | 1019 m.Branch( |
| 1040 m.Word32NotEqual(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), | 1020 m.Word32NotEqual(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), |
| 1041 &blocka, &blockb); | 1021 &blocka, &blockb); |
| 1042 m.Bind(&blocka); | 1022 m.Bind(&blocka); |
| 1043 bt.AddReturn(m.Int32Constant(constant)); | 1023 bt.AddReturn(m.Int32Constant(constant)); |
| 1044 m.Bind(&blockb); | 1024 m.Bind(&blockb); |
| 1045 bt.AddReturn(m.Int32Constant(0 - constant)); | 1025 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 1046 FOR_UINT32_INPUTS(i) { | 1026 FOR_UINT32_INPUTS(i) { |
| 1047 FOR_UINT32_INPUTS(j) { | 1027 FOR_UINT32_INPUTS(j) { |
| 1048 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; | 1028 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; |
| 1049 CHECK_EQ(expected, bt.call(*i, *j)); | 1029 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1050 } | 1030 } |
| 1051 } | 1031 } |
| 1052 } | 1032 } |
| 1053 { | 1033 { |
| 1054 FOR_UINT32_INPUTS(i) { | 1034 FOR_UINT32_INPUTS(i) { |
| 1055 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1035 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 1056 MLabel blocka, blockb; | 1036 MLabel blocka, blockb; |
| 1057 m.Branch(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), | 1037 m.Branch(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), |
| 1058 m.Int32Constant(0)), | 1038 m.Int32Constant(0)), |
| 1059 &blocka, &blockb); | 1039 &blocka, &blockb); |
| 1060 m.Bind(&blocka); | 1040 m.Bind(&blocka); |
| 1061 m.Return(m.Int32Constant(constant)); | 1041 m.Return(m.Int32Constant(constant)); |
| 1062 m.Bind(&blockb); | 1042 m.Bind(&blockb); |
| 1063 m.Return(m.Int32Constant(0 - constant)); | 1043 m.Return(m.Int32Constant(0 - constant)); |
| 1064 FOR_UINT32_INPUTS(j) { | 1044 FOR_UINT32_INPUTS(j) { |
| 1065 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant; | 1045 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant; |
| 1066 CHECK_EQ(expected, m.Call(*j)); | 1046 CHECK_EQ(expected, m.Call(*j)); |
| 1067 } | 1047 } |
| 1068 } | 1048 } |
| 1069 } | 1049 } |
| 1070 { | 1050 { |
| 1071 FOR_UINT32_INPUTS(i) { | 1051 FOR_UINT32_INPUTS(i) { |
| 1072 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1052 RawMachineAssemblerTester<int32_t> m(mUint32); |
| 1073 MLabel blocka, blockb; | 1053 MLabel blocka, blockb; |
| 1074 m.Branch(m.Word32NotEqual(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), | 1054 m.Branch(m.Word32NotEqual(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), |
| 1075 m.Int32Constant(0)), | 1055 m.Int32Constant(0)), |
| 1076 &blocka, &blockb); | 1056 &blocka, &blockb); |
| 1077 m.Bind(&blocka); | 1057 m.Bind(&blocka); |
| 1078 m.Return(m.Int32Constant(constant)); | 1058 m.Return(m.Int32Constant(constant)); |
| 1079 m.Bind(&blockb); | 1059 m.Bind(&blockb); |
| 1080 m.Return(m.Int32Constant(0 - constant)); | 1060 m.Return(m.Int32Constant(0 - constant)); |
| 1081 FOR_UINT32_INPUTS(j) { | 1061 FOR_UINT32_INPUTS(j) { |
| 1082 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; | 1062 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; |
| 1083 CHECK_EQ(expected, m.Call(*j)); | 1063 CHECK_EQ(expected, m.Call(*j)); |
| 1084 } | 1064 } |
| 1085 } | 1065 } |
| 1086 } | 1066 } |
| 1087 { | 1067 { |
| 1088 RawMachineAssemblerTester<void> m; | 1068 RawMachineAssemblerTester<void> m; |
| 1089 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 1069 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
| 1090 m.machine()->Word32Shr()}; | 1070 m.machine()->Word32Shr()}; |
| 1091 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 1071 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
| 1092 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1072 RawMachineAssemblerTester<int32_t> m(mUint32, mInt32, mUint32); |
| 1093 kMachineWord32); | |
| 1094 MLabel blocka, blockb; | 1073 MLabel blocka, blockb; |
| 1095 m.Branch(m.Word32Equal(m.Int32Sub(m.Parameter(0), | 1074 m.Branch(m.Word32Equal(m.Int32Sub(m.Parameter(0), |
| 1096 m.NewNode(shops[n], m.Parameter(1), | 1075 m.NewNode(shops[n], m.Parameter(1), |
| 1097 m.Parameter(2))), | 1076 m.Parameter(2))), |
| 1098 m.Int32Constant(0)), | 1077 m.Int32Constant(0)), |
| 1099 &blocka, &blockb); | 1078 &blocka, &blockb); |
| 1100 m.Bind(&blocka); | 1079 m.Bind(&blocka); |
| 1101 m.Return(m.Int32Constant(constant)); | 1080 m.Return(m.Int32Constant(constant)); |
| 1102 m.Bind(&blockb); | 1081 m.Bind(&blockb); |
| 1103 m.Return(m.Int32Constant(0 - constant)); | 1082 m.Return(m.Int32Constant(0 - constant)); |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1124 } | 1103 } |
| 1125 } | 1104 } |
| 1126 } | 1105 } |
| 1127 } | 1106 } |
| 1128 } | 1107 } |
| 1129 | 1108 |
| 1130 | 1109 |
| 1131 TEST(RunInt32SubInComparison) { | 1110 TEST(RunInt32SubInComparison) { |
| 1132 { | 1111 { |
| 1133 RawMachineAssemblerTester<int32_t> m; | 1112 RawMachineAssemblerTester<int32_t> m; |
| 1134 Int32BinopTester bt(&m); | 1113 Uint32BinopTester bt(&m); |
| 1135 bt.AddReturn( | 1114 bt.AddReturn( |
| 1136 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0))); | 1115 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0))); |
| 1137 FOR_UINT32_INPUTS(i) { | 1116 FOR_UINT32_INPUTS(i) { |
| 1138 FOR_UINT32_INPUTS(j) { | 1117 FOR_UINT32_INPUTS(j) { |
| 1139 int32_t expected = (*i - *j) == 0; | 1118 uint32_t expected = (*i - *j) == 0; |
| 1140 CHECK_EQ(expected, bt.call(*i, *j)); | 1119 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 1141 } | 1120 } |
| 1142 } | 1121 } |
| 1143 } | 1122 } |
| 1144 { | 1123 { |
| 1145 RawMachineAssemblerTester<int32_t> m; | 1124 RawMachineAssemblerTester<int32_t> m; |
| 1146 Int32BinopTester bt(&m); | 1125 Uint32BinopTester bt(&m); |
| 1147 bt.AddReturn( | 1126 bt.AddReturn( |
| 1148 m.Word32Equal(m.Int32Constant(0), m.Int32Sub(bt.param0, bt.param1))); | 1127 m.Word32Equal(m.Int32Constant(0), m.Int32Sub(bt.param0, bt.param1))); |
| 1149 FOR_UINT32_INPUTS(i) { | 1128 FOR_UINT32_INPUTS(i) { |
| 1150 FOR_UINT32_INPUTS(j) { | 1129 FOR_UINT32_INPUTS(j) { |
| 1151 int32_t expected = (*i - *j) == 0; | 1130 uint32_t expected = (*i - *j) == 0; |
| 1152 CHECK_EQ(expected, bt.call(*i, *j)); | 1131 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 1153 } | 1132 } |
| 1154 } | 1133 } |
| 1155 } | 1134 } |
| 1156 { | 1135 { |
| 1157 FOR_UINT32_INPUTS(i) { | 1136 FOR_UINT32_INPUTS(i) { |
| 1158 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1137 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 1159 m.Return(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), | 1138 m.Return(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), |
| 1160 m.Int32Constant(0))); | 1139 m.Int32Constant(0))); |
| 1161 FOR_UINT32_INPUTS(j) { | 1140 FOR_UINT32_INPUTS(j) { |
| 1162 int32_t expected = (*i - *j) == 0; | 1141 uint32_t expected = (*i - *j) == 0; |
| 1163 CHECK_EQ(expected, m.Call(*j)); | 1142 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 1164 } | 1143 } |
| 1165 } | 1144 } |
| 1166 } | 1145 } |
| 1167 { | 1146 { |
| 1168 FOR_UINT32_INPUTS(i) { | 1147 FOR_UINT32_INPUTS(i) { |
| 1169 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1148 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 1170 m.Return(m.Word32Equal(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i)), | 1149 m.Return(m.Word32Equal(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i)), |
| 1171 m.Int32Constant(0))); | 1150 m.Int32Constant(0))); |
| 1172 FOR_UINT32_INPUTS(j) { | 1151 FOR_UINT32_INPUTS(j) { |
| 1173 int32_t expected = (*j - *i) == 0; | 1152 uint32_t expected = (*j - *i) == 0; |
| 1174 CHECK_EQ(expected, m.Call(*j)); | 1153 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 1175 } | 1154 } |
| 1176 } | 1155 } |
| 1177 } | 1156 } |
| 1178 { | 1157 { |
| 1179 RawMachineAssemblerTester<void> m; | 1158 RawMachineAssemblerTester<void> m; |
| 1180 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 1159 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
| 1181 m.machine()->Word32Shr()}; | 1160 m.machine()->Word32Shr()}; |
| 1182 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 1161 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
| 1183 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1162 RawMachineAssemblerTester<int32_t> m(mUint32, mInt32, mUint32); |
| 1184 kMachineWord32); | |
| 1185 m.Return(m.Word32Equal( | 1163 m.Return(m.Word32Equal( |
| 1186 m.Int32Sub(m.Parameter(0), | 1164 m.Int32Sub(m.Parameter(0), |
| 1187 m.NewNode(shops[n], m.Parameter(1), m.Parameter(2))), | 1165 m.NewNode(shops[n], m.Parameter(1), m.Parameter(2))), |
| 1188 m.Int32Constant(0))); | 1166 m.Int32Constant(0))); |
| 1189 FOR_UINT32_INPUTS(i) { | 1167 FOR_UINT32_INPUTS(i) { |
| 1190 FOR_INT32_INPUTS(j) { | 1168 FOR_INT32_INPUTS(j) { |
| 1191 FOR_UINT32_SHIFTS(shift) { | 1169 FOR_UINT32_SHIFTS(shift) { |
| 1192 int32_t right; | 1170 int32_t right; |
| 1193 switch (shops[n]->opcode()) { | 1171 switch (shops[n]->opcode()) { |
| 1194 default: | 1172 default: |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 1220 bt.AddReturn(m.Int32Mul(bt.param0, bt.param1)); | 1198 bt.AddReturn(m.Int32Mul(bt.param0, bt.param1)); |
| 1221 FOR_INT32_INPUTS(i) { | 1199 FOR_INT32_INPUTS(i) { |
| 1222 FOR_INT32_INPUTS(j) { | 1200 FOR_INT32_INPUTS(j) { |
| 1223 int expected = static_cast<int32_t>(*i * *j); | 1201 int expected = static_cast<int32_t>(*i * *j); |
| 1224 CHECK_EQ(expected, bt.call(*i, *j)); | 1202 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1225 } | 1203 } |
| 1226 } | 1204 } |
| 1227 } | 1205 } |
| 1228 { | 1206 { |
| 1229 RawMachineAssemblerTester<int32_t> m; | 1207 RawMachineAssemblerTester<int32_t> m; |
| 1230 Int32BinopTester bt(&m); | 1208 Uint32BinopTester bt(&m); |
| 1231 bt.AddReturn(m.Int32Mul(bt.param0, bt.param1)); | 1209 bt.AddReturn(m.Int32Mul(bt.param0, bt.param1)); |
| 1232 FOR_UINT32_INPUTS(i) { | 1210 FOR_UINT32_INPUTS(i) { |
| 1233 FOR_UINT32_INPUTS(j) { | 1211 FOR_UINT32_INPUTS(j) { |
| 1234 int expected = static_cast<int32_t>(*i * *j); | 1212 uint32_t expected = *i * *j; |
| 1235 CHECK_EQ(expected, bt.call(*i, *j)); | 1213 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 1236 } | 1214 } |
| 1237 } | 1215 } |
| 1238 } | 1216 } |
| 1239 } | 1217 } |
| 1240 | 1218 |
| 1241 | 1219 |
| 1242 TEST(RunInt32MulImm) { | 1220 TEST(RunInt32MulImm) { |
| 1243 { | 1221 { |
| 1244 FOR_UINT32_INPUTS(i) { | 1222 FOR_UINT32_INPUTS(i) { |
| 1245 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1223 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 1246 m.Return(m.Int32Mul(m.Int32Constant(*i), m.Parameter(0))); | 1224 m.Return(m.Int32Mul(m.Int32Constant(*i), m.Parameter(0))); |
| 1247 FOR_UINT32_INPUTS(j) { | 1225 FOR_UINT32_INPUTS(j) { |
| 1248 int32_t expected = static_cast<int32_t>(*i * *j); | 1226 uint32_t expected = *i * *j; |
| 1249 CHECK_EQ(expected, m.Call(*j)); | 1227 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 1250 } | 1228 } |
| 1251 } | 1229 } |
| 1252 } | 1230 } |
| 1253 { | 1231 { |
| 1254 FOR_UINT32_INPUTS(i) { | 1232 FOR_UINT32_INPUTS(i) { |
| 1255 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1233 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 1256 m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant(*i))); | 1234 m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant(*i))); |
| 1257 FOR_UINT32_INPUTS(j) { | 1235 FOR_UINT32_INPUTS(j) { |
| 1258 int32_t expected = static_cast<int32_t>(*j * *i); | 1236 uint32_t expected = *j * *i; |
| 1259 CHECK_EQ(expected, m.Call(*j)); | 1237 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 1260 } | 1238 } |
| 1261 } | 1239 } |
| 1262 } | 1240 } |
| 1263 } | 1241 } |
| 1264 | 1242 |
| 1265 | 1243 |
| 1266 TEST(RunInt32MulAndInt32AddP) { | 1244 TEST(RunInt32MulAndInt32AddP) { |
| 1267 { | 1245 { |
| 1268 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1246 RawMachineAssemblerTester<int32_t> m(mInt32, mInt32, mInt32); |
| 1269 kMachineWord32); | |
| 1270 m.Return( | 1247 m.Return( |
| 1271 m.Int32Add(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); | 1248 m.Int32Add(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); |
| 1272 FOR_INT32_INPUTS(i) { | 1249 FOR_INT32_INPUTS(i) { |
| 1273 FOR_INT32_INPUTS(j) { | 1250 FOR_INT32_INPUTS(j) { |
| 1274 FOR_INT32_INPUTS(k) { | 1251 FOR_INT32_INPUTS(k) { |
| 1275 int32_t p0 = *i; | 1252 int32_t p0 = *i; |
| 1276 int32_t p1 = *j; | 1253 int32_t p1 = *j; |
| 1277 int32_t p2 = *k; | 1254 int32_t p2 = *k; |
| 1278 int expected = p0 + static_cast<int32_t>(p1 * p2); | 1255 int expected = p0 + static_cast<int32_t>(p1 * p2); |
| 1279 CHECK_EQ(expected, m.Call(p0, p1, p2)); | 1256 CHECK_EQ(expected, m.Call(p0, p1, p2)); |
| 1280 } | 1257 } |
| 1281 } | 1258 } |
| 1282 } | 1259 } |
| 1283 } | 1260 } |
| 1284 { | 1261 { |
| 1285 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1262 RawMachineAssemblerTester<int32_t> m(mInt32, mInt32, mInt32); |
| 1286 kMachineWord32); | |
| 1287 m.Return( | 1263 m.Return( |
| 1288 m.Int32Add(m.Int32Mul(m.Parameter(0), m.Parameter(1)), m.Parameter(2))); | 1264 m.Int32Add(m.Int32Mul(m.Parameter(0), m.Parameter(1)), m.Parameter(2))); |
| 1289 FOR_INT32_INPUTS(i) { | 1265 FOR_INT32_INPUTS(i) { |
| 1290 FOR_INT32_INPUTS(j) { | 1266 FOR_INT32_INPUTS(j) { |
| 1291 FOR_INT32_INPUTS(k) { | 1267 FOR_INT32_INPUTS(k) { |
| 1292 int32_t p0 = *i; | 1268 int32_t p0 = *i; |
| 1293 int32_t p1 = *j; | 1269 int32_t p1 = *j; |
| 1294 int32_t p2 = *k; | 1270 int32_t p2 = *k; |
| 1295 int expected = static_cast<int32_t>(p0 * p1) + p2; | 1271 int expected = static_cast<int32_t>(p0 * p1) + p2; |
| 1296 CHECK_EQ(expected, m.Call(p0, p1, p2)); | 1272 CHECK_EQ(expected, m.Call(p0, p1, p2)); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 1312 CHECK_EQ(expected, bt.call(p0, p1)); | 1288 CHECK_EQ(expected, bt.call(p0, p1)); |
| 1313 } | 1289 } |
| 1314 } | 1290 } |
| 1315 } | 1291 } |
| 1316 } | 1292 } |
| 1317 } | 1293 } |
| 1318 | 1294 |
| 1319 | 1295 |
| 1320 TEST(RunInt32MulAndInt32SubP) { | 1296 TEST(RunInt32MulAndInt32SubP) { |
| 1321 { | 1297 { |
| 1322 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1298 RawMachineAssemblerTester<int32_t> m(mUint32, mInt32, mInt32); |
| 1323 kMachineWord32); | |
| 1324 m.Return( | 1299 m.Return( |
| 1325 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); | 1300 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); |
| 1326 FOR_UINT32_INPUTS(i) { | 1301 FOR_UINT32_INPUTS(i) { |
| 1327 FOR_INT32_INPUTS(j) { | 1302 FOR_INT32_INPUTS(j) { |
| 1328 FOR_INT32_INPUTS(k) { | 1303 FOR_INT32_INPUTS(k) { |
| 1329 uint32_t p0 = *i; | 1304 uint32_t p0 = *i; |
| 1330 int32_t p1 = *j; | 1305 int32_t p1 = *j; |
| 1331 int32_t p2 = *k; | 1306 int32_t p2 = *k; |
| 1332 // Use uint32_t because signed overflow is UB in C. | 1307 // Use uint32_t because signed overflow is UB in C. |
| 1333 int expected = p0 - static_cast<uint32_t>(p1 * p2); | 1308 int expected = p0 - static_cast<uint32_t>(p1 * p2); |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1525 CHECK_EQ(expected, bt.call(*i, *j)); | 1500 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1526 } | 1501 } |
| 1527 } | 1502 } |
| 1528 } | 1503 } |
| 1529 } | 1504 } |
| 1530 | 1505 |
| 1531 | 1506 |
| 1532 TEST(RunWord32AndAndWord32ShlP) { | 1507 TEST(RunWord32AndAndWord32ShlP) { |
| 1533 { | 1508 { |
| 1534 RawMachineAssemblerTester<int32_t> m; | 1509 RawMachineAssemblerTester<int32_t> m; |
| 1535 Int32BinopTester bt(&m); | 1510 Uint32BinopTester bt(&m); |
| 1536 bt.AddReturn( | 1511 bt.AddReturn( |
| 1537 m.Word32Shl(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); | 1512 m.Word32Shl(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); |
| 1538 FOR_UINT32_INPUTS(i) { | 1513 FOR_UINT32_INPUTS(i) { |
| 1539 FOR_UINT32_INPUTS(j) { | 1514 FOR_UINT32_INPUTS(j) { |
| 1540 uint32_t expected = *i << (*j & 0x1f); | 1515 uint32_t expected = *i << (*j & 0x1f); |
| 1541 CHECK_EQ(expected, bt.call(*i, *j)); | 1516 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 1542 } | 1517 } |
| 1543 } | 1518 } |
| 1544 } | 1519 } |
| 1545 { | 1520 { |
| 1546 RawMachineAssemblerTester<int32_t> m; | 1521 RawMachineAssemblerTester<int32_t> m; |
| 1547 Int32BinopTester bt(&m); | 1522 Uint32BinopTester bt(&m); |
| 1548 bt.AddReturn( | 1523 bt.AddReturn( |
| 1549 m.Word32Shl(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); | 1524 m.Word32Shl(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); |
| 1550 FOR_UINT32_INPUTS(i) { | 1525 FOR_UINT32_INPUTS(i) { |
| 1551 FOR_UINT32_INPUTS(j) { | 1526 FOR_UINT32_INPUTS(j) { |
| 1552 uint32_t expected = *i << (0x1f & *j); | 1527 uint32_t expected = *i << (0x1f & *j); |
| 1553 CHECK_EQ(expected, bt.call(*i, *j)); | 1528 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 1554 } | 1529 } |
| 1555 } | 1530 } |
| 1556 } | 1531 } |
| 1557 } | 1532 } |
| 1558 | 1533 |
| 1559 | 1534 |
| 1560 TEST(RunWord32AndAndWord32ShrP) { | 1535 TEST(RunWord32AndAndWord32ShrP) { |
| 1561 { | 1536 { |
| 1562 RawMachineAssemblerTester<int32_t> m; | 1537 RawMachineAssemblerTester<int32_t> m; |
| 1563 Int32BinopTester bt(&m); | 1538 Uint32BinopTester bt(&m); |
| 1564 bt.AddReturn( | 1539 bt.AddReturn( |
| 1565 m.Word32Shr(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); | 1540 m.Word32Shr(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); |
| 1566 FOR_UINT32_INPUTS(i) { | 1541 FOR_UINT32_INPUTS(i) { |
| 1567 FOR_UINT32_INPUTS(j) { | 1542 FOR_UINT32_INPUTS(j) { |
| 1568 uint32_t expected = *i >> (*j & 0x1f); | 1543 uint32_t expected = *i >> (*j & 0x1f); |
| 1569 CHECK_EQ(expected, bt.call(*i, *j)); | 1544 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 1570 } | 1545 } |
| 1571 } | 1546 } |
| 1572 } | 1547 } |
| 1573 { | 1548 { |
| 1574 RawMachineAssemblerTester<int32_t> m; | 1549 RawMachineAssemblerTester<int32_t> m; |
| 1575 Int32BinopTester bt(&m); | 1550 Uint32BinopTester bt(&m); |
| 1576 bt.AddReturn( | 1551 bt.AddReturn( |
| 1577 m.Word32Shr(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); | 1552 m.Word32Shr(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); |
| 1578 FOR_UINT32_INPUTS(i) { | 1553 FOR_UINT32_INPUTS(i) { |
| 1579 FOR_UINT32_INPUTS(j) { | 1554 FOR_UINT32_INPUTS(j) { |
| 1580 uint32_t expected = *i >> (0x1f & *j); | 1555 uint32_t expected = *i >> (0x1f & *j); |
| 1581 CHECK_EQ(expected, bt.call(*i, *j)); | 1556 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 1582 } | 1557 } |
| 1583 } | 1558 } |
| 1584 } | 1559 } |
| 1585 } | 1560 } |
| 1586 | 1561 |
| 1587 | 1562 |
| 1588 TEST(RunWord32AndAndWord32SarP) { | 1563 TEST(RunWord32AndAndWord32SarP) { |
| 1589 { | 1564 { |
| 1590 RawMachineAssemblerTester<int32_t> m; | 1565 RawMachineAssemblerTester<int32_t> m; |
| 1591 Int32BinopTester bt(&m); | 1566 Int32BinopTester bt(&m); |
| 1592 bt.AddReturn( | 1567 bt.AddReturn( |
| 1593 m.Word32Sar(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); | 1568 m.Word32Sar(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); |
| 1594 FOR_INT32_INPUTS(i) { | 1569 FOR_INT32_INPUTS(i) { |
| 1595 FOR_UINT32_INPUTS(j) { | 1570 FOR_INT32_INPUTS(j) { |
| 1596 uint32_t expected = *i >> (*j & 0x1f); | 1571 int32_t expected = *i >> (*j & 0x1f); |
| 1597 CHECK_EQ(expected, bt.call(*i, *j)); | 1572 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1598 } | 1573 } |
| 1599 } | 1574 } |
| 1600 } | 1575 } |
| 1601 { | 1576 { |
| 1602 RawMachineAssemblerTester<int32_t> m; | 1577 RawMachineAssemblerTester<int32_t> m; |
| 1603 Int32BinopTester bt(&m); | 1578 Int32BinopTester bt(&m); |
| 1604 bt.AddReturn( | 1579 bt.AddReturn( |
| 1605 m.Word32Sar(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); | 1580 m.Word32Sar(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); |
| 1606 FOR_INT32_INPUTS(i) { | 1581 FOR_INT32_INPUTS(i) { |
| 1607 FOR_UINT32_INPUTS(j) { | 1582 FOR_INT32_INPUTS(j) { |
| 1608 uint32_t expected = *i >> (0x1f & *j); | 1583 uint32_t expected = *i >> (0x1f & *j); |
| 1609 CHECK_EQ(expected, bt.call(*i, *j)); | 1584 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1610 } | 1585 } |
| 1611 } | 1586 } |
| 1612 } | 1587 } |
| 1613 } | 1588 } |
| 1614 | 1589 |
| 1615 | 1590 |
| 1616 TEST(RunWord32AndImm) { | 1591 TEST(RunWord32AndImm) { |
| 1617 { | 1592 { |
| 1618 FOR_UINT32_INPUTS(i) { | 1593 FOR_UINT32_INPUTS(i) { |
| 1619 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1594 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 1620 m.Return(m.Word32And(m.Int32Constant(*i), m.Parameter(0))); | 1595 m.Return(m.Word32And(m.Int32Constant(*i), m.Parameter(0))); |
| 1621 FOR_UINT32_INPUTS(j) { | 1596 FOR_UINT32_INPUTS(j) { |
| 1622 uint32_t expected = *i & *j; | 1597 uint32_t expected = *i & *j; |
| 1623 CHECK_EQ(expected, m.Call(*j)); | 1598 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 1624 } | 1599 } |
| 1625 } | 1600 } |
| 1626 } | 1601 } |
| 1627 { | 1602 { |
| 1628 FOR_UINT32_INPUTS(i) { | 1603 FOR_UINT32_INPUTS(i) { |
| 1629 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1604 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 1630 m.Return(m.Word32And(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); | 1605 m.Return(m.Word32And(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); |
| 1631 FOR_UINT32_INPUTS(j) { | 1606 FOR_UINT32_INPUTS(j) { |
| 1632 uint32_t expected = *i & ~(*j); | 1607 uint32_t expected = *i & ~(*j); |
| 1633 CHECK_EQ(expected, m.Call(*j)); | 1608 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 1634 } | 1609 } |
| 1635 } | 1610 } |
| 1636 } | 1611 } |
| 1637 } | 1612 } |
| 1638 | 1613 |
| 1639 | 1614 |
| 1640 TEST(RunWord32AndInBranch) { | 1615 TEST(RunWord32AndInBranch) { |
| 1641 static const int constant = 987654321; | 1616 static const int constant = 987654321; |
| 1642 { | 1617 { |
| 1643 RawMachineAssemblerTester<int32_t> m; | 1618 RawMachineAssemblerTester<int32_t> m; |
| 1644 Int32BinopTester bt(&m); | 1619 Uint32BinopTester bt(&m); |
| 1645 MLabel blocka, blockb; | 1620 MLabel blocka, blockb; |
| 1646 m.Branch( | 1621 m.Branch( |
| 1647 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), | 1622 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), |
| 1648 &blocka, &blockb); | 1623 &blocka, &blockb); |
| 1649 m.Bind(&blocka); | 1624 m.Bind(&blocka); |
| 1650 bt.AddReturn(m.Int32Constant(constant)); | 1625 bt.AddReturn(m.Int32Constant(constant)); |
| 1651 m.Bind(&blockb); | 1626 m.Bind(&blockb); |
| 1652 bt.AddReturn(m.Int32Constant(0 - constant)); | 1627 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 1653 FOR_UINT32_INPUTS(i) { | 1628 FOR_UINT32_INPUTS(i) { |
| 1654 FOR_UINT32_INPUTS(j) { | 1629 FOR_UINT32_INPUTS(j) { |
| 1655 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; | 1630 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; |
| 1656 CHECK_EQ(expected, bt.call(*i, *j)); | 1631 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1657 } | 1632 } |
| 1658 } | 1633 } |
| 1659 } | 1634 } |
| 1660 { | 1635 { |
| 1661 RawMachineAssemblerTester<int32_t> m; | 1636 RawMachineAssemblerTester<int32_t> m; |
| 1662 Int32BinopTester bt(&m); | 1637 Uint32BinopTester bt(&m); |
| 1663 MLabel blocka, blockb; | 1638 MLabel blocka, blockb; |
| 1664 m.Branch( | 1639 m.Branch( |
| 1665 m.Word32NotEqual(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), | 1640 m.Word32NotEqual(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), |
| 1666 &blocka, &blockb); | 1641 &blocka, &blockb); |
| 1667 m.Bind(&blocka); | 1642 m.Bind(&blocka); |
| 1668 bt.AddReturn(m.Int32Constant(constant)); | 1643 bt.AddReturn(m.Int32Constant(constant)); |
| 1669 m.Bind(&blockb); | 1644 m.Bind(&blockb); |
| 1670 bt.AddReturn(m.Int32Constant(0 - constant)); | 1645 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 1671 FOR_UINT32_INPUTS(i) { | 1646 FOR_UINT32_INPUTS(i) { |
| 1672 FOR_UINT32_INPUTS(j) { | 1647 FOR_UINT32_INPUTS(j) { |
| 1673 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; | 1648 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; |
| 1674 CHECK_EQ(expected, bt.call(*i, *j)); | 1649 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1675 } | 1650 } |
| 1676 } | 1651 } |
| 1677 } | 1652 } |
| 1678 { | 1653 { |
| 1679 FOR_UINT32_INPUTS(i) { | 1654 FOR_UINT32_INPUTS(i) { |
| 1680 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1655 RawMachineAssemblerTester<int32_t> m(mUint32); |
| 1681 MLabel blocka, blockb; | 1656 MLabel blocka, blockb; |
| 1682 m.Branch(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), | 1657 m.Branch(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), |
| 1683 m.Int32Constant(0)), | 1658 m.Int32Constant(0)), |
| 1684 &blocka, &blockb); | 1659 &blocka, &blockb); |
| 1685 m.Bind(&blocka); | 1660 m.Bind(&blocka); |
| 1686 m.Return(m.Int32Constant(constant)); | 1661 m.Return(m.Int32Constant(constant)); |
| 1687 m.Bind(&blockb); | 1662 m.Bind(&blockb); |
| 1688 m.Return(m.Int32Constant(0 - constant)); | 1663 m.Return(m.Int32Constant(0 - constant)); |
| 1689 FOR_UINT32_INPUTS(j) { | 1664 FOR_UINT32_INPUTS(j) { |
| 1690 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; | 1665 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; |
| 1691 CHECK_EQ(expected, m.Call(*j)); | 1666 CHECK_EQ(expected, m.Call(*j)); |
| 1692 } | 1667 } |
| 1693 } | 1668 } |
| 1694 } | 1669 } |
| 1695 { | 1670 { |
| 1696 FOR_UINT32_INPUTS(i) { | 1671 FOR_UINT32_INPUTS(i) { |
| 1697 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1672 RawMachineAssemblerTester<int32_t> m(mUint32); |
| 1698 MLabel blocka, blockb; | 1673 MLabel blocka, blockb; |
| 1699 m.Branch( | 1674 m.Branch( |
| 1700 m.Word32NotEqual(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), | 1675 m.Word32NotEqual(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), |
| 1701 m.Int32Constant(0)), | 1676 m.Int32Constant(0)), |
| 1702 &blocka, &blockb); | 1677 &blocka, &blockb); |
| 1703 m.Bind(&blocka); | 1678 m.Bind(&blocka); |
| 1704 m.Return(m.Int32Constant(constant)); | 1679 m.Return(m.Int32Constant(constant)); |
| 1705 m.Bind(&blockb); | 1680 m.Bind(&blockb); |
| 1706 m.Return(m.Int32Constant(0 - constant)); | 1681 m.Return(m.Int32Constant(0 - constant)); |
| 1707 FOR_UINT32_INPUTS(j) { | 1682 FOR_UINT32_INPUTS(j) { |
| 1708 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; | 1683 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; |
| 1709 CHECK_EQ(expected, m.Call(*j)); | 1684 CHECK_EQ(expected, m.Call(*j)); |
| 1710 } | 1685 } |
| 1711 } | 1686 } |
| 1712 } | 1687 } |
| 1713 { | 1688 { |
| 1714 RawMachineAssemblerTester<void> m; | 1689 RawMachineAssemblerTester<void> m; |
| 1715 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 1690 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
| 1716 m.machine()->Word32Shr()}; | 1691 m.machine()->Word32Shr()}; |
| 1717 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 1692 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
| 1718 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1693 RawMachineAssemblerTester<int32_t> m(mUint32, mInt32, mUint32); |
| 1719 kMachineWord32); | |
| 1720 MLabel blocka, blockb; | 1694 MLabel blocka, blockb; |
| 1721 m.Branch(m.Word32Equal(m.Word32And(m.Parameter(0), | 1695 m.Branch(m.Word32Equal(m.Word32And(m.Parameter(0), |
| 1722 m.NewNode(shops[n], m.Parameter(1), | 1696 m.NewNode(shops[n], m.Parameter(1), |
| 1723 m.Parameter(2))), | 1697 m.Parameter(2))), |
| 1724 m.Int32Constant(0)), | 1698 m.Int32Constant(0)), |
| 1725 &blocka, &blockb); | 1699 &blocka, &blockb); |
| 1726 m.Bind(&blocka); | 1700 m.Bind(&blocka); |
| 1727 m.Return(m.Int32Constant(constant)); | 1701 m.Return(m.Int32Constant(constant)); |
| 1728 m.Bind(&blockb); | 1702 m.Bind(&blockb); |
| 1729 m.Return(m.Int32Constant(0 - constant)); | 1703 m.Return(m.Int32Constant(0 - constant)); |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1750 } | 1724 } |
| 1751 } | 1725 } |
| 1752 } | 1726 } |
| 1753 } | 1727 } |
| 1754 } | 1728 } |
| 1755 | 1729 |
| 1756 | 1730 |
| 1757 TEST(RunWord32AndInComparison) { | 1731 TEST(RunWord32AndInComparison) { |
| 1758 { | 1732 { |
| 1759 RawMachineAssemblerTester<int32_t> m; | 1733 RawMachineAssemblerTester<int32_t> m; |
| 1760 Int32BinopTester bt(&m); | 1734 Uint32BinopTester bt(&m); |
| 1761 bt.AddReturn( | 1735 bt.AddReturn( |
| 1762 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0))); | 1736 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0))); |
| 1763 FOR_UINT32_INPUTS(i) { | 1737 FOR_UINT32_INPUTS(i) { |
| 1764 FOR_UINT32_INPUTS(j) { | 1738 FOR_UINT32_INPUTS(j) { |
| 1765 int32_t expected = (*i & *j) == 0; | 1739 uint32_t expected = (*i & *j) == 0; |
| 1766 CHECK_EQ(expected, bt.call(*i, *j)); | 1740 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 1767 } | 1741 } |
| 1768 } | 1742 } |
| 1769 } | 1743 } |
| 1770 { | 1744 { |
| 1771 RawMachineAssemblerTester<int32_t> m; | 1745 RawMachineAssemblerTester<int32_t> m; |
| 1772 Int32BinopTester bt(&m); | 1746 Uint32BinopTester bt(&m); |
| 1773 bt.AddReturn( | 1747 bt.AddReturn( |
| 1774 m.Word32Equal(m.Int32Constant(0), m.Word32And(bt.param0, bt.param1))); | 1748 m.Word32Equal(m.Int32Constant(0), m.Word32And(bt.param0, bt.param1))); |
| 1775 FOR_UINT32_INPUTS(i) { | 1749 FOR_UINT32_INPUTS(i) { |
| 1776 FOR_UINT32_INPUTS(j) { | 1750 FOR_UINT32_INPUTS(j) { |
| 1777 int32_t expected = (*i & *j) == 0; | 1751 uint32_t expected = (*i & *j) == 0; |
| 1778 CHECK_EQ(expected, bt.call(*i, *j)); | 1752 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 1779 } | 1753 } |
| 1780 } | 1754 } |
| 1781 } | 1755 } |
| 1782 { | 1756 { |
| 1783 FOR_UINT32_INPUTS(i) { | 1757 FOR_UINT32_INPUTS(i) { |
| 1784 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1758 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 1785 m.Return(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), | 1759 m.Return(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), |
| 1786 m.Int32Constant(0))); | 1760 m.Int32Constant(0))); |
| 1787 FOR_UINT32_INPUTS(j) { | 1761 FOR_UINT32_INPUTS(j) { |
| 1788 int32_t expected = (*i & *j) == 0; | 1762 uint32_t expected = (*i & *j) == 0; |
| 1789 CHECK_EQ(expected, m.Call(*j)); | 1763 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 1790 } | 1764 } |
| 1791 } | 1765 } |
| 1792 } | 1766 } |
| 1793 { | 1767 { |
| 1794 FOR_UINT32_INPUTS(i) { | 1768 FOR_UINT32_INPUTS(i) { |
| 1795 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1769 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 1796 m.Return(m.Word32Equal(m.Word32And(m.Parameter(0), m.Int32Constant(*i)), | 1770 m.Return(m.Word32Equal(m.Word32And(m.Parameter(0), m.Int32Constant(*i)), |
| 1797 m.Int32Constant(0))); | 1771 m.Int32Constant(0))); |
| 1798 FOR_UINT32_INPUTS(j) { | 1772 FOR_UINT32_INPUTS(j) { |
| 1799 int32_t expected = (*j & *i) == 0; | 1773 uint32_t expected = (*j & *i) == 0; |
| 1800 CHECK_EQ(expected, m.Call(*j)); | 1774 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 1801 } | 1775 } |
| 1802 } | 1776 } |
| 1803 } | 1777 } |
| 1804 } | 1778 } |
| 1805 | 1779 |
| 1806 | 1780 |
| 1807 TEST(RunWord32OrP) { | 1781 TEST(RunWord32OrP) { |
| 1808 { | 1782 { |
| 1809 RawMachineAssemblerTester<int32_t> m; | 1783 RawMachineAssemblerTester<int32_t> m; |
| 1810 Int32BinopTester bt(&m); | 1784 Uint32BinopTester bt(&m); |
| 1811 bt.AddReturn(m.Word32Or(bt.param0, bt.param1)); | 1785 bt.AddReturn(m.Word32Or(bt.param0, bt.param1)); |
| 1812 FOR_UINT32_INPUTS(i) { | 1786 FOR_UINT32_INPUTS(i) { |
| 1813 FOR_UINT32_INPUTS(j) { | 1787 FOR_UINT32_INPUTS(j) { |
| 1814 uint32_t expected = *i | *j; | 1788 uint32_t expected = *i | *j; |
| 1815 CHECK_EQ(expected, bt.call(*i, *j)); | 1789 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 1816 } | 1790 } |
| 1817 } | 1791 } |
| 1818 } | 1792 } |
| 1819 { | 1793 { |
| 1820 RawMachineAssemblerTester<int32_t> m; | 1794 RawMachineAssemblerTester<int32_t> m; |
| 1821 Int32BinopTester bt(&m); | 1795 Uint32BinopTester bt(&m); |
| 1822 bt.AddReturn(m.Word32Or(bt.param0, m.Word32Not(bt.param1))); | 1796 bt.AddReturn(m.Word32Or(bt.param0, m.Word32Not(bt.param1))); |
| 1823 FOR_UINT32_INPUTS(i) { | 1797 FOR_UINT32_INPUTS(i) { |
| 1824 FOR_UINT32_INPUTS(j) { | 1798 FOR_UINT32_INPUTS(j) { |
| 1825 uint32_t expected = *i | ~(*j); | 1799 uint32_t expected = *i | ~(*j); |
| 1826 CHECK_EQ(expected, bt.call(*i, *j)); | 1800 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 1827 } | 1801 } |
| 1828 } | 1802 } |
| 1829 } | 1803 } |
| 1830 { | 1804 { |
| 1831 RawMachineAssemblerTester<int32_t> m; | 1805 RawMachineAssemblerTester<int32_t> m; |
| 1832 Int32BinopTester bt(&m); | 1806 Uint32BinopTester bt(&m); |
| 1833 bt.AddReturn(m.Word32Or(m.Word32Not(bt.param0), bt.param1)); | 1807 bt.AddReturn(m.Word32Or(m.Word32Not(bt.param0), bt.param1)); |
| 1834 FOR_UINT32_INPUTS(i) { | 1808 FOR_UINT32_INPUTS(i) { |
| 1835 FOR_UINT32_INPUTS(j) { | 1809 FOR_UINT32_INPUTS(j) { |
| 1836 uint32_t expected = ~(*i) | *j; | 1810 uint32_t expected = ~(*i) | *j; |
| 1837 CHECK_EQ(expected, bt.call(*i, *j)); | 1811 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 1838 } | 1812 } |
| 1839 } | 1813 } |
| 1840 } | 1814 } |
| 1841 } | 1815 } |
| 1842 | 1816 |
| 1843 | 1817 |
| 1844 TEST(RunWord32OrImm) { | 1818 TEST(RunWord32OrImm) { |
| 1845 { | 1819 { |
| 1846 FOR_UINT32_INPUTS(i) { | 1820 FOR_UINT32_INPUTS(i) { |
| 1847 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1821 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 1848 m.Return(m.Word32Or(m.Int32Constant(*i), m.Parameter(0))); | 1822 m.Return(m.Word32Or(m.Int32Constant(*i), m.Parameter(0))); |
| 1849 FOR_UINT32_INPUTS(j) { | 1823 FOR_UINT32_INPUTS(j) { |
| 1850 uint32_t expected = *i | *j; | 1824 uint32_t expected = *i | *j; |
| 1851 CHECK_EQ(expected, m.Call(*j)); | 1825 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 1852 } | 1826 } |
| 1853 } | 1827 } |
| 1854 } | 1828 } |
| 1855 { | 1829 { |
| 1856 FOR_UINT32_INPUTS(i) { | 1830 FOR_UINT32_INPUTS(i) { |
| 1857 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1831 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 1858 m.Return(m.Word32Or(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); | 1832 m.Return(m.Word32Or(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); |
| 1859 FOR_UINT32_INPUTS(j) { | 1833 FOR_UINT32_INPUTS(j) { |
| 1860 uint32_t expected = *i | ~(*j); | 1834 uint32_t expected = *i | ~(*j); |
| 1861 CHECK_EQ(expected, m.Call(*j)); | 1835 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 1862 } | 1836 } |
| 1863 } | 1837 } |
| 1864 } | 1838 } |
| 1865 } | 1839 } |
| 1866 | 1840 |
| 1867 | 1841 |
| 1868 TEST(RunWord32OrInBranch) { | 1842 TEST(RunWord32OrInBranch) { |
| 1869 static const int constant = 987654321; | 1843 static const int constant = 987654321; |
| 1870 { | 1844 { |
| 1871 RawMachineAssemblerTester<int32_t> m; | 1845 RawMachineAssemblerTester<int32_t> m; |
| 1872 Int32BinopTester bt(&m); | 1846 Int32BinopTester bt(&m); |
| 1873 MLabel blocka, blockb; | 1847 MLabel blocka, blockb; |
| 1874 m.Branch( | 1848 m.Branch( |
| 1875 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), | 1849 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), |
| 1876 &blocka, &blockb); | 1850 &blocka, &blockb); |
| 1877 m.Bind(&blocka); | 1851 m.Bind(&blocka); |
| 1878 bt.AddReturn(m.Int32Constant(constant)); | 1852 bt.AddReturn(m.Int32Constant(constant)); |
| 1879 m.Bind(&blockb); | 1853 m.Bind(&blockb); |
| 1880 bt.AddReturn(m.Int32Constant(0 - constant)); | 1854 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 1881 FOR_UINT32_INPUTS(i) { | 1855 FOR_INT32_INPUTS(i) { |
| 1882 FOR_UINT32_INPUTS(j) { | 1856 FOR_INT32_INPUTS(j) { |
| 1883 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; | 1857 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; |
| 1884 CHECK_EQ(expected, bt.call(*i, *j)); | 1858 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1885 } | 1859 } |
| 1886 } | 1860 } |
| 1887 } | 1861 } |
| 1888 { | 1862 { |
| 1889 RawMachineAssemblerTester<int32_t> m; | 1863 RawMachineAssemblerTester<int32_t> m; |
| 1890 Int32BinopTester bt(&m); | 1864 Int32BinopTester bt(&m); |
| 1891 MLabel blocka, blockb; | 1865 MLabel blocka, blockb; |
| 1892 m.Branch( | 1866 m.Branch( |
| 1893 m.Word32NotEqual(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), | 1867 m.Word32NotEqual(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), |
| 1894 &blocka, &blockb); | 1868 &blocka, &blockb); |
| 1895 m.Bind(&blocka); | 1869 m.Bind(&blocka); |
| 1896 bt.AddReturn(m.Int32Constant(constant)); | 1870 bt.AddReturn(m.Int32Constant(constant)); |
| 1897 m.Bind(&blockb); | 1871 m.Bind(&blockb); |
| 1898 bt.AddReturn(m.Int32Constant(0 - constant)); | 1872 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 1899 FOR_UINT32_INPUTS(i) { | 1873 FOR_INT32_INPUTS(i) { |
| 1900 FOR_UINT32_INPUTS(j) { | 1874 FOR_INT32_INPUTS(j) { |
| 1901 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; | 1875 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; |
| 1902 CHECK_EQ(expected, bt.call(*i, *j)); | 1876 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1903 } | 1877 } |
| 1904 } | 1878 } |
| 1905 } | 1879 } |
| 1906 { | 1880 { |
| 1907 FOR_UINT32_INPUTS(i) { | 1881 FOR_INT32_INPUTS(i) { |
| 1908 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1882 RawMachineAssemblerTester<int32_t> m(mInt32); |
| 1909 MLabel blocka, blockb; | 1883 MLabel blocka, blockb; |
| 1910 m.Branch(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), | 1884 m.Branch(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), |
| 1911 m.Int32Constant(0)), | 1885 m.Int32Constant(0)), |
| 1912 &blocka, &blockb); | 1886 &blocka, &blockb); |
| 1913 m.Bind(&blocka); | 1887 m.Bind(&blocka); |
| 1914 m.Return(m.Int32Constant(constant)); | 1888 m.Return(m.Int32Constant(constant)); |
| 1915 m.Bind(&blockb); | 1889 m.Bind(&blockb); |
| 1916 m.Return(m.Int32Constant(0 - constant)); | 1890 m.Return(m.Int32Constant(0 - constant)); |
| 1917 FOR_UINT32_INPUTS(j) { | 1891 FOR_INT32_INPUTS(j) { |
| 1918 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; | 1892 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; |
| 1919 CHECK_EQ(expected, m.Call(*j)); | 1893 CHECK_EQ(expected, m.Call(*j)); |
| 1920 } | 1894 } |
| 1921 } | 1895 } |
| 1922 } | 1896 } |
| 1923 { | 1897 { |
| 1924 FOR_UINT32_INPUTS(i) { | 1898 FOR_INT32_INPUTS(i) { |
| 1925 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1899 RawMachineAssemblerTester<int32_t> m(mInt32); |
| 1926 MLabel blocka, blockb; | 1900 MLabel blocka, blockb; |
| 1927 m.Branch(m.Word32NotEqual(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), | 1901 m.Branch(m.Word32NotEqual(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), |
| 1928 m.Int32Constant(0)), | 1902 m.Int32Constant(0)), |
| 1929 &blocka, &blockb); | 1903 &blocka, &blockb); |
| 1930 m.Bind(&blocka); | 1904 m.Bind(&blocka); |
| 1931 m.Return(m.Int32Constant(constant)); | 1905 m.Return(m.Int32Constant(constant)); |
| 1932 m.Bind(&blockb); | 1906 m.Bind(&blockb); |
| 1933 m.Return(m.Int32Constant(0 - constant)); | 1907 m.Return(m.Int32Constant(0 - constant)); |
| 1934 FOR_UINT32_INPUTS(j) { | 1908 FOR_INT32_INPUTS(j) { |
| 1935 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; | 1909 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; |
| 1936 CHECK_EQ(expected, m.Call(*j)); | 1910 CHECK_EQ(expected, m.Call(*j)); |
| 1937 } | 1911 } |
| 1938 } | 1912 } |
| 1939 } | 1913 } |
| 1940 { | 1914 { |
| 1941 RawMachineAssemblerTester<void> m; | 1915 RawMachineAssemblerTester<void> m; |
| 1942 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 1916 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
| 1943 m.machine()->Word32Shr()}; | 1917 m.machine()->Word32Shr()}; |
| 1944 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 1918 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
| 1945 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1919 RawMachineAssemblerTester<int32_t> m(mUint32, mInt32, mUint32); |
| 1946 kMachineWord32); | |
| 1947 MLabel blocka, blockb; | 1920 MLabel blocka, blockb; |
| 1948 m.Branch(m.Word32Equal(m.Word32Or(m.Parameter(0), | 1921 m.Branch(m.Word32Equal(m.Word32Or(m.Parameter(0), |
| 1949 m.NewNode(shops[n], m.Parameter(1), | 1922 m.NewNode(shops[n], m.Parameter(1), |
| 1950 m.Parameter(2))), | 1923 m.Parameter(2))), |
| 1951 m.Int32Constant(0)), | 1924 m.Int32Constant(0)), |
| 1952 &blocka, &blockb); | 1925 &blocka, &blockb); |
| 1953 m.Bind(&blocka); | 1926 m.Bind(&blocka); |
| 1954 m.Return(m.Int32Constant(constant)); | 1927 m.Return(m.Int32Constant(constant)); |
| 1955 m.Bind(&blockb); | 1928 m.Bind(&blockb); |
| 1956 m.Return(m.Int32Constant(0 - constant)); | 1929 m.Return(m.Int32Constant(0 - constant)); |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1977 } | 1950 } |
| 1978 } | 1951 } |
| 1979 } | 1952 } |
| 1980 } | 1953 } |
| 1981 } | 1954 } |
| 1982 | 1955 |
| 1983 | 1956 |
| 1984 TEST(RunWord32OrInComparison) { | 1957 TEST(RunWord32OrInComparison) { |
| 1985 { | 1958 { |
| 1986 RawMachineAssemblerTester<int32_t> m; | 1959 RawMachineAssemblerTester<int32_t> m; |
| 1987 Int32BinopTester bt(&m); | 1960 Uint32BinopTester bt(&m); |
| 1988 bt.AddReturn( | 1961 bt.AddReturn( |
| 1989 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0))); | 1962 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0))); |
| 1990 FOR_UINT32_INPUTS(i) { | 1963 FOR_UINT32_INPUTS(i) { |
| 1991 FOR_UINT32_INPUTS(j) { | 1964 FOR_UINT32_INPUTS(j) { |
| 1992 int32_t expected = (*i | *j) == 0; | 1965 int32_t expected = (*i | *j) == 0; |
| 1993 CHECK_EQ(expected, bt.call(*i, *j)); | 1966 CHECK_EQ(expected, bt.call(*i, *j)); |
| 1994 } | 1967 } |
| 1995 } | 1968 } |
| 1996 } | 1969 } |
| 1997 { | 1970 { |
| 1998 RawMachineAssemblerTester<int32_t> m; | 1971 RawMachineAssemblerTester<int32_t> m; |
| 1999 Int32BinopTester bt(&m); | 1972 Uint32BinopTester bt(&m); |
| 2000 bt.AddReturn( | 1973 bt.AddReturn( |
| 2001 m.Word32Equal(m.Int32Constant(0), m.Word32Or(bt.param0, bt.param1))); | 1974 m.Word32Equal(m.Int32Constant(0), m.Word32Or(bt.param0, bt.param1))); |
| 2002 FOR_UINT32_INPUTS(i) { | 1975 FOR_UINT32_INPUTS(i) { |
| 2003 FOR_UINT32_INPUTS(j) { | 1976 FOR_UINT32_INPUTS(j) { |
| 2004 int32_t expected = (*i | *j) == 0; | 1977 int32_t expected = (*i | *j) == 0; |
| 2005 CHECK_EQ(expected, bt.call(*i, *j)); | 1978 CHECK_EQ(expected, bt.call(*i, *j)); |
| 2006 } | 1979 } |
| 2007 } | 1980 } |
| 2008 } | 1981 } |
| 2009 { | 1982 { |
| 2010 FOR_UINT32_INPUTS(i) { | 1983 FOR_UINT32_INPUTS(i) { |
| 2011 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1984 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 2012 m.Return(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), | 1985 m.Return(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), |
| 2013 m.Int32Constant(0))); | 1986 m.Int32Constant(0))); |
| 2014 FOR_UINT32_INPUTS(j) { | 1987 FOR_UINT32_INPUTS(j) { |
| 2015 int32_t expected = (*i | *j) == 0; | 1988 uint32_t expected = (*i | *j) == 0; |
| 2016 CHECK_EQ(expected, m.Call(*j)); | 1989 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 2017 } | 1990 } |
| 2018 } | 1991 } |
| 2019 } | 1992 } |
| 2020 { | 1993 { |
| 2021 FOR_UINT32_INPUTS(i) { | 1994 FOR_UINT32_INPUTS(i) { |
| 2022 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1995 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 2023 m.Return(m.Word32Equal(m.Word32Or(m.Parameter(0), m.Int32Constant(*i)), | 1996 m.Return(m.Word32Equal(m.Word32Or(m.Parameter(0), m.Int32Constant(*i)), |
| 2024 m.Int32Constant(0))); | 1997 m.Int32Constant(0))); |
| 2025 FOR_UINT32_INPUTS(j) { | 1998 FOR_UINT32_INPUTS(j) { |
| 2026 int32_t expected = (*j | *i) == 0; | 1999 uint32_t expected = (*j | *i) == 0; |
| 2027 CHECK_EQ(expected, m.Call(*j)); | 2000 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 2028 } | 2001 } |
| 2029 } | 2002 } |
| 2030 } | 2003 } |
| 2031 } | 2004 } |
| 2032 | 2005 |
| 2033 | 2006 |
| 2034 TEST(RunWord32XorP) { | 2007 TEST(RunWord32XorP) { |
| 2035 { | 2008 { |
| 2036 FOR_UINT32_INPUTS(i) { | 2009 FOR_UINT32_INPUTS(i) { |
| 2037 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2010 RawMachineAssemblerTester<int32_t> m(mUint32); |
| 2038 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0))); | 2011 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0))); |
| 2039 FOR_UINT32_INPUTS(j) { | 2012 FOR_UINT32_INPUTS(j) { |
| 2040 uint32_t expected = *i ^ *j; | 2013 uint32_t expected = *i ^ *j; |
| 2041 CHECK_EQ(expected, m.Call(*j)); | 2014 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 2042 } | 2015 } |
| 2043 } | 2016 } |
| 2044 } | 2017 } |
| 2045 { | 2018 { |
| 2046 RawMachineAssemblerTester<int32_t> m; | 2019 RawMachineAssemblerTester<int32_t> m; |
| 2047 Int32BinopTester bt(&m); | 2020 Uint32BinopTester bt(&m); |
| 2048 bt.AddReturn(m.Word32Xor(bt.param0, bt.param1)); | 2021 bt.AddReturn(m.Word32Xor(bt.param0, bt.param1)); |
| 2049 FOR_UINT32_INPUTS(i) { | 2022 FOR_UINT32_INPUTS(i) { |
| 2050 FOR_UINT32_INPUTS(j) { | 2023 FOR_UINT32_INPUTS(j) { |
| 2051 uint32_t expected = *i ^ *j; | 2024 int32_t expected = *i ^ *j; |
| 2052 CHECK_EQ(expected, bt.call(*i, *j)); | 2025 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 2053 } | 2026 } |
| 2054 } | 2027 } |
| 2055 } | 2028 } |
| 2056 { | 2029 { |
| 2057 RawMachineAssemblerTester<int32_t> m; | 2030 RawMachineAssemblerTester<int32_t> m; |
| 2058 Int32BinopTester bt(&m); | 2031 Int32BinopTester bt(&m); |
| 2059 bt.AddReturn(m.Word32Xor(bt.param0, m.Word32Not(bt.param1))); | 2032 bt.AddReturn(m.Word32Xor(bt.param0, m.Word32Not(bt.param1))); |
| 2060 FOR_UINT32_INPUTS(i) { | 2033 FOR_INT32_INPUTS(i) { |
| 2061 FOR_UINT32_INPUTS(j) { | 2034 FOR_INT32_INPUTS(j) { |
| 2062 uint32_t expected = *i ^ ~(*j); | 2035 int32_t expected = *i ^ ~(*j); |
| 2063 CHECK_EQ(expected, bt.call(*i, *j)); | 2036 CHECK_EQ(expected, bt.call(*i, *j)); |
| 2064 } | 2037 } |
| 2065 } | 2038 } |
| 2066 } | 2039 } |
| 2067 { | 2040 { |
| 2068 RawMachineAssemblerTester<int32_t> m; | 2041 RawMachineAssemblerTester<int32_t> m; |
| 2069 Int32BinopTester bt(&m); | 2042 Int32BinopTester bt(&m); |
| 2070 bt.AddReturn(m.Word32Xor(m.Word32Not(bt.param0), bt.param1)); | 2043 bt.AddReturn(m.Word32Xor(m.Word32Not(bt.param0), bt.param1)); |
| 2071 FOR_UINT32_INPUTS(i) { | 2044 FOR_INT32_INPUTS(i) { |
| 2072 FOR_UINT32_INPUTS(j) { | 2045 FOR_INT32_INPUTS(j) { |
| 2073 uint32_t expected = ~(*i) ^ *j; | 2046 int32_t expected = ~(*i) ^ *j; |
| 2074 CHECK_EQ(expected, bt.call(*i, *j)); | 2047 CHECK_EQ(expected, bt.call(*i, *j)); |
| 2075 } | 2048 } |
| 2076 } | 2049 } |
| 2077 } | 2050 } |
| 2078 { | 2051 { |
| 2079 FOR_UINT32_INPUTS(i) { | 2052 FOR_UINT32_INPUTS(i) { |
| 2080 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2053 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 2081 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); | 2054 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); |
| 2082 FOR_UINT32_INPUTS(j) { | 2055 FOR_UINT32_INPUTS(j) { |
| 2083 uint32_t expected = *i ^ ~(*j); | 2056 uint32_t expected = *i ^ ~(*j); |
| 2084 CHECK_EQ(expected, m.Call(*j)); | 2057 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 2085 } | 2058 } |
| 2086 } | 2059 } |
| 2087 } | 2060 } |
| 2088 } | 2061 } |
| 2089 | 2062 |
| 2090 | 2063 |
| 2091 TEST(RunWord32XorInBranch) { | 2064 TEST(RunWord32XorInBranch) { |
| 2092 static const int constant = 987654321; | 2065 static const uint32_t constant = 987654321; |
| 2093 { | 2066 { |
| 2094 RawMachineAssemblerTester<int32_t> m; | 2067 RawMachineAssemblerTester<int32_t> m; |
| 2095 Int32BinopTester bt(&m); | 2068 Uint32BinopTester bt(&m); |
| 2096 MLabel blocka, blockb; | 2069 MLabel blocka, blockb; |
| 2097 m.Branch( | 2070 m.Branch( |
| 2098 m.Word32Equal(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), | 2071 m.Word32Equal(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), |
| 2099 &blocka, &blockb); | 2072 &blocka, &blockb); |
| 2100 m.Bind(&blocka); | 2073 m.Bind(&blocka); |
| 2101 bt.AddReturn(m.Int32Constant(constant)); | 2074 bt.AddReturn(m.Int32Constant(constant)); |
| 2102 m.Bind(&blockb); | 2075 m.Bind(&blockb); |
| 2103 bt.AddReturn(m.Int32Constant(0 - constant)); | 2076 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 2104 FOR_UINT32_INPUTS(i) { | 2077 FOR_UINT32_INPUTS(i) { |
| 2105 FOR_UINT32_INPUTS(j) { | 2078 FOR_UINT32_INPUTS(j) { |
| 2106 int32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; | 2079 uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; |
| 2107 CHECK_EQ(expected, bt.call(*i, *j)); | 2080 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 2108 } | 2081 } |
| 2109 } | 2082 } |
| 2110 } | 2083 } |
| 2111 { | 2084 { |
| 2112 RawMachineAssemblerTester<int32_t> m; | 2085 RawMachineAssemblerTester<int32_t> m; |
| 2113 Int32BinopTester bt(&m); | 2086 Uint32BinopTester bt(&m); |
| 2114 MLabel blocka, blockb; | 2087 MLabel blocka, blockb; |
| 2115 m.Branch( | 2088 m.Branch( |
| 2116 m.Word32NotEqual(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), | 2089 m.Word32NotEqual(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), |
| 2117 &blocka, &blockb); | 2090 &blocka, &blockb); |
| 2118 m.Bind(&blocka); | 2091 m.Bind(&blocka); |
| 2119 bt.AddReturn(m.Int32Constant(constant)); | 2092 bt.AddReturn(m.Int32Constant(constant)); |
| 2120 m.Bind(&blockb); | 2093 m.Bind(&blockb); |
| 2121 bt.AddReturn(m.Int32Constant(0 - constant)); | 2094 bt.AddReturn(m.Int32Constant(0 - constant)); |
| 2122 FOR_UINT32_INPUTS(i) { | 2095 FOR_UINT32_INPUTS(i) { |
| 2123 FOR_UINT32_INPUTS(j) { | 2096 FOR_UINT32_INPUTS(j) { |
| 2124 int32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; | 2097 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; |
| 2125 CHECK_EQ(expected, bt.call(*i, *j)); | 2098 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
| 2126 } | 2099 } |
| 2127 } | 2100 } |
| 2128 } | 2101 } |
| 2129 { | 2102 { |
| 2130 FOR_UINT32_INPUTS(i) { | 2103 FOR_UINT32_INPUTS(i) { |
| 2131 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2104 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 2132 MLabel blocka, blockb; | 2105 MLabel blocka, blockb; |
| 2133 m.Branch(m.Word32Equal(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), | 2106 m.Branch(m.Word32Equal(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), |
| 2134 m.Int32Constant(0)), | 2107 m.Int32Constant(0)), |
| 2135 &blocka, &blockb); | 2108 &blocka, &blockb); |
| 2136 m.Bind(&blocka); | 2109 m.Bind(&blocka); |
| 2137 m.Return(m.Int32Constant(constant)); | 2110 m.Return(m.Int32Constant(constant)); |
| 2138 m.Bind(&blockb); | 2111 m.Bind(&blockb); |
| 2139 m.Return(m.Int32Constant(0 - constant)); | 2112 m.Return(m.Int32Constant(0 - constant)); |
| 2140 FOR_UINT32_INPUTS(j) { | 2113 FOR_UINT32_INPUTS(j) { |
| 2141 int32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; | 2114 uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; |
| 2142 CHECK_EQ(expected, m.Call(*j)); | 2115 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 2143 } | 2116 } |
| 2144 } | 2117 } |
| 2145 } | 2118 } |
| 2146 { | 2119 { |
| 2147 FOR_UINT32_INPUTS(i) { | 2120 FOR_UINT32_INPUTS(i) { |
| 2148 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2121 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 2149 MLabel blocka, blockb; | 2122 MLabel blocka, blockb; |
| 2150 m.Branch( | 2123 m.Branch( |
| 2151 m.Word32NotEqual(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), | 2124 m.Word32NotEqual(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), |
| 2152 m.Int32Constant(0)), | 2125 m.Int32Constant(0)), |
| 2153 &blocka, &blockb); | 2126 &blocka, &blockb); |
| 2154 m.Bind(&blocka); | 2127 m.Bind(&blocka); |
| 2155 m.Return(m.Int32Constant(constant)); | 2128 m.Return(m.Int32Constant(constant)); |
| 2156 m.Bind(&blockb); | 2129 m.Bind(&blockb); |
| 2157 m.Return(m.Int32Constant(0 - constant)); | 2130 m.Return(m.Int32Constant(0 - constant)); |
| 2158 FOR_UINT32_INPUTS(j) { | 2131 FOR_UINT32_INPUTS(j) { |
| 2159 int32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; | 2132 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; |
| 2160 CHECK_EQ(expected, m.Call(*j)); | 2133 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 2161 } | 2134 } |
| 2162 } | 2135 } |
| 2163 } | 2136 } |
| 2164 { | 2137 { |
| 2165 RawMachineAssemblerTester<void> m; | 2138 RawMachineAssemblerTester<void> m; |
| 2166 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 2139 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
| 2167 m.machine()->Word32Shr()}; | 2140 m.machine()->Word32Shr()}; |
| 2168 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 2141 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
| 2169 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2142 RawMachineAssemblerTester<int32_t> m(mUint32, mInt32, mUint32); |
| 2170 kMachineWord32); | |
| 2171 MLabel blocka, blockb; | 2143 MLabel blocka, blockb; |
| 2172 m.Branch(m.Word32Equal(m.Word32Xor(m.Parameter(0), | 2144 m.Branch(m.Word32Equal(m.Word32Xor(m.Parameter(0), |
| 2173 m.NewNode(shops[n], m.Parameter(1), | 2145 m.NewNode(shops[n], m.Parameter(1), |
| 2174 m.Parameter(2))), | 2146 m.Parameter(2))), |
| 2175 m.Int32Constant(0)), | 2147 m.Int32Constant(0)), |
| 2176 &blocka, &blockb); | 2148 &blocka, &blockb); |
| 2177 m.Bind(&blocka); | 2149 m.Bind(&blocka); |
| 2178 m.Return(m.Int32Constant(constant)); | 2150 m.Return(m.Int32Constant(constant)); |
| 2179 m.Bind(&blockb); | 2151 m.Bind(&blockb); |
| 2180 m.Return(m.Int32Constant(0 - constant)); | 2152 m.Return(m.Int32Constant(0 - constant)); |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 2201 } | 2173 } |
| 2202 } | 2174 } |
| 2203 } | 2175 } |
| 2204 } | 2176 } |
| 2205 } | 2177 } |
| 2206 | 2178 |
| 2207 | 2179 |
| 2208 TEST(RunWord32ShlP) { | 2180 TEST(RunWord32ShlP) { |
| 2209 { | 2181 { |
| 2210 FOR_UINT32_SHIFTS(shift) { | 2182 FOR_UINT32_SHIFTS(shift) { |
| 2211 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2183 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 2212 m.Return(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift))); | 2184 m.Return(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift))); |
| 2213 FOR_UINT32_INPUTS(j) { | 2185 FOR_UINT32_INPUTS(j) { |
| 2214 uint32_t expected = *j << shift; | 2186 uint32_t expected = *j << shift; |
| 2215 CHECK_EQ(expected, m.Call(*j)); | 2187 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 2216 } | 2188 } |
| 2217 } | 2189 } |
| 2218 } | 2190 } |
| 2219 { | 2191 { |
| 2220 RawMachineAssemblerTester<int32_t> m; | 2192 RawMachineAssemblerTester<int32_t> m; |
| 2221 Int32BinopTester bt(&m); | 2193 Uint32BinopTester bt(&m); |
| 2222 bt.AddReturn(m.Word32Shl(bt.param0, bt.param1)); | 2194 bt.AddReturn(m.Word32Shl(bt.param0, bt.param1)); |
| 2223 FOR_UINT32_INPUTS(i) { | 2195 FOR_UINT32_INPUTS(i) { |
| 2224 FOR_UINT32_SHIFTS(shift) { | 2196 FOR_UINT32_SHIFTS(shift) { |
| 2225 uint32_t expected = *i << shift; | 2197 uint32_t expected = *i << shift; |
| 2226 CHECK_EQ(expected, bt.call(*i, shift)); | 2198 CHECK_UINT32_EQ(expected, bt.call(*i, shift)); |
| 2227 } | 2199 } |
| 2228 } | 2200 } |
| 2229 } | 2201 } |
| 2230 } | 2202 } |
| 2231 | 2203 |
| 2232 | 2204 |
| 2233 TEST(RunWord32ShrP) { | 2205 TEST(RunWord32ShrP) { |
| 2234 { | 2206 { |
| 2235 FOR_UINT32_SHIFTS(shift) { | 2207 FOR_UINT32_SHIFTS(shift) { |
| 2236 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2208 RawMachineAssemblerTester<uint32_t> m(mUint32); |
| 2237 m.Return(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift))); | 2209 m.Return(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift))); |
| 2238 FOR_UINT32_INPUTS(j) { | 2210 FOR_UINT32_INPUTS(j) { |
| 2239 uint32_t expected = *j >> shift; | 2211 uint32_t expected = *j >> shift; |
| 2240 CHECK_EQ(expected, m.Call(*j)); | 2212 CHECK_UINT32_EQ(expected, m.Call(*j)); |
| 2241 } | 2213 } |
| 2242 } | 2214 } |
| 2243 } | 2215 } |
| 2244 { | 2216 { |
| 2245 RawMachineAssemblerTester<int32_t> m; | 2217 RawMachineAssemblerTester<int32_t> m; |
| 2246 Int32BinopTester bt(&m); | 2218 Uint32BinopTester bt(&m); |
| 2247 bt.AddReturn(m.Word32Shr(bt.param0, bt.param1)); | 2219 bt.AddReturn(m.Word32Shr(bt.param0, bt.param1)); |
| 2248 FOR_UINT32_INPUTS(i) { | 2220 FOR_UINT32_INPUTS(i) { |
| 2249 FOR_UINT32_SHIFTS(shift) { | 2221 FOR_UINT32_SHIFTS(shift) { |
| 2250 uint32_t expected = *i >> shift; | 2222 uint32_t expected = *i >> shift; |
| 2251 CHECK_EQ(expected, bt.call(*i, shift)); | 2223 CHECK_UINT32_EQ(expected, bt.call(*i, shift)); |
| 2252 } | 2224 } |
| 2253 } | 2225 } |
| 2254 CHECK_EQ(0x00010000, bt.call(0x80000000, 15)); | 2226 CHECK_EQ(0x00010000, bt.call(0x80000000, 15)); |
| 2255 } | 2227 } |
| 2256 } | 2228 } |
| 2257 | 2229 |
| 2258 | 2230 |
| 2259 TEST(RunWord32SarP) { | 2231 TEST(RunWord32SarP) { |
| 2260 { | 2232 { |
| 2261 FOR_INT32_SHIFTS(shift) { | 2233 FOR_INT32_SHIFTS(shift) { |
| 2262 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2234 RawMachineAssemblerTester<int32_t> m(mInt32); |
| 2263 m.Return(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift))); | 2235 m.Return(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift))); |
| 2264 FOR_INT32_INPUTS(j) { | 2236 FOR_INT32_INPUTS(j) { |
| 2265 int32_t expected = *j >> shift; | 2237 int32_t expected = *j >> shift; |
| 2266 CHECK_EQ(expected, m.Call(*j)); | 2238 CHECK_EQ(expected, m.Call(*j)); |
| 2267 } | 2239 } |
| 2268 } | 2240 } |
| 2269 } | 2241 } |
| 2270 { | 2242 { |
| 2271 RawMachineAssemblerTester<int32_t> m; | 2243 RawMachineAssemblerTester<int32_t> m; |
| 2272 Int32BinopTester bt(&m); | 2244 Int32BinopTester bt(&m); |
| 2273 bt.AddReturn(m.Word32Sar(bt.param0, bt.param1)); | 2245 bt.AddReturn(m.Word32Sar(bt.param0, bt.param1)); |
| 2274 FOR_INT32_INPUTS(i) { | 2246 FOR_INT32_INPUTS(i) { |
| 2275 FOR_INT32_SHIFTS(shift) { | 2247 FOR_INT32_SHIFTS(shift) { |
| 2276 int32_t expected = *i >> shift; | 2248 int32_t expected = *i >> shift; |
| 2277 CHECK_EQ(expected, bt.call(*i, shift)); | 2249 CHECK_EQ(expected, bt.call(*i, shift)); |
| 2278 } | 2250 } |
| 2279 } | 2251 } |
| 2280 CHECK_EQ(0xFFFF0000, bt.call(0x80000000, 15)); | 2252 CHECK_EQ(0xFFFF0000, bt.call(0x80000000, 15)); |
| 2281 } | 2253 } |
| 2282 } | 2254 } |
| 2283 | 2255 |
| 2284 | 2256 |
| 2285 TEST(RunWord32NotP) { | 2257 TEST(RunWord32NotP) { |
| 2286 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2258 RawMachineAssemblerTester<int32_t> m(mInt32); |
| 2287 m.Return(m.Word32Not(m.Parameter(0))); | 2259 m.Return(m.Word32Not(m.Parameter(0))); |
| 2288 FOR_UINT32_INPUTS(i) { | 2260 FOR_INT32_INPUTS(i) { |
| 2289 int expected = ~(*i); | 2261 int expected = ~(*i); |
| 2290 CHECK_EQ(expected, m.Call(*i)); | 2262 CHECK_EQ(expected, m.Call(*i)); |
| 2291 } | 2263 } |
| 2292 } | 2264 } |
| 2293 | 2265 |
| 2294 | 2266 |
| 2295 TEST(RunInt32NegP) { | 2267 TEST(RunInt32NegP) { |
| 2296 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2268 RawMachineAssemblerTester<int32_t> m(mInt32); |
| 2297 m.Return(m.Int32Neg(m.Parameter(0))); | 2269 m.Return(m.Int32Neg(m.Parameter(0))); |
| 2298 FOR_INT32_INPUTS(i) { | 2270 FOR_INT32_INPUTS(i) { |
| 2299 int expected = -*i; | 2271 int expected = -*i; |
| 2300 CHECK_EQ(expected, m.Call(*i)); | 2272 CHECK_EQ(expected, m.Call(*i)); |
| 2301 } | 2273 } |
| 2302 } | 2274 } |
| 2303 | 2275 |
| 2304 | 2276 |
| 2305 TEST(RunWord32EqualAndWord32SarP) { | 2277 TEST(RunWord32EqualAndWord32SarP) { |
| 2306 { | 2278 { |
| 2307 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2279 RawMachineAssemblerTester<int32_t> m(mInt32, mInt32, mUint32); |
| 2308 kMachineWord32); | |
| 2309 m.Return(m.Word32Equal(m.Parameter(0), | 2280 m.Return(m.Word32Equal(m.Parameter(0), |
| 2310 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); | 2281 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); |
| 2311 FOR_INT32_INPUTS(i) { | 2282 FOR_INT32_INPUTS(i) { |
| 2312 FOR_INT32_INPUTS(j) { | 2283 FOR_INT32_INPUTS(j) { |
| 2313 FOR_UINT32_SHIFTS(shift) { | 2284 FOR_UINT32_SHIFTS(shift) { |
| 2314 int32_t expected = (*i == (*j >> shift)); | 2285 int32_t expected = (*i == (*j >> shift)); |
| 2315 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 2286 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 2316 } | 2287 } |
| 2317 } | 2288 } |
| 2318 } | 2289 } |
| 2319 } | 2290 } |
| 2320 { | 2291 { |
| 2321 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2292 RawMachineAssemblerTester<int32_t> m(mInt32, mUint32, mInt32); |
| 2322 kMachineWord32); | |
| 2323 m.Return(m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Parameter(1)), | 2293 m.Return(m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Parameter(1)), |
| 2324 m.Parameter(2))); | 2294 m.Parameter(2))); |
| 2325 FOR_INT32_INPUTS(i) { | 2295 FOR_INT32_INPUTS(i) { |
| 2326 FOR_UINT32_SHIFTS(shift) { | 2296 FOR_UINT32_SHIFTS(shift) { |
| 2327 FOR_INT32_INPUTS(k) { | 2297 FOR_INT32_INPUTS(k) { |
| 2328 int32_t expected = ((*i >> shift) == *k); | 2298 int32_t expected = ((*i >> shift) == *k); |
| 2329 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 2299 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 2330 } | 2300 } |
| 2331 } | 2301 } |
| 2332 } | 2302 } |
| 2333 } | 2303 } |
| 2334 } | 2304 } |
| 2335 | 2305 |
| 2336 | 2306 |
| 2337 TEST(RunWord32EqualAndWord32ShlP) { | 2307 TEST(RunWord32EqualAndWord32ShlP) { |
| 2338 { | 2308 { |
| 2339 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2309 RawMachineAssemblerTester<int32_t> m(mUint32, mUint32, mUint32); |
| 2340 kMachineWord32); | |
| 2341 m.Return(m.Word32Equal(m.Parameter(0), | 2310 m.Return(m.Word32Equal(m.Parameter(0), |
| 2342 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); | 2311 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); |
| 2343 FOR_UINT32_INPUTS(i) { | 2312 FOR_UINT32_INPUTS(i) { |
| 2344 FOR_UINT32_INPUTS(j) { | 2313 FOR_UINT32_INPUTS(j) { |
| 2345 FOR_UINT32_SHIFTS(shift) { | 2314 FOR_UINT32_SHIFTS(shift) { |
| 2346 int32_t expected = (*i == (*j << shift)); | 2315 int32_t expected = (*i == (*j << shift)); |
| 2347 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 2316 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 2348 } | 2317 } |
| 2349 } | 2318 } |
| 2350 } | 2319 } |
| 2351 } | 2320 } |
| 2352 { | 2321 { |
| 2353 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2322 RawMachineAssemblerTester<int32_t> m(mUint32, mUint32, mUint32); |
| 2354 kMachineWord32); | |
| 2355 m.Return(m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Parameter(1)), | 2323 m.Return(m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Parameter(1)), |
| 2356 m.Parameter(2))); | 2324 m.Parameter(2))); |
| 2357 FOR_UINT32_INPUTS(i) { | 2325 FOR_UINT32_INPUTS(i) { |
| 2358 FOR_UINT32_SHIFTS(shift) { | 2326 FOR_UINT32_SHIFTS(shift) { |
| 2359 FOR_UINT32_INPUTS(k) { | 2327 FOR_UINT32_INPUTS(k) { |
| 2360 int32_t expected = ((*i << shift) == *k); | 2328 int32_t expected = ((*i << shift) == *k); |
| 2361 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 2329 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 2362 } | 2330 } |
| 2363 } | 2331 } |
| 2364 } | 2332 } |
| 2365 } | 2333 } |
| 2366 } | 2334 } |
| 2367 | 2335 |
| 2368 | 2336 |
| 2369 TEST(RunWord32EqualAndWord32ShrP) { | 2337 TEST(RunWord32EqualAndWord32ShrP) { |
| 2370 { | 2338 { |
| 2371 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2339 RawMachineAssemblerTester<int32_t> m(mUint32, mUint32, mUint32); |
| 2372 kMachineWord32); | |
| 2373 m.Return(m.Word32Equal(m.Parameter(0), | 2340 m.Return(m.Word32Equal(m.Parameter(0), |
| 2374 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); | 2341 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); |
| 2375 FOR_UINT32_INPUTS(i) { | 2342 FOR_UINT32_INPUTS(i) { |
| 2376 FOR_UINT32_INPUTS(j) { | 2343 FOR_UINT32_INPUTS(j) { |
| 2377 FOR_UINT32_SHIFTS(shift) { | 2344 FOR_UINT32_SHIFTS(shift) { |
| 2378 int32_t expected = (*i == (*j >> shift)); | 2345 int32_t expected = (*i == (*j >> shift)); |
| 2379 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 2346 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
| 2380 } | 2347 } |
| 2381 } | 2348 } |
| 2382 } | 2349 } |
| 2383 } | 2350 } |
| 2384 { | 2351 { |
| 2385 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2352 RawMachineAssemblerTester<int32_t> m(mUint32, mUint32, mUint32); |
| 2386 kMachineWord32); | |
| 2387 m.Return(m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Parameter(1)), | 2353 m.Return(m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Parameter(1)), |
| 2388 m.Parameter(2))); | 2354 m.Parameter(2))); |
| 2389 FOR_UINT32_INPUTS(i) { | 2355 FOR_UINT32_INPUTS(i) { |
| 2390 FOR_UINT32_SHIFTS(shift) { | 2356 FOR_UINT32_SHIFTS(shift) { |
| 2391 FOR_UINT32_INPUTS(k) { | 2357 FOR_UINT32_INPUTS(k) { |
| 2392 int32_t expected = ((*i >> shift) == *k); | 2358 int32_t expected = ((*i >> shift) == *k); |
| 2393 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 2359 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
| 2394 } | 2360 } |
| 2395 } | 2361 } |
| 2396 } | 2362 } |
| 2397 } | 2363 } |
| 2398 } | 2364 } |
| 2399 | 2365 |
| 2400 | 2366 |
| 2401 TEST(RunDeadNodes) { | 2367 TEST(RunDeadNodes) { |
| 2402 for (int i = 0; true; i++) { | 2368 for (int i = 0; true; i++) { |
| 2403 RawMachineAssemblerTester<int32_t> m(i == 5 ? kMachineWord32 | 2369 RawMachineAssemblerTester<int32_t> m(i == 5 ? mInt32 : mNone); |
| 2404 : kMachineLast); | |
| 2405 int constant = 0x55 + i; | 2370 int constant = 0x55 + i; |
| 2406 switch (i) { | 2371 switch (i) { |
| 2407 case 0: | 2372 case 0: |
| 2408 m.Int32Constant(44); | 2373 m.Int32Constant(44); |
| 2409 break; | 2374 break; |
| 2410 case 1: | 2375 case 1: |
| 2411 m.StringConstant("unused"); | 2376 m.StringConstant("unused"); |
| 2412 break; | 2377 break; |
| 2413 case 2: | 2378 case 2: |
| 2414 m.NumberConstant(11.1); | 2379 m.NumberConstant(11.1); |
| 2415 break; | 2380 break; |
| 2416 case 3: | 2381 case 3: |
| 2417 m.PointerConstant(&constant); | 2382 m.PointerConstant(&constant); |
| 2418 break; | 2383 break; |
| 2419 case 4: | 2384 case 4: |
| 2420 m.LoadFromPointer(&constant, kMachineWord32); | 2385 m.LoadFromPointer(&constant, mInt32); |
| 2421 break; | 2386 break; |
| 2422 case 5: | 2387 case 5: |
| 2423 m.Parameter(0); | 2388 m.Parameter(0); |
| 2424 break; | 2389 break; |
| 2425 default: | 2390 default: |
| 2426 return; | 2391 return; |
| 2427 } | 2392 } |
| 2428 m.Return(m.Int32Constant(constant)); | 2393 m.Return(m.Int32Constant(constant)); |
| 2429 if (i != 5) { | 2394 if (i != 5) { |
| 2430 CHECK_EQ(constant, m.Call()); | 2395 CHECK_EQ(constant, m.Call()); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 2444 m.machine()->Word32Shr(), m.machine()->Word32Sar(), | 2409 m.machine()->Word32Shr(), m.machine()->Word32Sar(), |
| 2445 m.machine()->Word32Equal(), m.machine()->Int32Add(), | 2410 m.machine()->Word32Equal(), m.machine()->Int32Add(), |
| 2446 m.machine()->Int32Sub(), m.machine()->Int32Mul(), | 2411 m.machine()->Int32Sub(), m.machine()->Int32Mul(), |
| 2447 m.machine()->Int32Div(), m.machine()->Int32UDiv(), | 2412 m.machine()->Int32Div(), m.machine()->Int32UDiv(), |
| 2448 m.machine()->Int32Mod(), m.machine()->Int32UMod(), | 2413 m.machine()->Int32Mod(), m.machine()->Int32UMod(), |
| 2449 m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(), | 2414 m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(), |
| 2450 m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual(), | 2415 m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual(), |
| 2451 NULL}; | 2416 NULL}; |
| 2452 | 2417 |
| 2453 for (int i = 0; ops[i] != NULL; i++) { | 2418 for (int i = 0; ops[i] != NULL; i++) { |
| 2454 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | 2419 RawMachineAssemblerTester<int32_t> m(mInt32, mInt32); |
| 2455 int constant = 0x55555 + i; | 2420 int constant = 0x55555 + i; |
| 2456 m.NewNode(ops[i], m.Parameter(0), m.Parameter(1)); | 2421 m.NewNode(ops[i], m.Parameter(0), m.Parameter(1)); |
| 2457 m.Return(m.Int32Constant(constant)); | 2422 m.Return(m.Int32Constant(constant)); |
| 2458 | 2423 |
| 2459 CHECK_EQ(constant, m.Call(1, 1)); | 2424 CHECK_EQ(constant, m.Call(1, 1)); |
| 2460 } | 2425 } |
| 2461 } | 2426 } |
| 2462 | 2427 |
| 2463 | 2428 |
| 2464 template <typename Type, typename CType> | 2429 template <typename Type, typename CType> |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 2483 Type expected = buffer[i]; | 2448 Type expected = buffer[i]; |
| 2484 Type actual = static_cast<CType>(m.Call()); | 2449 Type actual = static_cast<CType>(m.Call()); |
| 2485 CHECK_EQ(expected, actual); | 2450 CHECK_EQ(expected, actual); |
| 2486 printf("XXX\n"); | 2451 printf("XXX\n"); |
| 2487 } | 2452 } |
| 2488 } | 2453 } |
| 2489 } | 2454 } |
| 2490 | 2455 |
| 2491 | 2456 |
| 2492 TEST(RunLoadImmIndex) { | 2457 TEST(RunLoadImmIndex) { |
| 2493 RunLoadImmIndex<int8_t, uint8_t>(kMachineWord8); | 2458 RunLoadImmIndex<int8_t, uint8_t>(mInt8); |
| 2494 RunLoadImmIndex<int16_t, uint16_t>(kMachineWord16); | 2459 RunLoadImmIndex<int16_t, uint16_t>(mInt16); |
| 2495 RunLoadImmIndex<int32_t, uint32_t>(kMachineWord32); | 2460 RunLoadImmIndex<int32_t, uint32_t>(mInt32); |
| 2496 RunLoadImmIndex<int32_t*, int32_t*>(kMachineTagged); | 2461 RunLoadImmIndex<int32_t*, int32_t*>(mAnyTagged); |
| 2497 | 2462 |
| 2498 // TODO(titzer): test kMachineFloat64 loads | 2463 // TODO(titzer): test rBit loads |
| 2464 // TODO(titzer): test mFloat64 loads | |
| 2499 // TODO(titzer): test various indexing modes. | 2465 // TODO(titzer): test various indexing modes. |
| 2500 } | 2466 } |
| 2501 | 2467 |
| 2502 | 2468 |
| 2503 template <typename CType> | 2469 template <typename CType> |
| 2504 static void RunLoadStore(MachineType rep) { | 2470 static void RunLoadStore(MachineType rep) { |
| 2505 const int kNumElems = 4; | 2471 const int kNumElems = 4; |
| 2506 CType buffer[kNumElems]; | 2472 CType buffer[kNumElems]; |
| 2507 | 2473 |
| 2508 for (int32_t x = 0; x < kNumElems; x++) { | 2474 for (int32_t x = 0; x < kNumElems; x++) { |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 2523 m.Return(m.Int32Constant(OK)); | 2489 m.Return(m.Int32Constant(OK)); |
| 2524 | 2490 |
| 2525 CHECK_NE(buffer[x], buffer[y]); | 2491 CHECK_NE(buffer[x], buffer[y]); |
| 2526 CHECK_EQ(OK, m.Call()); | 2492 CHECK_EQ(OK, m.Call()); |
| 2527 CHECK_EQ(buffer[x], buffer[y]); | 2493 CHECK_EQ(buffer[x], buffer[y]); |
| 2528 } | 2494 } |
| 2529 } | 2495 } |
| 2530 | 2496 |
| 2531 | 2497 |
| 2532 TEST(RunLoadStore) { | 2498 TEST(RunLoadStore) { |
| 2533 RunLoadStore<int8_t>(kMachineWord8); | 2499 RunLoadStore<int8_t>(mInt8); |
| 2534 RunLoadStore<int16_t>(kMachineWord16); | 2500 RunLoadStore<int16_t>(mInt16); |
| 2535 RunLoadStore<int32_t>(kMachineWord32); | 2501 RunLoadStore<int32_t>(mInt32); |
| 2536 RunLoadStore<void*>(kMachineTagged); | 2502 RunLoadStore<void*>(mAnyTagged); |
| 2537 RunLoadStore<double>(kMachineFloat64); | 2503 RunLoadStore<double>(mFloat64); |
| 2538 } | 2504 } |
| 2539 | 2505 |
| 2540 | 2506 |
| 2541 TEST(RunFloat64Binop) { | 2507 TEST(RunFloat64Binop) { |
| 2542 RawMachineAssemblerTester<int32_t> m; | 2508 RawMachineAssemblerTester<int32_t> m; |
| 2543 double result; | 2509 double result; |
| 2544 | 2510 |
| 2545 Operator* ops[] = {m.machine()->Float64Add(), m.machine()->Float64Sub(), | 2511 Operator* ops[] = {m.machine()->Float64Add(), m.machine()->Float64Sub(), |
| 2546 m.machine()->Float64Mul(), m.machine()->Float64Div(), | 2512 m.machine()->Float64Mul(), m.machine()->Float64Div(), |
| 2547 m.machine()->Float64Mod(), NULL}; | 2513 m.machine()->Float64Mod(), NULL}; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 2559 NULL}; | 2525 NULL}; |
| 2560 | 2526 |
| 2561 for (int i = 0; ops[i] != NULL; i++) { | 2527 for (int i = 0; ops[i] != NULL; i++) { |
| 2562 for (int j = 0; inputs[j] != NULL; j += 2) { | 2528 for (int j = 0; inputs[j] != NULL; j += 2) { |
| 2563 RawMachineAssemblerTester<int32_t> m; | 2529 RawMachineAssemblerTester<int32_t> m; |
| 2564 Node* a = m.NewNode(inputs[j]); | 2530 Node* a = m.NewNode(inputs[j]); |
| 2565 Node* b = m.NewNode(inputs[j + 1]); | 2531 Node* b = m.NewNode(inputs[j + 1]); |
| 2566 Node* binop = m.NewNode(ops[i], a, b); | 2532 Node* binop = m.NewNode(ops[i], a, b); |
| 2567 Node* base = m.PointerConstant(&result); | 2533 Node* base = m.PointerConstant(&result); |
| 2568 Node* zero = m.Int32Constant(0); | 2534 Node* zero = m.Int32Constant(0); |
| 2569 m.Store(kMachineFloat64, base, zero, binop); | 2535 m.Store(mFloat64, base, zero, binop); |
| 2570 m.Return(m.Int32Constant(i + j)); | 2536 m.Return(m.Int32Constant(i + j)); |
| 2571 CHECK_EQ(i + j, m.Call()); | 2537 CHECK_EQ(i + j, m.Call()); |
| 2572 } | 2538 } |
| 2573 } | 2539 } |
| 2574 } | 2540 } |
| 2575 | 2541 |
| 2576 | 2542 |
| 2577 TEST(RunDeadFloat64Binops) { | 2543 TEST(RunDeadFloat64Binops) { |
| 2578 RawMachineAssemblerTester<int32_t> m; | 2544 RawMachineAssemblerTester<int32_t> m; |
| 2579 | 2545 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2620 } | 2586 } |
| 2621 } | 2587 } |
| 2622 | 2588 |
| 2623 | 2589 |
| 2624 TEST(RunFloat64SubImm1) { | 2590 TEST(RunFloat64SubImm1) { |
| 2625 double input = 0.0; | 2591 double input = 0.0; |
| 2626 double output = 0.0; | 2592 double output = 0.0; |
| 2627 | 2593 |
| 2628 FOR_FLOAT64_INPUTS(i) { | 2594 FOR_FLOAT64_INPUTS(i) { |
| 2629 RawMachineAssemblerTester<int32_t> m; | 2595 RawMachineAssemblerTester<int32_t> m; |
| 2630 Node* t0 = m.LoadFromPointer(&input, kMachineFloat64); | 2596 Node* t0 = m.LoadFromPointer(&input, mFloat64); |
| 2631 Node* t1 = m.Float64Sub(m.Float64Constant(*i), t0); | 2597 Node* t1 = m.Float64Sub(m.Float64Constant(*i), t0); |
| 2632 m.StoreToPointer(&output, kMachineFloat64, t1); | 2598 m.StoreToPointer(&output, mFloat64, t1); |
| 2633 m.Return(m.Int32Constant(0)); | 2599 m.Return(m.Int32Constant(0)); |
| 2634 FOR_FLOAT64_INPUTS(j) { | 2600 FOR_FLOAT64_INPUTS(j) { |
| 2635 input = *j; | 2601 input = *j; |
| 2636 double expected = *i - input; | 2602 double expected = *i - input; |
| 2637 CHECK_EQ(0, m.Call()); | 2603 CHECK_EQ(0, m.Call()); |
| 2638 CHECK_EQ(expected, output); | 2604 CHECK_EQ(expected, output); |
| 2639 } | 2605 } |
| 2640 } | 2606 } |
| 2641 } | 2607 } |
| 2642 | 2608 |
| 2643 | 2609 |
| 2644 TEST(RunFloat64SubImm2) { | 2610 TEST(RunFloat64SubImm2) { |
| 2645 double input = 0.0; | 2611 double input = 0.0; |
| 2646 double output = 0.0; | 2612 double output = 0.0; |
| 2647 | 2613 |
| 2648 FOR_FLOAT64_INPUTS(i) { | 2614 FOR_FLOAT64_INPUTS(i) { |
| 2649 RawMachineAssemblerTester<int32_t> m; | 2615 RawMachineAssemblerTester<int32_t> m; |
| 2650 Node* t0 = m.LoadFromPointer(&input, kMachineFloat64); | 2616 Node* t0 = m.LoadFromPointer(&input, mFloat64); |
| 2651 Node* t1 = m.Float64Sub(t0, m.Float64Constant(*i)); | 2617 Node* t1 = m.Float64Sub(t0, m.Float64Constant(*i)); |
| 2652 m.StoreToPointer(&output, kMachineFloat64, t1); | 2618 m.StoreToPointer(&output, mFloat64, t1); |
| 2653 m.Return(m.Int32Constant(0)); | 2619 m.Return(m.Int32Constant(0)); |
| 2654 FOR_FLOAT64_INPUTS(j) { | 2620 FOR_FLOAT64_INPUTS(j) { |
| 2655 input = *j; | 2621 input = *j; |
| 2656 double expected = input - *i; | 2622 double expected = input - *i; |
| 2657 CHECK_EQ(0, m.Call()); | 2623 CHECK_EQ(0, m.Call()); |
| 2658 CHECK_EQ(expected, output); | 2624 CHECK_EQ(expected, output); |
| 2659 } | 2625 } |
| 2660 } | 2626 } |
| 2661 } | 2627 } |
| 2662 | 2628 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 2677 | 2643 |
| 2678 | 2644 |
| 2679 TEST(RunFloat64MulAndFloat64AddP) { | 2645 TEST(RunFloat64MulAndFloat64AddP) { |
| 2680 double input_a = 0.0; | 2646 double input_a = 0.0; |
| 2681 double input_b = 0.0; | 2647 double input_b = 0.0; |
| 2682 double input_c = 0.0; | 2648 double input_c = 0.0; |
| 2683 double output = 0.0; | 2649 double output = 0.0; |
| 2684 | 2650 |
| 2685 { | 2651 { |
| 2686 RawMachineAssemblerTester<int32_t> m; | 2652 RawMachineAssemblerTester<int32_t> m; |
| 2687 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); | 2653 Node* a = m.LoadFromPointer(&input_a, mFloat64); |
| 2688 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); | 2654 Node* b = m.LoadFromPointer(&input_b, mFloat64); |
| 2689 Node* c = m.LoadFromPointer(&input_c, kMachineFloat64); | 2655 Node* c = m.LoadFromPointer(&input_c, mFloat64); |
| 2690 m.StoreToPointer(&output, kMachineFloat64, | 2656 m.StoreToPointer(&output, mFloat64, m.Float64Add(m.Float64Mul(a, b), c)); |
| 2691 m.Float64Add(m.Float64Mul(a, b), c)); | |
| 2692 m.Return(m.Int32Constant(0)); | 2657 m.Return(m.Int32Constant(0)); |
| 2693 FOR_FLOAT64_INPUTS(i) { | 2658 FOR_FLOAT64_INPUTS(i) { |
| 2694 FOR_FLOAT64_INPUTS(j) { | 2659 FOR_FLOAT64_INPUTS(j) { |
| 2695 FOR_FLOAT64_INPUTS(k) { | 2660 FOR_FLOAT64_INPUTS(k) { |
| 2696 input_a = *i; | 2661 input_a = *i; |
| 2697 input_b = *j; | 2662 input_b = *j; |
| 2698 input_c = *k; | 2663 input_c = *k; |
| 2699 volatile double temp = input_a * input_b; | 2664 volatile double temp = input_a * input_b; |
| 2700 volatile double expected = temp + input_c; | 2665 volatile double expected = temp + input_c; |
| 2701 CHECK_EQ(0, m.Call()); | 2666 CHECK_EQ(0, m.Call()); |
| 2702 CHECK_EQ(expected, output); | 2667 CHECK_EQ(expected, output); |
| 2703 } | 2668 } |
| 2704 } | 2669 } |
| 2705 } | 2670 } |
| 2706 } | 2671 } |
| 2707 { | 2672 { |
| 2708 RawMachineAssemblerTester<int32_t> m; | 2673 RawMachineAssemblerTester<int32_t> m; |
| 2709 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); | 2674 Node* a = m.LoadFromPointer(&input_a, mFloat64); |
| 2710 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); | 2675 Node* b = m.LoadFromPointer(&input_b, mFloat64); |
| 2711 Node* c = m.LoadFromPointer(&input_c, kMachineFloat64); | 2676 Node* c = m.LoadFromPointer(&input_c, mFloat64); |
| 2712 m.StoreToPointer(&output, kMachineFloat64, | 2677 m.StoreToPointer(&output, mFloat64, m.Float64Add(a, m.Float64Mul(b, c))); |
| 2713 m.Float64Add(a, m.Float64Mul(b, c))); | |
| 2714 m.Return(m.Int32Constant(0)); | 2678 m.Return(m.Int32Constant(0)); |
| 2715 FOR_FLOAT64_INPUTS(i) { | 2679 FOR_FLOAT64_INPUTS(i) { |
| 2716 FOR_FLOAT64_INPUTS(j) { | 2680 FOR_FLOAT64_INPUTS(j) { |
| 2717 FOR_FLOAT64_INPUTS(k) { | 2681 FOR_FLOAT64_INPUTS(k) { |
| 2718 input_a = *i; | 2682 input_a = *i; |
| 2719 input_b = *j; | 2683 input_b = *j; |
| 2720 input_c = *k; | 2684 input_c = *k; |
| 2721 volatile double temp = input_b * input_c; | 2685 volatile double temp = input_b * input_c; |
| 2722 volatile double expected = input_a + temp; | 2686 volatile double expected = input_a + temp; |
| 2723 CHECK_EQ(0, m.Call()); | 2687 CHECK_EQ(0, m.Call()); |
| 2724 CHECK_EQ(expected, output); | 2688 CHECK_EQ(expected, output); |
| 2725 } | 2689 } |
| 2726 } | 2690 } |
| 2727 } | 2691 } |
| 2728 } | 2692 } |
| 2729 } | 2693 } |
| 2730 | 2694 |
| 2731 | 2695 |
| 2732 TEST(RunFloat64MulAndFloat64SubP) { | 2696 TEST(RunFloat64MulAndFloat64SubP) { |
| 2733 double input_a = 0.0; | 2697 double input_a = 0.0; |
| 2734 double input_b = 0.0; | 2698 double input_b = 0.0; |
| 2735 double input_c = 0.0; | 2699 double input_c = 0.0; |
| 2736 double output = 0.0; | 2700 double output = 0.0; |
| 2737 | 2701 |
| 2738 RawMachineAssemblerTester<int32_t> m; | 2702 RawMachineAssemblerTester<int32_t> m; |
| 2739 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); | 2703 Node* a = m.LoadFromPointer(&input_a, mFloat64); |
| 2740 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); | 2704 Node* b = m.LoadFromPointer(&input_b, mFloat64); |
| 2741 Node* c = m.LoadFromPointer(&input_c, kMachineFloat64); | 2705 Node* c = m.LoadFromPointer(&input_c, mFloat64); |
| 2742 m.StoreToPointer(&output, kMachineFloat64, | 2706 m.StoreToPointer(&output, mFloat64, m.Float64Sub(a, m.Float64Mul(b, c))); |
| 2743 m.Float64Sub(a, m.Float64Mul(b, c))); | |
| 2744 m.Return(m.Int32Constant(0)); | 2707 m.Return(m.Int32Constant(0)); |
| 2745 | 2708 |
| 2746 FOR_FLOAT64_INPUTS(i) { | 2709 FOR_FLOAT64_INPUTS(i) { |
| 2747 FOR_FLOAT64_INPUTS(j) { | 2710 FOR_FLOAT64_INPUTS(j) { |
| 2748 FOR_FLOAT64_INPUTS(k) { | 2711 FOR_FLOAT64_INPUTS(k) { |
| 2749 input_a = *i; | 2712 input_a = *i; |
| 2750 input_b = *j; | 2713 input_b = *j; |
| 2751 input_c = *k; | 2714 input_c = *k; |
| 2752 volatile double temp = input_b * input_c; | 2715 volatile double temp = input_b * input_c; |
| 2753 volatile double expected = input_a - temp; | 2716 volatile double expected = input_a - temp; |
| 2754 CHECK_EQ(0, m.Call()); | 2717 CHECK_EQ(0, m.Call()); |
| 2755 CHECK_EQ(expected, output); | 2718 CHECK_EQ(expected, output); |
| 2756 } | 2719 } |
| 2757 } | 2720 } |
| 2758 } | 2721 } |
| 2759 } | 2722 } |
| 2760 | 2723 |
| 2761 | 2724 |
| 2762 TEST(RunFloat64MulImm) { | 2725 TEST(RunFloat64MulImm) { |
| 2763 double input = 0.0; | 2726 double input = 0.0; |
| 2764 double output = 0.0; | 2727 double output = 0.0; |
| 2765 | 2728 |
| 2766 { | 2729 { |
| 2767 FOR_FLOAT64_INPUTS(i) { | 2730 FOR_FLOAT64_INPUTS(i) { |
| 2768 RawMachineAssemblerTester<int32_t> m; | 2731 RawMachineAssemblerTester<int32_t> m; |
| 2769 Node* t0 = m.LoadFromPointer(&input, kMachineFloat64); | 2732 Node* t0 = m.LoadFromPointer(&input, mFloat64); |
| 2770 Node* t1 = m.Float64Mul(m.Float64Constant(*i), t0); | 2733 Node* t1 = m.Float64Mul(m.Float64Constant(*i), t0); |
| 2771 m.StoreToPointer(&output, kMachineFloat64, t1); | 2734 m.StoreToPointer(&output, mFloat64, t1); |
| 2772 m.Return(m.Int32Constant(0)); | 2735 m.Return(m.Int32Constant(0)); |
| 2773 FOR_FLOAT64_INPUTS(j) { | 2736 FOR_FLOAT64_INPUTS(j) { |
| 2774 input = *j; | 2737 input = *j; |
| 2775 double expected = *i * input; | 2738 double expected = *i * input; |
| 2776 CHECK_EQ(0, m.Call()); | 2739 CHECK_EQ(0, m.Call()); |
| 2777 CHECK_EQ(expected, output); | 2740 CHECK_EQ(expected, output); |
| 2778 } | 2741 } |
| 2779 } | 2742 } |
| 2780 } | 2743 } |
| 2781 { | 2744 { |
| 2782 FOR_FLOAT64_INPUTS(i) { | 2745 FOR_FLOAT64_INPUTS(i) { |
| 2783 RawMachineAssemblerTester<int32_t> m; | 2746 RawMachineAssemblerTester<int32_t> m; |
| 2784 Node* t0 = m.LoadFromPointer(&input, kMachineFloat64); | 2747 Node* t0 = m.LoadFromPointer(&input, mFloat64); |
| 2785 Node* t1 = m.Float64Mul(t0, m.Float64Constant(*i)); | 2748 Node* t1 = m.Float64Mul(t0, m.Float64Constant(*i)); |
| 2786 m.StoreToPointer(&output, kMachineFloat64, t1); | 2749 m.StoreToPointer(&output, mFloat64, t1); |
| 2787 m.Return(m.Int32Constant(0)); | 2750 m.Return(m.Int32Constant(0)); |
| 2788 FOR_FLOAT64_INPUTS(j) { | 2751 FOR_FLOAT64_INPUTS(j) { |
| 2789 input = *j; | 2752 input = *j; |
| 2790 double expected = input * *i; | 2753 double expected = input * *i; |
| 2791 CHECK_EQ(0, m.Call()); | 2754 CHECK_EQ(0, m.Call()); |
| 2792 CHECK_EQ(expected, output); | 2755 CHECK_EQ(expected, output); |
| 2793 } | 2756 } |
| 2794 } | 2757 } |
| 2795 } | 2758 } |
| 2796 } | 2759 } |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 2826 } | 2789 } |
| 2827 } | 2790 } |
| 2828 | 2791 |
| 2829 | 2792 |
| 2830 TEST(RunChangeInt32ToFloat64_A) { | 2793 TEST(RunChangeInt32ToFloat64_A) { |
| 2831 RawMachineAssemblerTester<int32_t> m; | 2794 RawMachineAssemblerTester<int32_t> m; |
| 2832 int32_t magic = 0x986234; | 2795 int32_t magic = 0x986234; |
| 2833 double result = 0; | 2796 double result = 0; |
| 2834 | 2797 |
| 2835 Node* convert = m.ChangeInt32ToFloat64(m.Int32Constant(magic)); | 2798 Node* convert = m.ChangeInt32ToFloat64(m.Int32Constant(magic)); |
| 2836 m.Store(kMachineFloat64, m.PointerConstant(&result), m.Int32Constant(0), | 2799 m.Store(mFloat64, m.PointerConstant(&result), m.Int32Constant(0), convert); |
| 2837 convert); | |
| 2838 m.Return(m.Int32Constant(magic)); | 2800 m.Return(m.Int32Constant(magic)); |
| 2839 | 2801 |
| 2840 CHECK_EQ(magic, m.Call()); | 2802 CHECK_EQ(magic, m.Call()); |
| 2841 CHECK_EQ(static_cast<double>(magic), result); | 2803 CHECK_EQ(static_cast<double>(magic), result); |
| 2842 } | 2804 } |
| 2843 | 2805 |
| 2844 | 2806 |
| 2845 TEST(RunChangeInt32ToFloat64_B) { | 2807 TEST(RunChangeInt32ToFloat64_B) { |
| 2846 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2808 RawMachineAssemblerTester<int32_t> m(mInt32); |
| 2847 double output = 0; | 2809 double output = 0; |
| 2848 | 2810 |
| 2849 Node* convert = m.ChangeInt32ToFloat64(m.Parameter(0)); | 2811 Node* convert = m.ChangeInt32ToFloat64(m.Parameter(0)); |
| 2850 m.Store(kMachineFloat64, m.PointerConstant(&output), m.Int32Constant(0), | 2812 m.Store(mFloat64, m.PointerConstant(&output), m.Int32Constant(0), convert); |
| 2851 convert); | |
| 2852 m.Return(m.Parameter(0)); | 2813 m.Return(m.Parameter(0)); |
| 2853 | 2814 |
| 2854 FOR_INT32_INPUTS(i) { | 2815 FOR_INT32_INPUTS(i) { |
| 2855 int32_t expect = *i; | 2816 int32_t expect = *i; |
| 2856 CHECK_EQ(expect, m.Call(expect)); | 2817 CHECK_EQ(expect, m.Call(expect)); |
| 2857 CHECK_EQ(static_cast<double>(expect), output); | 2818 CHECK_EQ(static_cast<double>(expect), output); |
| 2858 } | 2819 } |
| 2859 } | 2820 } |
| 2860 | 2821 |
| 2861 | 2822 |
| 2862 TEST(RunChangeUint32ToFloat64_B) { | 2823 TEST(RunChangeUint32ToFloat64_B) { |
| 2863 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2824 RawMachineAssemblerTester<int32_t> m(mUint32); |
| 2864 double output = 0; | 2825 double output = 0; |
| 2865 | 2826 |
| 2866 Node* convert = m.ChangeUint32ToFloat64(m.Parameter(0)); | 2827 Node* convert = m.ChangeUint32ToFloat64(m.Parameter(0)); |
| 2867 m.Store(kMachineFloat64, m.PointerConstant(&output), m.Int32Constant(0), | 2828 m.Store(mFloat64, m.PointerConstant(&output), m.Int32Constant(0), convert); |
| 2868 convert); | |
| 2869 m.Return(m.Parameter(0)); | 2829 m.Return(m.Parameter(0)); |
| 2870 | 2830 |
| 2871 FOR_UINT32_INPUTS(i) { | 2831 FOR_UINT32_INPUTS(i) { |
| 2872 uint32_t expect = *i; | 2832 uint32_t expect = *i; |
| 2873 CHECK_EQ(expect, m.Call(expect)); | 2833 CHECK_EQ(expect, m.Call(expect)); |
| 2874 CHECK_EQ(static_cast<double>(expect), output); | 2834 CHECK_EQ(static_cast<double>(expect), output); |
| 2875 } | 2835 } |
| 2876 } | 2836 } |
| 2877 | 2837 |
| 2878 | 2838 |
| 2879 TEST(RunChangeFloat64ToInt32_A) { | 2839 TEST(RunChangeFloat64ToInt32_A) { |
| 2880 RawMachineAssemblerTester<int32_t> m; | 2840 RawMachineAssemblerTester<int32_t> m; |
| 2881 int32_t magic = 0x786234; | 2841 int32_t magic = 0x786234; |
| 2882 double input = 11.1; | 2842 double input = 11.1; |
| 2883 int32_t result = 0; | 2843 int32_t result = 0; |
| 2884 | 2844 |
| 2885 m.Store(kMachineWord32, m.PointerConstant(&result), m.Int32Constant(0), | 2845 m.Store(mInt32, m.PointerConstant(&result), m.Int32Constant(0), |
| 2886 m.ChangeFloat64ToInt32(m.Float64Constant(input))); | 2846 m.ChangeFloat64ToInt32(m.Float64Constant(input))); |
| 2887 m.Return(m.Int32Constant(magic)); | 2847 m.Return(m.Int32Constant(magic)); |
| 2888 | 2848 |
| 2889 CHECK_EQ(magic, m.Call()); | 2849 CHECK_EQ(magic, m.Call()); |
| 2890 CHECK_EQ(static_cast<int32_t>(input), result); | 2850 CHECK_EQ(static_cast<int32_t>(input), result); |
| 2891 } | 2851 } |
| 2892 | 2852 |
| 2893 | 2853 |
| 2894 TEST(RunChangeFloat64ToInt32_B) { | 2854 TEST(RunChangeFloat64ToInt32_B) { |
| 2895 RawMachineAssemblerTester<int32_t> m; | 2855 RawMachineAssemblerTester<int32_t> m; |
| 2896 double input = 0; | 2856 double input = 0; |
| 2897 int32_t output = 0; | 2857 int32_t output = 0; |
| 2898 | 2858 |
| 2899 Node* load = | 2859 Node* load = m.Load(mFloat64, m.PointerConstant(&input), m.Int32Constant(0)); |
| 2900 m.Load(kMachineFloat64, m.PointerConstant(&input), m.Int32Constant(0)); | |
| 2901 Node* convert = m.ChangeFloat64ToInt32(load); | 2860 Node* convert = m.ChangeFloat64ToInt32(load); |
| 2902 m.Store(kMachineWord32, m.PointerConstant(&output), m.Int32Constant(0), | 2861 m.Store(mInt32, m.PointerConstant(&output), m.Int32Constant(0), convert); |
| 2903 convert); | |
| 2904 m.Return(convert); | 2862 m.Return(convert); |
| 2905 | 2863 |
| 2906 { | 2864 { |
| 2907 FOR_INT32_INPUTS(i) { | 2865 FOR_INT32_INPUTS(i) { |
| 2908 input = *i; | 2866 input = *i; |
| 2909 int32_t expect = *i; | 2867 int32_t expect = *i; |
| 2910 CHECK_EQ(expect, m.Call()); | 2868 CHECK_EQ(expect, m.Call()); |
| 2911 CHECK_EQ(expect, output); | 2869 CHECK_EQ(expect, output); |
| 2912 } | 2870 } |
| 2913 } | 2871 } |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 2931 // Note we don't check fractional inputs, because these Convert operators | 2889 // Note we don't check fractional inputs, because these Convert operators |
| 2932 // really should be Change operators. | 2890 // really should be Change operators. |
| 2933 } | 2891 } |
| 2934 | 2892 |
| 2935 | 2893 |
| 2936 TEST(RunChangeFloat64ToUint32_B) { | 2894 TEST(RunChangeFloat64ToUint32_B) { |
| 2937 RawMachineAssemblerTester<int32_t> m; | 2895 RawMachineAssemblerTester<int32_t> m; |
| 2938 double input = 0; | 2896 double input = 0; |
| 2939 int32_t output = 0; | 2897 int32_t output = 0; |
| 2940 | 2898 |
| 2941 Node* load = | 2899 Node* load = m.Load(mFloat64, m.PointerConstant(&input), m.Int32Constant(0)); |
| 2942 m.Load(kMachineFloat64, m.PointerConstant(&input), m.Int32Constant(0)); | |
| 2943 Node* convert = m.ChangeFloat64ToUint32(load); | 2900 Node* convert = m.ChangeFloat64ToUint32(load); |
| 2944 m.Store(kMachineWord32, m.PointerConstant(&output), m.Int32Constant(0), | 2901 m.Store(mInt32, m.PointerConstant(&output), m.Int32Constant(0), convert); |
| 2945 convert); | |
| 2946 m.Return(convert); | 2902 m.Return(convert); |
| 2947 | 2903 |
| 2948 { | 2904 { |
| 2949 FOR_UINT32_INPUTS(i) { | 2905 FOR_UINT32_INPUTS(i) { |
| 2950 input = *i; | 2906 input = *i; |
| 2951 // TODO(titzer): add a CheckEqualsHelper overload for uint32_t. | 2907 // TODO(titzer): add a CheckEqualsHelper overload for uint32_t. |
| 2952 int32_t expect = static_cast<int32_t>(*i); | 2908 int32_t expect = static_cast<int32_t>(*i); |
| 2953 CHECK_EQ(expect, m.Call()); | 2909 CHECK_EQ(expect, m.Call()); |
| 2954 CHECK_EQ(expect, output); | 2910 CHECK_EQ(expect, output); |
| 2955 } | 2911 } |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 2978 | 2934 |
| 2979 TEST(RunChangeFloat64ToInt32_spilled) { | 2935 TEST(RunChangeFloat64ToInt32_spilled) { |
| 2980 RawMachineAssemblerTester<int32_t> m; | 2936 RawMachineAssemblerTester<int32_t> m; |
| 2981 const int kNumInputs = 32; | 2937 const int kNumInputs = 32; |
| 2982 int32_t magic = 0x786234; | 2938 int32_t magic = 0x786234; |
| 2983 double input[kNumInputs]; | 2939 double input[kNumInputs]; |
| 2984 int32_t result[kNumInputs]; | 2940 int32_t result[kNumInputs]; |
| 2985 Node* input_node[kNumInputs]; | 2941 Node* input_node[kNumInputs]; |
| 2986 | 2942 |
| 2987 for (int i = 0; i < kNumInputs; i++) { | 2943 for (int i = 0; i < kNumInputs; i++) { |
| 2988 input_node[i] = m.Load(kMachineFloat64, m.PointerConstant(&input), | 2944 input_node[i] = |
| 2989 m.Int32Constant(i * 8)); | 2945 m.Load(mFloat64, m.PointerConstant(&input), m.Int32Constant(i * 8)); |
| 2990 } | 2946 } |
| 2991 | 2947 |
| 2992 for (int i = 0; i < kNumInputs; i++) { | 2948 for (int i = 0; i < kNumInputs; i++) { |
| 2993 m.Store(kMachineWord32, m.PointerConstant(&result), m.Int32Constant(i * 4), | 2949 m.Store(mInt32, m.PointerConstant(&result), m.Int32Constant(i * 4), |
| 2994 m.ChangeFloat64ToInt32(input_node[i])); | 2950 m.ChangeFloat64ToInt32(input_node[i])); |
| 2995 } | 2951 } |
| 2996 | 2952 |
| 2997 m.Return(m.Int32Constant(magic)); | 2953 m.Return(m.Int32Constant(magic)); |
| 2998 | 2954 |
| 2999 for (int i = 0; i < kNumInputs; i++) { | 2955 for (int i = 0; i < kNumInputs; i++) { |
| 3000 input[i] = 100.9 + i; | 2956 input[i] = 100.9 + i; |
| 3001 } | 2957 } |
| 3002 | 2958 |
| 3003 CHECK_EQ(magic, m.Call()); | 2959 CHECK_EQ(magic, m.Call()); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3059 MLabel blocka, blockb, end; | 3015 MLabel blocka, blockb, end; |
| 3060 Node* k1 = m.Float64Constant(constant); | 3016 Node* k1 = m.Float64Constant(constant); |
| 3061 Node* k2 = m.Float64Constant(0 - constant); | 3017 Node* k2 = m.Float64Constant(0 - constant); |
| 3062 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 3018 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
| 3063 m.Bind(&blocka); | 3019 m.Bind(&blocka); |
| 3064 m.Goto(&end); | 3020 m.Goto(&end); |
| 3065 m.Bind(&blockb); | 3021 m.Bind(&blockb); |
| 3066 m.Goto(&end); | 3022 m.Goto(&end); |
| 3067 m.Bind(&end); | 3023 m.Bind(&end); |
| 3068 Node* phi = m.Phi(k2, k1); | 3024 Node* phi = m.Phi(k2, k1); |
| 3069 m.Store(kMachineFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi); | 3025 m.Store(mFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi); |
| 3070 m.Return(m.Int32Constant(magic)); | 3026 m.Return(m.Int32Constant(magic)); |
| 3071 | 3027 |
| 3072 CHECK_EQ(magic, m.Call()); | 3028 CHECK_EQ(magic, m.Call()); |
| 3073 CHECK_EQ(constant, buffer); | 3029 CHECK_EQ(constant, buffer); |
| 3074 } | 3030 } |
| 3075 | 3031 |
| 3076 | 3032 |
| 3077 TEST(RunRefDiamond) { | 3033 TEST(RunRefDiamond) { |
| 3078 RawMachineAssemblerTester<int32_t> m; | 3034 RawMachineAssemblerTester<int32_t> m; |
| 3079 | 3035 |
| 3080 const int magic = 99644; | 3036 const int magic = 99644; |
| 3081 Handle<String> rexpected = | 3037 Handle<String> rexpected = |
| 3082 CcTest::i_isolate()->factory()->InternalizeUtf8String("A"); | 3038 CcTest::i_isolate()->factory()->InternalizeUtf8String("A"); |
| 3083 String* buffer; | 3039 String* buffer; |
| 3084 | 3040 |
| 3085 MLabel blocka, blockb, end; | 3041 MLabel blocka, blockb, end; |
| 3086 Node* k1 = m.StringConstant("A"); | 3042 Node* k1 = m.StringConstant("A"); |
| 3087 Node* k2 = m.StringConstant("B"); | 3043 Node* k2 = m.StringConstant("B"); |
| 3088 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 3044 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
| 3089 m.Bind(&blocka); | 3045 m.Bind(&blocka); |
| 3090 m.Goto(&end); | 3046 m.Goto(&end); |
| 3091 m.Bind(&blockb); | 3047 m.Bind(&blockb); |
| 3092 m.Goto(&end); | 3048 m.Goto(&end); |
| 3093 m.Bind(&end); | 3049 m.Bind(&end); |
| 3094 Node* phi = m.Phi(k2, k1); | 3050 Node* phi = m.Phi(k2, k1); |
| 3095 m.Store(kMachineTagged, m.PointerConstant(&buffer), m.Int32Constant(0), phi); | 3051 m.Store(mAnyTagged, m.PointerConstant(&buffer), m.Int32Constant(0), phi); |
| 3096 m.Return(m.Int32Constant(magic)); | 3052 m.Return(m.Int32Constant(magic)); |
| 3097 | 3053 |
| 3098 CHECK_EQ(magic, m.Call()); | 3054 CHECK_EQ(magic, m.Call()); |
| 3099 CHECK(rexpected->SameValue(buffer)); | 3055 CHECK(rexpected->SameValue(buffer)); |
| 3100 } | 3056 } |
| 3101 | 3057 |
| 3102 | 3058 |
| 3103 TEST(RunDoubleRefDiamond) { | 3059 TEST(RunDoubleRefDiamond) { |
| 3104 RawMachineAssemblerTester<int32_t> m; | 3060 RawMachineAssemblerTester<int32_t> m; |
| 3105 | 3061 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 3116 Node* r1 = m.StringConstant("AX"); | 3072 Node* r1 = m.StringConstant("AX"); |
| 3117 Node* r2 = m.StringConstant("BX"); | 3073 Node* r2 = m.StringConstant("BX"); |
| 3118 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 3074 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
| 3119 m.Bind(&blocka); | 3075 m.Bind(&blocka); |
| 3120 m.Goto(&end); | 3076 m.Goto(&end); |
| 3121 m.Bind(&blockb); | 3077 m.Bind(&blockb); |
| 3122 m.Goto(&end); | 3078 m.Goto(&end); |
| 3123 m.Bind(&end); | 3079 m.Bind(&end); |
| 3124 Node* dphi = m.Phi(d2, d1); | 3080 Node* dphi = m.Phi(d2, d1); |
| 3125 Node* rphi = m.Phi(r2, r1); | 3081 Node* rphi = m.Phi(r2, r1); |
| 3126 m.Store(kMachineFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), | 3082 m.Store(mFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), dphi); |
| 3127 dphi); | 3083 m.Store(mAnyTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0), rphi); |
| 3128 m.Store(kMachineTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0), | |
| 3129 rphi); | |
| 3130 m.Return(m.Int32Constant(magic)); | 3084 m.Return(m.Int32Constant(magic)); |
| 3131 | 3085 |
| 3132 CHECK_EQ(magic, m.Call()); | 3086 CHECK_EQ(magic, m.Call()); |
| 3133 CHECK_EQ(dconstant, dbuffer); | 3087 CHECK_EQ(dconstant, dbuffer); |
| 3134 CHECK(rexpected->SameValue(rbuffer)); | 3088 CHECK(rexpected->SameValue(rbuffer)); |
| 3135 } | 3089 } |
| 3136 | 3090 |
| 3137 | 3091 |
| 3138 TEST(RunDoubleRefDoubleDiamond) { | 3092 TEST(RunDoubleRefDoubleDiamond) { |
| 3139 RawMachineAssemblerTester<int32_t> m; | 3093 RawMachineAssemblerTester<int32_t> m; |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 3161 m.Branch(m.Int32Constant(0), &blockd, &blocke); | 3115 m.Branch(m.Int32Constant(0), &blockd, &blocke); |
| 3162 | 3116 |
| 3163 m.Bind(&blockd); | 3117 m.Bind(&blockd); |
| 3164 m.Goto(&end); | 3118 m.Goto(&end); |
| 3165 m.Bind(&blocke); | 3119 m.Bind(&blocke); |
| 3166 m.Goto(&end); | 3120 m.Goto(&end); |
| 3167 m.Bind(&end); | 3121 m.Bind(&end); |
| 3168 Node* dphi2 = m.Phi(d1, dphi1); | 3122 Node* dphi2 = m.Phi(d1, dphi1); |
| 3169 Node* rphi2 = m.Phi(r1, rphi1); | 3123 Node* rphi2 = m.Phi(r1, rphi1); |
| 3170 | 3124 |
| 3171 m.Store(kMachineFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), | 3125 m.Store(mFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), dphi2); |
| 3172 dphi2); | 3126 m.Store(mAnyTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0), rphi2); |
| 3173 m.Store(kMachineTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0), | |
| 3174 rphi2); | |
| 3175 m.Return(m.Int32Constant(magic)); | 3127 m.Return(m.Int32Constant(magic)); |
| 3176 | 3128 |
| 3177 CHECK_EQ(magic, m.Call()); | 3129 CHECK_EQ(magic, m.Call()); |
| 3178 CHECK_EQ(dconstant, dbuffer); | 3130 CHECK_EQ(dconstant, dbuffer); |
| 3179 CHECK(rexpected->SameValue(rbuffer)); | 3131 CHECK(rexpected->SameValue(rbuffer)); |
| 3180 } | 3132 } |
| 3181 | 3133 |
| 3182 | 3134 |
| 3183 TEST(RunDoubleLoopPhi) { | 3135 TEST(RunDoubleLoopPhi) { |
| 3184 RawMachineAssemblerTester<int32_t> m; | 3136 RawMachineAssemblerTester<int32_t> m; |
| 3185 MLabel header, body, end; | 3137 MLabel header, body, end; |
| 3186 | 3138 |
| 3187 int magic = 99773; | 3139 int magic = 99773; |
| 3188 double buffer = 0.99; | 3140 double buffer = 0.99; |
| 3189 double dconstant = 777.1; | 3141 double dconstant = 777.1; |
| 3190 | 3142 |
| 3191 Node* zero = m.Int32Constant(0); | 3143 Node* zero = m.Int32Constant(0); |
| 3192 Node* dk = m.Float64Constant(dconstant); | 3144 Node* dk = m.Float64Constant(dconstant); |
| 3193 | 3145 |
| 3194 m.Goto(&header); | 3146 m.Goto(&header); |
| 3195 m.Bind(&header); | 3147 m.Bind(&header); |
| 3196 Node* phi = m.Phi(dk, dk); | 3148 Node* phi = m.Phi(dk, dk); |
| 3197 phi->ReplaceInput(1, phi); | 3149 phi->ReplaceInput(1, phi); |
| 3198 m.Branch(zero, &body, &end); | 3150 m.Branch(zero, &body, &end); |
| 3199 m.Bind(&body); | 3151 m.Bind(&body); |
| 3200 m.Goto(&header); | 3152 m.Goto(&header); |
| 3201 m.Bind(&end); | 3153 m.Bind(&end); |
| 3202 m.Store(kMachineFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi); | 3154 m.Store(mFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi); |
| 3203 m.Return(m.Int32Constant(magic)); | 3155 m.Return(m.Int32Constant(magic)); |
| 3204 | 3156 |
| 3205 CHECK_EQ(magic, m.Call()); | 3157 CHECK_EQ(magic, m.Call()); |
| 3206 } | 3158 } |
| 3207 | 3159 |
| 3208 | 3160 |
| 3209 TEST(RunCountToTenAccRaw) { | 3161 TEST(RunCountToTenAccRaw) { |
| 3210 RawMachineAssemblerTester<int32_t> m; | 3162 RawMachineAssemblerTester<int32_t> m; |
| 3211 | 3163 |
| 3212 Node* zero = m.Int32Constant(0); | 3164 Node* zero = m.Int32Constant(0); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3273 | 3225 |
| 3274 CHECK_EQ(10, m.Call()); | 3226 CHECK_EQ(10, m.Call()); |
| 3275 } | 3227 } |
| 3276 | 3228 |
| 3277 | 3229 |
| 3278 TEST(RunAddTree) { | 3230 TEST(RunAddTree) { |
| 3279 RawMachineAssemblerTester<int32_t> m; | 3231 RawMachineAssemblerTester<int32_t> m; |
| 3280 int32_t inputs[] = {11, 12, 13, 14, 15, 16, 17, 18}; | 3232 int32_t inputs[] = {11, 12, 13, 14, 15, 16, 17, 18}; |
| 3281 | 3233 |
| 3282 Node* base = m.PointerConstant(inputs); | 3234 Node* base = m.PointerConstant(inputs); |
| 3283 Node* n0 = m.Load(kMachineWord32, base, m.Int32Constant(0 * sizeof(int32_t))); | 3235 Node* n0 = m.Load(mInt32, base, m.Int32Constant(0 * sizeof(int32_t))); |
| 3284 Node* n1 = m.Load(kMachineWord32, base, m.Int32Constant(1 * sizeof(int32_t))); | 3236 Node* n1 = m.Load(mInt32, base, m.Int32Constant(1 * sizeof(int32_t))); |
| 3285 Node* n2 = m.Load(kMachineWord32, base, m.Int32Constant(2 * sizeof(int32_t))); | 3237 Node* n2 = m.Load(mInt32, base, m.Int32Constant(2 * sizeof(int32_t))); |
| 3286 Node* n3 = m.Load(kMachineWord32, base, m.Int32Constant(3 * sizeof(int32_t))); | 3238 Node* n3 = m.Load(mInt32, base, m.Int32Constant(3 * sizeof(int32_t))); |
| 3287 Node* n4 = m.Load(kMachineWord32, base, m.Int32Constant(4 * sizeof(int32_t))); | 3239 Node* n4 = m.Load(mInt32, base, m.Int32Constant(4 * sizeof(int32_t))); |
| 3288 Node* n5 = m.Load(kMachineWord32, base, m.Int32Constant(5 * sizeof(int32_t))); | 3240 Node* n5 = m.Load(mInt32, base, m.Int32Constant(5 * sizeof(int32_t))); |
| 3289 Node* n6 = m.Load(kMachineWord32, base, m.Int32Constant(6 * sizeof(int32_t))); | 3241 Node* n6 = m.Load(mInt32, base, m.Int32Constant(6 * sizeof(int32_t))); |
| 3290 Node* n7 = m.Load(kMachineWord32, base, m.Int32Constant(7 * sizeof(int32_t))); | 3242 Node* n7 = m.Load(mInt32, base, m.Int32Constant(7 * sizeof(int32_t))); |
| 3291 | 3243 |
| 3292 Node* i1 = m.Int32Add(n0, n1); | 3244 Node* i1 = m.Int32Add(n0, n1); |
| 3293 Node* i2 = m.Int32Add(n2, n3); | 3245 Node* i2 = m.Int32Add(n2, n3); |
| 3294 Node* i3 = m.Int32Add(n4, n5); | 3246 Node* i3 = m.Int32Add(n4, n5); |
| 3295 Node* i4 = m.Int32Add(n6, n7); | 3247 Node* i4 = m.Int32Add(n6, n7); |
| 3296 | 3248 |
| 3297 Node* i5 = m.Int32Add(i1, i2); | 3249 Node* i5 = m.Int32Add(i1, i2); |
| 3298 Node* i6 = m.Int32Add(i3, i4); | 3250 Node* i6 = m.Int32Add(i3, i4); |
| 3299 | 3251 |
| 3300 Node* i7 = m.Int32Add(i5, i6); | 3252 Node* i7 = m.Int32Add(i5, i6); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 3318 void* function_address = | 3270 void* function_address = |
| 3319 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); | 3271 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); |
| 3320 | 3272 |
| 3321 RawMachineAssemblerTester<int32_t> m; | 3273 RawMachineAssemblerTester<int32_t> m; |
| 3322 Node** args = NULL; | 3274 Node** args = NULL; |
| 3323 MachineType* arg_types = NULL; | 3275 MachineType* arg_types = NULL; |
| 3324 Node* function = | 3276 Node* function = |
| 3325 call_direct ? m.PointerConstant(function_address) | 3277 call_direct ? m.PointerConstant(function_address) |
| 3326 : m.LoadFromPointer(&function_address, | 3278 : m.LoadFromPointer(&function_address, |
| 3327 MachineOperatorBuilder::pointer_rep()); | 3279 MachineOperatorBuilder::pointer_rep()); |
| 3328 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 0)); | 3280 m.Return(m.CallC(function, mInt32, arg_types, args, 0)); |
| 3329 | 3281 |
| 3330 CHECK_EQ(7, m.Call()); | 3282 CHECK_EQ(7, m.Call()); |
| 3331 } | 3283 } |
| 3332 } | 3284 } |
| 3333 | 3285 |
| 3334 | 3286 |
| 3335 TEST(RunCallUnaryMinus) { | 3287 TEST(RunCallUnaryMinus) { |
| 3336 for (int i = 0; i < 2; i++) { | 3288 for (int i = 0; i < 2; i++) { |
| 3337 bool call_direct = i == 0; | 3289 bool call_direct = i == 0; |
| 3338 void* function_address = | 3290 void* function_address = |
| 3339 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&UnaryMinus)); | 3291 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&UnaryMinus)); |
| 3340 | 3292 |
| 3341 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3293 RawMachineAssemblerTester<int32_t> m(mInt32); |
| 3342 Node* args[] = {m.Parameter(0)}; | 3294 Node* args[] = {m.Parameter(0)}; |
| 3343 MachineType arg_types[] = {kMachineWord32}; | 3295 MachineType arg_types[] = {mInt32}; |
| 3344 Node* function = | 3296 Node* function = |
| 3345 call_direct ? m.PointerConstant(function_address) | 3297 call_direct ? m.PointerConstant(function_address) |
| 3346 : m.LoadFromPointer(&function_address, | 3298 : m.LoadFromPointer(&function_address, |
| 3347 MachineOperatorBuilder::pointer_rep()); | 3299 MachineOperatorBuilder::pointer_rep()); |
| 3348 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 1)); | 3300 m.Return(m.CallC(function, mInt32, arg_types, args, 1)); |
| 3349 | 3301 |
| 3350 FOR_INT32_INPUTS(i) { | 3302 FOR_INT32_INPUTS(i) { |
| 3351 int a = *i; | 3303 int a = *i; |
| 3352 CHECK_EQ(-a, m.Call(a)); | 3304 CHECK_EQ(-a, m.Call(a)); |
| 3353 } | 3305 } |
| 3354 } | 3306 } |
| 3355 } | 3307 } |
| 3356 | 3308 |
| 3357 | 3309 |
| 3358 TEST(RunCallAPlusTwoB) { | 3310 TEST(RunCallAPlusTwoB) { |
| 3359 for (int i = 0; i < 2; i++) { | 3311 for (int i = 0; i < 2; i++) { |
| 3360 bool call_direct = i == 0; | 3312 bool call_direct = i == 0; |
| 3361 void* function_address = | 3313 void* function_address = |
| 3362 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&APlusTwoB)); | 3314 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&APlusTwoB)); |
| 3363 | 3315 |
| 3364 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | 3316 RawMachineAssemblerTester<int32_t> m(mInt32, mInt32); |
| 3365 Node* args[] = {m.Parameter(0), m.Parameter(1)}; | 3317 Node* args[] = {m.Parameter(0), m.Parameter(1)}; |
| 3366 MachineType arg_types[] = {kMachineWord32, kMachineWord32}; | 3318 MachineType arg_types[] = {mInt32, mInt32}; |
| 3367 Node* function = | 3319 Node* function = |
| 3368 call_direct ? m.PointerConstant(function_address) | 3320 call_direct ? m.PointerConstant(function_address) |
| 3369 : m.LoadFromPointer(&function_address, | 3321 : m.LoadFromPointer(&function_address, |
| 3370 MachineOperatorBuilder::pointer_rep()); | 3322 MachineOperatorBuilder::pointer_rep()); |
| 3371 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 2)); | 3323 m.Return(m.CallC(function, mInt32, arg_types, args, 2)); |
| 3372 | 3324 |
| 3373 FOR_INT32_INPUTS(i) { | 3325 FOR_INT32_INPUTS(i) { |
| 3374 FOR_INT32_INPUTS(j) { | 3326 FOR_INT32_INPUTS(j) { |
| 3375 int a = *i; | 3327 int a = *i; |
| 3376 int b = *j; | 3328 int b = *j; |
| 3377 int result = m.Call(a, b); | 3329 int result = m.Call(a, b); |
| 3378 CHECK_EQ(a + 2 * b, result); | 3330 CHECK_EQ(a + 2 * b, result); |
| 3379 } | 3331 } |
| 3380 } | 3332 } |
| 3381 } | 3333 } |
| 3382 } | 3334 } |
| 3383 | 3335 |
| 3384 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C | 3336 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C |
| 3385 | 3337 |
| 3386 | 3338 |
| 3387 static const int kFloat64CompareHelperTestCases = 15; | 3339 static const int kFloat64CompareHelperTestCases = 15; |
| 3388 static const int kFloat64CompareHelperNodeType = 4; | 3340 static const int kFloat64CompareHelperNodeType = 4; |
| 3389 | 3341 |
| 3390 static int Float64CompareHelper(RawMachineAssemblerTester<int32_t>* m, | 3342 static int Float64CompareHelper(RawMachineAssemblerTester<int32_t>* m, |
| 3391 int test_case, int node_type, double x, | 3343 int test_case, int node_type, double x, |
| 3392 double y) { | 3344 double y) { |
| 3393 static double buffer[2]; | 3345 static double buffer[2]; |
| 3394 buffer[0] = x; | 3346 buffer[0] = x; |
| 3395 buffer[1] = y; | 3347 buffer[1] = y; |
| 3396 CHECK(0 <= test_case && test_case < kFloat64CompareHelperTestCases); | 3348 CHECK(0 <= test_case && test_case < kFloat64CompareHelperTestCases); |
| 3397 CHECK(0 <= node_type && node_type < kFloat64CompareHelperNodeType); | 3349 CHECK(0 <= node_type && node_type < kFloat64CompareHelperNodeType); |
| 3398 CHECK(x < y); | 3350 CHECK(x < y); |
| 3399 bool load_a = node_type / 2 == 1; | 3351 bool load_a = node_type / 2 == 1; |
| 3400 bool load_b = node_type % 2 == 1; | 3352 bool load_b = node_type % 2 == 1; |
| 3401 Node* a = load_a ? m->Load(kMachineFloat64, m->PointerConstant(&buffer[0])) | 3353 Node* a = load_a ? m->Load(mFloat64, m->PointerConstant(&buffer[0])) |
| 3402 : m->Float64Constant(x); | 3354 : m->Float64Constant(x); |
| 3403 Node* b = load_b ? m->Load(kMachineFloat64, m->PointerConstant(&buffer[1])) | 3355 Node* b = load_b ? m->Load(mFloat64, m->PointerConstant(&buffer[1])) |
| 3404 : m->Float64Constant(y); | 3356 : m->Float64Constant(y); |
| 3405 Node* cmp = NULL; | 3357 Node* cmp = NULL; |
| 3406 bool expected = false; | 3358 bool expected = false; |
| 3407 switch (test_case) { | 3359 switch (test_case) { |
| 3408 // Equal tests. | 3360 // Equal tests. |
| 3409 case 0: | 3361 case 0: |
| 3410 cmp = m->Float64Equal(a, b); | 3362 cmp = m->Float64Equal(a, b); |
| 3411 expected = false; | 3363 expected = false; |
| 3412 break; | 3364 break; |
| 3413 case 1: | 3365 case 1: |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3521 } | 3473 } |
| 3522 } | 3474 } |
| 3523 } | 3475 } |
| 3524 | 3476 |
| 3525 | 3477 |
| 3526 TEST(RunFloat64Equal) { | 3478 TEST(RunFloat64Equal) { |
| 3527 double input_a = 0.0; | 3479 double input_a = 0.0; |
| 3528 double input_b = 0.0; | 3480 double input_b = 0.0; |
| 3529 | 3481 |
| 3530 RawMachineAssemblerTester<int32_t> m; | 3482 RawMachineAssemblerTester<int32_t> m; |
| 3531 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); | 3483 Node* a = m.LoadFromPointer(&input_a, mFloat64); |
| 3532 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); | 3484 Node* b = m.LoadFromPointer(&input_b, mFloat64); |
| 3533 m.Return(m.Float64Equal(a, b)); | 3485 m.Return(m.Float64Equal(a, b)); |
| 3534 | 3486 |
| 3535 CompareWrapper cmp(IrOpcode::kFloat64Equal); | 3487 CompareWrapper cmp(IrOpcode::kFloat64Equal); |
| 3536 FOR_FLOAT64_INPUTS(pl) { | 3488 FOR_FLOAT64_INPUTS(pl) { |
| 3537 FOR_FLOAT64_INPUTS(pr) { | 3489 FOR_FLOAT64_INPUTS(pr) { |
| 3538 input_a = *pl; | 3490 input_a = *pl; |
| 3539 input_b = *pr; | 3491 input_b = *pr; |
| 3540 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; | 3492 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; |
| 3541 CHECK_EQ(expected, m.Call()); | 3493 CHECK_EQ(expected, m.Call()); |
| 3542 } | 3494 } |
| 3543 } | 3495 } |
| 3544 } | 3496 } |
| 3545 | 3497 |
| 3546 | 3498 |
| 3547 TEST(RunFloat64LessThan) { | 3499 TEST(RunFloat64LessThan) { |
| 3548 double input_a = 0.0; | 3500 double input_a = 0.0; |
| 3549 double input_b = 0.0; | 3501 double input_b = 0.0; |
| 3550 | 3502 |
| 3551 RawMachineAssemblerTester<int32_t> m; | 3503 RawMachineAssemblerTester<int32_t> m; |
| 3552 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); | 3504 Node* a = m.LoadFromPointer(&input_a, mFloat64); |
| 3553 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); | 3505 Node* b = m.LoadFromPointer(&input_b, mFloat64); |
| 3554 m.Return(m.Float64LessThan(a, b)); | 3506 m.Return(m.Float64LessThan(a, b)); |
| 3555 | 3507 |
| 3556 CompareWrapper cmp(IrOpcode::kFloat64LessThan); | 3508 CompareWrapper cmp(IrOpcode::kFloat64LessThan); |
| 3557 FOR_FLOAT64_INPUTS(pl) { | 3509 FOR_FLOAT64_INPUTS(pl) { |
| 3558 FOR_FLOAT64_INPUTS(pr) { | 3510 FOR_FLOAT64_INPUTS(pr) { |
| 3559 input_a = *pl; | 3511 input_a = *pl; |
| 3560 input_b = *pr; | 3512 input_b = *pr; |
| 3561 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; | 3513 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; |
| 3562 CHECK_EQ(expected, m.Call()); | 3514 CHECK_EQ(expected, m.Call()); |
| 3563 } | 3515 } |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 3592 for (int i = -127; i < 127; i++) { | 3544 for (int i = -127; i < 127; i++) { |
| 3593 input = i; | 3545 input = i; |
| 3594 int expected = i >= 0 ? i + 1 : max + (i - min) + 2; | 3546 int expected = i >= 0 ? i + 1 : max + (i - min) + 2; |
| 3595 CHECK_EQ(expected, m.Call()); | 3547 CHECK_EQ(expected, m.Call()); |
| 3596 CHECK_EQ(i + 1, input); | 3548 CHECK_EQ(i + 1, input); |
| 3597 } | 3549 } |
| 3598 } | 3550 } |
| 3599 | 3551 |
| 3600 | 3552 |
| 3601 TEST(RunLoadStoreTruncation) { | 3553 TEST(RunLoadStoreTruncation) { |
| 3602 LoadStoreTruncation<int8_t, kMachineWord8>(); | 3554 LoadStoreTruncation<int8_t, mInt8>(); |
| 3603 LoadStoreTruncation<int16_t, kMachineWord16>(); | 3555 LoadStoreTruncation<int16_t, mInt16>(); |
| 3604 } | 3556 } |
| 3605 | 3557 |
| 3606 | 3558 |
| 3607 static void IntPtrCompare(intptr_t left, intptr_t right) { | 3559 static void IntPtrCompare(intptr_t left, intptr_t right) { |
| 3608 for (int test = 0; test < 7; test++) { | 3560 for (int test = 0; test < 7; test++) { |
| 3609 RawMachineAssemblerTester<bool> m(MachineOperatorBuilder::pointer_rep(), | 3561 RawMachineAssemblerTester<bool> m(MachineOperatorBuilder::pointer_rep(), |
| 3610 MachineOperatorBuilder::pointer_rep()); | 3562 MachineOperatorBuilder::pointer_rep()); |
| 3611 Node* p0 = m.Parameter(0); | 3563 Node* p0 = m.Parameter(0); |
| 3612 Node* p1 = m.Parameter(1); | 3564 Node* p1 = m.Parameter(1); |
| 3613 Node* res = NULL; | 3565 Node* res = NULL; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3669 int32_t outputs[kInputSize]; | 3621 int32_t outputs[kInputSize]; |
| 3670 for (int i = 0; i < kInputSize; i++) { | 3622 for (int i = 0; i < kInputSize; i++) { |
| 3671 inputs[i] = i; | 3623 inputs[i] = i; |
| 3672 outputs[i] = -1; | 3624 outputs[i] = -1; |
| 3673 } | 3625 } |
| 3674 RawMachineAssemblerTester<int32_t*> m; | 3626 RawMachineAssemblerTester<int32_t*> m; |
| 3675 Node* input = m.PointerConstant(&inputs[0]); | 3627 Node* input = m.PointerConstant(&inputs[0]); |
| 3676 Node* output = m.PointerConstant(&outputs[kInputSize - 1]); | 3628 Node* output = m.PointerConstant(&outputs[kInputSize - 1]); |
| 3677 Node* elem_size = m.ConvertInt32ToIntPtr(m.Int32Constant(sizeof(inputs[0]))); | 3629 Node* elem_size = m.ConvertInt32ToIntPtr(m.Int32Constant(sizeof(inputs[0]))); |
| 3678 for (int i = 0; i < kInputSize; i++) { | 3630 for (int i = 0; i < kInputSize; i++) { |
| 3679 m.Store(kMachineWord32, output, m.Load(kMachineWord32, input)); | 3631 m.Store(mInt32, output, m.Load(mInt32, input)); |
| 3680 input = m.IntPtrAdd(input, elem_size); | 3632 input = m.IntPtrAdd(input, elem_size); |
| 3681 output = m.IntPtrSub(output, elem_size); | 3633 output = m.IntPtrSub(output, elem_size); |
| 3682 } | 3634 } |
| 3683 m.Return(input); | 3635 m.Return(input); |
| 3684 CHECK_EQ(&inputs[kInputSize], m.Call()); | 3636 CHECK_EQ(&inputs[kInputSize], m.Call()); |
| 3685 for (int i = 0; i < kInputSize; i++) { | 3637 for (int i = 0; i < kInputSize; i++) { |
| 3686 CHECK_EQ(i, inputs[i]); | 3638 CHECK_EQ(i, inputs[i]); |
| 3687 CHECK_EQ(kInputSize - i - 1, outputs[i]); | 3639 CHECK_EQ(kInputSize - i - 1, outputs[i]); |
| 3688 } | 3640 } |
| 3689 } | 3641 } |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 3710 m.Word32Shl(bt.param0, m.Int32Sub(m.Int32Constant(32), bt.param1)), | 3662 m.Word32Shl(bt.param0, m.Int32Sub(m.Int32Constant(32), bt.param1)), |
| 3711 m.Word32Shr(bt.param0, bt.param1))); | 3663 m.Word32Shr(bt.param0, bt.param1))); |
| 3712 bt.Run(ValueHelper::uint32_vector(), ValueHelper::ror_vector(), rotr32); | 3664 bt.Run(ValueHelper::uint32_vector(), ValueHelper::ror_vector(), rotr32); |
| 3713 } | 3665 } |
| 3714 } | 3666 } |
| 3715 | 3667 |
| 3716 | 3668 |
| 3717 TEST(RunTestInt32RotateRightImm) { | 3669 TEST(RunTestInt32RotateRightImm) { |
| 3718 FOR_INPUTS(uint32_t, ror, i) { | 3670 FOR_INPUTS(uint32_t, ror, i) { |
| 3719 { | 3671 { |
| 3720 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3672 RawMachineAssemblerTester<int32_t> m(mUint32); |
| 3721 Node* value = m.Parameter(0); | 3673 Node* value = m.Parameter(0); |
| 3722 m.Return(m.Word32Or(m.Word32Shr(value, m.Int32Constant(*i)), | 3674 m.Return(m.Word32Or(m.Word32Shr(value, m.Int32Constant(*i)), |
| 3723 m.Word32Shl(value, m.Int32Constant(32 - *i)))); | 3675 m.Word32Shl(value, m.Int32Constant(32 - *i)))); |
| 3724 m.Run(ValueHelper::uint32_vector(), | 3676 m.Run(ValueHelper::uint32_vector(), |
| 3725 std::bind2nd(std::ptr_fun(&rotr32), *i)); | 3677 std::bind2nd(std::ptr_fun(&rotr32), *i)); |
| 3726 } | 3678 } |
| 3727 { | 3679 { |
| 3728 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3680 RawMachineAssemblerTester<int32_t> m(mUint32); |
| 3729 Node* value = m.Parameter(0); | 3681 Node* value = m.Parameter(0); |
| 3730 m.Return(m.Word32Or(m.Word32Shl(value, m.Int32Constant(32 - *i)), | 3682 m.Return(m.Word32Or(m.Word32Shl(value, m.Int32Constant(32 - *i)), |
| 3731 m.Word32Shr(value, m.Int32Constant(*i)))); | 3683 m.Word32Shr(value, m.Int32Constant(*i)))); |
| 3732 m.Run(ValueHelper::uint32_vector(), | 3684 m.Run(ValueHelper::uint32_vector(), |
| 3733 std::bind2nd(std::ptr_fun(&rotr32), *i)); | 3685 std::bind2nd(std::ptr_fun(&rotr32), *i)); |
| 3734 } | 3686 } |
| 3735 } | 3687 } |
| 3736 } | 3688 } |
| 3737 | 3689 |
| 3738 | 3690 |
| 3739 TEST(RunSpillLotsOfThings) { | 3691 TEST(RunSpillLotsOfThings) { |
| 3740 static const int kInputSize = 1000; | 3692 static const int kInputSize = 1000; |
| 3741 RawMachineAssemblerTester<void> m; | 3693 RawMachineAssemblerTester<void> m; |
| 3742 Node* accs[kInputSize]; | 3694 Node* accs[kInputSize]; |
| 3743 int32_t outputs[kInputSize]; | 3695 int32_t outputs[kInputSize]; |
| 3744 Node* one = m.Int32Constant(1); | 3696 Node* one = m.Int32Constant(1); |
| 3745 Node* acc = one; | 3697 Node* acc = one; |
| 3746 for (int i = 0; i < kInputSize; i++) { | 3698 for (int i = 0; i < kInputSize; i++) { |
| 3747 acc = m.Int32Add(acc, one); | 3699 acc = m.Int32Add(acc, one); |
| 3748 accs[i] = acc; | 3700 accs[i] = acc; |
| 3749 } | 3701 } |
| 3750 for (int i = 0; i < kInputSize; i++) { | 3702 for (int i = 0; i < kInputSize; i++) { |
| 3751 m.StoreToPointer(&outputs[i], kMachineWord32, accs[i]); | 3703 m.StoreToPointer(&outputs[i], mInt32, accs[i]); |
| 3752 } | 3704 } |
| 3753 m.Return(one); | 3705 m.Return(one); |
| 3754 m.Call(); | 3706 m.Call(); |
| 3755 for (int i = 0; i < kInputSize; i++) { | 3707 for (int i = 0; i < kInputSize; i++) { |
| 3756 CHECK_EQ(outputs[i], i + 2); | 3708 CHECK_EQ(outputs[i], i + 2); |
| 3757 } | 3709 } |
| 3758 } | 3710 } |
| 3759 | 3711 |
| 3760 | 3712 |
| 3761 TEST(RunSpillConstantsAndParameters) { | 3713 TEST(RunSpillConstantsAndParameters) { |
| 3762 static const int kInputSize = 1000; | 3714 static const int kInputSize = 1000; |
| 3763 static const int32_t kBase = 987; | 3715 static const int32_t kBase = 987; |
| 3764 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | 3716 RawMachineAssemblerTester<int32_t> m(mInt32, mInt32); |
| 3765 int32_t outputs[kInputSize]; | 3717 int32_t outputs[kInputSize]; |
| 3766 Node* csts[kInputSize]; | 3718 Node* csts[kInputSize]; |
| 3767 Node* accs[kInputSize]; | 3719 Node* accs[kInputSize]; |
| 3768 Node* acc = m.Int32Constant(0); | 3720 Node* acc = m.Int32Constant(0); |
| 3769 for (int i = 0; i < kInputSize; i++) { | 3721 for (int i = 0; i < kInputSize; i++) { |
| 3770 csts[i] = m.Int32Constant(static_cast<int32_t>(kBase + i)); | 3722 csts[i] = m.Int32Constant(static_cast<int32_t>(kBase + i)); |
| 3771 } | 3723 } |
| 3772 for (int i = 0; i < kInputSize; i++) { | 3724 for (int i = 0; i < kInputSize; i++) { |
| 3773 acc = m.Int32Add(acc, csts[i]); | 3725 acc = m.Int32Add(acc, csts[i]); |
| 3774 accs[i] = acc; | 3726 accs[i] = acc; |
| 3775 } | 3727 } |
| 3776 for (int i = 0; i < kInputSize; i++) { | 3728 for (int i = 0; i < kInputSize; i++) { |
| 3777 m.StoreToPointer(&outputs[i], kMachineWord32, accs[i]); | 3729 m.StoreToPointer(&outputs[i], mInt32, accs[i]); |
| 3778 } | 3730 } |
| 3779 m.Return(m.Int32Add(acc, m.Int32Add(m.Parameter(0), m.Parameter(1)))); | 3731 m.Return(m.Int32Add(acc, m.Int32Add(m.Parameter(0), m.Parameter(1)))); |
| 3780 FOR_INT32_INPUTS(i) { | 3732 FOR_INT32_INPUTS(i) { |
| 3781 FOR_INT32_INPUTS(j) { | 3733 FOR_INT32_INPUTS(j) { |
| 3782 int32_t expected = *i + *j; | 3734 int32_t expected = *i + *j; |
| 3783 for (int k = 0; k < kInputSize; k++) { | 3735 for (int k = 0; k < kInputSize; k++) { |
| 3784 expected += kBase + k; | 3736 expected += kBase + k; |
| 3785 } | 3737 } |
| 3786 CHECK_EQ(expected, m.Call(*i, *j)); | 3738 CHECK_EQ(expected, m.Call(*i, *j)); |
| 3787 expected = 0; | 3739 expected = 0; |
| 3788 for (int k = 0; k < kInputSize; k++) { | 3740 for (int k = 0; k < kInputSize; k++) { |
| 3789 expected += kBase + k; | 3741 expected += kBase + k; |
| 3790 CHECK_EQ(expected, outputs[k]); | 3742 CHECK_EQ(expected, outputs[k]); |
| 3791 } | 3743 } |
| 3792 } | 3744 } |
| 3793 } | 3745 } |
| 3794 } | 3746 } |
| 3795 | 3747 |
| 3796 | 3748 |
| 3797 TEST(RunNewSpaceConstantsInPhi) { | 3749 TEST(RunNewSpaceConstantsInPhi) { |
| 3798 RawMachineAssemblerTester<Object*> m(kMachineWord32); | 3750 RawMachineAssemblerTester<Object*> m(mInt32); |
| 3799 | 3751 |
| 3800 Isolate* isolate = CcTest::i_isolate(); | 3752 Isolate* isolate = CcTest::i_isolate(); |
| 3801 Handle<HeapNumber> true_val = isolate->factory()->NewHeapNumber(11.2); | 3753 Handle<HeapNumber> true_val = isolate->factory()->NewHeapNumber(11.2); |
| 3802 Handle<HeapNumber> false_val = isolate->factory()->NewHeapNumber(11.3); | 3754 Handle<HeapNumber> false_val = isolate->factory()->NewHeapNumber(11.3); |
| 3803 Node* true_node = m.HeapConstant(true_val); | 3755 Node* true_node = m.HeapConstant(true_val); |
| 3804 Node* false_node = m.HeapConstant(false_val); | 3756 Node* false_node = m.HeapConstant(false_val); |
| 3805 | 3757 |
| 3806 MLabel blocka, blockb, end; | 3758 MLabel blocka, blockb, end; |
| 3807 m.Branch(m.Parameter(0), &blocka, &blockb); | 3759 m.Branch(m.Parameter(0), &blocka, &blockb); |
| 3808 m.Bind(&blocka); | 3760 m.Bind(&blocka); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 3830 Node* acc = one; | 3782 Node* acc = one; |
| 3831 for (int i = 0; i < kInputSize; i++) { | 3783 for (int i = 0; i < kInputSize; i++) { |
| 3832 acc = m.Int32Add(acc, one); | 3784 acc = m.Int32Add(acc, one); |
| 3833 accs[i] = acc; | 3785 accs[i] = acc; |
| 3834 } | 3786 } |
| 3835 // If the spill slot computation is wrong, it might load from the c frame | 3787 // If the spill slot computation is wrong, it might load from the c frame |
| 3836 { | 3788 { |
| 3837 void* func = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); | 3789 void* func = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); |
| 3838 Node** args = NULL; | 3790 Node** args = NULL; |
| 3839 MachineType* arg_types = NULL; | 3791 MachineType* arg_types = NULL; |
| 3840 m.CallC(m.PointerConstant(func), kMachineWord32, arg_types, args, 0); | 3792 m.CallC(m.PointerConstant(func), mInt32, arg_types, args, 0); |
| 3841 } | 3793 } |
| 3842 for (int i = 0; i < kInputSize; i++) { | 3794 for (int i = 0; i < kInputSize; i++) { |
| 3843 m.StoreToPointer(&outputs[i], kMachineWord32, accs[i]); | 3795 m.StoreToPointer(&outputs[i], mInt32, accs[i]); |
| 3844 } | 3796 } |
| 3845 m.Return(one); | 3797 m.Return(one); |
| 3846 m.Call(); | 3798 m.Call(); |
| 3847 for (int i = 0; i < kInputSize; i++) { | 3799 for (int i = 0; i < kInputSize; i++) { |
| 3848 CHECK_EQ(outputs[i], i + 2); | 3800 CHECK_EQ(outputs[i], i + 2); |
| 3849 } | 3801 } |
| 3850 } | 3802 } |
| 3851 | 3803 |
| 3852 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C | 3804 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C |
| 3853 | 3805 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 3868 } | 3820 } |
| 3869 | 3821 |
| 3870 | 3822 |
| 3871 TEST(RunInt32AddWithOverflowP) { | 3823 TEST(RunInt32AddWithOverflowP) { |
| 3872 int32_t actual_val = -1; | 3824 int32_t actual_val = -1; |
| 3873 RawMachineAssemblerTester<int32_t> m; | 3825 RawMachineAssemblerTester<int32_t> m; |
| 3874 Int32BinopTester bt(&m); | 3826 Int32BinopTester bt(&m); |
| 3875 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); | 3827 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); |
| 3876 Node* val = m.Projection(0, add); | 3828 Node* val = m.Projection(0, add); |
| 3877 Node* ovf = m.Projection(1, add); | 3829 Node* ovf = m.Projection(1, add); |
| 3878 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3830 m.StoreToPointer(&actual_val, mInt32, val); |
| 3879 bt.AddReturn(ovf); | 3831 bt.AddReturn(ovf); |
| 3880 FOR_INT32_INPUTS(i) { | 3832 FOR_INT32_INPUTS(i) { |
| 3881 FOR_INT32_INPUTS(j) { | 3833 FOR_INT32_INPUTS(j) { |
| 3882 int32_t expected_val; | 3834 int32_t expected_val; |
| 3883 int expected_ovf = sadd_overflow(*i, *j, &expected_val); | 3835 int expected_ovf = sadd_overflow(*i, *j, &expected_val); |
| 3884 CHECK_EQ(expected_ovf, bt.call(*i, *j)); | 3836 CHECK_EQ(expected_ovf, bt.call(*i, *j)); |
| 3885 CHECK_EQ(expected_val, actual_val); | 3837 CHECK_EQ(expected_val, actual_val); |
| 3886 } | 3838 } |
| 3887 } | 3839 } |
| 3888 } | 3840 } |
| 3889 | 3841 |
| 3890 | 3842 |
| 3891 TEST(RunInt32AddWithOverflowImm) { | 3843 TEST(RunInt32AddWithOverflowImm) { |
| 3892 int32_t actual_val = -1, expected_val = 0; | 3844 int32_t actual_val = -1, expected_val = 0; |
| 3893 FOR_INT32_INPUTS(i) { | 3845 FOR_INT32_INPUTS(i) { |
| 3894 { | 3846 { |
| 3895 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3847 RawMachineAssemblerTester<int32_t> m(mInt32); |
| 3896 Node* add = m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0)); | 3848 Node* add = m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0)); |
| 3897 Node* val = m.Projection(0, add); | 3849 Node* val = m.Projection(0, add); |
| 3898 Node* ovf = m.Projection(1, add); | 3850 Node* ovf = m.Projection(1, add); |
| 3899 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3851 m.StoreToPointer(&actual_val, mInt32, val); |
| 3900 m.Return(ovf); | 3852 m.Return(ovf); |
| 3901 FOR_INT32_INPUTS(j) { | 3853 FOR_INT32_INPUTS(j) { |
| 3902 int expected_ovf = sadd_overflow(*i, *j, &expected_val); | 3854 int expected_ovf = sadd_overflow(*i, *j, &expected_val); |
| 3903 CHECK_EQ(expected_ovf, m.Call(*j)); | 3855 CHECK_EQ(expected_ovf, m.Call(*j)); |
| 3904 CHECK_EQ(expected_val, actual_val); | 3856 CHECK_EQ(expected_val, actual_val); |
| 3905 } | 3857 } |
| 3906 } | 3858 } |
| 3907 { | 3859 { |
| 3908 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3860 RawMachineAssemblerTester<int32_t> m(mInt32); |
| 3909 Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i)); | 3861 Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i)); |
| 3910 Node* val = m.Projection(0, add); | 3862 Node* val = m.Projection(0, add); |
| 3911 Node* ovf = m.Projection(1, add); | 3863 Node* ovf = m.Projection(1, add); |
| 3912 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3864 m.StoreToPointer(&actual_val, mInt32, val); |
| 3913 m.Return(ovf); | 3865 m.Return(ovf); |
| 3914 FOR_INT32_INPUTS(j) { | 3866 FOR_INT32_INPUTS(j) { |
| 3915 int expected_ovf = sadd_overflow(*i, *j, &expected_val); | 3867 int expected_ovf = sadd_overflow(*i, *j, &expected_val); |
| 3916 CHECK_EQ(expected_ovf, m.Call(*j)); | 3868 CHECK_EQ(expected_ovf, m.Call(*j)); |
| 3917 CHECK_EQ(expected_val, actual_val); | 3869 CHECK_EQ(expected_val, actual_val); |
| 3918 } | 3870 } |
| 3919 } | 3871 } |
| 3920 FOR_INT32_INPUTS(j) { | 3872 FOR_INT32_INPUTS(j) { |
| 3921 RawMachineAssemblerTester<int32_t> m; | 3873 RawMachineAssemblerTester<int32_t> m; |
| 3922 Node* add = | 3874 Node* add = |
| 3923 m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); | 3875 m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); |
| 3924 Node* val = m.Projection(0, add); | 3876 Node* val = m.Projection(0, add); |
| 3925 Node* ovf = m.Projection(1, add); | 3877 Node* ovf = m.Projection(1, add); |
| 3926 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3878 m.StoreToPointer(&actual_val, mInt32, val); |
| 3927 m.Return(ovf); | 3879 m.Return(ovf); |
| 3928 int expected_ovf = sadd_overflow(*i, *j, &expected_val); | 3880 int expected_ovf = sadd_overflow(*i, *j, &expected_val); |
| 3929 CHECK_EQ(expected_ovf, m.Call()); | 3881 CHECK_EQ(expected_ovf, m.Call()); |
| 3930 CHECK_EQ(expected_val, actual_val); | 3882 CHECK_EQ(expected_val, actual_val); |
| 3931 } | 3883 } |
| 3932 } | 3884 } |
| 3933 } | 3885 } |
| 3934 | 3886 |
| 3935 | 3887 |
| 3936 TEST(RunInt32AddWithOverflowInBranchP) { | 3888 TEST(RunInt32AddWithOverflowInBranchP) { |
| 3937 int constant = 911777; | 3889 int constant = 911777; |
| 3938 MLabel blocka, blockb; | 3890 MLabel blocka, blockb; |
| 3939 RawMachineAssemblerTester<int32_t> m; | 3891 RawMachineAssemblerTester<int32_t> m; |
| 3940 Int32BinopTester bt(&m); | 3892 Int32BinopTester bt(&m); |
| 3941 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); | 3893 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); |
| 3942 Node* ovf = m.Projection(1, add); | 3894 Node* ovf = m.Projection(1, add); |
| 3943 m.Branch(ovf, &blocka, &blockb); | 3895 m.Branch(ovf, &blocka, &blockb); |
| 3944 m.Bind(&blocka); | 3896 m.Bind(&blocka); |
| 3945 bt.AddReturn(m.Int32Constant(constant)); | 3897 bt.AddReturn(m.Int32Constant(constant)); |
| 3946 m.Bind(&blockb); | 3898 m.Bind(&blockb); |
| 3947 Node* val = m.Projection(0, add); | 3899 Node* val = m.Projection(0, add); |
| 3948 bt.AddReturn(val); | 3900 bt.AddReturn(val); |
| 3949 FOR_UINT32_INPUTS(i) { | 3901 FOR_INT32_INPUTS(i) { |
| 3950 FOR_UINT32_INPUTS(j) { | 3902 FOR_INT32_INPUTS(j) { |
| 3951 int32_t expected; | 3903 int32_t expected; |
| 3952 if (sadd_overflow(*i, *j, &expected)) expected = constant; | 3904 if (sadd_overflow(*i, *j, &expected)) expected = constant; |
| 3953 CHECK_EQ(expected, bt.call(*i, *j)); | 3905 CHECK_EQ(expected, bt.call(*i, *j)); |
| 3954 } | 3906 } |
| 3955 } | 3907 } |
| 3956 } | 3908 } |
| 3957 | 3909 |
| 3958 | 3910 |
| 3959 TEST(RunInt32SubWithOverflowP) { | 3911 TEST(RunInt32SubWithOverflowP) { |
| 3960 int32_t actual_val = -1; | 3912 int32_t actual_val = -1; |
| 3961 RawMachineAssemblerTester<int32_t> m; | 3913 RawMachineAssemblerTester<int32_t> m; |
| 3962 Int32BinopTester bt(&m); | 3914 Int32BinopTester bt(&m); |
| 3963 Node* add = m.Int32SubWithOverflow(bt.param0, bt.param1); | 3915 Node* add = m.Int32SubWithOverflow(bt.param0, bt.param1); |
| 3964 Node* val = m.Projection(0, add); | 3916 Node* val = m.Projection(0, add); |
| 3965 Node* ovf = m.Projection(1, add); | 3917 Node* ovf = m.Projection(1, add); |
| 3966 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3918 m.StoreToPointer(&actual_val, mInt32, val); |
| 3967 bt.AddReturn(ovf); | 3919 bt.AddReturn(ovf); |
| 3968 FOR_INT32_INPUTS(i) { | 3920 FOR_INT32_INPUTS(i) { |
| 3969 FOR_INT32_INPUTS(j) { | 3921 FOR_INT32_INPUTS(j) { |
| 3970 int32_t expected_val; | 3922 int32_t expected_val; |
| 3971 int expected_ovf = ssub_overflow(*i, *j, &expected_val); | 3923 int expected_ovf = ssub_overflow(*i, *j, &expected_val); |
| 3972 CHECK_EQ(expected_ovf, bt.call(*i, *j)); | 3924 CHECK_EQ(expected_ovf, bt.call(*i, *j)); |
| 3973 CHECK_EQ(expected_val, actual_val); | 3925 CHECK_EQ(expected_val, actual_val); |
| 3974 } | 3926 } |
| 3975 } | 3927 } |
| 3976 } | 3928 } |
| 3977 | 3929 |
| 3978 | 3930 |
| 3979 TEST(RunInt32SubWithOverflowImm) { | 3931 TEST(RunInt32SubWithOverflowImm) { |
| 3980 int32_t actual_val = -1, expected_val = 0; | 3932 int32_t actual_val = -1, expected_val = 0; |
| 3981 FOR_INT32_INPUTS(i) { | 3933 FOR_INT32_INPUTS(i) { |
| 3982 { | 3934 { |
| 3983 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3935 RawMachineAssemblerTester<int32_t> m(mInt32); |
| 3984 Node* add = m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0)); | 3936 Node* add = m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0)); |
| 3985 Node* val = m.Projection(0, add); | 3937 Node* val = m.Projection(0, add); |
| 3986 Node* ovf = m.Projection(1, add); | 3938 Node* ovf = m.Projection(1, add); |
| 3987 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3939 m.StoreToPointer(&actual_val, mInt32, val); |
| 3988 m.Return(ovf); | 3940 m.Return(ovf); |
| 3989 FOR_INT32_INPUTS(j) { | 3941 FOR_INT32_INPUTS(j) { |
| 3990 int expected_ovf = ssub_overflow(*i, *j, &expected_val); | 3942 int expected_ovf = ssub_overflow(*i, *j, &expected_val); |
| 3991 CHECK_EQ(expected_ovf, m.Call(*j)); | 3943 CHECK_EQ(expected_ovf, m.Call(*j)); |
| 3992 CHECK_EQ(expected_val, actual_val); | 3944 CHECK_EQ(expected_val, actual_val); |
| 3993 } | 3945 } |
| 3994 } | 3946 } |
| 3995 { | 3947 { |
| 3996 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3948 RawMachineAssemblerTester<int32_t> m(mInt32); |
| 3997 Node* add = m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i)); | 3949 Node* add = m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i)); |
| 3998 Node* val = m.Projection(0, add); | 3950 Node* val = m.Projection(0, add); |
| 3999 Node* ovf = m.Projection(1, add); | 3951 Node* ovf = m.Projection(1, add); |
| 4000 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3952 m.StoreToPointer(&actual_val, mInt32, val); |
| 4001 m.Return(ovf); | 3953 m.Return(ovf); |
| 4002 FOR_INT32_INPUTS(j) { | 3954 FOR_INT32_INPUTS(j) { |
| 4003 int expected_ovf = ssub_overflow(*j, *i, &expected_val); | 3955 int expected_ovf = ssub_overflow(*j, *i, &expected_val); |
| 4004 CHECK_EQ(expected_ovf, m.Call(*j)); | 3956 CHECK_EQ(expected_ovf, m.Call(*j)); |
| 4005 CHECK_EQ(expected_val, actual_val); | 3957 CHECK_EQ(expected_val, actual_val); |
| 4006 } | 3958 } |
| 4007 } | 3959 } |
| 4008 FOR_INT32_INPUTS(j) { | 3960 FOR_INT32_INPUTS(j) { |
| 4009 RawMachineAssemblerTester<int32_t> m; | 3961 RawMachineAssemblerTester<int32_t> m; |
| 4010 Node* add = | 3962 Node* add = |
| 4011 m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); | 3963 m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); |
| 4012 Node* val = m.Projection(0, add); | 3964 Node* val = m.Projection(0, add); |
| 4013 Node* ovf = m.Projection(1, add); | 3965 Node* ovf = m.Projection(1, add); |
| 4014 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3966 m.StoreToPointer(&actual_val, mInt32, val); |
| 4015 m.Return(ovf); | 3967 m.Return(ovf); |
| 4016 int expected_ovf = ssub_overflow(*i, *j, &expected_val); | 3968 int expected_ovf = ssub_overflow(*i, *j, &expected_val); |
| 4017 CHECK_EQ(expected_ovf, m.Call()); | 3969 CHECK_EQ(expected_ovf, m.Call()); |
| 4018 CHECK_EQ(expected_val, actual_val); | 3970 CHECK_EQ(expected_val, actual_val); |
| 4019 } | 3971 } |
| 4020 } | 3972 } |
| 4021 } | 3973 } |
| 4022 | 3974 |
| 4023 | 3975 |
| 4024 TEST(RunInt32SubWithOverflowInBranchP) { | 3976 TEST(RunInt32SubWithOverflowInBranchP) { |
| 4025 int constant = 911999; | 3977 int constant = 911999; |
| 4026 MLabel blocka, blockb; | 3978 MLabel blocka, blockb; |
| 4027 RawMachineAssemblerTester<int32_t> m; | 3979 RawMachineAssemblerTester<int32_t> m; |
| 4028 Int32BinopTester bt(&m); | 3980 Int32BinopTester bt(&m); |
| 4029 Node* sub = m.Int32SubWithOverflow(bt.param0, bt.param1); | 3981 Node* sub = m.Int32SubWithOverflow(bt.param0, bt.param1); |
| 4030 Node* ovf = m.Projection(1, sub); | 3982 Node* ovf = m.Projection(1, sub); |
| 4031 m.Branch(ovf, &blocka, &blockb); | 3983 m.Branch(ovf, &blocka, &blockb); |
| 4032 m.Bind(&blocka); | 3984 m.Bind(&blocka); |
| 4033 bt.AddReturn(m.Int32Constant(constant)); | 3985 bt.AddReturn(m.Int32Constant(constant)); |
| 4034 m.Bind(&blockb); | 3986 m.Bind(&blockb); |
| 4035 Node* val = m.Projection(0, sub); | 3987 Node* val = m.Projection(0, sub); |
| 4036 bt.AddReturn(val); | 3988 bt.AddReturn(val); |
| 4037 FOR_UINT32_INPUTS(i) { | 3989 FOR_INT32_INPUTS(i) { |
| 4038 FOR_UINT32_INPUTS(j) { | 3990 FOR_INT32_INPUTS(j) { |
| 4039 int32_t expected; | 3991 int32_t expected; |
| 4040 if (ssub_overflow(*i, *j, &expected)) expected = constant; | 3992 if (ssub_overflow(*i, *j, &expected)) expected = constant; |
| 4041 CHECK_EQ(expected, bt.call(*i, *j)); | 3993 CHECK_EQ(expected, bt.call(*i, *j)); |
| 4042 } | 3994 } |
| 4043 } | 3995 } |
| 4044 } | 3996 } |
| 4045 | 3997 |
| 4046 #endif // V8_TURBOFAN_TARGET | 3998 #endif // V8_TURBOFAN_TARGET |
| OLD | NEW |