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

Side by Side Diff: test/cctest/compiler/test-run-machops.cc

Issue 470593002: Unify MachineType and RepType. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rename tXXX to kTypeXXX, rXXX to kRepXXX, and mXXX to kMachXXX to conform to style guide. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <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) \
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
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(kMachInt32, 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(kMachInt32, kMachInt32);
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
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(kMachInt32);
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(kMachInt32);
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(kMachInt32);
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(kMachInt32, kMachInt32, kMachInt32);
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
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(kMachInt32, kMachInt32, kMachInt32);
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
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, kMachInt32));
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, kMachInt32, 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(kMachFloat64, m.PointerConstant(from), m.Int32Constant(offset));
538 m.Store(kMachineFloat64, m.PointerConstant(to), m.Int32Constant(offset), 539 m.Store(kMachFloat64, 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
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(kMachUint32, kMachInt32, kMachUint32);
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(kMachInt32, kMachUint32, kMachUint32);
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(kMachUint32, kMachInt32, kMachUint32);
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(kMachInt32, kMachUint32, kMachUint32);
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(kMachUint32, kMachUint32, kMachUint32);
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(kMachUint32, kMachUint32, kMachUint32);
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(kMachUint32);
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(kMachUint32);
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(kMachUint32, kMachInt32,
748 kMachineWord32); 742 kMachUint32);
749 MLabel blocka, blockb; 743 MLabel blocka, blockb;
750 m.Branch(m.Word32Equal(m.Int32Add(m.Parameter(0), 744 m.Branch(m.Word32Equal(m.Int32Add(m.Parameter(0),
751 m.NewNode(shops[n], m.Parameter(1), 745 m.NewNode(shops[n], m.Parameter(1),
752 m.Parameter(2))), 746 m.Parameter(2))),
753 m.Int32Constant(0)), 747 m.Int32Constant(0)),
754 &blocka, &blockb); 748 &blocka, &blockb);
755 m.Bind(&blocka); 749 m.Bind(&blocka);
756 m.Return(m.Int32Constant(constant)); 750 m.Return(m.Int32Constant(constant));
757 m.Bind(&blockb); 751 m.Bind(&blockb);
758 m.Return(m.Int32Constant(0 - constant)); 752 m.Return(m.Int32Constant(0 - constant));
(...skipping 20 matching lines...) Expand all
779 } 773 }
780 } 774 }
781 } 775 }
782 } 776 }
783 } 777 }
784 778
785 779
786 TEST(RunInt32AddInComparison) { 780 TEST(RunInt32AddInComparison) {
787 { 781 {
788 RawMachineAssemblerTester<int32_t> m; 782 RawMachineAssemblerTester<int32_t> m;
789 Int32BinopTester bt(&m); 783 Uint32BinopTester bt(&m);
790 bt.AddReturn( 784 bt.AddReturn(
791 m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0))); 785 m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)));
792 FOR_UINT32_INPUTS(i) { 786 FOR_UINT32_INPUTS(i) {
793 FOR_UINT32_INPUTS(j) { 787 FOR_UINT32_INPUTS(j) {
794 int32_t expected = (*i + *j) == 0; 788 uint32_t expected = (*i + *j) == 0;
795 CHECK_EQ(expected, bt.call(*i, *j)); 789 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
796 } 790 }
797 } 791 }
798 } 792 }
799 { 793 {
800 RawMachineAssemblerTester<int32_t> m; 794 RawMachineAssemblerTester<int32_t> m;
801 Int32BinopTester bt(&m); 795 Uint32BinopTester bt(&m);
802 bt.AddReturn( 796 bt.AddReturn(
803 m.Word32Equal(m.Int32Constant(0), m.Int32Add(bt.param0, bt.param1))); 797 m.Word32Equal(m.Int32Constant(0), m.Int32Add(bt.param0, bt.param1)));
804 FOR_UINT32_INPUTS(i) { 798 FOR_UINT32_INPUTS(i) {
805 FOR_UINT32_INPUTS(j) { 799 FOR_UINT32_INPUTS(j) {
806 int32_t expected = (*i + *j) == 0; 800 uint32_t expected = (*i + *j) == 0;
807 CHECK_EQ(expected, bt.call(*i, *j)); 801 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
808 } 802 }
809 } 803 }
810 } 804 }
811 { 805 {
812 FOR_UINT32_INPUTS(i) { 806 FOR_UINT32_INPUTS(i) {
813 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 807 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
814 m.Return(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), 808 m.Return(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)),
815 m.Int32Constant(0))); 809 m.Int32Constant(0)));
816 FOR_UINT32_INPUTS(j) { 810 FOR_UINT32_INPUTS(j) {
817 int32_t expected = (*i + *j) == 0; 811 uint32_t expected = (*i + *j) == 0;
818 CHECK_EQ(expected, m.Call(*j)); 812 CHECK_UINT32_EQ(expected, m.Call(*j));
819 } 813 }
820 } 814 }
821 } 815 }
822 { 816 {
823 FOR_UINT32_INPUTS(i) { 817 FOR_UINT32_INPUTS(i) {
824 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 818 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
825 m.Return(m.Word32Equal(m.Int32Add(m.Parameter(0), m.Int32Constant(*i)), 819 m.Return(m.Word32Equal(m.Int32Add(m.Parameter(0), m.Int32Constant(*i)),
826 m.Int32Constant(0))); 820 m.Int32Constant(0)));
827 FOR_UINT32_INPUTS(j) { 821 FOR_UINT32_INPUTS(j) {
828 int32_t expected = (*j + *i) == 0; 822 uint32_t expected = (*j + *i) == 0;
829 CHECK_EQ(expected, m.Call(*j)); 823 CHECK_UINT32_EQ(expected, m.Call(*j));
830 } 824 }
831 } 825 }
832 } 826 }
833 { 827 {
834 RawMachineAssemblerTester<void> m; 828 RawMachineAssemblerTester<void> m;
835 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), 829 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(),
836 m.machine()->Word32Shr()}; 830 m.machine()->Word32Shr()};
837 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { 831 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) {
838 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 832 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32,
839 kMachineWord32); 833 kMachUint32);
840 m.Return(m.Word32Equal( 834 m.Return(m.Word32Equal(
841 m.Int32Add(m.Parameter(0), 835 m.Int32Add(m.Parameter(0),
842 m.NewNode(shops[n], m.Parameter(1), m.Parameter(2))), 836 m.NewNode(shops[n], m.Parameter(1), m.Parameter(2))),
843 m.Int32Constant(0))); 837 m.Int32Constant(0)));
844 FOR_UINT32_INPUTS(i) { 838 FOR_UINT32_INPUTS(i) {
845 FOR_INT32_INPUTS(j) { 839 FOR_INT32_INPUTS(j) {
846 FOR_UINT32_SHIFTS(shift) { 840 FOR_UINT32_SHIFTS(shift) {
847 int32_t right; 841 int32_t right;
848 switch (shops[n]->opcode()) { 842 switch (shops[n]->opcode()) {
849 default: 843 default:
(...skipping 13 matching lines...) Expand all
863 } 857 }
864 } 858 }
865 } 859 }
866 } 860 }
867 } 861 }
868 } 862 }
869 863
870 864
871 TEST(RunInt32SubP) { 865 TEST(RunInt32SubP) {
872 RawMachineAssemblerTester<int32_t> m; 866 RawMachineAssemblerTester<int32_t> m;
873 Int32BinopTester bt(&m); 867 Uint32BinopTester bt(&m);
874 868
875 m.Return(m.Int32Sub(bt.param0, bt.param1)); 869 m.Return(m.Int32Sub(bt.param0, bt.param1));
876 870
877 FOR_UINT32_INPUTS(i) { 871 FOR_UINT32_INPUTS(i) {
878 FOR_UINT32_INPUTS(j) { 872 FOR_UINT32_INPUTS(j) {
879 // Use uint32_t because signed overflow is UB in C. 873 uint32_t expected = static_cast<int32_t>(*i - *j);
880 int expected = static_cast<int32_t>(*i - *j); 874 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
881 CHECK_EQ(expected, bt.call(*i, *j));
882 } 875 }
883 } 876 }
884 } 877 }
885 878
886 879
887 TEST(RunInt32SubImm) { 880 TEST(RunInt32SubImm) {
888 { 881 {
889 FOR_UINT32_INPUTS(i) { 882 FOR_UINT32_INPUTS(i) {
890 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 883 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
891 m.Return(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0))); 884 m.Return(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)));
892 FOR_UINT32_INPUTS(j) { 885 FOR_UINT32_INPUTS(j) {
893 // Use uint32_t because signed overflow is UB in C. 886 uint32_t expected = *i - *j;
894 int32_t expected = static_cast<int32_t>(*i - *j); 887 CHECK_UINT32_EQ(expected, m.Call(*j));
895 CHECK_EQ(expected, m.Call(*j));
896 } 888 }
897 } 889 }
898 } 890 }
899 { 891 {
900 FOR_UINT32_INPUTS(i) { 892 FOR_UINT32_INPUTS(i) {
901 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 893 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
902 m.Return(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i))); 894 m.Return(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i)));
903 FOR_UINT32_INPUTS(j) { 895 FOR_UINT32_INPUTS(j) {
904 // Use uint32_t because signed overflow is UB in C. 896 uint32_t expected = *j - *i;
905 int32_t expected = static_cast<int32_t>(*j - *i); 897 CHECK_UINT32_EQ(expected, m.Call(*j));
906 CHECK_EQ(expected, m.Call(*j));
907 } 898 }
908 } 899 }
909 } 900 }
910 } 901 }
911 902
912 903
913 TEST(RunInt32SubAndWord32SarP) { 904 TEST(RunInt32SubAndWord32SarP) {
914 { 905 {
915 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 906 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, kMachUint32);
916 kMachineWord32);
917 m.Return(m.Int32Sub(m.Parameter(0), 907 m.Return(m.Int32Sub(m.Parameter(0),
918 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); 908 m.Word32Sar(m.Parameter(1), m.Parameter(2))));
919 FOR_UINT32_INPUTS(i) { 909 FOR_UINT32_INPUTS(i) {
920 FOR_INT32_INPUTS(j) { 910 FOR_INT32_INPUTS(j) {
921 FOR_UINT32_SHIFTS(shift) { 911 FOR_UINT32_SHIFTS(shift) {
922 // Use uint32_t because signed overflow is UB in C.
923 int32_t expected = *i - (*j >> shift); 912 int32_t expected = *i - (*j >> shift);
924 CHECK_EQ(expected, m.Call(*i, *j, shift)); 913 CHECK_EQ(expected, m.Call(*i, *j, shift));
925 } 914 }
926 } 915 }
927 } 916 }
928 } 917 }
929 { 918 {
930 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 919 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachUint32, kMachUint32);
931 kMachineWord32);
932 m.Return(m.Int32Sub(m.Word32Sar(m.Parameter(0), m.Parameter(1)), 920 m.Return(m.Int32Sub(m.Word32Sar(m.Parameter(0), m.Parameter(1)),
933 m.Parameter(2))); 921 m.Parameter(2)));
934 FOR_INT32_INPUTS(i) { 922 FOR_INT32_INPUTS(i) {
935 FOR_UINT32_SHIFTS(shift) { 923 FOR_UINT32_SHIFTS(shift) {
936 FOR_UINT32_INPUTS(k) { 924 FOR_UINT32_INPUTS(k) {
937 // Use uint32_t because signed overflow is UB in C.
938 int32_t expected = (*i >> shift) - *k; 925 int32_t expected = (*i >> shift) - *k;
939 CHECK_EQ(expected, m.Call(*i, shift, *k)); 926 CHECK_EQ(expected, m.Call(*i, shift, *k));
940 } 927 }
941 } 928 }
942 } 929 }
943 } 930 }
944 } 931 }
945 932
946 933
947 TEST(RunInt32SubAndWord32ShlP) { 934 TEST(RunInt32SubAndWord32ShlP) {
948 { 935 {
949 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 936 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, kMachUint32);
950 kMachineWord32);
951 m.Return(m.Int32Sub(m.Parameter(0), 937 m.Return(m.Int32Sub(m.Parameter(0),
952 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); 938 m.Word32Shl(m.Parameter(1), m.Parameter(2))));
953 FOR_UINT32_INPUTS(i) { 939 FOR_UINT32_INPUTS(i) {
954 FOR_INT32_INPUTS(j) { 940 FOR_INT32_INPUTS(j) {
955 FOR_UINT32_SHIFTS(shift) { 941 FOR_UINT32_SHIFTS(shift) {
956 // Use uint32_t because signed overflow is UB in C.
957 int32_t expected = *i - (*j << shift); 942 int32_t expected = *i - (*j << shift);
958 CHECK_EQ(expected, m.Call(*i, *j, shift)); 943 CHECK_EQ(expected, m.Call(*i, *j, shift));
959 } 944 }
960 } 945 }
961 } 946 }
962 } 947 }
963 { 948 {
964 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 949 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachUint32, kMachUint32);
965 kMachineWord32);
966 m.Return(m.Int32Sub(m.Word32Shl(m.Parameter(0), m.Parameter(1)), 950 m.Return(m.Int32Sub(m.Word32Shl(m.Parameter(0), m.Parameter(1)),
967 m.Parameter(2))); 951 m.Parameter(2)));
968 FOR_INT32_INPUTS(i) { 952 FOR_INT32_INPUTS(i) {
969 FOR_UINT32_SHIFTS(shift) { 953 FOR_UINT32_SHIFTS(shift) {
970 FOR_UINT32_INPUTS(k) { 954 FOR_UINT32_INPUTS(k) {
971 // Use uint32_t because signed overflow is UB in C. 955 // Use uint32_t because signed overflow is UB in C.
972 int32_t expected = (*i << shift) - *k; 956 int32_t expected = (*i << shift) - *k;
973 CHECK_EQ(expected, m.Call(*i, shift, *k)); 957 CHECK_EQ(expected, m.Call(*i, shift, *k));
974 } 958 }
975 } 959 }
976 } 960 }
977 } 961 }
978 } 962 }
979 963
980 964
981 TEST(RunInt32SubAndWord32ShrP) { 965 TEST(RunInt32SubAndWord32ShrP) {
982 { 966 {
983 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 967 RawMachineAssemblerTester<uint32_t> m(kMachUint32, kMachUint32,
984 kMachineWord32); 968 kMachUint32);
985 m.Return(m.Int32Sub(m.Parameter(0), 969 m.Return(m.Int32Sub(m.Parameter(0),
986 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); 970 m.Word32Shr(m.Parameter(1), m.Parameter(2))));
987 FOR_UINT32_INPUTS(i) { 971 FOR_UINT32_INPUTS(i) {
988 FOR_UINT32_INPUTS(j) { 972 FOR_UINT32_INPUTS(j) {
989 FOR_UINT32_SHIFTS(shift) { 973 FOR_UINT32_SHIFTS(shift) {
990 // Use uint32_t because signed overflow is UB in C. 974 // Use uint32_t because signed overflow is UB in C.
991 int32_t expected = *i - (*j >> shift); 975 int32_t expected = *i - (*j >> shift);
992 CHECK_EQ(expected, m.Call(*i, *j, shift)); 976 CHECK_UINT32_EQ(expected, m.Call(*i, *j, shift));
993 } 977 }
994 } 978 }
995 } 979 }
996 } 980 }
997 { 981 {
998 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 982 RawMachineAssemblerTester<uint32_t> m(kMachUint32, kMachUint32,
999 kMachineWord32); 983 kMachUint32);
1000 m.Return(m.Int32Sub(m.Word32Shr(m.Parameter(0), m.Parameter(1)), 984 m.Return(m.Int32Sub(m.Word32Shr(m.Parameter(0), m.Parameter(1)),
1001 m.Parameter(2))); 985 m.Parameter(2)));
1002 FOR_UINT32_INPUTS(i) { 986 FOR_UINT32_INPUTS(i) {
1003 FOR_UINT32_SHIFTS(shift) { 987 FOR_UINT32_SHIFTS(shift) {
1004 FOR_UINT32_INPUTS(k) { 988 FOR_UINT32_INPUTS(k) {
1005 // Use uint32_t because signed overflow is UB in C. 989 // Use uint32_t because signed overflow is UB in C.
1006 int32_t expected = (*i >> shift) - *k; 990 int32_t expected = (*i >> shift) - *k;
1007 CHECK_EQ(expected, m.Call(*i, shift, *k)); 991 CHECK_EQ(expected, m.Call(*i, shift, *k));
1008 } 992 }
1009 } 993 }
1010 } 994 }
1011 } 995 }
1012 } 996 }
1013 997
1014 998
1015 TEST(RunInt32SubInBranch) { 999 TEST(RunInt32SubInBranch) {
1016 static const int constant = 987654321; 1000 static const int constant = 987654321;
1017 { 1001 {
1018 RawMachineAssemblerTester<int32_t> m; 1002 RawMachineAssemblerTester<int32_t> m;
1019 Int32BinopTester bt(&m); 1003 Uint32BinopTester bt(&m);
1020 MLabel blocka, blockb; 1004 MLabel blocka, blockb;
1021 m.Branch( 1005 m.Branch(
1022 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), 1006 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)),
1023 &blocka, &blockb); 1007 &blocka, &blockb);
1024 m.Bind(&blocka); 1008 m.Bind(&blocka);
1025 bt.AddReturn(m.Int32Constant(constant)); 1009 bt.AddReturn(m.Int32Constant(constant));
1026 m.Bind(&blockb); 1010 m.Bind(&blockb);
1027 bt.AddReturn(m.Int32Constant(0 - constant)); 1011 bt.AddReturn(m.Int32Constant(0 - constant));
1028 FOR_UINT32_INPUTS(i) { 1012 FOR_UINT32_INPUTS(i) {
1029 FOR_UINT32_INPUTS(j) { 1013 FOR_UINT32_INPUTS(j) {
1030 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant; 1014 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant;
1031 CHECK_EQ(expected, bt.call(*i, *j)); 1015 CHECK_EQ(expected, bt.call(*i, *j));
1032 } 1016 }
1033 } 1017 }
1034 } 1018 }
1035 { 1019 {
1036 RawMachineAssemblerTester<int32_t> m; 1020 RawMachineAssemblerTester<int32_t> m;
1037 Int32BinopTester bt(&m); 1021 Uint32BinopTester bt(&m);
1038 MLabel blocka, blockb; 1022 MLabel blocka, blockb;
1039 m.Branch( 1023 m.Branch(
1040 m.Word32NotEqual(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), 1024 m.Word32NotEqual(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)),
1041 &blocka, &blockb); 1025 &blocka, &blockb);
1042 m.Bind(&blocka); 1026 m.Bind(&blocka);
1043 bt.AddReturn(m.Int32Constant(constant)); 1027 bt.AddReturn(m.Int32Constant(constant));
1044 m.Bind(&blockb); 1028 m.Bind(&blockb);
1045 bt.AddReturn(m.Int32Constant(0 - constant)); 1029 bt.AddReturn(m.Int32Constant(0 - constant));
1046 FOR_UINT32_INPUTS(i) { 1030 FOR_UINT32_INPUTS(i) {
1047 FOR_UINT32_INPUTS(j) { 1031 FOR_UINT32_INPUTS(j) {
1048 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; 1032 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant;
1049 CHECK_EQ(expected, bt.call(*i, *j)); 1033 CHECK_EQ(expected, bt.call(*i, *j));
1050 } 1034 }
1051 } 1035 }
1052 } 1036 }
1053 { 1037 {
1054 FOR_UINT32_INPUTS(i) { 1038 FOR_UINT32_INPUTS(i) {
1055 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1039 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1056 MLabel blocka, blockb; 1040 MLabel blocka, blockb;
1057 m.Branch(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), 1041 m.Branch(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)),
1058 m.Int32Constant(0)), 1042 m.Int32Constant(0)),
1059 &blocka, &blockb); 1043 &blocka, &blockb);
1060 m.Bind(&blocka); 1044 m.Bind(&blocka);
1061 m.Return(m.Int32Constant(constant)); 1045 m.Return(m.Int32Constant(constant));
1062 m.Bind(&blockb); 1046 m.Bind(&blockb);
1063 m.Return(m.Int32Constant(0 - constant)); 1047 m.Return(m.Int32Constant(0 - constant));
1064 FOR_UINT32_INPUTS(j) { 1048 FOR_UINT32_INPUTS(j) {
1065 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant; 1049 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant;
1066 CHECK_EQ(expected, m.Call(*j)); 1050 CHECK_EQ(expected, m.Call(*j));
1067 } 1051 }
1068 } 1052 }
1069 } 1053 }
1070 { 1054 {
1071 FOR_UINT32_INPUTS(i) { 1055 FOR_UINT32_INPUTS(i) {
1072 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1056 RawMachineAssemblerTester<int32_t> m(kMachUint32);
1073 MLabel blocka, blockb; 1057 MLabel blocka, blockb;
1074 m.Branch(m.Word32NotEqual(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), 1058 m.Branch(m.Word32NotEqual(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)),
1075 m.Int32Constant(0)), 1059 m.Int32Constant(0)),
1076 &blocka, &blockb); 1060 &blocka, &blockb);
1077 m.Bind(&blocka); 1061 m.Bind(&blocka);
1078 m.Return(m.Int32Constant(constant)); 1062 m.Return(m.Int32Constant(constant));
1079 m.Bind(&blockb); 1063 m.Bind(&blockb);
1080 m.Return(m.Int32Constant(0 - constant)); 1064 m.Return(m.Int32Constant(0 - constant));
1081 FOR_UINT32_INPUTS(j) { 1065 FOR_UINT32_INPUTS(j) {
1082 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; 1066 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant;
1083 CHECK_EQ(expected, m.Call(*j)); 1067 CHECK_EQ(expected, m.Call(*j));
1084 } 1068 }
1085 } 1069 }
1086 } 1070 }
1087 { 1071 {
1088 RawMachineAssemblerTester<void> m; 1072 RawMachineAssemblerTester<void> m;
1089 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), 1073 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(),
1090 m.machine()->Word32Shr()}; 1074 m.machine()->Word32Shr()};
1091 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { 1075 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) {
1092 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 1076 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32,
1093 kMachineWord32); 1077 kMachUint32);
1094 MLabel blocka, blockb; 1078 MLabel blocka, blockb;
1095 m.Branch(m.Word32Equal(m.Int32Sub(m.Parameter(0), 1079 m.Branch(m.Word32Equal(m.Int32Sub(m.Parameter(0),
1096 m.NewNode(shops[n], m.Parameter(1), 1080 m.NewNode(shops[n], m.Parameter(1),
1097 m.Parameter(2))), 1081 m.Parameter(2))),
1098 m.Int32Constant(0)), 1082 m.Int32Constant(0)),
1099 &blocka, &blockb); 1083 &blocka, &blockb);
1100 m.Bind(&blocka); 1084 m.Bind(&blocka);
1101 m.Return(m.Int32Constant(constant)); 1085 m.Return(m.Int32Constant(constant));
1102 m.Bind(&blockb); 1086 m.Bind(&blockb);
1103 m.Return(m.Int32Constant(0 - constant)); 1087 m.Return(m.Int32Constant(0 - constant));
(...skipping 20 matching lines...) Expand all
1124 } 1108 }
1125 } 1109 }
1126 } 1110 }
1127 } 1111 }
1128 } 1112 }
1129 1113
1130 1114
1131 TEST(RunInt32SubInComparison) { 1115 TEST(RunInt32SubInComparison) {
1132 { 1116 {
1133 RawMachineAssemblerTester<int32_t> m; 1117 RawMachineAssemblerTester<int32_t> m;
1134 Int32BinopTester bt(&m); 1118 Uint32BinopTester bt(&m);
1135 bt.AddReturn( 1119 bt.AddReturn(
1136 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0))); 1120 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)));
1137 FOR_UINT32_INPUTS(i) { 1121 FOR_UINT32_INPUTS(i) {
1138 FOR_UINT32_INPUTS(j) { 1122 FOR_UINT32_INPUTS(j) {
1139 int32_t expected = (*i - *j) == 0; 1123 uint32_t expected = (*i - *j) == 0;
1140 CHECK_EQ(expected, bt.call(*i, *j)); 1124 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
1141 } 1125 }
1142 } 1126 }
1143 } 1127 }
1144 { 1128 {
1145 RawMachineAssemblerTester<int32_t> m; 1129 RawMachineAssemblerTester<int32_t> m;
1146 Int32BinopTester bt(&m); 1130 Uint32BinopTester bt(&m);
1147 bt.AddReturn( 1131 bt.AddReturn(
1148 m.Word32Equal(m.Int32Constant(0), m.Int32Sub(bt.param0, bt.param1))); 1132 m.Word32Equal(m.Int32Constant(0), m.Int32Sub(bt.param0, bt.param1)));
1149 FOR_UINT32_INPUTS(i) { 1133 FOR_UINT32_INPUTS(i) {
1150 FOR_UINT32_INPUTS(j) { 1134 FOR_UINT32_INPUTS(j) {
1151 int32_t expected = (*i - *j) == 0; 1135 uint32_t expected = (*i - *j) == 0;
1152 CHECK_EQ(expected, bt.call(*i, *j)); 1136 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
1153 } 1137 }
1154 } 1138 }
1155 } 1139 }
1156 { 1140 {
1157 FOR_UINT32_INPUTS(i) { 1141 FOR_UINT32_INPUTS(i) {
1158 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1142 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1159 m.Return(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), 1143 m.Return(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)),
1160 m.Int32Constant(0))); 1144 m.Int32Constant(0)));
1161 FOR_UINT32_INPUTS(j) { 1145 FOR_UINT32_INPUTS(j) {
1162 int32_t expected = (*i - *j) == 0; 1146 uint32_t expected = (*i - *j) == 0;
1163 CHECK_EQ(expected, m.Call(*j)); 1147 CHECK_UINT32_EQ(expected, m.Call(*j));
1164 } 1148 }
1165 } 1149 }
1166 } 1150 }
1167 { 1151 {
1168 FOR_UINT32_INPUTS(i) { 1152 FOR_UINT32_INPUTS(i) {
1169 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1153 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1170 m.Return(m.Word32Equal(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i)), 1154 m.Return(m.Word32Equal(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i)),
1171 m.Int32Constant(0))); 1155 m.Int32Constant(0)));
1172 FOR_UINT32_INPUTS(j) { 1156 FOR_UINT32_INPUTS(j) {
1173 int32_t expected = (*j - *i) == 0; 1157 uint32_t expected = (*j - *i) == 0;
1174 CHECK_EQ(expected, m.Call(*j)); 1158 CHECK_UINT32_EQ(expected, m.Call(*j));
1175 } 1159 }
1176 } 1160 }
1177 } 1161 }
1178 { 1162 {
1179 RawMachineAssemblerTester<void> m; 1163 RawMachineAssemblerTester<void> m;
1180 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), 1164 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(),
1181 m.machine()->Word32Shr()}; 1165 m.machine()->Word32Shr()};
1182 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { 1166 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) {
1183 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 1167 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32,
1184 kMachineWord32); 1168 kMachUint32);
1185 m.Return(m.Word32Equal( 1169 m.Return(m.Word32Equal(
1186 m.Int32Sub(m.Parameter(0), 1170 m.Int32Sub(m.Parameter(0),
1187 m.NewNode(shops[n], m.Parameter(1), m.Parameter(2))), 1171 m.NewNode(shops[n], m.Parameter(1), m.Parameter(2))),
1188 m.Int32Constant(0))); 1172 m.Int32Constant(0)));
1189 FOR_UINT32_INPUTS(i) { 1173 FOR_UINT32_INPUTS(i) {
1190 FOR_INT32_INPUTS(j) { 1174 FOR_INT32_INPUTS(j) {
1191 FOR_UINT32_SHIFTS(shift) { 1175 FOR_UINT32_SHIFTS(shift) {
1192 int32_t right; 1176 int32_t right;
1193 switch (shops[n]->opcode()) { 1177 switch (shops[n]->opcode()) {
1194 default: 1178 default:
(...skipping 25 matching lines...) Expand all
1220 bt.AddReturn(m.Int32Mul(bt.param0, bt.param1)); 1204 bt.AddReturn(m.Int32Mul(bt.param0, bt.param1));
1221 FOR_INT32_INPUTS(i) { 1205 FOR_INT32_INPUTS(i) {
1222 FOR_INT32_INPUTS(j) { 1206 FOR_INT32_INPUTS(j) {
1223 int expected = static_cast<int32_t>(*i * *j); 1207 int expected = static_cast<int32_t>(*i * *j);
1224 CHECK_EQ(expected, bt.call(*i, *j)); 1208 CHECK_EQ(expected, bt.call(*i, *j));
1225 } 1209 }
1226 } 1210 }
1227 } 1211 }
1228 { 1212 {
1229 RawMachineAssemblerTester<int32_t> m; 1213 RawMachineAssemblerTester<int32_t> m;
1230 Int32BinopTester bt(&m); 1214 Uint32BinopTester bt(&m);
1231 bt.AddReturn(m.Int32Mul(bt.param0, bt.param1)); 1215 bt.AddReturn(m.Int32Mul(bt.param0, bt.param1));
1232 FOR_UINT32_INPUTS(i) { 1216 FOR_UINT32_INPUTS(i) {
1233 FOR_UINT32_INPUTS(j) { 1217 FOR_UINT32_INPUTS(j) {
1234 int expected = static_cast<int32_t>(*i * *j); 1218 uint32_t expected = *i * *j;
1235 CHECK_EQ(expected, bt.call(*i, *j)); 1219 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
1236 } 1220 }
1237 } 1221 }
1238 } 1222 }
1239 } 1223 }
1240 1224
1241 1225
1242 TEST(RunInt32MulImm) { 1226 TEST(RunInt32MulImm) {
1243 { 1227 {
1244 FOR_UINT32_INPUTS(i) { 1228 FOR_UINT32_INPUTS(i) {
1245 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1229 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1246 m.Return(m.Int32Mul(m.Int32Constant(*i), m.Parameter(0))); 1230 m.Return(m.Int32Mul(m.Int32Constant(*i), m.Parameter(0)));
1247 FOR_UINT32_INPUTS(j) { 1231 FOR_UINT32_INPUTS(j) {
1248 int32_t expected = static_cast<int32_t>(*i * *j); 1232 uint32_t expected = *i * *j;
1249 CHECK_EQ(expected, m.Call(*j)); 1233 CHECK_UINT32_EQ(expected, m.Call(*j));
1250 } 1234 }
1251 } 1235 }
1252 } 1236 }
1253 { 1237 {
1254 FOR_UINT32_INPUTS(i) { 1238 FOR_UINT32_INPUTS(i) {
1255 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1239 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1256 m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant(*i))); 1240 m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant(*i)));
1257 FOR_UINT32_INPUTS(j) { 1241 FOR_UINT32_INPUTS(j) {
1258 int32_t expected = static_cast<int32_t>(*j * *i); 1242 uint32_t expected = *j * *i;
1259 CHECK_EQ(expected, m.Call(*j)); 1243 CHECK_UINT32_EQ(expected, m.Call(*j));
1260 } 1244 }
1261 } 1245 }
1262 } 1246 }
1263 } 1247 }
1264 1248
1265 1249
1266 TEST(RunInt32MulAndInt32AddP) { 1250 TEST(RunInt32MulAndInt32AddP) {
1267 { 1251 {
1268 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 1252 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32);
1269 kMachineWord32);
1270 m.Return( 1253 m.Return(
1271 m.Int32Add(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); 1254 m.Int32Add(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2))));
1272 FOR_INT32_INPUTS(i) { 1255 FOR_INT32_INPUTS(i) {
1273 FOR_INT32_INPUTS(j) { 1256 FOR_INT32_INPUTS(j) {
1274 FOR_INT32_INPUTS(k) { 1257 FOR_INT32_INPUTS(k) {
1275 int32_t p0 = *i; 1258 int32_t p0 = *i;
1276 int32_t p1 = *j; 1259 int32_t p1 = *j;
1277 int32_t p2 = *k; 1260 int32_t p2 = *k;
1278 int expected = p0 + static_cast<int32_t>(p1 * p2); 1261 int expected = p0 + static_cast<int32_t>(p1 * p2);
1279 CHECK_EQ(expected, m.Call(p0, p1, p2)); 1262 CHECK_EQ(expected, m.Call(p0, p1, p2));
1280 } 1263 }
1281 } 1264 }
1282 } 1265 }
1283 } 1266 }
1284 { 1267 {
1285 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 1268 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32);
1286 kMachineWord32);
1287 m.Return( 1269 m.Return(
1288 m.Int32Add(m.Int32Mul(m.Parameter(0), m.Parameter(1)), m.Parameter(2))); 1270 m.Int32Add(m.Int32Mul(m.Parameter(0), m.Parameter(1)), m.Parameter(2)));
1289 FOR_INT32_INPUTS(i) { 1271 FOR_INT32_INPUTS(i) {
1290 FOR_INT32_INPUTS(j) { 1272 FOR_INT32_INPUTS(j) {
1291 FOR_INT32_INPUTS(k) { 1273 FOR_INT32_INPUTS(k) {
1292 int32_t p0 = *i; 1274 int32_t p0 = *i;
1293 int32_t p1 = *j; 1275 int32_t p1 = *j;
1294 int32_t p2 = *k; 1276 int32_t p2 = *k;
1295 int expected = static_cast<int32_t>(p0 * p1) + p2; 1277 int expected = static_cast<int32_t>(p0 * p1) + p2;
1296 CHECK_EQ(expected, m.Call(p0, p1, p2)); 1278 CHECK_EQ(expected, m.Call(p0, p1, p2));
(...skipping 15 matching lines...) Expand all
1312 CHECK_EQ(expected, bt.call(p0, p1)); 1294 CHECK_EQ(expected, bt.call(p0, p1));
1313 } 1295 }
1314 } 1296 }
1315 } 1297 }
1316 } 1298 }
1317 } 1299 }
1318 1300
1319 1301
1320 TEST(RunInt32MulAndInt32SubP) { 1302 TEST(RunInt32MulAndInt32SubP) {
1321 { 1303 {
1322 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 1304 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, kMachInt32);
1323 kMachineWord32);
1324 m.Return( 1305 m.Return(
1325 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); 1306 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2))));
1326 FOR_UINT32_INPUTS(i) { 1307 FOR_UINT32_INPUTS(i) {
1327 FOR_INT32_INPUTS(j) { 1308 FOR_INT32_INPUTS(j) {
1328 FOR_INT32_INPUTS(k) { 1309 FOR_INT32_INPUTS(k) {
1329 uint32_t p0 = *i; 1310 uint32_t p0 = *i;
1330 int32_t p1 = *j; 1311 int32_t p1 = *j;
1331 int32_t p2 = *k; 1312 int32_t p2 = *k;
1332 // Use uint32_t because signed overflow is UB in C. 1313 // Use uint32_t because signed overflow is UB in C.
1333 int expected = p0 - static_cast<uint32_t>(p1 * p2); 1314 int expected = p0 - static_cast<uint32_t>(p1 * p2);
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
1525 CHECK_EQ(expected, bt.call(*i, *j)); 1506 CHECK_EQ(expected, bt.call(*i, *j));
1526 } 1507 }
1527 } 1508 }
1528 } 1509 }
1529 } 1510 }
1530 1511
1531 1512
1532 TEST(RunWord32AndAndWord32ShlP) { 1513 TEST(RunWord32AndAndWord32ShlP) {
1533 { 1514 {
1534 RawMachineAssemblerTester<int32_t> m; 1515 RawMachineAssemblerTester<int32_t> m;
1535 Int32BinopTester bt(&m); 1516 Uint32BinopTester bt(&m);
1536 bt.AddReturn( 1517 bt.AddReturn(
1537 m.Word32Shl(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); 1518 m.Word32Shl(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f))));
1538 FOR_UINT32_INPUTS(i) { 1519 FOR_UINT32_INPUTS(i) {
1539 FOR_UINT32_INPUTS(j) { 1520 FOR_UINT32_INPUTS(j) {
1540 uint32_t expected = *i << (*j & 0x1f); 1521 uint32_t expected = *i << (*j & 0x1f);
1541 CHECK_EQ(expected, bt.call(*i, *j)); 1522 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
1542 } 1523 }
1543 } 1524 }
1544 } 1525 }
1545 { 1526 {
1546 RawMachineAssemblerTester<int32_t> m; 1527 RawMachineAssemblerTester<int32_t> m;
1547 Int32BinopTester bt(&m); 1528 Uint32BinopTester bt(&m);
1548 bt.AddReturn( 1529 bt.AddReturn(
1549 m.Word32Shl(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); 1530 m.Word32Shl(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1)));
1550 FOR_UINT32_INPUTS(i) { 1531 FOR_UINT32_INPUTS(i) {
1551 FOR_UINT32_INPUTS(j) { 1532 FOR_UINT32_INPUTS(j) {
1552 uint32_t expected = *i << (0x1f & *j); 1533 uint32_t expected = *i << (0x1f & *j);
1553 CHECK_EQ(expected, bt.call(*i, *j)); 1534 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
1554 } 1535 }
1555 } 1536 }
1556 } 1537 }
1557 } 1538 }
1558 1539
1559 1540
1560 TEST(RunWord32AndAndWord32ShrP) { 1541 TEST(RunWord32AndAndWord32ShrP) {
1561 { 1542 {
1562 RawMachineAssemblerTester<int32_t> m; 1543 RawMachineAssemblerTester<int32_t> m;
1563 Int32BinopTester bt(&m); 1544 Uint32BinopTester bt(&m);
1564 bt.AddReturn( 1545 bt.AddReturn(
1565 m.Word32Shr(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); 1546 m.Word32Shr(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f))));
1566 FOR_UINT32_INPUTS(i) { 1547 FOR_UINT32_INPUTS(i) {
1567 FOR_UINT32_INPUTS(j) { 1548 FOR_UINT32_INPUTS(j) {
1568 uint32_t expected = *i >> (*j & 0x1f); 1549 uint32_t expected = *i >> (*j & 0x1f);
1569 CHECK_EQ(expected, bt.call(*i, *j)); 1550 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
1570 } 1551 }
1571 } 1552 }
1572 } 1553 }
1573 { 1554 {
1574 RawMachineAssemblerTester<int32_t> m; 1555 RawMachineAssemblerTester<int32_t> m;
1575 Int32BinopTester bt(&m); 1556 Uint32BinopTester bt(&m);
1576 bt.AddReturn( 1557 bt.AddReturn(
1577 m.Word32Shr(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); 1558 m.Word32Shr(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1)));
1578 FOR_UINT32_INPUTS(i) { 1559 FOR_UINT32_INPUTS(i) {
1579 FOR_UINT32_INPUTS(j) { 1560 FOR_UINT32_INPUTS(j) {
1580 uint32_t expected = *i >> (0x1f & *j); 1561 uint32_t expected = *i >> (0x1f & *j);
1581 CHECK_EQ(expected, bt.call(*i, *j)); 1562 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
1582 } 1563 }
1583 } 1564 }
1584 } 1565 }
1585 } 1566 }
1586 1567
1587 1568
1588 TEST(RunWord32AndAndWord32SarP) { 1569 TEST(RunWord32AndAndWord32SarP) {
1589 { 1570 {
1590 RawMachineAssemblerTester<int32_t> m; 1571 RawMachineAssemblerTester<int32_t> m;
1591 Int32BinopTester bt(&m); 1572 Int32BinopTester bt(&m);
1592 bt.AddReturn( 1573 bt.AddReturn(
1593 m.Word32Sar(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); 1574 m.Word32Sar(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f))));
1594 FOR_INT32_INPUTS(i) { 1575 FOR_INT32_INPUTS(i) {
1595 FOR_UINT32_INPUTS(j) { 1576 FOR_INT32_INPUTS(j) {
1596 uint32_t expected = *i >> (*j & 0x1f); 1577 int32_t expected = *i >> (*j & 0x1f);
1597 CHECK_EQ(expected, bt.call(*i, *j)); 1578 CHECK_EQ(expected, bt.call(*i, *j));
1598 } 1579 }
1599 } 1580 }
1600 } 1581 }
1601 { 1582 {
1602 RawMachineAssemblerTester<int32_t> m; 1583 RawMachineAssemblerTester<int32_t> m;
1603 Int32BinopTester bt(&m); 1584 Int32BinopTester bt(&m);
1604 bt.AddReturn( 1585 bt.AddReturn(
1605 m.Word32Sar(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); 1586 m.Word32Sar(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1)));
1606 FOR_INT32_INPUTS(i) { 1587 FOR_INT32_INPUTS(i) {
1607 FOR_UINT32_INPUTS(j) { 1588 FOR_INT32_INPUTS(j) {
1608 uint32_t expected = *i >> (0x1f & *j); 1589 uint32_t expected = *i >> (0x1f & *j);
1609 CHECK_EQ(expected, bt.call(*i, *j)); 1590 CHECK_EQ(expected, bt.call(*i, *j));
1610 } 1591 }
1611 } 1592 }
1612 } 1593 }
1613 } 1594 }
1614 1595
1615 1596
1616 TEST(RunWord32AndImm) { 1597 TEST(RunWord32AndImm) {
1617 { 1598 {
1618 FOR_UINT32_INPUTS(i) { 1599 FOR_UINT32_INPUTS(i) {
1619 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1600 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1620 m.Return(m.Word32And(m.Int32Constant(*i), m.Parameter(0))); 1601 m.Return(m.Word32And(m.Int32Constant(*i), m.Parameter(0)));
1621 FOR_UINT32_INPUTS(j) { 1602 FOR_UINT32_INPUTS(j) {
1622 uint32_t expected = *i & *j; 1603 uint32_t expected = *i & *j;
1623 CHECK_EQ(expected, m.Call(*j)); 1604 CHECK_UINT32_EQ(expected, m.Call(*j));
1624 } 1605 }
1625 } 1606 }
1626 } 1607 }
1627 { 1608 {
1628 FOR_UINT32_INPUTS(i) { 1609 FOR_UINT32_INPUTS(i) {
1629 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1610 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1630 m.Return(m.Word32And(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); 1611 m.Return(m.Word32And(m.Int32Constant(*i), m.Word32Not(m.Parameter(0))));
1631 FOR_UINT32_INPUTS(j) { 1612 FOR_UINT32_INPUTS(j) {
1632 uint32_t expected = *i & ~(*j); 1613 uint32_t expected = *i & ~(*j);
1633 CHECK_EQ(expected, m.Call(*j)); 1614 CHECK_UINT32_EQ(expected, m.Call(*j));
1634 } 1615 }
1635 } 1616 }
1636 } 1617 }
1637 } 1618 }
1638 1619
1639 1620
1640 TEST(RunWord32AndInBranch) { 1621 TEST(RunWord32AndInBranch) {
1641 static const int constant = 987654321; 1622 static const int constant = 987654321;
1642 { 1623 {
1643 RawMachineAssemblerTester<int32_t> m; 1624 RawMachineAssemblerTester<int32_t> m;
1644 Int32BinopTester bt(&m); 1625 Uint32BinopTester bt(&m);
1645 MLabel blocka, blockb; 1626 MLabel blocka, blockb;
1646 m.Branch( 1627 m.Branch(
1647 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), 1628 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)),
1648 &blocka, &blockb); 1629 &blocka, &blockb);
1649 m.Bind(&blocka); 1630 m.Bind(&blocka);
1650 bt.AddReturn(m.Int32Constant(constant)); 1631 bt.AddReturn(m.Int32Constant(constant));
1651 m.Bind(&blockb); 1632 m.Bind(&blockb);
1652 bt.AddReturn(m.Int32Constant(0 - constant)); 1633 bt.AddReturn(m.Int32Constant(0 - constant));
1653 FOR_UINT32_INPUTS(i) { 1634 FOR_UINT32_INPUTS(i) {
1654 FOR_UINT32_INPUTS(j) { 1635 FOR_UINT32_INPUTS(j) {
1655 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; 1636 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant;
1656 CHECK_EQ(expected, bt.call(*i, *j)); 1637 CHECK_EQ(expected, bt.call(*i, *j));
1657 } 1638 }
1658 } 1639 }
1659 } 1640 }
1660 { 1641 {
1661 RawMachineAssemblerTester<int32_t> m; 1642 RawMachineAssemblerTester<int32_t> m;
1662 Int32BinopTester bt(&m); 1643 Uint32BinopTester bt(&m);
1663 MLabel blocka, blockb; 1644 MLabel blocka, blockb;
1664 m.Branch( 1645 m.Branch(
1665 m.Word32NotEqual(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), 1646 m.Word32NotEqual(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)),
1666 &blocka, &blockb); 1647 &blocka, &blockb);
1667 m.Bind(&blocka); 1648 m.Bind(&blocka);
1668 bt.AddReturn(m.Int32Constant(constant)); 1649 bt.AddReturn(m.Int32Constant(constant));
1669 m.Bind(&blockb); 1650 m.Bind(&blockb);
1670 bt.AddReturn(m.Int32Constant(0 - constant)); 1651 bt.AddReturn(m.Int32Constant(0 - constant));
1671 FOR_UINT32_INPUTS(i) { 1652 FOR_UINT32_INPUTS(i) {
1672 FOR_UINT32_INPUTS(j) { 1653 FOR_UINT32_INPUTS(j) {
1673 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; 1654 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant;
1674 CHECK_EQ(expected, bt.call(*i, *j)); 1655 CHECK_EQ(expected, bt.call(*i, *j));
1675 } 1656 }
1676 } 1657 }
1677 } 1658 }
1678 { 1659 {
1679 FOR_UINT32_INPUTS(i) { 1660 FOR_UINT32_INPUTS(i) {
1680 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1661 RawMachineAssemblerTester<int32_t> m(kMachUint32);
1681 MLabel blocka, blockb; 1662 MLabel blocka, blockb;
1682 m.Branch(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), 1663 m.Branch(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)),
1683 m.Int32Constant(0)), 1664 m.Int32Constant(0)),
1684 &blocka, &blockb); 1665 &blocka, &blockb);
1685 m.Bind(&blocka); 1666 m.Bind(&blocka);
1686 m.Return(m.Int32Constant(constant)); 1667 m.Return(m.Int32Constant(constant));
1687 m.Bind(&blockb); 1668 m.Bind(&blockb);
1688 m.Return(m.Int32Constant(0 - constant)); 1669 m.Return(m.Int32Constant(0 - constant));
1689 FOR_UINT32_INPUTS(j) { 1670 FOR_UINT32_INPUTS(j) {
1690 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; 1671 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant;
1691 CHECK_EQ(expected, m.Call(*j)); 1672 CHECK_EQ(expected, m.Call(*j));
1692 } 1673 }
1693 } 1674 }
1694 } 1675 }
1695 { 1676 {
1696 FOR_UINT32_INPUTS(i) { 1677 FOR_UINT32_INPUTS(i) {
1697 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1678 RawMachineAssemblerTester<int32_t> m(kMachUint32);
1698 MLabel blocka, blockb; 1679 MLabel blocka, blockb;
1699 m.Branch( 1680 m.Branch(
1700 m.Word32NotEqual(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), 1681 m.Word32NotEqual(m.Word32And(m.Int32Constant(*i), m.Parameter(0)),
1701 m.Int32Constant(0)), 1682 m.Int32Constant(0)),
1702 &blocka, &blockb); 1683 &blocka, &blockb);
1703 m.Bind(&blocka); 1684 m.Bind(&blocka);
1704 m.Return(m.Int32Constant(constant)); 1685 m.Return(m.Int32Constant(constant));
1705 m.Bind(&blockb); 1686 m.Bind(&blockb);
1706 m.Return(m.Int32Constant(0 - constant)); 1687 m.Return(m.Int32Constant(0 - constant));
1707 FOR_UINT32_INPUTS(j) { 1688 FOR_UINT32_INPUTS(j) {
1708 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; 1689 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant;
1709 CHECK_EQ(expected, m.Call(*j)); 1690 CHECK_EQ(expected, m.Call(*j));
1710 } 1691 }
1711 } 1692 }
1712 } 1693 }
1713 { 1694 {
1714 RawMachineAssemblerTester<void> m; 1695 RawMachineAssemblerTester<void> m;
1715 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), 1696 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(),
1716 m.machine()->Word32Shr()}; 1697 m.machine()->Word32Shr()};
1717 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { 1698 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) {
1718 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 1699 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32,
1719 kMachineWord32); 1700 kMachUint32);
1720 MLabel blocka, blockb; 1701 MLabel blocka, blockb;
1721 m.Branch(m.Word32Equal(m.Word32And(m.Parameter(0), 1702 m.Branch(m.Word32Equal(m.Word32And(m.Parameter(0),
1722 m.NewNode(shops[n], m.Parameter(1), 1703 m.NewNode(shops[n], m.Parameter(1),
1723 m.Parameter(2))), 1704 m.Parameter(2))),
1724 m.Int32Constant(0)), 1705 m.Int32Constant(0)),
1725 &blocka, &blockb); 1706 &blocka, &blockb);
1726 m.Bind(&blocka); 1707 m.Bind(&blocka);
1727 m.Return(m.Int32Constant(constant)); 1708 m.Return(m.Int32Constant(constant));
1728 m.Bind(&blockb); 1709 m.Bind(&blockb);
1729 m.Return(m.Int32Constant(0 - constant)); 1710 m.Return(m.Int32Constant(0 - constant));
(...skipping 20 matching lines...) Expand all
1750 } 1731 }
1751 } 1732 }
1752 } 1733 }
1753 } 1734 }
1754 } 1735 }
1755 1736
1756 1737
1757 TEST(RunWord32AndInComparison) { 1738 TEST(RunWord32AndInComparison) {
1758 { 1739 {
1759 RawMachineAssemblerTester<int32_t> m; 1740 RawMachineAssemblerTester<int32_t> m;
1760 Int32BinopTester bt(&m); 1741 Uint32BinopTester bt(&m);
1761 bt.AddReturn( 1742 bt.AddReturn(
1762 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0))); 1743 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)));
1763 FOR_UINT32_INPUTS(i) { 1744 FOR_UINT32_INPUTS(i) {
1764 FOR_UINT32_INPUTS(j) { 1745 FOR_UINT32_INPUTS(j) {
1765 int32_t expected = (*i & *j) == 0; 1746 uint32_t expected = (*i & *j) == 0;
1766 CHECK_EQ(expected, bt.call(*i, *j)); 1747 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
1767 } 1748 }
1768 } 1749 }
1769 } 1750 }
1770 { 1751 {
1771 RawMachineAssemblerTester<int32_t> m; 1752 RawMachineAssemblerTester<int32_t> m;
1772 Int32BinopTester bt(&m); 1753 Uint32BinopTester bt(&m);
1773 bt.AddReturn( 1754 bt.AddReturn(
1774 m.Word32Equal(m.Int32Constant(0), m.Word32And(bt.param0, bt.param1))); 1755 m.Word32Equal(m.Int32Constant(0), m.Word32And(bt.param0, bt.param1)));
1775 FOR_UINT32_INPUTS(i) { 1756 FOR_UINT32_INPUTS(i) {
1776 FOR_UINT32_INPUTS(j) { 1757 FOR_UINT32_INPUTS(j) {
1777 int32_t expected = (*i & *j) == 0; 1758 uint32_t expected = (*i & *j) == 0;
1778 CHECK_EQ(expected, bt.call(*i, *j)); 1759 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
1779 } 1760 }
1780 } 1761 }
1781 } 1762 }
1782 { 1763 {
1783 FOR_UINT32_INPUTS(i) { 1764 FOR_UINT32_INPUTS(i) {
1784 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1765 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1785 m.Return(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), 1766 m.Return(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)),
1786 m.Int32Constant(0))); 1767 m.Int32Constant(0)));
1787 FOR_UINT32_INPUTS(j) { 1768 FOR_UINT32_INPUTS(j) {
1788 int32_t expected = (*i & *j) == 0; 1769 uint32_t expected = (*i & *j) == 0;
1789 CHECK_EQ(expected, m.Call(*j)); 1770 CHECK_UINT32_EQ(expected, m.Call(*j));
1790 } 1771 }
1791 } 1772 }
1792 } 1773 }
1793 { 1774 {
1794 FOR_UINT32_INPUTS(i) { 1775 FOR_UINT32_INPUTS(i) {
1795 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1776 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1796 m.Return(m.Word32Equal(m.Word32And(m.Parameter(0), m.Int32Constant(*i)), 1777 m.Return(m.Word32Equal(m.Word32And(m.Parameter(0), m.Int32Constant(*i)),
1797 m.Int32Constant(0))); 1778 m.Int32Constant(0)));
1798 FOR_UINT32_INPUTS(j) { 1779 FOR_UINT32_INPUTS(j) {
1799 int32_t expected = (*j & *i) == 0; 1780 uint32_t expected = (*j & *i) == 0;
1800 CHECK_EQ(expected, m.Call(*j)); 1781 CHECK_UINT32_EQ(expected, m.Call(*j));
1801 } 1782 }
1802 } 1783 }
1803 } 1784 }
1804 } 1785 }
1805 1786
1806 1787
1807 TEST(RunWord32OrP) { 1788 TEST(RunWord32OrP) {
1808 { 1789 {
1809 RawMachineAssemblerTester<int32_t> m; 1790 RawMachineAssemblerTester<int32_t> m;
1810 Int32BinopTester bt(&m); 1791 Uint32BinopTester bt(&m);
1811 bt.AddReturn(m.Word32Or(bt.param0, bt.param1)); 1792 bt.AddReturn(m.Word32Or(bt.param0, bt.param1));
1812 FOR_UINT32_INPUTS(i) { 1793 FOR_UINT32_INPUTS(i) {
1813 FOR_UINT32_INPUTS(j) { 1794 FOR_UINT32_INPUTS(j) {
1814 uint32_t expected = *i | *j; 1795 uint32_t expected = *i | *j;
1815 CHECK_EQ(expected, bt.call(*i, *j)); 1796 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
1816 } 1797 }
1817 } 1798 }
1818 } 1799 }
1819 { 1800 {
1820 RawMachineAssemblerTester<int32_t> m; 1801 RawMachineAssemblerTester<int32_t> m;
1821 Int32BinopTester bt(&m); 1802 Uint32BinopTester bt(&m);
1822 bt.AddReturn(m.Word32Or(bt.param0, m.Word32Not(bt.param1))); 1803 bt.AddReturn(m.Word32Or(bt.param0, m.Word32Not(bt.param1)));
1823 FOR_UINT32_INPUTS(i) { 1804 FOR_UINT32_INPUTS(i) {
1824 FOR_UINT32_INPUTS(j) { 1805 FOR_UINT32_INPUTS(j) {
1825 uint32_t expected = *i | ~(*j); 1806 uint32_t expected = *i | ~(*j);
1826 CHECK_EQ(expected, bt.call(*i, *j)); 1807 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
1827 } 1808 }
1828 } 1809 }
1829 } 1810 }
1830 { 1811 {
1831 RawMachineAssemblerTester<int32_t> m; 1812 RawMachineAssemblerTester<int32_t> m;
1832 Int32BinopTester bt(&m); 1813 Uint32BinopTester bt(&m);
1833 bt.AddReturn(m.Word32Or(m.Word32Not(bt.param0), bt.param1)); 1814 bt.AddReturn(m.Word32Or(m.Word32Not(bt.param0), bt.param1));
1834 FOR_UINT32_INPUTS(i) { 1815 FOR_UINT32_INPUTS(i) {
1835 FOR_UINT32_INPUTS(j) { 1816 FOR_UINT32_INPUTS(j) {
1836 uint32_t expected = ~(*i) | *j; 1817 uint32_t expected = ~(*i) | *j;
1837 CHECK_EQ(expected, bt.call(*i, *j)); 1818 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
1838 } 1819 }
1839 } 1820 }
1840 } 1821 }
1841 } 1822 }
1842 1823
1843 1824
1844 TEST(RunWord32OrImm) { 1825 TEST(RunWord32OrImm) {
1845 { 1826 {
1846 FOR_UINT32_INPUTS(i) { 1827 FOR_UINT32_INPUTS(i) {
1847 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1828 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1848 m.Return(m.Word32Or(m.Int32Constant(*i), m.Parameter(0))); 1829 m.Return(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)));
1849 FOR_UINT32_INPUTS(j) { 1830 FOR_UINT32_INPUTS(j) {
1850 uint32_t expected = *i | *j; 1831 uint32_t expected = *i | *j;
1851 CHECK_EQ(expected, m.Call(*j)); 1832 CHECK_UINT32_EQ(expected, m.Call(*j));
1852 } 1833 }
1853 } 1834 }
1854 } 1835 }
1855 { 1836 {
1856 FOR_UINT32_INPUTS(i) { 1837 FOR_UINT32_INPUTS(i) {
1857 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1838 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1858 m.Return(m.Word32Or(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); 1839 m.Return(m.Word32Or(m.Int32Constant(*i), m.Word32Not(m.Parameter(0))));
1859 FOR_UINT32_INPUTS(j) { 1840 FOR_UINT32_INPUTS(j) {
1860 uint32_t expected = *i | ~(*j); 1841 uint32_t expected = *i | ~(*j);
1861 CHECK_EQ(expected, m.Call(*j)); 1842 CHECK_UINT32_EQ(expected, m.Call(*j));
1862 } 1843 }
1863 } 1844 }
1864 } 1845 }
1865 } 1846 }
1866 1847
1867 1848
1868 TEST(RunWord32OrInBranch) { 1849 TEST(RunWord32OrInBranch) {
1869 static const int constant = 987654321; 1850 static const int constant = 987654321;
1870 { 1851 {
1871 RawMachineAssemblerTester<int32_t> m; 1852 RawMachineAssemblerTester<int32_t> m;
1872 Int32BinopTester bt(&m); 1853 Int32BinopTester bt(&m);
1873 MLabel blocka, blockb; 1854 MLabel blocka, blockb;
1874 m.Branch( 1855 m.Branch(
1875 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), 1856 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)),
1876 &blocka, &blockb); 1857 &blocka, &blockb);
1877 m.Bind(&blocka); 1858 m.Bind(&blocka);
1878 bt.AddReturn(m.Int32Constant(constant)); 1859 bt.AddReturn(m.Int32Constant(constant));
1879 m.Bind(&blockb); 1860 m.Bind(&blockb);
1880 bt.AddReturn(m.Int32Constant(0 - constant)); 1861 bt.AddReturn(m.Int32Constant(0 - constant));
1881 FOR_UINT32_INPUTS(i) { 1862 FOR_INT32_INPUTS(i) {
1882 FOR_UINT32_INPUTS(j) { 1863 FOR_INT32_INPUTS(j) {
1883 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; 1864 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant;
1884 CHECK_EQ(expected, bt.call(*i, *j)); 1865 CHECK_EQ(expected, bt.call(*i, *j));
1885 } 1866 }
1886 } 1867 }
1887 } 1868 }
1888 { 1869 {
1889 RawMachineAssemblerTester<int32_t> m; 1870 RawMachineAssemblerTester<int32_t> m;
1890 Int32BinopTester bt(&m); 1871 Int32BinopTester bt(&m);
1891 MLabel blocka, blockb; 1872 MLabel blocka, blockb;
1892 m.Branch( 1873 m.Branch(
1893 m.Word32NotEqual(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), 1874 m.Word32NotEqual(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)),
1894 &blocka, &blockb); 1875 &blocka, &blockb);
1895 m.Bind(&blocka); 1876 m.Bind(&blocka);
1896 bt.AddReturn(m.Int32Constant(constant)); 1877 bt.AddReturn(m.Int32Constant(constant));
1897 m.Bind(&blockb); 1878 m.Bind(&blockb);
1898 bt.AddReturn(m.Int32Constant(0 - constant)); 1879 bt.AddReturn(m.Int32Constant(0 - constant));
1899 FOR_UINT32_INPUTS(i) { 1880 FOR_INT32_INPUTS(i) {
1900 FOR_UINT32_INPUTS(j) { 1881 FOR_INT32_INPUTS(j) {
1901 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; 1882 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant;
1902 CHECK_EQ(expected, bt.call(*i, *j)); 1883 CHECK_EQ(expected, bt.call(*i, *j));
1903 } 1884 }
1904 } 1885 }
1905 } 1886 }
1906 { 1887 {
1907 FOR_UINT32_INPUTS(i) { 1888 FOR_INT32_INPUTS(i) {
1908 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1889 RawMachineAssemblerTester<int32_t> m(kMachInt32);
1909 MLabel blocka, blockb; 1890 MLabel blocka, blockb;
1910 m.Branch(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), 1891 m.Branch(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)),
1911 m.Int32Constant(0)), 1892 m.Int32Constant(0)),
1912 &blocka, &blockb); 1893 &blocka, &blockb);
1913 m.Bind(&blocka); 1894 m.Bind(&blocka);
1914 m.Return(m.Int32Constant(constant)); 1895 m.Return(m.Int32Constant(constant));
1915 m.Bind(&blockb); 1896 m.Bind(&blockb);
1916 m.Return(m.Int32Constant(0 - constant)); 1897 m.Return(m.Int32Constant(0 - constant));
1917 FOR_UINT32_INPUTS(j) { 1898 FOR_INT32_INPUTS(j) {
1918 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; 1899 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant;
1919 CHECK_EQ(expected, m.Call(*j)); 1900 CHECK_EQ(expected, m.Call(*j));
1920 } 1901 }
1921 } 1902 }
1922 } 1903 }
1923 { 1904 {
1924 FOR_UINT32_INPUTS(i) { 1905 FOR_INT32_INPUTS(i) {
1925 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1906 RawMachineAssemblerTester<int32_t> m(kMachInt32);
1926 MLabel blocka, blockb; 1907 MLabel blocka, blockb;
1927 m.Branch(m.Word32NotEqual(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), 1908 m.Branch(m.Word32NotEqual(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)),
1928 m.Int32Constant(0)), 1909 m.Int32Constant(0)),
1929 &blocka, &blockb); 1910 &blocka, &blockb);
1930 m.Bind(&blocka); 1911 m.Bind(&blocka);
1931 m.Return(m.Int32Constant(constant)); 1912 m.Return(m.Int32Constant(constant));
1932 m.Bind(&blockb); 1913 m.Bind(&blockb);
1933 m.Return(m.Int32Constant(0 - constant)); 1914 m.Return(m.Int32Constant(0 - constant));
1934 FOR_UINT32_INPUTS(j) { 1915 FOR_INT32_INPUTS(j) {
1935 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; 1916 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant;
1936 CHECK_EQ(expected, m.Call(*j)); 1917 CHECK_EQ(expected, m.Call(*j));
1937 } 1918 }
1938 } 1919 }
1939 } 1920 }
1940 { 1921 {
1941 RawMachineAssemblerTester<void> m; 1922 RawMachineAssemblerTester<void> m;
1942 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), 1923 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(),
1943 m.machine()->Word32Shr()}; 1924 m.machine()->Word32Shr()};
1944 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { 1925 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) {
1945 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 1926 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32,
1946 kMachineWord32); 1927 kMachUint32);
1947 MLabel blocka, blockb; 1928 MLabel blocka, blockb;
1948 m.Branch(m.Word32Equal(m.Word32Or(m.Parameter(0), 1929 m.Branch(m.Word32Equal(m.Word32Or(m.Parameter(0),
1949 m.NewNode(shops[n], m.Parameter(1), 1930 m.NewNode(shops[n], m.Parameter(1),
1950 m.Parameter(2))), 1931 m.Parameter(2))),
1951 m.Int32Constant(0)), 1932 m.Int32Constant(0)),
1952 &blocka, &blockb); 1933 &blocka, &blockb);
1953 m.Bind(&blocka); 1934 m.Bind(&blocka);
1954 m.Return(m.Int32Constant(constant)); 1935 m.Return(m.Int32Constant(constant));
1955 m.Bind(&blockb); 1936 m.Bind(&blockb);
1956 m.Return(m.Int32Constant(0 - constant)); 1937 m.Return(m.Int32Constant(0 - constant));
(...skipping 20 matching lines...) Expand all
1977 } 1958 }
1978 } 1959 }
1979 } 1960 }
1980 } 1961 }
1981 } 1962 }
1982 1963
1983 1964
1984 TEST(RunWord32OrInComparison) { 1965 TEST(RunWord32OrInComparison) {
1985 { 1966 {
1986 RawMachineAssemblerTester<int32_t> m; 1967 RawMachineAssemblerTester<int32_t> m;
1987 Int32BinopTester bt(&m); 1968 Uint32BinopTester bt(&m);
1988 bt.AddReturn( 1969 bt.AddReturn(
1989 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0))); 1970 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)));
1990 FOR_UINT32_INPUTS(i) { 1971 FOR_UINT32_INPUTS(i) {
1991 FOR_UINT32_INPUTS(j) { 1972 FOR_UINT32_INPUTS(j) {
1992 int32_t expected = (*i | *j) == 0; 1973 int32_t expected = (*i | *j) == 0;
1993 CHECK_EQ(expected, bt.call(*i, *j)); 1974 CHECK_EQ(expected, bt.call(*i, *j));
1994 } 1975 }
1995 } 1976 }
1996 } 1977 }
1997 { 1978 {
1998 RawMachineAssemblerTester<int32_t> m; 1979 RawMachineAssemblerTester<int32_t> m;
1999 Int32BinopTester bt(&m); 1980 Uint32BinopTester bt(&m);
2000 bt.AddReturn( 1981 bt.AddReturn(
2001 m.Word32Equal(m.Int32Constant(0), m.Word32Or(bt.param0, bt.param1))); 1982 m.Word32Equal(m.Int32Constant(0), m.Word32Or(bt.param0, bt.param1)));
2002 FOR_UINT32_INPUTS(i) { 1983 FOR_UINT32_INPUTS(i) {
2003 FOR_UINT32_INPUTS(j) { 1984 FOR_UINT32_INPUTS(j) {
2004 int32_t expected = (*i | *j) == 0; 1985 int32_t expected = (*i | *j) == 0;
2005 CHECK_EQ(expected, bt.call(*i, *j)); 1986 CHECK_EQ(expected, bt.call(*i, *j));
2006 } 1987 }
2007 } 1988 }
2008 } 1989 }
2009 { 1990 {
2010 FOR_UINT32_INPUTS(i) { 1991 FOR_UINT32_INPUTS(i) {
2011 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 1992 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
2012 m.Return(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), 1993 m.Return(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)),
2013 m.Int32Constant(0))); 1994 m.Int32Constant(0)));
2014 FOR_UINT32_INPUTS(j) { 1995 FOR_UINT32_INPUTS(j) {
2015 int32_t expected = (*i | *j) == 0; 1996 uint32_t expected = (*i | *j) == 0;
2016 CHECK_EQ(expected, m.Call(*j)); 1997 CHECK_UINT32_EQ(expected, m.Call(*j));
2017 } 1998 }
2018 } 1999 }
2019 } 2000 }
2020 { 2001 {
2021 FOR_UINT32_INPUTS(i) { 2002 FOR_UINT32_INPUTS(i) {
2022 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 2003 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
2023 m.Return(m.Word32Equal(m.Word32Or(m.Parameter(0), m.Int32Constant(*i)), 2004 m.Return(m.Word32Equal(m.Word32Or(m.Parameter(0), m.Int32Constant(*i)),
2024 m.Int32Constant(0))); 2005 m.Int32Constant(0)));
2025 FOR_UINT32_INPUTS(j) { 2006 FOR_UINT32_INPUTS(j) {
2026 int32_t expected = (*j | *i) == 0; 2007 uint32_t expected = (*j | *i) == 0;
2027 CHECK_EQ(expected, m.Call(*j)); 2008 CHECK_UINT32_EQ(expected, m.Call(*j));
2028 } 2009 }
2029 } 2010 }
2030 } 2011 }
2031 } 2012 }
2032 2013
2033 2014
2034 TEST(RunWord32XorP) { 2015 TEST(RunWord32XorP) {
2035 { 2016 {
2036 FOR_UINT32_INPUTS(i) { 2017 FOR_UINT32_INPUTS(i) {
2037 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 2018 RawMachineAssemblerTester<int32_t> m(kMachUint32);
2038 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0))); 2019 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)));
2039 FOR_UINT32_INPUTS(j) { 2020 FOR_UINT32_INPUTS(j) {
2040 uint32_t expected = *i ^ *j; 2021 uint32_t expected = *i ^ *j;
2041 CHECK_EQ(expected, m.Call(*j)); 2022 CHECK_UINT32_EQ(expected, m.Call(*j));
2042 } 2023 }
2043 } 2024 }
2044 } 2025 }
2045 { 2026 {
2046 RawMachineAssemblerTester<int32_t> m; 2027 RawMachineAssemblerTester<int32_t> m;
2047 Int32BinopTester bt(&m); 2028 Uint32BinopTester bt(&m);
2048 bt.AddReturn(m.Word32Xor(bt.param0, bt.param1)); 2029 bt.AddReturn(m.Word32Xor(bt.param0, bt.param1));
2049 FOR_UINT32_INPUTS(i) { 2030 FOR_UINT32_INPUTS(i) {
2050 FOR_UINT32_INPUTS(j) { 2031 FOR_UINT32_INPUTS(j) {
2051 uint32_t expected = *i ^ *j; 2032 int32_t expected = *i ^ *j;
2052 CHECK_EQ(expected, bt.call(*i, *j)); 2033 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
2053 } 2034 }
2054 } 2035 }
2055 } 2036 }
2056 { 2037 {
2057 RawMachineAssemblerTester<int32_t> m; 2038 RawMachineAssemblerTester<int32_t> m;
2058 Int32BinopTester bt(&m); 2039 Int32BinopTester bt(&m);
2059 bt.AddReturn(m.Word32Xor(bt.param0, m.Word32Not(bt.param1))); 2040 bt.AddReturn(m.Word32Xor(bt.param0, m.Word32Not(bt.param1)));
2060 FOR_UINT32_INPUTS(i) { 2041 FOR_INT32_INPUTS(i) {
2061 FOR_UINT32_INPUTS(j) { 2042 FOR_INT32_INPUTS(j) {
2062 uint32_t expected = *i ^ ~(*j); 2043 int32_t expected = *i ^ ~(*j);
2063 CHECK_EQ(expected, bt.call(*i, *j)); 2044 CHECK_EQ(expected, bt.call(*i, *j));
2064 } 2045 }
2065 } 2046 }
2066 } 2047 }
2067 { 2048 {
2068 RawMachineAssemblerTester<int32_t> m; 2049 RawMachineAssemblerTester<int32_t> m;
2069 Int32BinopTester bt(&m); 2050 Int32BinopTester bt(&m);
2070 bt.AddReturn(m.Word32Xor(m.Word32Not(bt.param0), bt.param1)); 2051 bt.AddReturn(m.Word32Xor(m.Word32Not(bt.param0), bt.param1));
2071 FOR_UINT32_INPUTS(i) { 2052 FOR_INT32_INPUTS(i) {
2072 FOR_UINT32_INPUTS(j) { 2053 FOR_INT32_INPUTS(j) {
2073 uint32_t expected = ~(*i) ^ *j; 2054 int32_t expected = ~(*i) ^ *j;
2074 CHECK_EQ(expected, bt.call(*i, *j)); 2055 CHECK_EQ(expected, bt.call(*i, *j));
2075 } 2056 }
2076 } 2057 }
2077 } 2058 }
2078 { 2059 {
2079 FOR_UINT32_INPUTS(i) { 2060 FOR_UINT32_INPUTS(i) {
2080 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 2061 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
2081 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); 2062 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Word32Not(m.Parameter(0))));
2082 FOR_UINT32_INPUTS(j) { 2063 FOR_UINT32_INPUTS(j) {
2083 uint32_t expected = *i ^ ~(*j); 2064 uint32_t expected = *i ^ ~(*j);
2084 CHECK_EQ(expected, m.Call(*j)); 2065 CHECK_UINT32_EQ(expected, m.Call(*j));
2085 } 2066 }
2086 } 2067 }
2087 } 2068 }
2088 } 2069 }
2089 2070
2090 2071
2091 TEST(RunWord32XorInBranch) { 2072 TEST(RunWord32XorInBranch) {
2092 static const int constant = 987654321; 2073 static const uint32_t constant = 987654321;
2093 { 2074 {
2094 RawMachineAssemblerTester<int32_t> m; 2075 RawMachineAssemblerTester<int32_t> m;
2095 Int32BinopTester bt(&m); 2076 Uint32BinopTester bt(&m);
2096 MLabel blocka, blockb; 2077 MLabel blocka, blockb;
2097 m.Branch( 2078 m.Branch(
2098 m.Word32Equal(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), 2079 m.Word32Equal(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)),
2099 &blocka, &blockb); 2080 &blocka, &blockb);
2100 m.Bind(&blocka); 2081 m.Bind(&blocka);
2101 bt.AddReturn(m.Int32Constant(constant)); 2082 bt.AddReturn(m.Int32Constant(constant));
2102 m.Bind(&blockb); 2083 m.Bind(&blockb);
2103 bt.AddReturn(m.Int32Constant(0 - constant)); 2084 bt.AddReturn(m.Int32Constant(0 - constant));
2104 FOR_UINT32_INPUTS(i) { 2085 FOR_UINT32_INPUTS(i) {
2105 FOR_UINT32_INPUTS(j) { 2086 FOR_UINT32_INPUTS(j) {
2106 int32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; 2087 uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant;
2107 CHECK_EQ(expected, bt.call(*i, *j)); 2088 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
2108 } 2089 }
2109 } 2090 }
2110 } 2091 }
2111 { 2092 {
2112 RawMachineAssemblerTester<int32_t> m; 2093 RawMachineAssemblerTester<int32_t> m;
2113 Int32BinopTester bt(&m); 2094 Uint32BinopTester bt(&m);
2114 MLabel blocka, blockb; 2095 MLabel blocka, blockb;
2115 m.Branch( 2096 m.Branch(
2116 m.Word32NotEqual(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), 2097 m.Word32NotEqual(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)),
2117 &blocka, &blockb); 2098 &blocka, &blockb);
2118 m.Bind(&blocka); 2099 m.Bind(&blocka);
2119 bt.AddReturn(m.Int32Constant(constant)); 2100 bt.AddReturn(m.Int32Constant(constant));
2120 m.Bind(&blockb); 2101 m.Bind(&blockb);
2121 bt.AddReturn(m.Int32Constant(0 - constant)); 2102 bt.AddReturn(m.Int32Constant(0 - constant));
2122 FOR_UINT32_INPUTS(i) { 2103 FOR_UINT32_INPUTS(i) {
2123 FOR_UINT32_INPUTS(j) { 2104 FOR_UINT32_INPUTS(j) {
2124 int32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; 2105 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant;
2125 CHECK_EQ(expected, bt.call(*i, *j)); 2106 CHECK_UINT32_EQ(expected, bt.call(*i, *j));
2126 } 2107 }
2127 } 2108 }
2128 } 2109 }
2129 { 2110 {
2130 FOR_UINT32_INPUTS(i) { 2111 FOR_UINT32_INPUTS(i) {
2131 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 2112 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
2132 MLabel blocka, blockb; 2113 MLabel blocka, blockb;
2133 m.Branch(m.Word32Equal(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), 2114 m.Branch(m.Word32Equal(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)),
2134 m.Int32Constant(0)), 2115 m.Int32Constant(0)),
2135 &blocka, &blockb); 2116 &blocka, &blockb);
2136 m.Bind(&blocka); 2117 m.Bind(&blocka);
2137 m.Return(m.Int32Constant(constant)); 2118 m.Return(m.Int32Constant(constant));
2138 m.Bind(&blockb); 2119 m.Bind(&blockb);
2139 m.Return(m.Int32Constant(0 - constant)); 2120 m.Return(m.Int32Constant(0 - constant));
2140 FOR_UINT32_INPUTS(j) { 2121 FOR_UINT32_INPUTS(j) {
2141 int32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; 2122 uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant;
2142 CHECK_EQ(expected, m.Call(*j)); 2123 CHECK_UINT32_EQ(expected, m.Call(*j));
2143 } 2124 }
2144 } 2125 }
2145 } 2126 }
2146 { 2127 {
2147 FOR_UINT32_INPUTS(i) { 2128 FOR_UINT32_INPUTS(i) {
2148 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 2129 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
2149 MLabel blocka, blockb; 2130 MLabel blocka, blockb;
2150 m.Branch( 2131 m.Branch(
2151 m.Word32NotEqual(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), 2132 m.Word32NotEqual(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)),
2152 m.Int32Constant(0)), 2133 m.Int32Constant(0)),
2153 &blocka, &blockb); 2134 &blocka, &blockb);
2154 m.Bind(&blocka); 2135 m.Bind(&blocka);
2155 m.Return(m.Int32Constant(constant)); 2136 m.Return(m.Int32Constant(constant));
2156 m.Bind(&blockb); 2137 m.Bind(&blockb);
2157 m.Return(m.Int32Constant(0 - constant)); 2138 m.Return(m.Int32Constant(0 - constant));
2158 FOR_UINT32_INPUTS(j) { 2139 FOR_UINT32_INPUTS(j) {
2159 int32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; 2140 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant;
2160 CHECK_EQ(expected, m.Call(*j)); 2141 CHECK_UINT32_EQ(expected, m.Call(*j));
2161 } 2142 }
2162 } 2143 }
2163 } 2144 }
2164 { 2145 {
2165 RawMachineAssemblerTester<void> m; 2146 RawMachineAssemblerTester<void> m;
2166 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), 2147 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(),
2167 m.machine()->Word32Shr()}; 2148 m.machine()->Word32Shr()};
2168 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { 2149 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) {
2169 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 2150 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32,
2170 kMachineWord32); 2151 kMachUint32);
2171 MLabel blocka, blockb; 2152 MLabel blocka, blockb;
2172 m.Branch(m.Word32Equal(m.Word32Xor(m.Parameter(0), 2153 m.Branch(m.Word32Equal(m.Word32Xor(m.Parameter(0),
2173 m.NewNode(shops[n], m.Parameter(1), 2154 m.NewNode(shops[n], m.Parameter(1),
2174 m.Parameter(2))), 2155 m.Parameter(2))),
2175 m.Int32Constant(0)), 2156 m.Int32Constant(0)),
2176 &blocka, &blockb); 2157 &blocka, &blockb);
2177 m.Bind(&blocka); 2158 m.Bind(&blocka);
2178 m.Return(m.Int32Constant(constant)); 2159 m.Return(m.Int32Constant(constant));
2179 m.Bind(&blockb); 2160 m.Bind(&blockb);
2180 m.Return(m.Int32Constant(0 - constant)); 2161 m.Return(m.Int32Constant(0 - constant));
(...skipping 20 matching lines...) Expand all
2201 } 2182 }
2202 } 2183 }
2203 } 2184 }
2204 } 2185 }
2205 } 2186 }
2206 2187
2207 2188
2208 TEST(RunWord32ShlP) { 2189 TEST(RunWord32ShlP) {
2209 { 2190 {
2210 FOR_UINT32_SHIFTS(shift) { 2191 FOR_UINT32_SHIFTS(shift) {
2211 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 2192 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
2212 m.Return(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift))); 2193 m.Return(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift)));
2213 FOR_UINT32_INPUTS(j) { 2194 FOR_UINT32_INPUTS(j) {
2214 uint32_t expected = *j << shift; 2195 uint32_t expected = *j << shift;
2215 CHECK_EQ(expected, m.Call(*j)); 2196 CHECK_UINT32_EQ(expected, m.Call(*j));
2216 } 2197 }
2217 } 2198 }
2218 } 2199 }
2219 { 2200 {
2220 RawMachineAssemblerTester<int32_t> m; 2201 RawMachineAssemblerTester<int32_t> m;
2221 Int32BinopTester bt(&m); 2202 Uint32BinopTester bt(&m);
2222 bt.AddReturn(m.Word32Shl(bt.param0, bt.param1)); 2203 bt.AddReturn(m.Word32Shl(bt.param0, bt.param1));
2223 FOR_UINT32_INPUTS(i) { 2204 FOR_UINT32_INPUTS(i) {
2224 FOR_UINT32_SHIFTS(shift) { 2205 FOR_UINT32_SHIFTS(shift) {
2225 uint32_t expected = *i << shift; 2206 uint32_t expected = *i << shift;
2226 CHECK_EQ(expected, bt.call(*i, shift)); 2207 CHECK_UINT32_EQ(expected, bt.call(*i, shift));
2227 } 2208 }
2228 } 2209 }
2229 } 2210 }
2230 } 2211 }
2231 2212
2232 2213
2233 TEST(RunWord32ShrP) { 2214 TEST(RunWord32ShrP) {
2234 { 2215 {
2235 FOR_UINT32_SHIFTS(shift) { 2216 FOR_UINT32_SHIFTS(shift) {
2236 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 2217 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
2237 m.Return(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift))); 2218 m.Return(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift)));
2238 FOR_UINT32_INPUTS(j) { 2219 FOR_UINT32_INPUTS(j) {
2239 uint32_t expected = *j >> shift; 2220 uint32_t expected = *j >> shift;
2240 CHECK_EQ(expected, m.Call(*j)); 2221 CHECK_UINT32_EQ(expected, m.Call(*j));
2241 } 2222 }
2242 } 2223 }
2243 } 2224 }
2244 { 2225 {
2245 RawMachineAssemblerTester<int32_t> m; 2226 RawMachineAssemblerTester<int32_t> m;
2246 Int32BinopTester bt(&m); 2227 Uint32BinopTester bt(&m);
2247 bt.AddReturn(m.Word32Shr(bt.param0, bt.param1)); 2228 bt.AddReturn(m.Word32Shr(bt.param0, bt.param1));
2248 FOR_UINT32_INPUTS(i) { 2229 FOR_UINT32_INPUTS(i) {
2249 FOR_UINT32_SHIFTS(shift) { 2230 FOR_UINT32_SHIFTS(shift) {
2250 uint32_t expected = *i >> shift; 2231 uint32_t expected = *i >> shift;
2251 CHECK_EQ(expected, bt.call(*i, shift)); 2232 CHECK_UINT32_EQ(expected, bt.call(*i, shift));
2252 } 2233 }
2253 } 2234 }
2254 CHECK_EQ(0x00010000, bt.call(0x80000000, 15)); 2235 CHECK_EQ(0x00010000, bt.call(0x80000000, 15));
2255 } 2236 }
2256 } 2237 }
2257 2238
2258 2239
2259 TEST(RunWord32SarP) { 2240 TEST(RunWord32SarP) {
2260 { 2241 {
2261 FOR_INT32_SHIFTS(shift) { 2242 FOR_INT32_SHIFTS(shift) {
2262 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 2243 RawMachineAssemblerTester<int32_t> m(kMachInt32);
2263 m.Return(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift))); 2244 m.Return(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift)));
2264 FOR_INT32_INPUTS(j) { 2245 FOR_INT32_INPUTS(j) {
2265 int32_t expected = *j >> shift; 2246 int32_t expected = *j >> shift;
2266 CHECK_EQ(expected, m.Call(*j)); 2247 CHECK_EQ(expected, m.Call(*j));
2267 } 2248 }
2268 } 2249 }
2269 } 2250 }
2270 { 2251 {
2271 RawMachineAssemblerTester<int32_t> m; 2252 RawMachineAssemblerTester<int32_t> m;
2272 Int32BinopTester bt(&m); 2253 Int32BinopTester bt(&m);
2273 bt.AddReturn(m.Word32Sar(bt.param0, bt.param1)); 2254 bt.AddReturn(m.Word32Sar(bt.param0, bt.param1));
2274 FOR_INT32_INPUTS(i) { 2255 FOR_INT32_INPUTS(i) {
2275 FOR_INT32_SHIFTS(shift) { 2256 FOR_INT32_SHIFTS(shift) {
2276 int32_t expected = *i >> shift; 2257 int32_t expected = *i >> shift;
2277 CHECK_EQ(expected, bt.call(*i, shift)); 2258 CHECK_EQ(expected, bt.call(*i, shift));
2278 } 2259 }
2279 } 2260 }
2280 CHECK_EQ(0xFFFF0000, bt.call(0x80000000, 15)); 2261 CHECK_EQ(0xFFFF0000, bt.call(0x80000000, 15));
2281 } 2262 }
2282 } 2263 }
2283 2264
2284 2265
2285 TEST(RunWord32NotP) { 2266 TEST(RunWord32NotP) {
2286 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 2267 RawMachineAssemblerTester<int32_t> m(kMachInt32);
2287 m.Return(m.Word32Not(m.Parameter(0))); 2268 m.Return(m.Word32Not(m.Parameter(0)));
2288 FOR_UINT32_INPUTS(i) { 2269 FOR_INT32_INPUTS(i) {
2289 int expected = ~(*i); 2270 int expected = ~(*i);
2290 CHECK_EQ(expected, m.Call(*i)); 2271 CHECK_EQ(expected, m.Call(*i));
2291 } 2272 }
2292 } 2273 }
2293 2274
2294 2275
2295 TEST(RunInt32NegP) { 2276 TEST(RunInt32NegP) {
2296 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 2277 RawMachineAssemblerTester<int32_t> m(kMachInt32);
2297 m.Return(m.Int32Neg(m.Parameter(0))); 2278 m.Return(m.Int32Neg(m.Parameter(0)));
2298 FOR_INT32_INPUTS(i) { 2279 FOR_INT32_INPUTS(i) {
2299 int expected = -*i; 2280 int expected = -*i;
2300 CHECK_EQ(expected, m.Call(*i)); 2281 CHECK_EQ(expected, m.Call(*i));
2301 } 2282 }
2302 } 2283 }
2303 2284
2304 2285
2305 TEST(RunWord32EqualAndWord32SarP) { 2286 TEST(RunWord32EqualAndWord32SarP) {
2306 { 2287 {
2307 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 2288 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachUint32);
2308 kMachineWord32);
2309 m.Return(m.Word32Equal(m.Parameter(0), 2289 m.Return(m.Word32Equal(m.Parameter(0),
2310 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); 2290 m.Word32Sar(m.Parameter(1), m.Parameter(2))));
2311 FOR_INT32_INPUTS(i) { 2291 FOR_INT32_INPUTS(i) {
2312 FOR_INT32_INPUTS(j) { 2292 FOR_INT32_INPUTS(j) {
2313 FOR_UINT32_SHIFTS(shift) { 2293 FOR_UINT32_SHIFTS(shift) {
2314 int32_t expected = (*i == (*j >> shift)); 2294 int32_t expected = (*i == (*j >> shift));
2315 CHECK_EQ(expected, m.Call(*i, *j, shift)); 2295 CHECK_EQ(expected, m.Call(*i, *j, shift));
2316 } 2296 }
2317 } 2297 }
2318 } 2298 }
2319 } 2299 }
2320 { 2300 {
2321 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 2301 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachUint32, kMachInt32);
2322 kMachineWord32);
2323 m.Return(m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Parameter(1)), 2302 m.Return(m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Parameter(1)),
2324 m.Parameter(2))); 2303 m.Parameter(2)));
2325 FOR_INT32_INPUTS(i) { 2304 FOR_INT32_INPUTS(i) {
2326 FOR_UINT32_SHIFTS(shift) { 2305 FOR_UINT32_SHIFTS(shift) {
2327 FOR_INT32_INPUTS(k) { 2306 FOR_INT32_INPUTS(k) {
2328 int32_t expected = ((*i >> shift) == *k); 2307 int32_t expected = ((*i >> shift) == *k);
2329 CHECK_EQ(expected, m.Call(*i, shift, *k)); 2308 CHECK_EQ(expected, m.Call(*i, shift, *k));
2330 } 2309 }
2331 } 2310 }
2332 } 2311 }
2333 } 2312 }
2334 } 2313 }
2335 2314
2336 2315
2337 TEST(RunWord32EqualAndWord32ShlP) { 2316 TEST(RunWord32EqualAndWord32ShlP) {
2338 { 2317 {
2339 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 2318 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32);
2340 kMachineWord32);
2341 m.Return(m.Word32Equal(m.Parameter(0), 2319 m.Return(m.Word32Equal(m.Parameter(0),
2342 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); 2320 m.Word32Shl(m.Parameter(1), m.Parameter(2))));
2343 FOR_UINT32_INPUTS(i) { 2321 FOR_UINT32_INPUTS(i) {
2344 FOR_UINT32_INPUTS(j) { 2322 FOR_UINT32_INPUTS(j) {
2345 FOR_UINT32_SHIFTS(shift) { 2323 FOR_UINT32_SHIFTS(shift) {
2346 int32_t expected = (*i == (*j << shift)); 2324 int32_t expected = (*i == (*j << shift));
2347 CHECK_EQ(expected, m.Call(*i, *j, shift)); 2325 CHECK_EQ(expected, m.Call(*i, *j, shift));
2348 } 2326 }
2349 } 2327 }
2350 } 2328 }
2351 } 2329 }
2352 { 2330 {
2353 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 2331 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32);
2354 kMachineWord32);
2355 m.Return(m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Parameter(1)), 2332 m.Return(m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Parameter(1)),
2356 m.Parameter(2))); 2333 m.Parameter(2)));
2357 FOR_UINT32_INPUTS(i) { 2334 FOR_UINT32_INPUTS(i) {
2358 FOR_UINT32_SHIFTS(shift) { 2335 FOR_UINT32_SHIFTS(shift) {
2359 FOR_UINT32_INPUTS(k) { 2336 FOR_UINT32_INPUTS(k) {
2360 int32_t expected = ((*i << shift) == *k); 2337 int32_t expected = ((*i << shift) == *k);
2361 CHECK_EQ(expected, m.Call(*i, shift, *k)); 2338 CHECK_EQ(expected, m.Call(*i, shift, *k));
2362 } 2339 }
2363 } 2340 }
2364 } 2341 }
2365 } 2342 }
2366 } 2343 }
2367 2344
2368 2345
2369 TEST(RunWord32EqualAndWord32ShrP) { 2346 TEST(RunWord32EqualAndWord32ShrP) {
2370 { 2347 {
2371 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 2348 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32);
2372 kMachineWord32);
2373 m.Return(m.Word32Equal(m.Parameter(0), 2349 m.Return(m.Word32Equal(m.Parameter(0),
2374 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); 2350 m.Word32Shr(m.Parameter(1), m.Parameter(2))));
2375 FOR_UINT32_INPUTS(i) { 2351 FOR_UINT32_INPUTS(i) {
2376 FOR_UINT32_INPUTS(j) { 2352 FOR_UINT32_INPUTS(j) {
2377 FOR_UINT32_SHIFTS(shift) { 2353 FOR_UINT32_SHIFTS(shift) {
2378 int32_t expected = (*i == (*j >> shift)); 2354 int32_t expected = (*i == (*j >> shift));
2379 CHECK_EQ(expected, m.Call(*i, *j, shift)); 2355 CHECK_EQ(expected, m.Call(*i, *j, shift));
2380 } 2356 }
2381 } 2357 }
2382 } 2358 }
2383 } 2359 }
2384 { 2360 {
2385 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, 2361 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32);
2386 kMachineWord32);
2387 m.Return(m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Parameter(1)), 2362 m.Return(m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Parameter(1)),
2388 m.Parameter(2))); 2363 m.Parameter(2)));
2389 FOR_UINT32_INPUTS(i) { 2364 FOR_UINT32_INPUTS(i) {
2390 FOR_UINT32_SHIFTS(shift) { 2365 FOR_UINT32_SHIFTS(shift) {
2391 FOR_UINT32_INPUTS(k) { 2366 FOR_UINT32_INPUTS(k) {
2392 int32_t expected = ((*i >> shift) == *k); 2367 int32_t expected = ((*i >> shift) == *k);
2393 CHECK_EQ(expected, m.Call(*i, shift, *k)); 2368 CHECK_EQ(expected, m.Call(*i, shift, *k));
2394 } 2369 }
2395 } 2370 }
2396 } 2371 }
2397 } 2372 }
2398 } 2373 }
2399 2374
2400 2375
2401 TEST(RunDeadNodes) { 2376 TEST(RunDeadNodes) {
2402 for (int i = 0; true; i++) { 2377 for (int i = 0; true; i++) {
2403 RawMachineAssemblerTester<int32_t> m(i == 5 ? kMachineWord32 2378 RawMachineAssemblerTester<int32_t> m(i == 5 ? kMachInt32 : kMachNone);
2404 : kMachineLast);
2405 int constant = 0x55 + i; 2379 int constant = 0x55 + i;
2406 switch (i) { 2380 switch (i) {
2407 case 0: 2381 case 0:
2408 m.Int32Constant(44); 2382 m.Int32Constant(44);
2409 break; 2383 break;
2410 case 1: 2384 case 1:
2411 m.StringConstant("unused"); 2385 m.StringConstant("unused");
2412 break; 2386 break;
2413 case 2: 2387 case 2:
2414 m.NumberConstant(11.1); 2388 m.NumberConstant(11.1);
2415 break; 2389 break;
2416 case 3: 2390 case 3:
2417 m.PointerConstant(&constant); 2391 m.PointerConstant(&constant);
2418 break; 2392 break;
2419 case 4: 2393 case 4:
2420 m.LoadFromPointer(&constant, kMachineWord32); 2394 m.LoadFromPointer(&constant, kMachInt32);
2421 break; 2395 break;
2422 case 5: 2396 case 5:
2423 m.Parameter(0); 2397 m.Parameter(0);
2424 break; 2398 break;
2425 default: 2399 default:
2426 return; 2400 return;
2427 } 2401 }
2428 m.Return(m.Int32Constant(constant)); 2402 m.Return(m.Int32Constant(constant));
2429 if (i != 5) { 2403 if (i != 5) {
2430 CHECK_EQ(constant, m.Call()); 2404 CHECK_EQ(constant, m.Call());
(...skipping 13 matching lines...) Expand all
2444 m.machine()->Word32Shr(), m.machine()->Word32Sar(), 2418 m.machine()->Word32Shr(), m.machine()->Word32Sar(),
2445 m.machine()->Word32Equal(), m.machine()->Int32Add(), 2419 m.machine()->Word32Equal(), m.machine()->Int32Add(),
2446 m.machine()->Int32Sub(), m.machine()->Int32Mul(), 2420 m.machine()->Int32Sub(), m.machine()->Int32Mul(),
2447 m.machine()->Int32Div(), m.machine()->Int32UDiv(), 2421 m.machine()->Int32Div(), m.machine()->Int32UDiv(),
2448 m.machine()->Int32Mod(), m.machine()->Int32UMod(), 2422 m.machine()->Int32Mod(), m.machine()->Int32UMod(),
2449 m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(), 2423 m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(),
2450 m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual(), 2424 m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual(),
2451 NULL}; 2425 NULL};
2452 2426
2453 for (int i = 0; ops[i] != NULL; i++) { 2427 for (int i = 0; ops[i] != NULL; i++) {
2454 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); 2428 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32);
2455 int constant = 0x55555 + i; 2429 int constant = 0x55555 + i;
2456 m.NewNode(ops[i], m.Parameter(0), m.Parameter(1)); 2430 m.NewNode(ops[i], m.Parameter(0), m.Parameter(1));
2457 m.Return(m.Int32Constant(constant)); 2431 m.Return(m.Int32Constant(constant));
2458 2432
2459 CHECK_EQ(constant, m.Call(1, 1)); 2433 CHECK_EQ(constant, m.Call(1, 1));
2460 } 2434 }
2461 } 2435 }
2462 2436
2463 2437
2464 template <typename Type, typename CType> 2438 template <typename Type, typename CType>
(...skipping 18 matching lines...) Expand all
2483 Type expected = buffer[i]; 2457 Type expected = buffer[i];
2484 Type actual = static_cast<CType>(m.Call()); 2458 Type actual = static_cast<CType>(m.Call());
2485 CHECK_EQ(expected, actual); 2459 CHECK_EQ(expected, actual);
2486 printf("XXX\n"); 2460 printf("XXX\n");
2487 } 2461 }
2488 } 2462 }
2489 } 2463 }
2490 2464
2491 2465
2492 TEST(RunLoadImmIndex) { 2466 TEST(RunLoadImmIndex) {
2493 RunLoadImmIndex<int8_t, uint8_t>(kMachineWord8); 2467 RunLoadImmIndex<int8_t, uint8_t>(kMachInt8);
2494 RunLoadImmIndex<int16_t, uint16_t>(kMachineWord16); 2468 RunLoadImmIndex<int16_t, uint16_t>(kMachInt16);
2495 RunLoadImmIndex<int32_t, uint32_t>(kMachineWord32); 2469 RunLoadImmIndex<int32_t, uint32_t>(kMachInt32);
2496 RunLoadImmIndex<int32_t*, int32_t*>(kMachineTagged); 2470 RunLoadImmIndex<int32_t*, int32_t*>(kMachAnyTagged);
2497 2471
2498 // TODO(titzer): test kMachineFloat64 loads 2472 // TODO(titzer): test kRepBit loads
2473 // TODO(titzer): test kMachFloat64 loads
2499 // TODO(titzer): test various indexing modes. 2474 // TODO(titzer): test various indexing modes.
2500 } 2475 }
2501 2476
2502 2477
2503 template <typename CType> 2478 template <typename CType>
2504 static void RunLoadStore(MachineType rep) { 2479 static void RunLoadStore(MachineType rep) {
2505 const int kNumElems = 4; 2480 const int kNumElems = 4;
2506 CType buffer[kNumElems]; 2481 CType buffer[kNumElems];
2507 2482
2508 for (int32_t x = 0; x < kNumElems; x++) { 2483 for (int32_t x = 0; x < kNumElems; x++) {
(...skipping 14 matching lines...) Expand all
2523 m.Return(m.Int32Constant(OK)); 2498 m.Return(m.Int32Constant(OK));
2524 2499
2525 CHECK_NE(buffer[x], buffer[y]); 2500 CHECK_NE(buffer[x], buffer[y]);
2526 CHECK_EQ(OK, m.Call()); 2501 CHECK_EQ(OK, m.Call());
2527 CHECK_EQ(buffer[x], buffer[y]); 2502 CHECK_EQ(buffer[x], buffer[y]);
2528 } 2503 }
2529 } 2504 }
2530 2505
2531 2506
2532 TEST(RunLoadStore) { 2507 TEST(RunLoadStore) {
2533 RunLoadStore<int8_t>(kMachineWord8); 2508 RunLoadStore<int8_t>(kMachInt8);
2534 RunLoadStore<int16_t>(kMachineWord16); 2509 RunLoadStore<int16_t>(kMachInt16);
2535 RunLoadStore<int32_t>(kMachineWord32); 2510 RunLoadStore<int32_t>(kMachInt32);
2536 RunLoadStore<void*>(kMachineTagged); 2511 RunLoadStore<void*>(kMachAnyTagged);
2537 RunLoadStore<double>(kMachineFloat64); 2512 RunLoadStore<double>(kMachFloat64);
2538 } 2513 }
2539 2514
2540 2515
2541 TEST(RunFloat64Binop) { 2516 TEST(RunFloat64Binop) {
2542 RawMachineAssemblerTester<int32_t> m; 2517 RawMachineAssemblerTester<int32_t> m;
2543 double result; 2518 double result;
2544 2519
2545 Operator* ops[] = {m.machine()->Float64Add(), m.machine()->Float64Sub(), 2520 Operator* ops[] = {m.machine()->Float64Add(), m.machine()->Float64Sub(),
2546 m.machine()->Float64Mul(), m.machine()->Float64Div(), 2521 m.machine()->Float64Mul(), m.machine()->Float64Div(),
2547 m.machine()->Float64Mod(), NULL}; 2522 m.machine()->Float64Mod(), NULL};
(...skipping 11 matching lines...) Expand all
2559 NULL}; 2534 NULL};
2560 2535
2561 for (int i = 0; ops[i] != NULL; i++) { 2536 for (int i = 0; ops[i] != NULL; i++) {
2562 for (int j = 0; inputs[j] != NULL; j += 2) { 2537 for (int j = 0; inputs[j] != NULL; j += 2) {
2563 RawMachineAssemblerTester<int32_t> m; 2538 RawMachineAssemblerTester<int32_t> m;
2564 Node* a = m.NewNode(inputs[j]); 2539 Node* a = m.NewNode(inputs[j]);
2565 Node* b = m.NewNode(inputs[j + 1]); 2540 Node* b = m.NewNode(inputs[j + 1]);
2566 Node* binop = m.NewNode(ops[i], a, b); 2541 Node* binop = m.NewNode(ops[i], a, b);
2567 Node* base = m.PointerConstant(&result); 2542 Node* base = m.PointerConstant(&result);
2568 Node* zero = m.Int32Constant(0); 2543 Node* zero = m.Int32Constant(0);
2569 m.Store(kMachineFloat64, base, zero, binop); 2544 m.Store(kMachFloat64, base, zero, binop);
2570 m.Return(m.Int32Constant(i + j)); 2545 m.Return(m.Int32Constant(i + j));
2571 CHECK_EQ(i + j, m.Call()); 2546 CHECK_EQ(i + j, m.Call());
2572 } 2547 }
2573 } 2548 }
2574 } 2549 }
2575 2550
2576 2551
2577 TEST(RunDeadFloat64Binops) { 2552 TEST(RunDeadFloat64Binops) {
2578 RawMachineAssemblerTester<int32_t> m; 2553 RawMachineAssemblerTester<int32_t> m;
2579 2554
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2620 } 2595 }
2621 } 2596 }
2622 2597
2623 2598
2624 TEST(RunFloat64SubImm1) { 2599 TEST(RunFloat64SubImm1) {
2625 double input = 0.0; 2600 double input = 0.0;
2626 double output = 0.0; 2601 double output = 0.0;
2627 2602
2628 FOR_FLOAT64_INPUTS(i) { 2603 FOR_FLOAT64_INPUTS(i) {
2629 RawMachineAssemblerTester<int32_t> m; 2604 RawMachineAssemblerTester<int32_t> m;
2630 Node* t0 = m.LoadFromPointer(&input, kMachineFloat64); 2605 Node* t0 = m.LoadFromPointer(&input, kMachFloat64);
2631 Node* t1 = m.Float64Sub(m.Float64Constant(*i), t0); 2606 Node* t1 = m.Float64Sub(m.Float64Constant(*i), t0);
2632 m.StoreToPointer(&output, kMachineFloat64, t1); 2607 m.StoreToPointer(&output, kMachFloat64, t1);
2633 m.Return(m.Int32Constant(0)); 2608 m.Return(m.Int32Constant(0));
2634 FOR_FLOAT64_INPUTS(j) { 2609 FOR_FLOAT64_INPUTS(j) {
2635 input = *j; 2610 input = *j;
2636 double expected = *i - input; 2611 double expected = *i - input;
2637 CHECK_EQ(0, m.Call()); 2612 CHECK_EQ(0, m.Call());
2638 CHECK_EQ(expected, output); 2613 CHECK_EQ(expected, output);
2639 } 2614 }
2640 } 2615 }
2641 } 2616 }
2642 2617
2643 2618
2644 TEST(RunFloat64SubImm2) { 2619 TEST(RunFloat64SubImm2) {
2645 double input = 0.0; 2620 double input = 0.0;
2646 double output = 0.0; 2621 double output = 0.0;
2647 2622
2648 FOR_FLOAT64_INPUTS(i) { 2623 FOR_FLOAT64_INPUTS(i) {
2649 RawMachineAssemblerTester<int32_t> m; 2624 RawMachineAssemblerTester<int32_t> m;
2650 Node* t0 = m.LoadFromPointer(&input, kMachineFloat64); 2625 Node* t0 = m.LoadFromPointer(&input, kMachFloat64);
2651 Node* t1 = m.Float64Sub(t0, m.Float64Constant(*i)); 2626 Node* t1 = m.Float64Sub(t0, m.Float64Constant(*i));
2652 m.StoreToPointer(&output, kMachineFloat64, t1); 2627 m.StoreToPointer(&output, kMachFloat64, t1);
2653 m.Return(m.Int32Constant(0)); 2628 m.Return(m.Int32Constant(0));
2654 FOR_FLOAT64_INPUTS(j) { 2629 FOR_FLOAT64_INPUTS(j) {
2655 input = *j; 2630 input = *j;
2656 double expected = input - *i; 2631 double expected = input - *i;
2657 CHECK_EQ(0, m.Call()); 2632 CHECK_EQ(0, m.Call());
2658 CHECK_EQ(expected, output); 2633 CHECK_EQ(expected, output);
2659 } 2634 }
2660 } 2635 }
2661 } 2636 }
2662 2637
(...skipping 14 matching lines...) Expand all
2677 2652
2678 2653
2679 TEST(RunFloat64MulAndFloat64AddP) { 2654 TEST(RunFloat64MulAndFloat64AddP) {
2680 double input_a = 0.0; 2655 double input_a = 0.0;
2681 double input_b = 0.0; 2656 double input_b = 0.0;
2682 double input_c = 0.0; 2657 double input_c = 0.0;
2683 double output = 0.0; 2658 double output = 0.0;
2684 2659
2685 { 2660 {
2686 RawMachineAssemblerTester<int32_t> m; 2661 RawMachineAssemblerTester<int32_t> m;
2687 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); 2662 Node* a = m.LoadFromPointer(&input_a, kMachFloat64);
2688 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); 2663 Node* b = m.LoadFromPointer(&input_b, kMachFloat64);
2689 Node* c = m.LoadFromPointer(&input_c, kMachineFloat64); 2664 Node* c = m.LoadFromPointer(&input_c, kMachFloat64);
2690 m.StoreToPointer(&output, kMachineFloat64, 2665 m.StoreToPointer(&output, kMachFloat64,
2691 m.Float64Add(m.Float64Mul(a, b), c)); 2666 m.Float64Add(m.Float64Mul(a, b), c));
2692 m.Return(m.Int32Constant(0)); 2667 m.Return(m.Int32Constant(0));
2693 FOR_FLOAT64_INPUTS(i) { 2668 FOR_FLOAT64_INPUTS(i) {
2694 FOR_FLOAT64_INPUTS(j) { 2669 FOR_FLOAT64_INPUTS(j) {
2695 FOR_FLOAT64_INPUTS(k) { 2670 FOR_FLOAT64_INPUTS(k) {
2696 input_a = *i; 2671 input_a = *i;
2697 input_b = *j; 2672 input_b = *j;
2698 input_c = *k; 2673 input_c = *k;
2699 volatile double temp = input_a * input_b; 2674 volatile double temp = input_a * input_b;
2700 volatile double expected = temp + input_c; 2675 volatile double expected = temp + input_c;
2701 CHECK_EQ(0, m.Call()); 2676 CHECK_EQ(0, m.Call());
2702 CHECK_EQ(expected, output); 2677 CHECK_EQ(expected, output);
2703 } 2678 }
2704 } 2679 }
2705 } 2680 }
2706 } 2681 }
2707 { 2682 {
2708 RawMachineAssemblerTester<int32_t> m; 2683 RawMachineAssemblerTester<int32_t> m;
2709 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); 2684 Node* a = m.LoadFromPointer(&input_a, kMachFloat64);
2710 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); 2685 Node* b = m.LoadFromPointer(&input_b, kMachFloat64);
2711 Node* c = m.LoadFromPointer(&input_c, kMachineFloat64); 2686 Node* c = m.LoadFromPointer(&input_c, kMachFloat64);
2712 m.StoreToPointer(&output, kMachineFloat64, 2687 m.StoreToPointer(&output, kMachFloat64,
2713 m.Float64Add(a, m.Float64Mul(b, c))); 2688 m.Float64Add(a, m.Float64Mul(b, c)));
2714 m.Return(m.Int32Constant(0)); 2689 m.Return(m.Int32Constant(0));
2715 FOR_FLOAT64_INPUTS(i) { 2690 FOR_FLOAT64_INPUTS(i) {
2716 FOR_FLOAT64_INPUTS(j) { 2691 FOR_FLOAT64_INPUTS(j) {
2717 FOR_FLOAT64_INPUTS(k) { 2692 FOR_FLOAT64_INPUTS(k) {
2718 input_a = *i; 2693 input_a = *i;
2719 input_b = *j; 2694 input_b = *j;
2720 input_c = *k; 2695 input_c = *k;
2721 volatile double temp = input_b * input_c; 2696 volatile double temp = input_b * input_c;
2722 volatile double expected = input_a + temp; 2697 volatile double expected = input_a + temp;
2723 CHECK_EQ(0, m.Call()); 2698 CHECK_EQ(0, m.Call());
2724 CHECK_EQ(expected, output); 2699 CHECK_EQ(expected, output);
2725 } 2700 }
2726 } 2701 }
2727 } 2702 }
2728 } 2703 }
2729 } 2704 }
2730 2705
2731 2706
2732 TEST(RunFloat64MulAndFloat64SubP) { 2707 TEST(RunFloat64MulAndFloat64SubP) {
2733 double input_a = 0.0; 2708 double input_a = 0.0;
2734 double input_b = 0.0; 2709 double input_b = 0.0;
2735 double input_c = 0.0; 2710 double input_c = 0.0;
2736 double output = 0.0; 2711 double output = 0.0;
2737 2712
2738 RawMachineAssemblerTester<int32_t> m; 2713 RawMachineAssemblerTester<int32_t> m;
2739 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); 2714 Node* a = m.LoadFromPointer(&input_a, kMachFloat64);
2740 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); 2715 Node* b = m.LoadFromPointer(&input_b, kMachFloat64);
2741 Node* c = m.LoadFromPointer(&input_c, kMachineFloat64); 2716 Node* c = m.LoadFromPointer(&input_c, kMachFloat64);
2742 m.StoreToPointer(&output, kMachineFloat64, 2717 m.StoreToPointer(&output, kMachFloat64, m.Float64Sub(a, m.Float64Mul(b, c)));
2743 m.Float64Sub(a, m.Float64Mul(b, c)));
2744 m.Return(m.Int32Constant(0)); 2718 m.Return(m.Int32Constant(0));
2745 2719
2746 FOR_FLOAT64_INPUTS(i) { 2720 FOR_FLOAT64_INPUTS(i) {
2747 FOR_FLOAT64_INPUTS(j) { 2721 FOR_FLOAT64_INPUTS(j) {
2748 FOR_FLOAT64_INPUTS(k) { 2722 FOR_FLOAT64_INPUTS(k) {
2749 input_a = *i; 2723 input_a = *i;
2750 input_b = *j; 2724 input_b = *j;
2751 input_c = *k; 2725 input_c = *k;
2752 volatile double temp = input_b * input_c; 2726 volatile double temp = input_b * input_c;
2753 volatile double expected = input_a - temp; 2727 volatile double expected = input_a - temp;
2754 CHECK_EQ(0, m.Call()); 2728 CHECK_EQ(0, m.Call());
2755 CHECK_EQ(expected, output); 2729 CHECK_EQ(expected, output);
2756 } 2730 }
2757 } 2731 }
2758 } 2732 }
2759 } 2733 }
2760 2734
2761 2735
2762 TEST(RunFloat64MulImm) { 2736 TEST(RunFloat64MulImm) {
2763 double input = 0.0; 2737 double input = 0.0;
2764 double output = 0.0; 2738 double output = 0.0;
2765 2739
2766 { 2740 {
2767 FOR_FLOAT64_INPUTS(i) { 2741 FOR_FLOAT64_INPUTS(i) {
2768 RawMachineAssemblerTester<int32_t> m; 2742 RawMachineAssemblerTester<int32_t> m;
2769 Node* t0 = m.LoadFromPointer(&input, kMachineFloat64); 2743 Node* t0 = m.LoadFromPointer(&input, kMachFloat64);
2770 Node* t1 = m.Float64Mul(m.Float64Constant(*i), t0); 2744 Node* t1 = m.Float64Mul(m.Float64Constant(*i), t0);
2771 m.StoreToPointer(&output, kMachineFloat64, t1); 2745 m.StoreToPointer(&output, kMachFloat64, t1);
2772 m.Return(m.Int32Constant(0)); 2746 m.Return(m.Int32Constant(0));
2773 FOR_FLOAT64_INPUTS(j) { 2747 FOR_FLOAT64_INPUTS(j) {
2774 input = *j; 2748 input = *j;
2775 double expected = *i * input; 2749 double expected = *i * input;
2776 CHECK_EQ(0, m.Call()); 2750 CHECK_EQ(0, m.Call());
2777 CHECK_EQ(expected, output); 2751 CHECK_EQ(expected, output);
2778 } 2752 }
2779 } 2753 }
2780 } 2754 }
2781 { 2755 {
2782 FOR_FLOAT64_INPUTS(i) { 2756 FOR_FLOAT64_INPUTS(i) {
2783 RawMachineAssemblerTester<int32_t> m; 2757 RawMachineAssemblerTester<int32_t> m;
2784 Node* t0 = m.LoadFromPointer(&input, kMachineFloat64); 2758 Node* t0 = m.LoadFromPointer(&input, kMachFloat64);
2785 Node* t1 = m.Float64Mul(t0, m.Float64Constant(*i)); 2759 Node* t1 = m.Float64Mul(t0, m.Float64Constant(*i));
2786 m.StoreToPointer(&output, kMachineFloat64, t1); 2760 m.StoreToPointer(&output, kMachFloat64, t1);
2787 m.Return(m.Int32Constant(0)); 2761 m.Return(m.Int32Constant(0));
2788 FOR_FLOAT64_INPUTS(j) { 2762 FOR_FLOAT64_INPUTS(j) {
2789 input = *j; 2763 input = *j;
2790 double expected = input * *i; 2764 double expected = input * *i;
2791 CHECK_EQ(0, m.Call()); 2765 CHECK_EQ(0, m.Call());
2792 CHECK_EQ(expected, output); 2766 CHECK_EQ(expected, output);
2793 } 2767 }
2794 } 2768 }
2795 } 2769 }
2796 } 2770 }
(...skipping 29 matching lines...) Expand all
2826 } 2800 }
2827 } 2801 }
2828 2802
2829 2803
2830 TEST(RunChangeInt32ToFloat64_A) { 2804 TEST(RunChangeInt32ToFloat64_A) {
2831 RawMachineAssemblerTester<int32_t> m; 2805 RawMachineAssemblerTester<int32_t> m;
2832 int32_t magic = 0x986234; 2806 int32_t magic = 0x986234;
2833 double result = 0; 2807 double result = 0;
2834 2808
2835 Node* convert = m.ChangeInt32ToFloat64(m.Int32Constant(magic)); 2809 Node* convert = m.ChangeInt32ToFloat64(m.Int32Constant(magic));
2836 m.Store(kMachineFloat64, m.PointerConstant(&result), m.Int32Constant(0), 2810 m.Store(kMachFloat64, m.PointerConstant(&result), m.Int32Constant(0),
2837 convert); 2811 convert);
2838 m.Return(m.Int32Constant(magic)); 2812 m.Return(m.Int32Constant(magic));
2839 2813
2840 CHECK_EQ(magic, m.Call()); 2814 CHECK_EQ(magic, m.Call());
2841 CHECK_EQ(static_cast<double>(magic), result); 2815 CHECK_EQ(static_cast<double>(magic), result);
2842 } 2816 }
2843 2817
2844 2818
2845 TEST(RunChangeInt32ToFloat64_B) { 2819 TEST(RunChangeInt32ToFloat64_B) {
2846 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 2820 RawMachineAssemblerTester<int32_t> m(kMachInt32);
2847 double output = 0; 2821 double output = 0;
2848 2822
2849 Node* convert = m.ChangeInt32ToFloat64(m.Parameter(0)); 2823 Node* convert = m.ChangeInt32ToFloat64(m.Parameter(0));
2850 m.Store(kMachineFloat64, m.PointerConstant(&output), m.Int32Constant(0), 2824 m.Store(kMachFloat64, m.PointerConstant(&output), m.Int32Constant(0),
2851 convert); 2825 convert);
2852 m.Return(m.Parameter(0)); 2826 m.Return(m.Parameter(0));
2853 2827
2854 FOR_INT32_INPUTS(i) { 2828 FOR_INT32_INPUTS(i) {
2855 int32_t expect = *i; 2829 int32_t expect = *i;
2856 CHECK_EQ(expect, m.Call(expect)); 2830 CHECK_EQ(expect, m.Call(expect));
2857 CHECK_EQ(static_cast<double>(expect), output); 2831 CHECK_EQ(static_cast<double>(expect), output);
2858 } 2832 }
2859 } 2833 }
2860 2834
2861 2835
2862 TEST(RunChangeUint32ToFloat64_B) { 2836 TEST(RunChangeUint32ToFloat64_B) {
2863 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 2837 RawMachineAssemblerTester<int32_t> m(kMachUint32);
2864 double output = 0; 2838 double output = 0;
2865 2839
2866 Node* convert = m.ChangeUint32ToFloat64(m.Parameter(0)); 2840 Node* convert = m.ChangeUint32ToFloat64(m.Parameter(0));
2867 m.Store(kMachineFloat64, m.PointerConstant(&output), m.Int32Constant(0), 2841 m.Store(kMachFloat64, m.PointerConstant(&output), m.Int32Constant(0),
2868 convert); 2842 convert);
2869 m.Return(m.Parameter(0)); 2843 m.Return(m.Parameter(0));
2870 2844
2871 FOR_UINT32_INPUTS(i) { 2845 FOR_UINT32_INPUTS(i) {
2872 uint32_t expect = *i; 2846 uint32_t expect = *i;
2873 CHECK_EQ(expect, m.Call(expect)); 2847 CHECK_EQ(expect, m.Call(expect));
2874 CHECK_EQ(static_cast<double>(expect), output); 2848 CHECK_EQ(static_cast<double>(expect), output);
2875 } 2849 }
2876 } 2850 }
2877 2851
2878 2852
2879 TEST(RunChangeFloat64ToInt32_A) { 2853 TEST(RunChangeFloat64ToInt32_A) {
2880 RawMachineAssemblerTester<int32_t> m; 2854 RawMachineAssemblerTester<int32_t> m;
2881 int32_t magic = 0x786234; 2855 int32_t magic = 0x786234;
2882 double input = 11.1; 2856 double input = 11.1;
2883 int32_t result = 0; 2857 int32_t result = 0;
2884 2858
2885 m.Store(kMachineWord32, m.PointerConstant(&result), m.Int32Constant(0), 2859 m.Store(kMachInt32, m.PointerConstant(&result), m.Int32Constant(0),
2886 m.ChangeFloat64ToInt32(m.Float64Constant(input))); 2860 m.ChangeFloat64ToInt32(m.Float64Constant(input)));
2887 m.Return(m.Int32Constant(magic)); 2861 m.Return(m.Int32Constant(magic));
2888 2862
2889 CHECK_EQ(magic, m.Call()); 2863 CHECK_EQ(magic, m.Call());
2890 CHECK_EQ(static_cast<int32_t>(input), result); 2864 CHECK_EQ(static_cast<int32_t>(input), result);
2891 } 2865 }
2892 2866
2893 2867
2894 TEST(RunChangeFloat64ToInt32_B) { 2868 TEST(RunChangeFloat64ToInt32_B) {
2895 RawMachineAssemblerTester<int32_t> m; 2869 RawMachineAssemblerTester<int32_t> m;
2896 double input = 0; 2870 double input = 0;
2897 int32_t output = 0; 2871 int32_t output = 0;
2898 2872
2899 Node* load = 2873 Node* load =
2900 m.Load(kMachineFloat64, m.PointerConstant(&input), m.Int32Constant(0)); 2874 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(0));
2901 Node* convert = m.ChangeFloat64ToInt32(load); 2875 Node* convert = m.ChangeFloat64ToInt32(load);
2902 m.Store(kMachineWord32, m.PointerConstant(&output), m.Int32Constant(0), 2876 m.Store(kMachInt32, m.PointerConstant(&output), m.Int32Constant(0), convert);
2903 convert);
2904 m.Return(convert); 2877 m.Return(convert);
2905 2878
2906 { 2879 {
2907 FOR_INT32_INPUTS(i) { 2880 FOR_INT32_INPUTS(i) {
2908 input = *i; 2881 input = *i;
2909 int32_t expect = *i; 2882 int32_t expect = *i;
2910 CHECK_EQ(expect, m.Call()); 2883 CHECK_EQ(expect, m.Call());
2911 CHECK_EQ(expect, output); 2884 CHECK_EQ(expect, output);
2912 } 2885 }
2913 } 2886 }
(...skipping 18 matching lines...) Expand all
2932 // really should be Change operators. 2905 // really should be Change operators.
2933 } 2906 }
2934 2907
2935 2908
2936 TEST(RunChangeFloat64ToUint32_B) { 2909 TEST(RunChangeFloat64ToUint32_B) {
2937 RawMachineAssemblerTester<int32_t> m; 2910 RawMachineAssemblerTester<int32_t> m;
2938 double input = 0; 2911 double input = 0;
2939 int32_t output = 0; 2912 int32_t output = 0;
2940 2913
2941 Node* load = 2914 Node* load =
2942 m.Load(kMachineFloat64, m.PointerConstant(&input), m.Int32Constant(0)); 2915 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(0));
2943 Node* convert = m.ChangeFloat64ToUint32(load); 2916 Node* convert = m.ChangeFloat64ToUint32(load);
2944 m.Store(kMachineWord32, m.PointerConstant(&output), m.Int32Constant(0), 2917 m.Store(kMachInt32, m.PointerConstant(&output), m.Int32Constant(0), convert);
2945 convert);
2946 m.Return(convert); 2918 m.Return(convert);
2947 2919
2948 { 2920 {
2949 FOR_UINT32_INPUTS(i) { 2921 FOR_UINT32_INPUTS(i) {
2950 input = *i; 2922 input = *i;
2951 // TODO(titzer): add a CheckEqualsHelper overload for uint32_t. 2923 // TODO(titzer): add a CheckEqualsHelper overload for uint32_t.
2952 int32_t expect = static_cast<int32_t>(*i); 2924 int32_t expect = static_cast<int32_t>(*i);
2953 CHECK_EQ(expect, m.Call()); 2925 CHECK_EQ(expect, m.Call());
2954 CHECK_EQ(expect, output); 2926 CHECK_EQ(expect, output);
2955 } 2927 }
(...skipping 22 matching lines...) Expand all
2978 2950
2979 TEST(RunChangeFloat64ToInt32_spilled) { 2951 TEST(RunChangeFloat64ToInt32_spilled) {
2980 RawMachineAssemblerTester<int32_t> m; 2952 RawMachineAssemblerTester<int32_t> m;
2981 const int kNumInputs = 32; 2953 const int kNumInputs = 32;
2982 int32_t magic = 0x786234; 2954 int32_t magic = 0x786234;
2983 double input[kNumInputs]; 2955 double input[kNumInputs];
2984 int32_t result[kNumInputs]; 2956 int32_t result[kNumInputs];
2985 Node* input_node[kNumInputs]; 2957 Node* input_node[kNumInputs];
2986 2958
2987 for (int i = 0; i < kNumInputs; i++) { 2959 for (int i = 0; i < kNumInputs; i++) {
2988 input_node[i] = m.Load(kMachineFloat64, m.PointerConstant(&input), 2960 input_node[i] =
2989 m.Int32Constant(i * 8)); 2961 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(i * 8));
2990 } 2962 }
2991 2963
2992 for (int i = 0; i < kNumInputs; i++) { 2964 for (int i = 0; i < kNumInputs; i++) {
2993 m.Store(kMachineWord32, m.PointerConstant(&result), m.Int32Constant(i * 4), 2965 m.Store(kMachInt32, m.PointerConstant(&result), m.Int32Constant(i * 4),
2994 m.ChangeFloat64ToInt32(input_node[i])); 2966 m.ChangeFloat64ToInt32(input_node[i]));
2995 } 2967 }
2996 2968
2997 m.Return(m.Int32Constant(magic)); 2969 m.Return(m.Int32Constant(magic));
2998 2970
2999 for (int i = 0; i < kNumInputs; i++) { 2971 for (int i = 0; i < kNumInputs; i++) {
3000 input[i] = 100.9 + i; 2972 input[i] = 100.9 + i;
3001 } 2973 }
3002 2974
3003 CHECK_EQ(magic, m.Call()); 2975 CHECK_EQ(magic, m.Call());
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
3059 MLabel blocka, blockb, end; 3031 MLabel blocka, blockb, end;
3060 Node* k1 = m.Float64Constant(constant); 3032 Node* k1 = m.Float64Constant(constant);
3061 Node* k2 = m.Float64Constant(0 - constant); 3033 Node* k2 = m.Float64Constant(0 - constant);
3062 m.Branch(m.Int32Constant(0), &blocka, &blockb); 3034 m.Branch(m.Int32Constant(0), &blocka, &blockb);
3063 m.Bind(&blocka); 3035 m.Bind(&blocka);
3064 m.Goto(&end); 3036 m.Goto(&end);
3065 m.Bind(&blockb); 3037 m.Bind(&blockb);
3066 m.Goto(&end); 3038 m.Goto(&end);
3067 m.Bind(&end); 3039 m.Bind(&end);
3068 Node* phi = m.Phi(k2, k1); 3040 Node* phi = m.Phi(k2, k1);
3069 m.Store(kMachineFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi); 3041 m.Store(kMachFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi);
3070 m.Return(m.Int32Constant(magic)); 3042 m.Return(m.Int32Constant(magic));
3071 3043
3072 CHECK_EQ(magic, m.Call()); 3044 CHECK_EQ(magic, m.Call());
3073 CHECK_EQ(constant, buffer); 3045 CHECK_EQ(constant, buffer);
3074 } 3046 }
3075 3047
3076 3048
3077 TEST(RunRefDiamond) { 3049 TEST(RunRefDiamond) {
3078 RawMachineAssemblerTester<int32_t> m; 3050 RawMachineAssemblerTester<int32_t> m;
3079 3051
3080 const int magic = 99644; 3052 const int magic = 99644;
3081 Handle<String> rexpected = 3053 Handle<String> rexpected =
3082 CcTest::i_isolate()->factory()->InternalizeUtf8String("A"); 3054 CcTest::i_isolate()->factory()->InternalizeUtf8String("A");
3083 String* buffer; 3055 String* buffer;
3084 3056
3085 MLabel blocka, blockb, end; 3057 MLabel blocka, blockb, end;
3086 Node* k1 = m.StringConstant("A"); 3058 Node* k1 = m.StringConstant("A");
3087 Node* k2 = m.StringConstant("B"); 3059 Node* k2 = m.StringConstant("B");
3088 m.Branch(m.Int32Constant(0), &blocka, &blockb); 3060 m.Branch(m.Int32Constant(0), &blocka, &blockb);
3089 m.Bind(&blocka); 3061 m.Bind(&blocka);
3090 m.Goto(&end); 3062 m.Goto(&end);
3091 m.Bind(&blockb); 3063 m.Bind(&blockb);
3092 m.Goto(&end); 3064 m.Goto(&end);
3093 m.Bind(&end); 3065 m.Bind(&end);
3094 Node* phi = m.Phi(k2, k1); 3066 Node* phi = m.Phi(k2, k1);
3095 m.Store(kMachineTagged, m.PointerConstant(&buffer), m.Int32Constant(0), phi); 3067 m.Store(kMachAnyTagged, m.PointerConstant(&buffer), m.Int32Constant(0), phi);
3096 m.Return(m.Int32Constant(magic)); 3068 m.Return(m.Int32Constant(magic));
3097 3069
3098 CHECK_EQ(magic, m.Call()); 3070 CHECK_EQ(magic, m.Call());
3099 CHECK(rexpected->SameValue(buffer)); 3071 CHECK(rexpected->SameValue(buffer));
3100 } 3072 }
3101 3073
3102 3074
3103 TEST(RunDoubleRefDiamond) { 3075 TEST(RunDoubleRefDiamond) {
3104 RawMachineAssemblerTester<int32_t> m; 3076 RawMachineAssemblerTester<int32_t> m;
3105 3077
(...skipping 10 matching lines...) Expand all
3116 Node* r1 = m.StringConstant("AX"); 3088 Node* r1 = m.StringConstant("AX");
3117 Node* r2 = m.StringConstant("BX"); 3089 Node* r2 = m.StringConstant("BX");
3118 m.Branch(m.Int32Constant(0), &blocka, &blockb); 3090 m.Branch(m.Int32Constant(0), &blocka, &blockb);
3119 m.Bind(&blocka); 3091 m.Bind(&blocka);
3120 m.Goto(&end); 3092 m.Goto(&end);
3121 m.Bind(&blockb); 3093 m.Bind(&blockb);
3122 m.Goto(&end); 3094 m.Goto(&end);
3123 m.Bind(&end); 3095 m.Bind(&end);
3124 Node* dphi = m.Phi(d2, d1); 3096 Node* dphi = m.Phi(d2, d1);
3125 Node* rphi = m.Phi(r2, r1); 3097 Node* rphi = m.Phi(r2, r1);
3126 m.Store(kMachineFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), 3098 m.Store(kMachFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), dphi);
3127 dphi); 3099 m.Store(kMachAnyTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0),
3128 m.Store(kMachineTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0),
3129 rphi); 3100 rphi);
3130 m.Return(m.Int32Constant(magic)); 3101 m.Return(m.Int32Constant(magic));
3131 3102
3132 CHECK_EQ(magic, m.Call()); 3103 CHECK_EQ(magic, m.Call());
3133 CHECK_EQ(dconstant, dbuffer); 3104 CHECK_EQ(dconstant, dbuffer);
3134 CHECK(rexpected->SameValue(rbuffer)); 3105 CHECK(rexpected->SameValue(rbuffer));
3135 } 3106 }
3136 3107
3137 3108
3138 TEST(RunDoubleRefDoubleDiamond) { 3109 TEST(RunDoubleRefDoubleDiamond) {
(...skipping 22 matching lines...) Expand all
3161 m.Branch(m.Int32Constant(0), &blockd, &blocke); 3132 m.Branch(m.Int32Constant(0), &blockd, &blocke);
3162 3133
3163 m.Bind(&blockd); 3134 m.Bind(&blockd);
3164 m.Goto(&end); 3135 m.Goto(&end);
3165 m.Bind(&blocke); 3136 m.Bind(&blocke);
3166 m.Goto(&end); 3137 m.Goto(&end);
3167 m.Bind(&end); 3138 m.Bind(&end);
3168 Node* dphi2 = m.Phi(d1, dphi1); 3139 Node* dphi2 = m.Phi(d1, dphi1);
3169 Node* rphi2 = m.Phi(r1, rphi1); 3140 Node* rphi2 = m.Phi(r1, rphi1);
3170 3141
3171 m.Store(kMachineFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), 3142 m.Store(kMachFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), dphi2);
3172 dphi2); 3143 m.Store(kMachAnyTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0),
3173 m.Store(kMachineTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0),
3174 rphi2); 3144 rphi2);
3175 m.Return(m.Int32Constant(magic)); 3145 m.Return(m.Int32Constant(magic));
3176 3146
3177 CHECK_EQ(magic, m.Call()); 3147 CHECK_EQ(magic, m.Call());
3178 CHECK_EQ(dconstant, dbuffer); 3148 CHECK_EQ(dconstant, dbuffer);
3179 CHECK(rexpected->SameValue(rbuffer)); 3149 CHECK(rexpected->SameValue(rbuffer));
3180 } 3150 }
3181 3151
3182 3152
3183 TEST(RunDoubleLoopPhi) { 3153 TEST(RunDoubleLoopPhi) {
3184 RawMachineAssemblerTester<int32_t> m; 3154 RawMachineAssemblerTester<int32_t> m;
3185 MLabel header, body, end; 3155 MLabel header, body, end;
3186 3156
3187 int magic = 99773; 3157 int magic = 99773;
3188 double buffer = 0.99; 3158 double buffer = 0.99;
3189 double dconstant = 777.1; 3159 double dconstant = 777.1;
3190 3160
3191 Node* zero = m.Int32Constant(0); 3161 Node* zero = m.Int32Constant(0);
3192 Node* dk = m.Float64Constant(dconstant); 3162 Node* dk = m.Float64Constant(dconstant);
3193 3163
3194 m.Goto(&header); 3164 m.Goto(&header);
3195 m.Bind(&header); 3165 m.Bind(&header);
3196 Node* phi = m.Phi(dk, dk); 3166 Node* phi = m.Phi(dk, dk);
3197 phi->ReplaceInput(1, phi); 3167 phi->ReplaceInput(1, phi);
3198 m.Branch(zero, &body, &end); 3168 m.Branch(zero, &body, &end);
3199 m.Bind(&body); 3169 m.Bind(&body);
3200 m.Goto(&header); 3170 m.Goto(&header);
3201 m.Bind(&end); 3171 m.Bind(&end);
3202 m.Store(kMachineFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi); 3172 m.Store(kMachFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi);
3203 m.Return(m.Int32Constant(magic)); 3173 m.Return(m.Int32Constant(magic));
3204 3174
3205 CHECK_EQ(magic, m.Call()); 3175 CHECK_EQ(magic, m.Call());
3206 } 3176 }
3207 3177
3208 3178
3209 TEST(RunCountToTenAccRaw) { 3179 TEST(RunCountToTenAccRaw) {
3210 RawMachineAssemblerTester<int32_t> m; 3180 RawMachineAssemblerTester<int32_t> m;
3211 3181
3212 Node* zero = m.Int32Constant(0); 3182 Node* zero = m.Int32Constant(0);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
3273 3243
3274 CHECK_EQ(10, m.Call()); 3244 CHECK_EQ(10, m.Call());
3275 } 3245 }
3276 3246
3277 3247
3278 TEST(RunAddTree) { 3248 TEST(RunAddTree) {
3279 RawMachineAssemblerTester<int32_t> m; 3249 RawMachineAssemblerTester<int32_t> m;
3280 int32_t inputs[] = {11, 12, 13, 14, 15, 16, 17, 18}; 3250 int32_t inputs[] = {11, 12, 13, 14, 15, 16, 17, 18};
3281 3251
3282 Node* base = m.PointerConstant(inputs); 3252 Node* base = m.PointerConstant(inputs);
3283 Node* n0 = m.Load(kMachineWord32, base, m.Int32Constant(0 * sizeof(int32_t))); 3253 Node* n0 = m.Load(kMachInt32, base, m.Int32Constant(0 * sizeof(int32_t)));
3284 Node* n1 = m.Load(kMachineWord32, base, m.Int32Constant(1 * sizeof(int32_t))); 3254 Node* n1 = m.Load(kMachInt32, base, m.Int32Constant(1 * sizeof(int32_t)));
3285 Node* n2 = m.Load(kMachineWord32, base, m.Int32Constant(2 * sizeof(int32_t))); 3255 Node* n2 = m.Load(kMachInt32, base, m.Int32Constant(2 * sizeof(int32_t)));
3286 Node* n3 = m.Load(kMachineWord32, base, m.Int32Constant(3 * sizeof(int32_t))); 3256 Node* n3 = m.Load(kMachInt32, base, m.Int32Constant(3 * sizeof(int32_t)));
3287 Node* n4 = m.Load(kMachineWord32, base, m.Int32Constant(4 * sizeof(int32_t))); 3257 Node* n4 = m.Load(kMachInt32, base, m.Int32Constant(4 * sizeof(int32_t)));
3288 Node* n5 = m.Load(kMachineWord32, base, m.Int32Constant(5 * sizeof(int32_t))); 3258 Node* n5 = m.Load(kMachInt32, base, m.Int32Constant(5 * sizeof(int32_t)));
3289 Node* n6 = m.Load(kMachineWord32, base, m.Int32Constant(6 * sizeof(int32_t))); 3259 Node* n6 = m.Load(kMachInt32, base, m.Int32Constant(6 * sizeof(int32_t)));
3290 Node* n7 = m.Load(kMachineWord32, base, m.Int32Constant(7 * sizeof(int32_t))); 3260 Node* n7 = m.Load(kMachInt32, base, m.Int32Constant(7 * sizeof(int32_t)));
3291 3261
3292 Node* i1 = m.Int32Add(n0, n1); 3262 Node* i1 = m.Int32Add(n0, n1);
3293 Node* i2 = m.Int32Add(n2, n3); 3263 Node* i2 = m.Int32Add(n2, n3);
3294 Node* i3 = m.Int32Add(n4, n5); 3264 Node* i3 = m.Int32Add(n4, n5);
3295 Node* i4 = m.Int32Add(n6, n7); 3265 Node* i4 = m.Int32Add(n6, n7);
3296 3266
3297 Node* i5 = m.Int32Add(i1, i2); 3267 Node* i5 = m.Int32Add(i1, i2);
3298 Node* i6 = m.Int32Add(i3, i4); 3268 Node* i6 = m.Int32Add(i3, i4);
3299 3269
3300 Node* i7 = m.Int32Add(i5, i6); 3270 Node* i7 = m.Int32Add(i5, i6);
(...skipping 17 matching lines...) Expand all
3318 void* function_address = 3288 void* function_address =
3319 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); 3289 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven));
3320 3290
3321 RawMachineAssemblerTester<int32_t> m; 3291 RawMachineAssemblerTester<int32_t> m;
3322 Node** args = NULL; 3292 Node** args = NULL;
3323 MachineType* arg_types = NULL; 3293 MachineType* arg_types = NULL;
3324 Node* function = 3294 Node* function =
3325 call_direct ? m.PointerConstant(function_address) 3295 call_direct ? m.PointerConstant(function_address)
3326 : m.LoadFromPointer(&function_address, 3296 : m.LoadFromPointer(&function_address,
3327 MachineOperatorBuilder::pointer_rep()); 3297 MachineOperatorBuilder::pointer_rep());
3328 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 0)); 3298 m.Return(m.CallC(function, kMachInt32, arg_types, args, 0));
3329 3299
3330 CHECK_EQ(7, m.Call()); 3300 CHECK_EQ(7, m.Call());
3331 } 3301 }
3332 } 3302 }
3333 3303
3334 3304
3335 TEST(RunCallUnaryMinus) { 3305 TEST(RunCallUnaryMinus) {
3336 for (int i = 0; i < 2; i++) { 3306 for (int i = 0; i < 2; i++) {
3337 bool call_direct = i == 0; 3307 bool call_direct = i == 0;
3338 void* function_address = 3308 void* function_address =
3339 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&UnaryMinus)); 3309 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&UnaryMinus));
3340 3310
3341 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 3311 RawMachineAssemblerTester<int32_t> m(kMachInt32);
3342 Node* args[] = {m.Parameter(0)}; 3312 Node* args[] = {m.Parameter(0)};
3343 MachineType arg_types[] = {kMachineWord32}; 3313 MachineType arg_types[] = {kMachInt32};
3344 Node* function = 3314 Node* function =
3345 call_direct ? m.PointerConstant(function_address) 3315 call_direct ? m.PointerConstant(function_address)
3346 : m.LoadFromPointer(&function_address, 3316 : m.LoadFromPointer(&function_address,
3347 MachineOperatorBuilder::pointer_rep()); 3317 MachineOperatorBuilder::pointer_rep());
3348 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 1)); 3318 m.Return(m.CallC(function, kMachInt32, arg_types, args, 1));
3349 3319
3350 FOR_INT32_INPUTS(i) { 3320 FOR_INT32_INPUTS(i) {
3351 int a = *i; 3321 int a = *i;
3352 CHECK_EQ(-a, m.Call(a)); 3322 CHECK_EQ(-a, m.Call(a));
3353 } 3323 }
3354 } 3324 }
3355 } 3325 }
3356 3326
3357 3327
3358 TEST(RunCallAPlusTwoB) { 3328 TEST(RunCallAPlusTwoB) {
3359 for (int i = 0; i < 2; i++) { 3329 for (int i = 0; i < 2; i++) {
3360 bool call_direct = i == 0; 3330 bool call_direct = i == 0;
3361 void* function_address = 3331 void* function_address =
3362 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&APlusTwoB)); 3332 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&APlusTwoB));
3363 3333
3364 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); 3334 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32);
3365 Node* args[] = {m.Parameter(0), m.Parameter(1)}; 3335 Node* args[] = {m.Parameter(0), m.Parameter(1)};
3366 MachineType arg_types[] = {kMachineWord32, kMachineWord32}; 3336 MachineType arg_types[] = {kMachInt32, kMachInt32};
3367 Node* function = 3337 Node* function =
3368 call_direct ? m.PointerConstant(function_address) 3338 call_direct ? m.PointerConstant(function_address)
3369 : m.LoadFromPointer(&function_address, 3339 : m.LoadFromPointer(&function_address,
3370 MachineOperatorBuilder::pointer_rep()); 3340 MachineOperatorBuilder::pointer_rep());
3371 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 2)); 3341 m.Return(m.CallC(function, kMachInt32, arg_types, args, 2));
3372 3342
3373 FOR_INT32_INPUTS(i) { 3343 FOR_INT32_INPUTS(i) {
3374 FOR_INT32_INPUTS(j) { 3344 FOR_INT32_INPUTS(j) {
3375 int a = *i; 3345 int a = *i;
3376 int b = *j; 3346 int b = *j;
3377 int result = m.Call(a, b); 3347 int result = m.Call(a, b);
3378 CHECK_EQ(a + 2 * b, result); 3348 CHECK_EQ(a + 2 * b, result);
3379 } 3349 }
3380 } 3350 }
3381 } 3351 }
3382 } 3352 }
3383 3353
3384 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C 3354 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C
3385 3355
3386 3356
3387 static const int kFloat64CompareHelperTestCases = 15; 3357 static const int kFloat64CompareHelperTestCases = 15;
3388 static const int kFloat64CompareHelperNodeType = 4; 3358 static const int kFloat64CompareHelperNodeType = 4;
3389 3359
3390 static int Float64CompareHelper(RawMachineAssemblerTester<int32_t>* m, 3360 static int Float64CompareHelper(RawMachineAssemblerTester<int32_t>* m,
3391 int test_case, int node_type, double x, 3361 int test_case, int node_type, double x,
3392 double y) { 3362 double y) {
3393 static double buffer[2]; 3363 static double buffer[2];
3394 buffer[0] = x; 3364 buffer[0] = x;
3395 buffer[1] = y; 3365 buffer[1] = y;
3396 CHECK(0 <= test_case && test_case < kFloat64CompareHelperTestCases); 3366 CHECK(0 <= test_case && test_case < kFloat64CompareHelperTestCases);
3397 CHECK(0 <= node_type && node_type < kFloat64CompareHelperNodeType); 3367 CHECK(0 <= node_type && node_type < kFloat64CompareHelperNodeType);
3398 CHECK(x < y); 3368 CHECK(x < y);
3399 bool load_a = node_type / 2 == 1; 3369 bool load_a = node_type / 2 == 1;
3400 bool load_b = node_type % 2 == 1; 3370 bool load_b = node_type % 2 == 1;
3401 Node* a = load_a ? m->Load(kMachineFloat64, m->PointerConstant(&buffer[0])) 3371 Node* a = load_a ? m->Load(kMachFloat64, m->PointerConstant(&buffer[0]))
3402 : m->Float64Constant(x); 3372 : m->Float64Constant(x);
3403 Node* b = load_b ? m->Load(kMachineFloat64, m->PointerConstant(&buffer[1])) 3373 Node* b = load_b ? m->Load(kMachFloat64, m->PointerConstant(&buffer[1]))
3404 : m->Float64Constant(y); 3374 : m->Float64Constant(y);
3405 Node* cmp = NULL; 3375 Node* cmp = NULL;
3406 bool expected = false; 3376 bool expected = false;
3407 switch (test_case) { 3377 switch (test_case) {
3408 // Equal tests. 3378 // Equal tests.
3409 case 0: 3379 case 0:
3410 cmp = m->Float64Equal(a, b); 3380 cmp = m->Float64Equal(a, b);
3411 expected = false; 3381 expected = false;
3412 break; 3382 break;
3413 case 1: 3383 case 1:
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
3521 } 3491 }
3522 } 3492 }
3523 } 3493 }
3524 3494
3525 3495
3526 TEST(RunFloat64Equal) { 3496 TEST(RunFloat64Equal) {
3527 double input_a = 0.0; 3497 double input_a = 0.0;
3528 double input_b = 0.0; 3498 double input_b = 0.0;
3529 3499
3530 RawMachineAssemblerTester<int32_t> m; 3500 RawMachineAssemblerTester<int32_t> m;
3531 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); 3501 Node* a = m.LoadFromPointer(&input_a, kMachFloat64);
3532 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); 3502 Node* b = m.LoadFromPointer(&input_b, kMachFloat64);
3533 m.Return(m.Float64Equal(a, b)); 3503 m.Return(m.Float64Equal(a, b));
3534 3504
3535 CompareWrapper cmp(IrOpcode::kFloat64Equal); 3505 CompareWrapper cmp(IrOpcode::kFloat64Equal);
3536 FOR_FLOAT64_INPUTS(pl) { 3506 FOR_FLOAT64_INPUTS(pl) {
3537 FOR_FLOAT64_INPUTS(pr) { 3507 FOR_FLOAT64_INPUTS(pr) {
3538 input_a = *pl; 3508 input_a = *pl;
3539 input_b = *pr; 3509 input_b = *pr;
3540 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; 3510 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0;
3541 CHECK_EQ(expected, m.Call()); 3511 CHECK_EQ(expected, m.Call());
3542 } 3512 }
3543 } 3513 }
3544 } 3514 }
3545 3515
3546 3516
3547 TEST(RunFloat64LessThan) { 3517 TEST(RunFloat64LessThan) {
3548 double input_a = 0.0; 3518 double input_a = 0.0;
3549 double input_b = 0.0; 3519 double input_b = 0.0;
3550 3520
3551 RawMachineAssemblerTester<int32_t> m; 3521 RawMachineAssemblerTester<int32_t> m;
3552 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); 3522 Node* a = m.LoadFromPointer(&input_a, kMachFloat64);
3553 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); 3523 Node* b = m.LoadFromPointer(&input_b, kMachFloat64);
3554 m.Return(m.Float64LessThan(a, b)); 3524 m.Return(m.Float64LessThan(a, b));
3555 3525
3556 CompareWrapper cmp(IrOpcode::kFloat64LessThan); 3526 CompareWrapper cmp(IrOpcode::kFloat64LessThan);
3557 FOR_FLOAT64_INPUTS(pl) { 3527 FOR_FLOAT64_INPUTS(pl) {
3558 FOR_FLOAT64_INPUTS(pr) { 3528 FOR_FLOAT64_INPUTS(pr) {
3559 input_a = *pl; 3529 input_a = *pl;
3560 input_b = *pr; 3530 input_b = *pr;
3561 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; 3531 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0;
3562 CHECK_EQ(expected, m.Call()); 3532 CHECK_EQ(expected, m.Call());
3563 } 3533 }
(...skipping 28 matching lines...) Expand all
3592 for (int i = -127; i < 127; i++) { 3562 for (int i = -127; i < 127; i++) {
3593 input = i; 3563 input = i;
3594 int expected = i >= 0 ? i + 1 : max + (i - min) + 2; 3564 int expected = i >= 0 ? i + 1 : max + (i - min) + 2;
3595 CHECK_EQ(expected, m.Call()); 3565 CHECK_EQ(expected, m.Call());
3596 CHECK_EQ(i + 1, input); 3566 CHECK_EQ(i + 1, input);
3597 } 3567 }
3598 } 3568 }
3599 3569
3600 3570
3601 TEST(RunLoadStoreTruncation) { 3571 TEST(RunLoadStoreTruncation) {
3602 LoadStoreTruncation<int8_t, kMachineWord8>(); 3572 LoadStoreTruncation<int8_t, kMachInt8>();
3603 LoadStoreTruncation<int16_t, kMachineWord16>(); 3573 LoadStoreTruncation<int16_t, kMachInt16>();
3604 } 3574 }
3605 3575
3606 3576
3607 static void IntPtrCompare(intptr_t left, intptr_t right) { 3577 static void IntPtrCompare(intptr_t left, intptr_t right) {
3608 for (int test = 0; test < 7; test++) { 3578 for (int test = 0; test < 7; test++) {
3609 RawMachineAssemblerTester<bool> m(MachineOperatorBuilder::pointer_rep(), 3579 RawMachineAssemblerTester<bool> m(MachineOperatorBuilder::pointer_rep(),
3610 MachineOperatorBuilder::pointer_rep()); 3580 MachineOperatorBuilder::pointer_rep());
3611 Node* p0 = m.Parameter(0); 3581 Node* p0 = m.Parameter(0);
3612 Node* p1 = m.Parameter(1); 3582 Node* p1 = m.Parameter(1);
3613 Node* res = NULL; 3583 Node* res = NULL;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
3669 int32_t outputs[kInputSize]; 3639 int32_t outputs[kInputSize];
3670 for (int i = 0; i < kInputSize; i++) { 3640 for (int i = 0; i < kInputSize; i++) {
3671 inputs[i] = i; 3641 inputs[i] = i;
3672 outputs[i] = -1; 3642 outputs[i] = -1;
3673 } 3643 }
3674 RawMachineAssemblerTester<int32_t*> m; 3644 RawMachineAssemblerTester<int32_t*> m;
3675 Node* input = m.PointerConstant(&inputs[0]); 3645 Node* input = m.PointerConstant(&inputs[0]);
3676 Node* output = m.PointerConstant(&outputs[kInputSize - 1]); 3646 Node* output = m.PointerConstant(&outputs[kInputSize - 1]);
3677 Node* elem_size = m.ConvertInt32ToIntPtr(m.Int32Constant(sizeof(inputs[0]))); 3647 Node* elem_size = m.ConvertInt32ToIntPtr(m.Int32Constant(sizeof(inputs[0])));
3678 for (int i = 0; i < kInputSize; i++) { 3648 for (int i = 0; i < kInputSize; i++) {
3679 m.Store(kMachineWord32, output, m.Load(kMachineWord32, input)); 3649 m.Store(kMachInt32, output, m.Load(kMachInt32, input));
3680 input = m.IntPtrAdd(input, elem_size); 3650 input = m.IntPtrAdd(input, elem_size);
3681 output = m.IntPtrSub(output, elem_size); 3651 output = m.IntPtrSub(output, elem_size);
3682 } 3652 }
3683 m.Return(input); 3653 m.Return(input);
3684 CHECK_EQ(&inputs[kInputSize], m.Call()); 3654 CHECK_EQ(&inputs[kInputSize], m.Call());
3685 for (int i = 0; i < kInputSize; i++) { 3655 for (int i = 0; i < kInputSize; i++) {
3686 CHECK_EQ(i, inputs[i]); 3656 CHECK_EQ(i, inputs[i]);
3687 CHECK_EQ(kInputSize - i - 1, outputs[i]); 3657 CHECK_EQ(kInputSize - i - 1, outputs[i]);
3688 } 3658 }
3689 } 3659 }
(...skipping 20 matching lines...) Expand all
3710 m.Word32Shl(bt.param0, m.Int32Sub(m.Int32Constant(32), bt.param1)), 3680 m.Word32Shl(bt.param0, m.Int32Sub(m.Int32Constant(32), bt.param1)),
3711 m.Word32Shr(bt.param0, bt.param1))); 3681 m.Word32Shr(bt.param0, bt.param1)));
3712 bt.Run(ValueHelper::uint32_vector(), ValueHelper::ror_vector(), rotr32); 3682 bt.Run(ValueHelper::uint32_vector(), ValueHelper::ror_vector(), rotr32);
3713 } 3683 }
3714 } 3684 }
3715 3685
3716 3686
3717 TEST(RunTestInt32RotateRightImm) { 3687 TEST(RunTestInt32RotateRightImm) {
3718 FOR_INPUTS(uint32_t, ror, i) { 3688 FOR_INPUTS(uint32_t, ror, i) {
3719 { 3689 {
3720 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 3690 RawMachineAssemblerTester<int32_t> m(kMachUint32);
3721 Node* value = m.Parameter(0); 3691 Node* value = m.Parameter(0);
3722 m.Return(m.Word32Or(m.Word32Shr(value, m.Int32Constant(*i)), 3692 m.Return(m.Word32Or(m.Word32Shr(value, m.Int32Constant(*i)),
3723 m.Word32Shl(value, m.Int32Constant(32 - *i)))); 3693 m.Word32Shl(value, m.Int32Constant(32 - *i))));
3724 m.Run(ValueHelper::uint32_vector(), 3694 m.Run(ValueHelper::uint32_vector(),
3725 std::bind2nd(std::ptr_fun(&rotr32), *i)); 3695 std::bind2nd(std::ptr_fun(&rotr32), *i));
3726 } 3696 }
3727 { 3697 {
3728 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 3698 RawMachineAssemblerTester<int32_t> m(kMachUint32);
3729 Node* value = m.Parameter(0); 3699 Node* value = m.Parameter(0);
3730 m.Return(m.Word32Or(m.Word32Shl(value, m.Int32Constant(32 - *i)), 3700 m.Return(m.Word32Or(m.Word32Shl(value, m.Int32Constant(32 - *i)),
3731 m.Word32Shr(value, m.Int32Constant(*i)))); 3701 m.Word32Shr(value, m.Int32Constant(*i))));
3732 m.Run(ValueHelper::uint32_vector(), 3702 m.Run(ValueHelper::uint32_vector(),
3733 std::bind2nd(std::ptr_fun(&rotr32), *i)); 3703 std::bind2nd(std::ptr_fun(&rotr32), *i));
3734 } 3704 }
3735 } 3705 }
3736 } 3706 }
3737 3707
3738 3708
3739 TEST(RunSpillLotsOfThings) { 3709 TEST(RunSpillLotsOfThings) {
3740 static const int kInputSize = 1000; 3710 static const int kInputSize = 1000;
3741 RawMachineAssemblerTester<void> m; 3711 RawMachineAssemblerTester<void> m;
3742 Node* accs[kInputSize]; 3712 Node* accs[kInputSize];
3743 int32_t outputs[kInputSize]; 3713 int32_t outputs[kInputSize];
3744 Node* one = m.Int32Constant(1); 3714 Node* one = m.Int32Constant(1);
3745 Node* acc = one; 3715 Node* acc = one;
3746 for (int i = 0; i < kInputSize; i++) { 3716 for (int i = 0; i < kInputSize; i++) {
3747 acc = m.Int32Add(acc, one); 3717 acc = m.Int32Add(acc, one);
3748 accs[i] = acc; 3718 accs[i] = acc;
3749 } 3719 }
3750 for (int i = 0; i < kInputSize; i++) { 3720 for (int i = 0; i < kInputSize; i++) {
3751 m.StoreToPointer(&outputs[i], kMachineWord32, accs[i]); 3721 m.StoreToPointer(&outputs[i], kMachInt32, accs[i]);
3752 } 3722 }
3753 m.Return(one); 3723 m.Return(one);
3754 m.Call(); 3724 m.Call();
3755 for (int i = 0; i < kInputSize; i++) { 3725 for (int i = 0; i < kInputSize; i++) {
3756 CHECK_EQ(outputs[i], i + 2); 3726 CHECK_EQ(outputs[i], i + 2);
3757 } 3727 }
3758 } 3728 }
3759 3729
3760 3730
3761 TEST(RunSpillConstantsAndParameters) { 3731 TEST(RunSpillConstantsAndParameters) {
3762 static const int kInputSize = 1000; 3732 static const int kInputSize = 1000;
3763 static const int32_t kBase = 987; 3733 static const int32_t kBase = 987;
3764 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); 3734 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32);
3765 int32_t outputs[kInputSize]; 3735 int32_t outputs[kInputSize];
3766 Node* csts[kInputSize]; 3736 Node* csts[kInputSize];
3767 Node* accs[kInputSize]; 3737 Node* accs[kInputSize];
3768 Node* acc = m.Int32Constant(0); 3738 Node* acc = m.Int32Constant(0);
3769 for (int i = 0; i < kInputSize; i++) { 3739 for (int i = 0; i < kInputSize; i++) {
3770 csts[i] = m.Int32Constant(static_cast<int32_t>(kBase + i)); 3740 csts[i] = m.Int32Constant(static_cast<int32_t>(kBase + i));
3771 } 3741 }
3772 for (int i = 0; i < kInputSize; i++) { 3742 for (int i = 0; i < kInputSize; i++) {
3773 acc = m.Int32Add(acc, csts[i]); 3743 acc = m.Int32Add(acc, csts[i]);
3774 accs[i] = acc; 3744 accs[i] = acc;
3775 } 3745 }
3776 for (int i = 0; i < kInputSize; i++) { 3746 for (int i = 0; i < kInputSize; i++) {
3777 m.StoreToPointer(&outputs[i], kMachineWord32, accs[i]); 3747 m.StoreToPointer(&outputs[i], kMachInt32, accs[i]);
3778 } 3748 }
3779 m.Return(m.Int32Add(acc, m.Int32Add(m.Parameter(0), m.Parameter(1)))); 3749 m.Return(m.Int32Add(acc, m.Int32Add(m.Parameter(0), m.Parameter(1))));
3780 FOR_INT32_INPUTS(i) { 3750 FOR_INT32_INPUTS(i) {
3781 FOR_INT32_INPUTS(j) { 3751 FOR_INT32_INPUTS(j) {
3782 int32_t expected = *i + *j; 3752 int32_t expected = *i + *j;
3783 for (int k = 0; k < kInputSize; k++) { 3753 for (int k = 0; k < kInputSize; k++) {
3784 expected += kBase + k; 3754 expected += kBase + k;
3785 } 3755 }
3786 CHECK_EQ(expected, m.Call(*i, *j)); 3756 CHECK_EQ(expected, m.Call(*i, *j));
3787 expected = 0; 3757 expected = 0;
3788 for (int k = 0; k < kInputSize; k++) { 3758 for (int k = 0; k < kInputSize; k++) {
3789 expected += kBase + k; 3759 expected += kBase + k;
3790 CHECK_EQ(expected, outputs[k]); 3760 CHECK_EQ(expected, outputs[k]);
3791 } 3761 }
3792 } 3762 }
3793 } 3763 }
3794 } 3764 }
3795 3765
3796 3766
3797 TEST(RunNewSpaceConstantsInPhi) { 3767 TEST(RunNewSpaceConstantsInPhi) {
3798 RawMachineAssemblerTester<Object*> m(kMachineWord32); 3768 RawMachineAssemblerTester<Object*> m(kMachInt32);
3799 3769
3800 Isolate* isolate = CcTest::i_isolate(); 3770 Isolate* isolate = CcTest::i_isolate();
3801 Handle<HeapNumber> true_val = isolate->factory()->NewHeapNumber(11.2); 3771 Handle<HeapNumber> true_val = isolate->factory()->NewHeapNumber(11.2);
3802 Handle<HeapNumber> false_val = isolate->factory()->NewHeapNumber(11.3); 3772 Handle<HeapNumber> false_val = isolate->factory()->NewHeapNumber(11.3);
3803 Node* true_node = m.HeapConstant(true_val); 3773 Node* true_node = m.HeapConstant(true_val);
3804 Node* false_node = m.HeapConstant(false_val); 3774 Node* false_node = m.HeapConstant(false_val);
3805 3775
3806 MLabel blocka, blockb, end; 3776 MLabel blocka, blockb, end;
3807 m.Branch(m.Parameter(0), &blocka, &blockb); 3777 m.Branch(m.Parameter(0), &blocka, &blockb);
3808 m.Bind(&blocka); 3778 m.Bind(&blocka);
(...skipping 21 matching lines...) Expand all
3830 Node* acc = one; 3800 Node* acc = one;
3831 for (int i = 0; i < kInputSize; i++) { 3801 for (int i = 0; i < kInputSize; i++) {
3832 acc = m.Int32Add(acc, one); 3802 acc = m.Int32Add(acc, one);
3833 accs[i] = acc; 3803 accs[i] = acc;
3834 } 3804 }
3835 // If the spill slot computation is wrong, it might load from the c frame 3805 // If the spill slot computation is wrong, it might load from the c frame
3836 { 3806 {
3837 void* func = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); 3807 void* func = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven));
3838 Node** args = NULL; 3808 Node** args = NULL;
3839 MachineType* arg_types = NULL; 3809 MachineType* arg_types = NULL;
3840 m.CallC(m.PointerConstant(func), kMachineWord32, arg_types, args, 0); 3810 m.CallC(m.PointerConstant(func), kMachInt32, arg_types, args, 0);
3841 } 3811 }
3842 for (int i = 0; i < kInputSize; i++) { 3812 for (int i = 0; i < kInputSize; i++) {
3843 m.StoreToPointer(&outputs[i], kMachineWord32, accs[i]); 3813 m.StoreToPointer(&outputs[i], kMachInt32, accs[i]);
3844 } 3814 }
3845 m.Return(one); 3815 m.Return(one);
3846 m.Call(); 3816 m.Call();
3847 for (int i = 0; i < kInputSize; i++) { 3817 for (int i = 0; i < kInputSize; i++) {
3848 CHECK_EQ(outputs[i], i + 2); 3818 CHECK_EQ(outputs[i], i + 2);
3849 } 3819 }
3850 } 3820 }
3851 3821
3852 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C 3822 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C
3853 3823
(...skipping 14 matching lines...) Expand all
3868 } 3838 }
3869 3839
3870 3840
3871 TEST(RunInt32AddWithOverflowP) { 3841 TEST(RunInt32AddWithOverflowP) {
3872 int32_t actual_val = -1; 3842 int32_t actual_val = -1;
3873 RawMachineAssemblerTester<int32_t> m; 3843 RawMachineAssemblerTester<int32_t> m;
3874 Int32BinopTester bt(&m); 3844 Int32BinopTester bt(&m);
3875 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); 3845 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1);
3876 Node* val = m.Projection(0, add); 3846 Node* val = m.Projection(0, add);
3877 Node* ovf = m.Projection(1, add); 3847 Node* ovf = m.Projection(1, add);
3878 m.StoreToPointer(&actual_val, kMachineWord32, val); 3848 m.StoreToPointer(&actual_val, kMachInt32, val);
3879 bt.AddReturn(ovf); 3849 bt.AddReturn(ovf);
3880 FOR_INT32_INPUTS(i) { 3850 FOR_INT32_INPUTS(i) {
3881 FOR_INT32_INPUTS(j) { 3851 FOR_INT32_INPUTS(j) {
3882 int32_t expected_val; 3852 int32_t expected_val;
3883 int expected_ovf = sadd_overflow(*i, *j, &expected_val); 3853 int expected_ovf = sadd_overflow(*i, *j, &expected_val);
3884 CHECK_EQ(expected_ovf, bt.call(*i, *j)); 3854 CHECK_EQ(expected_ovf, bt.call(*i, *j));
3885 CHECK_EQ(expected_val, actual_val); 3855 CHECK_EQ(expected_val, actual_val);
3886 } 3856 }
3887 } 3857 }
3888 } 3858 }
3889 3859
3890 3860
3891 TEST(RunInt32AddWithOverflowImm) { 3861 TEST(RunInt32AddWithOverflowImm) {
3892 int32_t actual_val = -1, expected_val = 0; 3862 int32_t actual_val = -1, expected_val = 0;
3893 FOR_INT32_INPUTS(i) { 3863 FOR_INT32_INPUTS(i) {
3894 { 3864 {
3895 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 3865 RawMachineAssemblerTester<int32_t> m(kMachInt32);
3896 Node* add = m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0)); 3866 Node* add = m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0));
3897 Node* val = m.Projection(0, add); 3867 Node* val = m.Projection(0, add);
3898 Node* ovf = m.Projection(1, add); 3868 Node* ovf = m.Projection(1, add);
3899 m.StoreToPointer(&actual_val, kMachineWord32, val); 3869 m.StoreToPointer(&actual_val, kMachInt32, val);
3900 m.Return(ovf); 3870 m.Return(ovf);
3901 FOR_INT32_INPUTS(j) { 3871 FOR_INT32_INPUTS(j) {
3902 int expected_ovf = sadd_overflow(*i, *j, &expected_val); 3872 int expected_ovf = sadd_overflow(*i, *j, &expected_val);
3903 CHECK_EQ(expected_ovf, m.Call(*j)); 3873 CHECK_EQ(expected_ovf, m.Call(*j));
3904 CHECK_EQ(expected_val, actual_val); 3874 CHECK_EQ(expected_val, actual_val);
3905 } 3875 }
3906 } 3876 }
3907 { 3877 {
3908 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 3878 RawMachineAssemblerTester<int32_t> m(kMachInt32);
3909 Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i)); 3879 Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i));
3910 Node* val = m.Projection(0, add); 3880 Node* val = m.Projection(0, add);
3911 Node* ovf = m.Projection(1, add); 3881 Node* ovf = m.Projection(1, add);
3912 m.StoreToPointer(&actual_val, kMachineWord32, val); 3882 m.StoreToPointer(&actual_val, kMachInt32, val);
3913 m.Return(ovf); 3883 m.Return(ovf);
3914 FOR_INT32_INPUTS(j) { 3884 FOR_INT32_INPUTS(j) {
3915 int expected_ovf = sadd_overflow(*i, *j, &expected_val); 3885 int expected_ovf = sadd_overflow(*i, *j, &expected_val);
3916 CHECK_EQ(expected_ovf, m.Call(*j)); 3886 CHECK_EQ(expected_ovf, m.Call(*j));
3917 CHECK_EQ(expected_val, actual_val); 3887 CHECK_EQ(expected_val, actual_val);
3918 } 3888 }
3919 } 3889 }
3920 FOR_INT32_INPUTS(j) { 3890 FOR_INT32_INPUTS(j) {
3921 RawMachineAssemblerTester<int32_t> m; 3891 RawMachineAssemblerTester<int32_t> m;
3922 Node* add = 3892 Node* add =
3923 m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); 3893 m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j));
3924 Node* val = m.Projection(0, add); 3894 Node* val = m.Projection(0, add);
3925 Node* ovf = m.Projection(1, add); 3895 Node* ovf = m.Projection(1, add);
3926 m.StoreToPointer(&actual_val, kMachineWord32, val); 3896 m.StoreToPointer(&actual_val, kMachInt32, val);
3927 m.Return(ovf); 3897 m.Return(ovf);
3928 int expected_ovf = sadd_overflow(*i, *j, &expected_val); 3898 int expected_ovf = sadd_overflow(*i, *j, &expected_val);
3929 CHECK_EQ(expected_ovf, m.Call()); 3899 CHECK_EQ(expected_ovf, m.Call());
3930 CHECK_EQ(expected_val, actual_val); 3900 CHECK_EQ(expected_val, actual_val);
3931 } 3901 }
3932 } 3902 }
3933 } 3903 }
3934 3904
3935 3905
3936 TEST(RunInt32AddWithOverflowInBranchP) { 3906 TEST(RunInt32AddWithOverflowInBranchP) {
3937 int constant = 911777; 3907 int constant = 911777;
3938 MLabel blocka, blockb; 3908 MLabel blocka, blockb;
3939 RawMachineAssemblerTester<int32_t> m; 3909 RawMachineAssemblerTester<int32_t> m;
3940 Int32BinopTester bt(&m); 3910 Int32BinopTester bt(&m);
3941 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); 3911 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1);
3942 Node* ovf = m.Projection(1, add); 3912 Node* ovf = m.Projection(1, add);
3943 m.Branch(ovf, &blocka, &blockb); 3913 m.Branch(ovf, &blocka, &blockb);
3944 m.Bind(&blocka); 3914 m.Bind(&blocka);
3945 bt.AddReturn(m.Int32Constant(constant)); 3915 bt.AddReturn(m.Int32Constant(constant));
3946 m.Bind(&blockb); 3916 m.Bind(&blockb);
3947 Node* val = m.Projection(0, add); 3917 Node* val = m.Projection(0, add);
3948 bt.AddReturn(val); 3918 bt.AddReturn(val);
3949 FOR_UINT32_INPUTS(i) { 3919 FOR_INT32_INPUTS(i) {
3950 FOR_UINT32_INPUTS(j) { 3920 FOR_INT32_INPUTS(j) {
3951 int32_t expected; 3921 int32_t expected;
3952 if (sadd_overflow(*i, *j, &expected)) expected = constant; 3922 if (sadd_overflow(*i, *j, &expected)) expected = constant;
3953 CHECK_EQ(expected, bt.call(*i, *j)); 3923 CHECK_EQ(expected, bt.call(*i, *j));
3954 } 3924 }
3955 } 3925 }
3956 } 3926 }
3957 3927
3958 3928
3959 TEST(RunInt32SubWithOverflowP) { 3929 TEST(RunInt32SubWithOverflowP) {
3960 int32_t actual_val = -1; 3930 int32_t actual_val = -1;
3961 RawMachineAssemblerTester<int32_t> m; 3931 RawMachineAssemblerTester<int32_t> m;
3962 Int32BinopTester bt(&m); 3932 Int32BinopTester bt(&m);
3963 Node* add = m.Int32SubWithOverflow(bt.param0, bt.param1); 3933 Node* add = m.Int32SubWithOverflow(bt.param0, bt.param1);
3964 Node* val = m.Projection(0, add); 3934 Node* val = m.Projection(0, add);
3965 Node* ovf = m.Projection(1, add); 3935 Node* ovf = m.Projection(1, add);
3966 m.StoreToPointer(&actual_val, kMachineWord32, val); 3936 m.StoreToPointer(&actual_val, kMachInt32, val);
3967 bt.AddReturn(ovf); 3937 bt.AddReturn(ovf);
3968 FOR_INT32_INPUTS(i) { 3938 FOR_INT32_INPUTS(i) {
3969 FOR_INT32_INPUTS(j) { 3939 FOR_INT32_INPUTS(j) {
3970 int32_t expected_val; 3940 int32_t expected_val;
3971 int expected_ovf = ssub_overflow(*i, *j, &expected_val); 3941 int expected_ovf = ssub_overflow(*i, *j, &expected_val);
3972 CHECK_EQ(expected_ovf, bt.call(*i, *j)); 3942 CHECK_EQ(expected_ovf, bt.call(*i, *j));
3973 CHECK_EQ(expected_val, actual_val); 3943 CHECK_EQ(expected_val, actual_val);
3974 } 3944 }
3975 } 3945 }
3976 } 3946 }
3977 3947
3978 3948
3979 TEST(RunInt32SubWithOverflowImm) { 3949 TEST(RunInt32SubWithOverflowImm) {
3980 int32_t actual_val = -1, expected_val = 0; 3950 int32_t actual_val = -1, expected_val = 0;
3981 FOR_INT32_INPUTS(i) { 3951 FOR_INT32_INPUTS(i) {
3982 { 3952 {
3983 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 3953 RawMachineAssemblerTester<int32_t> m(kMachInt32);
3984 Node* add = m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0)); 3954 Node* add = m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0));
3985 Node* val = m.Projection(0, add); 3955 Node* val = m.Projection(0, add);
3986 Node* ovf = m.Projection(1, add); 3956 Node* ovf = m.Projection(1, add);
3987 m.StoreToPointer(&actual_val, kMachineWord32, val); 3957 m.StoreToPointer(&actual_val, kMachInt32, val);
3988 m.Return(ovf); 3958 m.Return(ovf);
3989 FOR_INT32_INPUTS(j) { 3959 FOR_INT32_INPUTS(j) {
3990 int expected_ovf = ssub_overflow(*i, *j, &expected_val); 3960 int expected_ovf = ssub_overflow(*i, *j, &expected_val);
3991 CHECK_EQ(expected_ovf, m.Call(*j)); 3961 CHECK_EQ(expected_ovf, m.Call(*j));
3992 CHECK_EQ(expected_val, actual_val); 3962 CHECK_EQ(expected_val, actual_val);
3993 } 3963 }
3994 } 3964 }
3995 { 3965 {
3996 RawMachineAssemblerTester<int32_t> m(kMachineWord32); 3966 RawMachineAssemblerTester<int32_t> m(kMachInt32);
3997 Node* add = m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i)); 3967 Node* add = m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i));
3998 Node* val = m.Projection(0, add); 3968 Node* val = m.Projection(0, add);
3999 Node* ovf = m.Projection(1, add); 3969 Node* ovf = m.Projection(1, add);
4000 m.StoreToPointer(&actual_val, kMachineWord32, val); 3970 m.StoreToPointer(&actual_val, kMachInt32, val);
4001 m.Return(ovf); 3971 m.Return(ovf);
4002 FOR_INT32_INPUTS(j) { 3972 FOR_INT32_INPUTS(j) {
4003 int expected_ovf = ssub_overflow(*j, *i, &expected_val); 3973 int expected_ovf = ssub_overflow(*j, *i, &expected_val);
4004 CHECK_EQ(expected_ovf, m.Call(*j)); 3974 CHECK_EQ(expected_ovf, m.Call(*j));
4005 CHECK_EQ(expected_val, actual_val); 3975 CHECK_EQ(expected_val, actual_val);
4006 } 3976 }
4007 } 3977 }
4008 FOR_INT32_INPUTS(j) { 3978 FOR_INT32_INPUTS(j) {
4009 RawMachineAssemblerTester<int32_t> m; 3979 RawMachineAssemblerTester<int32_t> m;
4010 Node* add = 3980 Node* add =
4011 m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); 3981 m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j));
4012 Node* val = m.Projection(0, add); 3982 Node* val = m.Projection(0, add);
4013 Node* ovf = m.Projection(1, add); 3983 Node* ovf = m.Projection(1, add);
4014 m.StoreToPointer(&actual_val, kMachineWord32, val); 3984 m.StoreToPointer(&actual_val, kMachInt32, val);
4015 m.Return(ovf); 3985 m.Return(ovf);
4016 int expected_ovf = ssub_overflow(*i, *j, &expected_val); 3986 int expected_ovf = ssub_overflow(*i, *j, &expected_val);
4017 CHECK_EQ(expected_ovf, m.Call()); 3987 CHECK_EQ(expected_ovf, m.Call());
4018 CHECK_EQ(expected_val, actual_val); 3988 CHECK_EQ(expected_val, actual_val);
4019 } 3989 }
4020 } 3990 }
4021 } 3991 }
4022 3992
4023 3993
4024 TEST(RunInt32SubWithOverflowInBranchP) { 3994 TEST(RunInt32SubWithOverflowInBranchP) {
4025 int constant = 911999; 3995 int constant = 911999;
4026 MLabel blocka, blockb; 3996 MLabel blocka, blockb;
4027 RawMachineAssemblerTester<int32_t> m; 3997 RawMachineAssemblerTester<int32_t> m;
4028 Int32BinopTester bt(&m); 3998 Int32BinopTester bt(&m);
4029 Node* sub = m.Int32SubWithOverflow(bt.param0, bt.param1); 3999 Node* sub = m.Int32SubWithOverflow(bt.param0, bt.param1);
4030 Node* ovf = m.Projection(1, sub); 4000 Node* ovf = m.Projection(1, sub);
4031 m.Branch(ovf, &blocka, &blockb); 4001 m.Branch(ovf, &blocka, &blockb);
4032 m.Bind(&blocka); 4002 m.Bind(&blocka);
4033 bt.AddReturn(m.Int32Constant(constant)); 4003 bt.AddReturn(m.Int32Constant(constant));
4034 m.Bind(&blockb); 4004 m.Bind(&blockb);
4035 Node* val = m.Projection(0, sub); 4005 Node* val = m.Projection(0, sub);
4036 bt.AddReturn(val); 4006 bt.AddReturn(val);
4037 FOR_UINT32_INPUTS(i) { 4007 FOR_INT32_INPUTS(i) {
4038 FOR_UINT32_INPUTS(j) { 4008 FOR_INT32_INPUTS(j) {
4039 int32_t expected; 4009 int32_t expected;
4040 if (ssub_overflow(*i, *j, &expected)) expected = constant; 4010 if (ssub_overflow(*i, *j, &expected)) expected = constant;
4041 CHECK_EQ(expected, bt.call(*i, *j)); 4011 CHECK_EQ(expected, bt.call(*i, *j));
4042 } 4012 }
4043 } 4013 }
4044 } 4014 }
4045 4015
4046 #endif // V8_TURBOFAN_TARGET 4016 #endif // V8_TURBOFAN_TARGET
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698