| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <functional> | 5 #include <functional> |
| 6 #include <limits> | 6 #include <limits> |
| 7 | 7 |
| 8 #include "test/cctest/cctest.h" | 8 #include "test/cctest/cctest.h" |
| 9 #include "test/cctest/compiler/codegen-tester.h" | 9 #include "test/cctest/compiler/codegen-tester.h" |
| 10 #include "test/cctest/compiler/value-helper.h" | 10 #include "test/cctest/compiler/value-helper.h" |
| 11 | 11 |
| 12 #if V8_TURBOFAN_TARGET | 12 #if V8_TURBOFAN_TARGET |
| 13 | 13 |
| 14 #define CHECK_UINT32_EQ(x, y) \ |
| 15 CHECK_EQ(static_cast<int32_t>(x), static_cast<int32_t>(y)) |
| 16 |
| 14 using namespace v8::internal; | 17 using namespace v8::internal; |
| 15 using namespace v8::internal::compiler; | 18 using namespace v8::internal::compiler; |
| 16 | 19 |
| 17 typedef RawMachineAssembler::Label MLabel; | 20 typedef RawMachineAssembler::Label MLabel; |
| 18 | 21 |
| 19 TEST(RunInt32Add) { | 22 TEST(RunInt32Add) { |
| 20 RawMachineAssemblerTester<int32_t> m; | 23 RawMachineAssemblerTester<int32_t> m; |
| 21 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); | 24 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); |
| 22 m.Return(add); | 25 m.Return(add); |
| 23 CHECK_EQ(1, m.Call()); | 26 CHECK_EQ(1, m.Call()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 34 return m->Int32Constant(0); | 37 return m->Int32Constant(0); |
| 35 case 3: | 38 case 3: |
| 36 return m->Int32Constant(1); | 39 return m->Int32Constant(1); |
| 37 case 4: | 40 case 4: |
| 38 return m->Int32Constant(-1); | 41 return m->Int32Constant(-1); |
| 39 case 5: | 42 case 5: |
| 40 return m->Int32Constant(0xff); | 43 return m->Int32Constant(0xff); |
| 41 case 6: | 44 case 6: |
| 42 return m->Int32Constant(0x01234567); | 45 return m->Int32Constant(0x01234567); |
| 43 case 7: | 46 case 7: |
| 44 return m->Load(kMachineWord32, m->PointerConstant(NULL)); | 47 return m->Load(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 Loading... |
| 211 m->Bind(&blockb); | 214 m->Bind(&blockb); |
| 212 m->Goto(end); | 215 m->Goto(end); |
| 213 | 216 |
| 214 m->Bind(end); | 217 m->Bind(end); |
| 215 Node* phi = m->Phi(true_node, false_node); | 218 Node* phi = m->Phi(true_node, false_node); |
| 216 m->Return(phi); | 219 m->Return(phi); |
| 217 } | 220 } |
| 218 | 221 |
| 219 | 222 |
| 220 TEST(RunDiamondPhiConst) { | 223 TEST(RunDiamondPhiConst) { |
| 221 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 224 RawMachineAssemblerTester<int32_t> m(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 Loading... |
| 286 m.Bind(&body); | 288 m.Bind(&body); |
| 287 m.Goto(&header); | 289 m.Goto(&header); |
| 288 m.Bind(end); | 290 m.Bind(end); |
| 289 m.Return(phi); | 291 m.Return(phi); |
| 290 | 292 |
| 291 CHECK_EQ(false_val, m.Call()); | 293 CHECK_EQ(false_val, m.Call()); |
| 292 } | 294 } |
| 293 | 295 |
| 294 | 296 |
| 295 TEST(RunLoopPhiParam) { | 297 TEST(RunLoopPhiParam) { |
| 296 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 298 RawMachineAssemblerTester<int32_t> m(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 Loading... |
| 485 m.Return(m.ChangeFloat64ToInt32(phi)); | 486 m.Return(m.ChangeFloat64ToInt32(phi)); |
| 486 | 487 |
| 487 CHECK_EQ(10, m.Call()); | 488 CHECK_EQ(10, m.Call()); |
| 488 } | 489 } |
| 489 | 490 |
| 490 | 491 |
| 491 TEST(RunLoadInt32) { | 492 TEST(RunLoadInt32) { |
| 492 RawMachineAssemblerTester<int32_t> m; | 493 RawMachineAssemblerTester<int32_t> m; |
| 493 | 494 |
| 494 int32_t p1 = 0; // loads directly from this location. | 495 int32_t p1 = 0; // loads directly from this location. |
| 495 m.Return(m.LoadFromPointer(&p1, kMachineWord32)); | 496 m.Return(m.LoadFromPointer(&p1, 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 Loading... |
| 560 // Use uint32_t because signed overflow is UB in C. | 560 // Use uint32_t because signed overflow is UB in C. |
| 561 int expected = static_cast<int32_t>(*i + *j); | 561 int expected = static_cast<int32_t>(*i + *j); |
| 562 CHECK_EQ(expected, bt.call(*i, *j)); | 562 CHECK_EQ(expected, bt.call(*i, *j)); |
| 563 } | 563 } |
| 564 } | 564 } |
| 565 } | 565 } |
| 566 | 566 |
| 567 | 567 |
| 568 TEST(RunInt32AddAndWord32SarP) { | 568 TEST(RunInt32AddAndWord32SarP) { |
| 569 { | 569 { |
| 570 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 570 RawMachineAssemblerTester<int32_t> m(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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |