| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 __ Move(rdx, Smi::FromInt(y)); | 192 __ Move(rdx, Smi::FromInt(y)); |
| 193 __ movq(r9, rdx); | 193 __ movq(r9, rdx); |
| 194 __ SmiCompare(rcx, rdx); | 194 __ SmiCompare(rcx, rdx); |
| 195 if (x < y) { | 195 if (x < y) { |
| 196 __ movl(rax, Immediate(id + 1)); | 196 __ movl(rax, Immediate(id + 1)); |
| 197 __ j(greater_equal, exit); | 197 __ j(greater_equal, exit); |
| 198 } else if (x > y) { | 198 } else if (x > y) { |
| 199 __ movl(rax, Immediate(id + 2)); | 199 __ movl(rax, Immediate(id + 2)); |
| 200 __ j(less_equal, exit); | 200 __ j(less_equal, exit); |
| 201 } else { | 201 } else { |
| 202 DCHECK_EQ(x, y); | 202 CHECK_EQ(x, y); |
| 203 __ movl(rax, Immediate(id + 3)); | 203 __ movl(rax, Immediate(id + 3)); |
| 204 __ j(not_equal, exit); | 204 __ j(not_equal, exit); |
| 205 } | 205 } |
| 206 __ movl(rax, Immediate(id + 4)); | 206 __ movl(rax, Immediate(id + 4)); |
| 207 __ cmpq(rcx, r8); | 207 __ cmpq(rcx, r8); |
| 208 __ j(not_equal, exit); | 208 __ j(not_equal, exit); |
| 209 __ incq(rax); | 209 __ incq(rax); |
| 210 __ cmpq(rdx, r9); | 210 __ cmpq(rdx, r9); |
| 211 __ j(not_equal, exit); | 211 __ j(not_equal, exit); |
| 212 | 212 |
| 213 if (x != y) { | 213 if (x != y) { |
| 214 __ SmiCompare(rdx, rcx); | 214 __ SmiCompare(rdx, rcx); |
| 215 if (y < x) { | 215 if (y < x) { |
| 216 __ movl(rax, Immediate(id + 9)); | 216 __ movl(rax, Immediate(id + 9)); |
| 217 __ j(greater_equal, exit); | 217 __ j(greater_equal, exit); |
| 218 } else { | 218 } else { |
| 219 DCHECK(y > x); | 219 CHECK(y > x); |
| 220 __ movl(rax, Immediate(id + 10)); | 220 __ movl(rax, Immediate(id + 10)); |
| 221 __ j(less_equal, exit); | 221 __ j(less_equal, exit); |
| 222 } | 222 } |
| 223 } else { | 223 } else { |
| 224 __ cmpq(rcx, rcx); | 224 __ cmpq(rcx, rcx); |
| 225 __ movl(rax, Immediate(id + 11)); | 225 __ movl(rax, Immediate(id + 11)); |
| 226 __ j(not_equal, exit); | 226 __ j(not_equal, exit); |
| 227 __ incq(rax); | 227 __ incq(rax); |
| 228 __ cmpq(rcx, r8); | 228 __ cmpq(rcx, r8); |
| 229 __ j(not_equal, exit); | 229 __ j(not_equal, exit); |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 CHECK_EQ(0, result); | 381 CHECK_EQ(0, result); |
| 382 } | 382 } |
| 383 | 383 |
| 384 | 384 |
| 385 void TestI64PlusConstantToSmi(MacroAssembler* masm, | 385 void TestI64PlusConstantToSmi(MacroAssembler* masm, |
| 386 Label* exit, | 386 Label* exit, |
| 387 int id, | 387 int id, |
| 388 int64_t x, | 388 int64_t x, |
| 389 int y) { | 389 int y) { |
| 390 int64_t result = x + y; | 390 int64_t result = x + y; |
| 391 DCHECK(Smi::IsValid(result)); | 391 CHECK(Smi::IsValid(result)); |
| 392 __ movl(rax, Immediate(id)); | 392 __ movl(rax, Immediate(id)); |
| 393 __ Move(r8, Smi::FromInt(static_cast<int>(result))); | 393 __ Move(r8, Smi::FromInt(static_cast<int>(result))); |
| 394 __ movq(rcx, x); | 394 __ movq(rcx, x); |
| 395 __ movq(r11, rcx); | 395 __ movq(r11, rcx); |
| 396 __ Integer64PlusConstantToSmi(rdx, rcx, y); | 396 __ Integer64PlusConstantToSmi(rdx, rcx, y); |
| 397 __ cmpq(rdx, r8); | 397 __ cmpq(rdx, r8); |
| 398 __ j(not_equal, exit); | 398 __ j(not_equal, exit); |
| 399 | 399 |
| 400 __ incq(rax); | 400 __ incq(rax); |
| 401 __ cmpq(r11, rcx); | 401 __ cmpq(r11, rcx); |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 771 __ cmpq(rcx, r8); | 771 __ cmpq(rcx, r8); |
| 772 __ j(not_equal, exit); | 772 __ j(not_equal, exit); |
| 773 } | 773 } |
| 774 | 774 |
| 775 | 775 |
| 776 static void SmiAddOverflowTest(MacroAssembler* masm, | 776 static void SmiAddOverflowTest(MacroAssembler* masm, |
| 777 Label* exit, | 777 Label* exit, |
| 778 int id, | 778 int id, |
| 779 int x) { | 779 int x) { |
| 780 // Adds a Smi to x so that the addition overflows. | 780 // Adds a Smi to x so that the addition overflows. |
| 781 DCHECK(x != 0); // Can't overflow by adding a Smi. | 781 CHECK(x != 0); // Can't overflow by adding a Smi. |
| 782 int y_max = (x > 0) ? (Smi::kMaxValue + 0) : (Smi::kMinValue - x - 1); | 782 int y_max = (x > 0) ? (Smi::kMaxValue + 0) : (Smi::kMinValue - x - 1); |
| 783 int y_min = (x > 0) ? (Smi::kMaxValue - x + 1) : (Smi::kMinValue + 0); | 783 int y_min = (x > 0) ? (Smi::kMaxValue - x + 1) : (Smi::kMinValue + 0); |
| 784 | 784 |
| 785 __ movl(rax, Immediate(id)); | 785 __ movl(rax, Immediate(id)); |
| 786 __ Move(rcx, Smi::FromInt(x)); | 786 __ Move(rcx, Smi::FromInt(x)); |
| 787 __ movq(r11, rcx); // Store original Smi value of x in r11. | 787 __ movq(r11, rcx); // Store original Smi value of x in r11. |
| 788 __ Move(rdx, Smi::FromInt(y_min)); | 788 __ Move(rdx, Smi::FromInt(y_min)); |
| 789 { | 789 { |
| 790 Label overflow_ok; | 790 Label overflow_ok; |
| 791 __ SmiAdd(r9, rcx, rdx, &overflow_ok); | 791 __ SmiAdd(r9, rcx, rdx, &overflow_ok); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 986 __ cmpq(rcx, r8); | 986 __ cmpq(rcx, r8); |
| 987 __ j(not_equal, exit); | 987 __ j(not_equal, exit); |
| 988 } | 988 } |
| 989 | 989 |
| 990 | 990 |
| 991 static void SmiSubOverflowTest(MacroAssembler* masm, | 991 static void SmiSubOverflowTest(MacroAssembler* masm, |
| 992 Label* exit, | 992 Label* exit, |
| 993 int id, | 993 int id, |
| 994 int x) { | 994 int x) { |
| 995 // Subtracts a Smi from x so that the subtraction overflows. | 995 // Subtracts a Smi from x so that the subtraction overflows. |
| 996 DCHECK(x != -1); // Can't overflow by subtracting a Smi. | 996 CHECK(x != -1); // Can't overflow by subtracting a Smi. |
| 997 int y_max = (x < 0) ? (Smi::kMaxValue + 0) : (Smi::kMinValue + 0); | 997 int y_max = (x < 0) ? (Smi::kMaxValue + 0) : (Smi::kMinValue + 0); |
| 998 int y_min = (x < 0) ? (Smi::kMaxValue + x + 2) : (Smi::kMinValue + x); | 998 int y_min = (x < 0) ? (Smi::kMaxValue + x + 2) : (Smi::kMinValue + x); |
| 999 | 999 |
| 1000 __ movl(rax, Immediate(id)); | 1000 __ movl(rax, Immediate(id)); |
| 1001 __ Move(rcx, Smi::FromInt(x)); | 1001 __ Move(rcx, Smi::FromInt(x)); |
| 1002 __ movq(r11, rcx); // Store original Smi value of x in r11. | 1002 __ movq(r11, rcx); // Store original Smi value of x in r11. |
| 1003 __ Move(rdx, Smi::FromInt(y_min)); | 1003 __ Move(rdx, Smi::FromInt(y_min)); |
| 1004 { | 1004 { |
| 1005 Label overflow_ok; | 1005 Label overflow_ok; |
| 1006 __ SmiSub(r9, rcx, rdx, &overflow_ok); | 1006 __ SmiSub(r9, rcx, rdx, &overflow_ok); |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1454 CHECK_EQ(0, result); | 1454 CHECK_EQ(0, result); |
| 1455 } | 1455 } |
| 1456 | 1456 |
| 1457 | 1457 |
| 1458 void TestSmiIndex(MacroAssembler* masm, Label* exit, int id, int x) { | 1458 void TestSmiIndex(MacroAssembler* masm, Label* exit, int id, int x) { |
| 1459 __ movl(rax, Immediate(id)); | 1459 __ movl(rax, Immediate(id)); |
| 1460 | 1460 |
| 1461 for (int i = 0; i < 8; i++) { | 1461 for (int i = 0; i < 8; i++) { |
| 1462 __ Move(rcx, Smi::FromInt(x)); | 1462 __ Move(rcx, Smi::FromInt(x)); |
| 1463 SmiIndex index = masm->SmiToIndex(rdx, rcx, i); | 1463 SmiIndex index = masm->SmiToIndex(rdx, rcx, i); |
| 1464 DCHECK(index.reg.is(rcx) || index.reg.is(rdx)); | 1464 CHECK(index.reg.is(rcx) || index.reg.is(rdx)); |
| 1465 __ shlq(index.reg, Immediate(index.scale)); | 1465 __ shlq(index.reg, Immediate(index.scale)); |
| 1466 __ Set(r8, static_cast<intptr_t>(x) << i); | 1466 __ Set(r8, static_cast<intptr_t>(x) << i); |
| 1467 __ cmpq(index.reg, r8); | 1467 __ cmpq(index.reg, r8); |
| 1468 __ j(not_equal, exit); | 1468 __ j(not_equal, exit); |
| 1469 __ incq(rax); | 1469 __ incq(rax); |
| 1470 __ Move(rcx, Smi::FromInt(x)); | 1470 __ Move(rcx, Smi::FromInt(x)); |
| 1471 index = masm->SmiToIndex(rcx, rcx, i); | 1471 index = masm->SmiToIndex(rcx, rcx, i); |
| 1472 DCHECK(index.reg.is(rcx)); | 1472 CHECK(index.reg.is(rcx)); |
| 1473 __ shlq(rcx, Immediate(index.scale)); | 1473 __ shlq(rcx, Immediate(index.scale)); |
| 1474 __ Set(r8, static_cast<intptr_t>(x) << i); | 1474 __ Set(r8, static_cast<intptr_t>(x) << i); |
| 1475 __ cmpq(rcx, r8); | 1475 __ cmpq(rcx, r8); |
| 1476 __ j(not_equal, exit); | 1476 __ j(not_equal, exit); |
| 1477 __ incq(rax); | 1477 __ incq(rax); |
| 1478 | 1478 |
| 1479 __ Move(rcx, Smi::FromInt(x)); | 1479 __ Move(rcx, Smi::FromInt(x)); |
| 1480 index = masm->SmiToNegativeIndex(rdx, rcx, i); | 1480 index = masm->SmiToNegativeIndex(rdx, rcx, i); |
| 1481 DCHECK(index.reg.is(rcx) || index.reg.is(rdx)); | 1481 CHECK(index.reg.is(rcx) || index.reg.is(rdx)); |
| 1482 __ shlq(index.reg, Immediate(index.scale)); | 1482 __ shlq(index.reg, Immediate(index.scale)); |
| 1483 __ Set(r8, static_cast<intptr_t>(-x) << i); | 1483 __ Set(r8, static_cast<intptr_t>(-x) << i); |
| 1484 __ cmpq(index.reg, r8); | 1484 __ cmpq(index.reg, r8); |
| 1485 __ j(not_equal, exit); | 1485 __ j(not_equal, exit); |
| 1486 __ incq(rax); | 1486 __ incq(rax); |
| 1487 __ Move(rcx, Smi::FromInt(x)); | 1487 __ Move(rcx, Smi::FromInt(x)); |
| 1488 index = masm->SmiToNegativeIndex(rcx, rcx, i); | 1488 index = masm->SmiToNegativeIndex(rcx, rcx, i); |
| 1489 DCHECK(index.reg.is(rcx)); | 1489 CHECK(index.reg.is(rcx)); |
| 1490 __ shlq(rcx, Immediate(index.scale)); | 1490 __ shlq(rcx, Immediate(index.scale)); |
| 1491 __ Set(r8, static_cast<intptr_t>(-x) << i); | 1491 __ Set(r8, static_cast<intptr_t>(-x) << i); |
| 1492 __ cmpq(rcx, r8); | 1492 __ cmpq(rcx, r8); |
| 1493 __ j(not_equal, exit); | 1493 __ j(not_equal, exit); |
| 1494 __ incq(rax); | 1494 __ incq(rax); |
| 1495 } | 1495 } |
| 1496 } | 1496 } |
| 1497 | 1497 |
| 1498 | 1498 |
| 1499 TEST(SmiIndex) { | 1499 TEST(SmiIndex) { |
| (...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2160 | 2160 |
| 2161 CodeDesc desc; | 2161 CodeDesc desc; |
| 2162 masm->GetCode(&desc); | 2162 masm->GetCode(&desc); |
| 2163 // Call the function from C++. | 2163 // Call the function from C++. |
| 2164 int result = FUNCTION_CAST<F0>(buffer)(); | 2164 int result = FUNCTION_CAST<F0>(buffer)(); |
| 2165 CHECK_EQ(0, result); | 2165 CHECK_EQ(0, result); |
| 2166 } | 2166 } |
| 2167 | 2167 |
| 2168 | 2168 |
| 2169 void TestPositiveSmiPowerUp(MacroAssembler* masm, Label* exit, int id, int x) { | 2169 void TestPositiveSmiPowerUp(MacroAssembler* masm, Label* exit, int id, int x) { |
| 2170 DCHECK(x >= 0); | 2170 CHECK(x >= 0); |
| 2171 int powers[] = { 0, 1, 2, 3, 8, 16, 24, 31 }; | 2171 int powers[] = { 0, 1, 2, 3, 8, 16, 24, 31 }; |
| 2172 int power_count = 8; | 2172 int power_count = 8; |
| 2173 __ movl(rax, Immediate(id)); | 2173 __ movl(rax, Immediate(id)); |
| 2174 for (int i = 0; i < power_count; i++) { | 2174 for (int i = 0; i < power_count; i++) { |
| 2175 int power = powers[i]; | 2175 int power = powers[i]; |
| 2176 intptr_t result = static_cast<intptr_t>(x) << power; | 2176 intptr_t result = static_cast<intptr_t>(x) << power; |
| 2177 __ Set(r8, result); | 2177 __ Set(r8, result); |
| 2178 __ Move(rcx, Smi::FromInt(x)); | 2178 __ Move(rcx, Smi::FromInt(x)); |
| 2179 __ movq(r11, rcx); | 2179 __ movq(r11, rcx); |
| 2180 __ PositiveSmiTimesPowerOfTwoToInteger64(rdx, rcx, power); | 2180 __ PositiveSmiTimesPowerOfTwoToInteger64(rdx, rcx, power); |
| (...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2726 | 2726 |
| 2727 CodeDesc desc; | 2727 CodeDesc desc; |
| 2728 masm->GetCode(&desc); | 2728 masm->GetCode(&desc); |
| 2729 // Call the function from C++. | 2729 // Call the function from C++. |
| 2730 int result = FUNCTION_CAST<F0>(buffer)(); | 2730 int result = FUNCTION_CAST<F0>(buffer)(); |
| 2731 CHECK_EQ(0, result); | 2731 CHECK_EQ(0, result); |
| 2732 } | 2732 } |
| 2733 | 2733 |
| 2734 | 2734 |
| 2735 #undef __ | 2735 #undef __ |
| OLD | NEW |