Chromium Code Reviews| 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 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 213 __ SmiCompare(rdx, rcx); | 213 __ SmiCompare(rdx, rcx); |
| 214 if (y < x) { | 214 if (y < x) { |
| 215 __ movl(rax, Immediate(id + 9)); | 215 __ movl(rax, Immediate(id + 9)); |
| 216 __ j(greater_equal, exit); | 216 __ j(greater_equal, exit); |
| 217 } else { | 217 } else { |
| 218 ASSERT(y > x); | 218 ASSERT(y > x); |
| 219 __ movl(rax, Immediate(id + 10)); | 219 __ movl(rax, Immediate(id + 10)); |
| 220 __ j(less_equal, exit); | 220 __ j(less_equal, exit); |
| 221 } | 221 } |
| 222 } else { | 222 } else { |
| 223 __ SmiCompare(rcx, rcx); | 223 __ cmpq(rcx, rcx); |
|
Lasse Reichstein
2011/03/15 09:07:01
Really should be SmiCompare in this function.
Erik Corry
2011/03/15 10:00:50
Since we are only testing for equality cmpq seems
Lasse Reichstein
2011/03/15 12:29:23
But we are testing SmiCompare :)
| |
| 224 __ movl(rax, Immediate(id + 11)); | 224 __ movl(rax, Immediate(id + 11)); |
| 225 __ j(not_equal, exit); | 225 __ j(not_equal, exit); |
| 226 __ incq(rax); | 226 __ incq(rax); |
| 227 __ cmpq(rcx, r8); | 227 __ cmpq(rcx, r8); |
| 228 __ j(not_equal, exit); | 228 __ j(not_equal, exit); |
| 229 } | 229 } |
| 230 } | 230 } |
| 231 | 231 |
| 232 | 232 |
| 233 // Test that we can compare smis for equality (and more). | 233 // Test that we can compare smis for equality (and more). |
| 234 TEST(SmiCompare) { | 234 TEST(SmiCompare) { |
| 235 v8::V8::Initialize(); | |
| 235 // Allocate an executable page of memory. | 236 // Allocate an executable page of memory. |
| 236 size_t actual_size; | 237 size_t actual_size; |
| 237 byte* buffer = | 238 byte* buffer = |
| 238 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 239 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, |
| 239 &actual_size, | 240 &actual_size, |
| 240 true)); | 241 true)); |
| 241 CHECK(buffer); | 242 CHECK(buffer); |
| 242 HandleScope handles; | 243 HandleScope handles; |
| 243 MacroAssembler assembler(buffer, static_cast<int>(actual_size)); | 244 MacroAssembler assembler(buffer, static_cast<int>(actual_size)); |
| 244 | 245 |
| 245 MacroAssembler* masm = &assembler; | 246 MacroAssembler* masm = &assembler; |
| 246 masm->set_allow_stub_calls(false); | 247 masm->set_allow_stub_calls(false); |
| 247 EntryCode(masm); | 248 EntryCode(masm); |
| 248 Label exit; | 249 Label exit; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 293 | 294 |
| 294 MacroAssembler* masm = &assembler; | 295 MacroAssembler* masm = &assembler; |
| 295 masm->set_allow_stub_calls(false); | 296 masm->set_allow_stub_calls(false); |
| 296 EntryCode(masm); | 297 EntryCode(masm); |
| 297 Label exit; | 298 Label exit; |
| 298 | 299 |
| 299 __ movq(rax, Immediate(1)); // Test number. | 300 __ movq(rax, Immediate(1)); // Test number. |
| 300 __ movl(rcx, Immediate(0)); | 301 __ movl(rcx, Immediate(0)); |
| 301 __ Integer32ToSmi(rcx, rcx); | 302 __ Integer32ToSmi(rcx, rcx); |
| 302 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(0))); | 303 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(0))); |
| 303 __ SmiCompare(rcx, rdx); | 304 __ cmpq(rcx, rdx); |
| 304 __ j(not_equal, &exit); | 305 __ j(not_equal, &exit); |
| 305 | 306 |
| 306 __ movq(rax, Immediate(2)); // Test number. | 307 __ movq(rax, Immediate(2)); // Test number. |
| 307 __ movl(rcx, Immediate(1024)); | 308 __ movl(rcx, Immediate(1024)); |
| 308 __ Integer32ToSmi(rcx, rcx); | 309 __ Integer32ToSmi(rcx, rcx); |
| 309 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(1024))); | 310 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(1024))); |
| 310 __ SmiCompare(rcx, rdx); | 311 __ cmpq(rcx, rdx); |
| 311 __ j(not_equal, &exit); | 312 __ j(not_equal, &exit); |
| 312 | 313 |
| 313 __ movq(rax, Immediate(3)); // Test number. | 314 __ movq(rax, Immediate(3)); // Test number. |
| 314 __ movl(rcx, Immediate(-1)); | 315 __ movl(rcx, Immediate(-1)); |
| 315 __ Integer32ToSmi(rcx, rcx); | 316 __ Integer32ToSmi(rcx, rcx); |
| 316 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(-1))); | 317 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(-1))); |
| 317 __ SmiCompare(rcx, rdx); | 318 __ cmpq(rcx, rdx); |
| 318 __ j(not_equal, &exit); | 319 __ j(not_equal, &exit); |
| 319 | 320 |
| 320 __ movq(rax, Immediate(4)); // Test number. | 321 __ movq(rax, Immediate(4)); // Test number. |
| 321 __ movl(rcx, Immediate(Smi::kMaxValue)); | 322 __ movl(rcx, Immediate(Smi::kMaxValue)); |
| 322 __ Integer32ToSmi(rcx, rcx); | 323 __ Integer32ToSmi(rcx, rcx); |
| 323 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(Smi::kMaxValue))); | 324 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(Smi::kMaxValue))); |
| 324 __ SmiCompare(rcx, rdx); | 325 __ cmpq(rcx, rdx); |
| 325 __ j(not_equal, &exit); | 326 __ j(not_equal, &exit); |
| 326 | 327 |
| 327 __ movq(rax, Immediate(5)); // Test number. | 328 __ movq(rax, Immediate(5)); // Test number. |
| 328 __ movl(rcx, Immediate(Smi::kMinValue)); | 329 __ movl(rcx, Immediate(Smi::kMinValue)); |
| 329 __ Integer32ToSmi(rcx, rcx); | 330 __ Integer32ToSmi(rcx, rcx); |
| 330 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(Smi::kMinValue))); | 331 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(Smi::kMinValue))); |
| 331 __ SmiCompare(rcx, rdx); | 332 __ cmpq(rcx, rdx); |
| 332 __ j(not_equal, &exit); | 333 __ j(not_equal, &exit); |
| 333 | 334 |
| 334 // Different target register. | 335 // Different target register. |
| 335 | 336 |
| 336 __ movq(rax, Immediate(6)); // Test number. | 337 __ movq(rax, Immediate(6)); // Test number. |
| 337 __ movl(rcx, Immediate(0)); | 338 __ movl(rcx, Immediate(0)); |
| 338 __ Integer32ToSmi(r8, rcx); | 339 __ Integer32ToSmi(r8, rcx); |
| 339 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(0))); | 340 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(0))); |
| 340 __ SmiCompare(r8, rdx); | 341 __ cmpq(r8, rdx); |
| 341 __ j(not_equal, &exit); | 342 __ j(not_equal, &exit); |
| 342 | 343 |
| 343 __ movq(rax, Immediate(7)); // Test number. | 344 __ movq(rax, Immediate(7)); // Test number. |
| 344 __ movl(rcx, Immediate(1024)); | 345 __ movl(rcx, Immediate(1024)); |
| 345 __ Integer32ToSmi(r8, rcx); | 346 __ Integer32ToSmi(r8, rcx); |
| 346 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(1024))); | 347 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(1024))); |
| 347 __ SmiCompare(r8, rdx); | 348 __ cmpq(r8, rdx); |
| 348 __ j(not_equal, &exit); | 349 __ j(not_equal, &exit); |
| 349 | 350 |
| 350 __ movq(rax, Immediate(8)); // Test number. | 351 __ movq(rax, Immediate(8)); // Test number. |
| 351 __ movl(rcx, Immediate(-1)); | 352 __ movl(rcx, Immediate(-1)); |
| 352 __ Integer32ToSmi(r8, rcx); | 353 __ Integer32ToSmi(r8, rcx); |
| 353 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(-1))); | 354 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(-1))); |
| 354 __ SmiCompare(r8, rdx); | 355 __ cmpq(r8, rdx); |
| 355 __ j(not_equal, &exit); | 356 __ j(not_equal, &exit); |
| 356 | 357 |
| 357 __ movq(rax, Immediate(9)); // Test number. | 358 __ movq(rax, Immediate(9)); // Test number. |
| 358 __ movl(rcx, Immediate(Smi::kMaxValue)); | 359 __ movl(rcx, Immediate(Smi::kMaxValue)); |
| 359 __ Integer32ToSmi(r8, rcx); | 360 __ Integer32ToSmi(r8, rcx); |
| 360 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(Smi::kMaxValue))); | 361 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(Smi::kMaxValue))); |
| 361 __ SmiCompare(r8, rdx); | 362 __ cmpq(r8, rdx); |
| 362 __ j(not_equal, &exit); | 363 __ j(not_equal, &exit); |
| 363 | 364 |
| 364 __ movq(rax, Immediate(10)); // Test number. | 365 __ movq(rax, Immediate(10)); // Test number. |
| 365 __ movl(rcx, Immediate(Smi::kMinValue)); | 366 __ movl(rcx, Immediate(Smi::kMinValue)); |
| 366 __ Integer32ToSmi(r8, rcx); | 367 __ Integer32ToSmi(r8, rcx); |
| 367 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(Smi::kMinValue))); | 368 __ Set(rdx, reinterpret_cast<intptr_t>(Smi::FromInt(Smi::kMinValue))); |
| 368 __ SmiCompare(r8, rdx); | 369 __ cmpq(r8, rdx); |
| 369 __ j(not_equal, &exit); | 370 __ j(not_equal, &exit); |
| 370 | 371 |
| 371 | 372 |
| 372 __ xor_(rax, rax); // Success. | 373 __ xor_(rax, rax); // Success. |
| 373 __ bind(&exit); | 374 __ bind(&exit); |
| 374 ExitCode(masm); | 375 ExitCode(masm); |
| 375 __ ret(0); | 376 __ ret(0); |
| 376 | 377 |
| 377 CodeDesc desc; | 378 CodeDesc desc; |
| 378 masm->GetCode(&desc); | 379 masm->GetCode(&desc); |
| 379 // Call the function from C++. | 380 // Call the function from C++. |
| 380 int result = FUNCTION_CAST<F0>(buffer)(); | 381 int result = FUNCTION_CAST<F0>(buffer)(); |
| 381 CHECK_EQ(0, result); | 382 CHECK_EQ(0, result); |
| 382 } | 383 } |
| 383 | 384 |
| 384 | 385 |
| 385 void TestI64PlusConstantToSmi(MacroAssembler* masm, | 386 void TestI64PlusConstantToSmi(MacroAssembler* masm, |
| 386 Label* exit, | 387 Label* exit, |
| 387 int id, | 388 int id, |
| 388 int64_t x, | 389 int64_t x, |
| 389 int y) { | 390 int y) { |
| 390 int64_t result = x + y; | 391 int64_t result = x + y; |
| 391 ASSERT(Smi::IsValid(result)); | 392 ASSERT(Smi::IsValid(result)); |
| 392 __ movl(rax, Immediate(id)); | 393 __ movl(rax, Immediate(id)); |
| 393 __ Move(r8, Smi::FromInt(static_cast<int>(result))); | 394 __ Move(r8, Smi::FromInt(static_cast<int>(result))); |
| 394 __ movq(rcx, x, RelocInfo::NONE); | 395 __ movq(rcx, x, RelocInfo::NONE); |
| 395 __ movq(r11, rcx); | 396 __ movq(r11, rcx); |
| 396 __ Integer64PlusConstantToSmi(rdx, rcx, y); | 397 __ Integer64PlusConstantToSmi(rdx, rcx, y); |
| 397 __ SmiCompare(rdx, r8); | 398 __ cmpq(rdx, r8); |
| 398 __ j(not_equal, exit); | 399 __ j(not_equal, exit); |
| 399 | 400 |
| 400 __ incq(rax); | 401 __ incq(rax); |
| 401 __ SmiCompare(r11, rcx); | 402 __ cmpq(r11, rcx); |
| 402 __ j(not_equal, exit); | 403 __ j(not_equal, exit); |
| 403 | 404 |
| 404 __ incq(rax); | 405 __ incq(rax); |
| 405 __ Integer64PlusConstantToSmi(rcx, rcx, y); | 406 __ Integer64PlusConstantToSmi(rcx, rcx, y); |
| 406 __ SmiCompare(rcx, r8); | 407 __ cmpq(rcx, r8); |
| 407 __ j(not_equal, exit); | 408 __ j(not_equal, exit); |
| 408 } | 409 } |
| 409 | 410 |
| 410 | 411 |
| 411 TEST(Integer64PlusConstantToSmi) { | 412 TEST(Integer64PlusConstantToSmi) { |
| 412 // Allocate an executable page of memory. | 413 // Allocate an executable page of memory. |
| 413 size_t actual_size; | 414 size_t actual_size; |
| 414 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 415 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
| 415 &actual_size, | 416 &actual_size, |
| 416 true)); | 417 true)); |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 653 | 654 |
| 654 void TestSmiNeg(MacroAssembler* masm, Label* exit, int id, int x) { | 655 void TestSmiNeg(MacroAssembler* masm, Label* exit, int id, int x) { |
| 655 __ Move(rcx, Smi::FromInt(x)); | 656 __ Move(rcx, Smi::FromInt(x)); |
| 656 __ movq(r11, rcx); | 657 __ movq(r11, rcx); |
| 657 if (x == Smi::kMinValue || x == 0) { | 658 if (x == Smi::kMinValue || x == 0) { |
| 658 // Negation fails. | 659 // Negation fails. |
| 659 __ movl(rax, Immediate(id + 8)); | 660 __ movl(rax, Immediate(id + 8)); |
| 660 __ SmiNeg(r9, rcx, exit); | 661 __ SmiNeg(r9, rcx, exit); |
| 661 | 662 |
| 662 __ incq(rax); | 663 __ incq(rax); |
| 663 __ SmiCompare(r11, rcx); | 664 __ cmpq(r11, rcx); |
| 664 __ j(not_equal, exit); | 665 __ j(not_equal, exit); |
| 665 | 666 |
| 666 __ incq(rax); | 667 __ incq(rax); |
| 667 __ SmiNeg(rcx, rcx, exit); | 668 __ SmiNeg(rcx, rcx, exit); |
| 668 | 669 |
| 669 __ incq(rax); | 670 __ incq(rax); |
| 670 __ SmiCompare(r11, rcx); | 671 __ cmpq(r11, rcx); |
| 671 __ j(not_equal, exit); | 672 __ j(not_equal, exit); |
| 672 } else { | 673 } else { |
| 673 Label smi_ok, smi_ok2; | 674 Label smi_ok, smi_ok2; |
| 674 int result = -x; | 675 int result = -x; |
| 675 __ movl(rax, Immediate(id)); | 676 __ movl(rax, Immediate(id)); |
| 676 __ Move(r8, Smi::FromInt(result)); | 677 __ Move(r8, Smi::FromInt(result)); |
| 677 | 678 |
| 678 __ SmiNeg(r9, rcx, &smi_ok); | 679 __ SmiNeg(r9, rcx, &smi_ok); |
| 679 __ jmp(exit); | 680 __ jmp(exit); |
| 680 __ bind(&smi_ok); | 681 __ bind(&smi_ok); |
| 681 __ incq(rax); | 682 __ incq(rax); |
| 682 __ SmiCompare(r9, r8); | 683 __ cmpq(r9, r8); |
| 683 __ j(not_equal, exit); | 684 __ j(not_equal, exit); |
| 684 | 685 |
| 685 __ incq(rax); | 686 __ incq(rax); |
| 686 __ SmiCompare(r11, rcx); | 687 __ cmpq(r11, rcx); |
| 687 __ j(not_equal, exit); | 688 __ j(not_equal, exit); |
| 688 | 689 |
| 689 __ incq(rax); | 690 __ incq(rax); |
| 690 __ SmiNeg(rcx, rcx, &smi_ok2); | 691 __ SmiNeg(rcx, rcx, &smi_ok2); |
| 691 __ jmp(exit); | 692 __ jmp(exit); |
| 692 __ bind(&smi_ok2); | 693 __ bind(&smi_ok2); |
| 693 __ incq(rax); | 694 __ incq(rax); |
| 694 __ SmiCompare(rcx, r8); | 695 __ cmpq(rcx, r8); |
| 695 __ j(not_equal, exit); | 696 __ j(not_equal, exit); |
| 696 } | 697 } |
| 697 } | 698 } |
| 698 | 699 |
| 699 | 700 |
| 700 TEST(SmiNeg) { | 701 TEST(SmiNeg) { |
| 701 // Allocate an executable page of memory. | 702 // Allocate an executable page of memory. |
| 702 size_t actual_size; | 703 size_t actual_size; |
| 703 byte* buffer = | 704 byte* buffer = |
| 704 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 705 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 744 int second) { | 745 int second) { |
| 745 __ movl(rcx, Immediate(first)); | 746 __ movl(rcx, Immediate(first)); |
| 746 __ Integer32ToSmi(rcx, rcx); | 747 __ Integer32ToSmi(rcx, rcx); |
| 747 __ movl(rdx, Immediate(second)); | 748 __ movl(rdx, Immediate(second)); |
| 748 __ Integer32ToSmi(rdx, rdx); | 749 __ Integer32ToSmi(rdx, rdx); |
| 749 __ movl(r8, Immediate(first + second)); | 750 __ movl(r8, Immediate(first + second)); |
| 750 __ Integer32ToSmi(r8, r8); | 751 __ Integer32ToSmi(r8, r8); |
| 751 | 752 |
| 752 __ movl(rax, Immediate(id)); // Test number. | 753 __ movl(rax, Immediate(id)); // Test number. |
| 753 __ SmiAdd(r9, rcx, rdx, exit); | 754 __ SmiAdd(r9, rcx, rdx, exit); |
| 754 __ SmiCompare(r9, r8); | 755 __ cmpq(r9, r8); |
| 755 __ j(not_equal, exit); | 756 __ j(not_equal, exit); |
| 756 | 757 |
| 757 __ incq(rax); | 758 __ incq(rax); |
| 758 __ SmiAdd(rcx, rcx, rdx, exit); \ | 759 __ SmiAdd(rcx, rcx, rdx, exit); \ |
| 759 __ SmiCompare(rcx, r8); | 760 __ cmpq(rcx, r8); |
| 760 __ j(not_equal, exit); | 761 __ j(not_equal, exit); |
| 761 | 762 |
| 762 __ movl(rcx, Immediate(first)); | 763 __ movl(rcx, Immediate(first)); |
| 763 __ Integer32ToSmi(rcx, rcx); | 764 __ Integer32ToSmi(rcx, rcx); |
| 764 | 765 |
| 765 __ incq(rax); | 766 __ incq(rax); |
| 766 __ SmiAddConstant(r9, rcx, Smi::FromInt(second)); | 767 __ SmiAddConstant(r9, rcx, Smi::FromInt(second)); |
| 767 __ SmiCompare(r9, r8); | 768 __ cmpq(r9, r8); |
| 768 __ j(not_equal, exit); | 769 __ j(not_equal, exit); |
| 769 | 770 |
| 770 __ SmiAddConstant(rcx, rcx, Smi::FromInt(second)); | 771 __ SmiAddConstant(rcx, rcx, Smi::FromInt(second)); |
| 771 __ SmiCompare(rcx, r8); | 772 __ cmpq(rcx, r8); |
| 772 __ j(not_equal, exit); | 773 __ j(not_equal, exit); |
| 773 | 774 |
| 774 __ movl(rcx, Immediate(first)); | 775 __ movl(rcx, Immediate(first)); |
| 775 __ Integer32ToSmi(rcx, rcx); | 776 __ Integer32ToSmi(rcx, rcx); |
| 776 | 777 |
| 777 __ incq(rax); | 778 __ incq(rax); |
| 778 __ SmiAddConstant(r9, rcx, Smi::FromInt(second), exit); | 779 __ SmiAddConstant(r9, rcx, Smi::FromInt(second), exit); |
| 779 __ SmiCompare(r9, r8); | 780 __ cmpq(r9, r8); |
| 780 __ j(not_equal, exit); | 781 __ j(not_equal, exit); |
| 781 | 782 |
| 782 __ incq(rax); | 783 __ incq(rax); |
| 783 __ SmiAddConstant(rcx, rcx, Smi::FromInt(second), exit); | 784 __ SmiAddConstant(rcx, rcx, Smi::FromInt(second), exit); |
| 784 __ SmiCompare(rcx, r8); | 785 __ cmpq(rcx, r8); |
| 785 __ j(not_equal, exit); | 786 __ j(not_equal, exit); |
| 786 } | 787 } |
| 787 | 788 |
| 788 TEST(SmiAdd) { | 789 TEST(SmiAdd) { |
| 789 // Allocate an executable page of memory. | 790 // Allocate an executable page of memory. |
| 790 size_t actual_size; | 791 size_t actual_size; |
| 791 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 792 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
| 792 &actual_size, | 793 &actual_size, |
| 793 true)); | 794 true)); |
| 794 CHECK(buffer); | 795 CHECK(buffer); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 827 Label* exit, | 828 Label* exit, |
| 828 int id, | 829 int id, |
| 829 int first, | 830 int first, |
| 830 int second) { | 831 int second) { |
| 831 __ Move(rcx, Smi::FromInt(first)); | 832 __ Move(rcx, Smi::FromInt(first)); |
| 832 __ Move(rdx, Smi::FromInt(second)); | 833 __ Move(rdx, Smi::FromInt(second)); |
| 833 __ Move(r8, Smi::FromInt(first - second)); | 834 __ Move(r8, Smi::FromInt(first - second)); |
| 834 | 835 |
| 835 __ movl(rax, Immediate(id)); // Test 0. | 836 __ movl(rax, Immediate(id)); // Test 0. |
| 836 __ SmiSub(r9, rcx, rdx, exit); | 837 __ SmiSub(r9, rcx, rdx, exit); |
| 837 __ SmiCompare(r9, r8); | 838 __ cmpq(r9, r8); |
| 838 __ j(not_equal, exit); | 839 __ j(not_equal, exit); |
| 839 | 840 |
| 840 __ incq(rax); // Test 1. | 841 __ incq(rax); // Test 1. |
| 841 __ SmiSub(rcx, rcx, rdx, exit); | 842 __ SmiSub(rcx, rcx, rdx, exit); |
| 842 __ SmiCompare(rcx, r8); | 843 __ cmpq(rcx, r8); |
| 843 __ j(not_equal, exit); | 844 __ j(not_equal, exit); |
| 844 | 845 |
| 845 __ Move(rcx, Smi::FromInt(first)); | 846 __ Move(rcx, Smi::FromInt(first)); |
| 846 | 847 |
| 847 __ incq(rax); // Test 2. | 848 __ incq(rax); // Test 2. |
| 848 __ SmiSubConstant(r9, rcx, Smi::FromInt(second)); | 849 __ SmiSubConstant(r9, rcx, Smi::FromInt(second)); |
| 849 __ SmiCompare(r9, r8); | 850 __ cmpq(r9, r8); |
| 850 __ j(not_equal, exit); | 851 __ j(not_equal, exit); |
| 851 | 852 |
| 852 __ incq(rax); // Test 3. | 853 __ incq(rax); // Test 3. |
| 853 __ SmiSubConstant(rcx, rcx, Smi::FromInt(second)); | 854 __ SmiSubConstant(rcx, rcx, Smi::FromInt(second)); |
| 854 __ SmiCompare(rcx, r8); | 855 __ cmpq(rcx, r8); |
| 855 __ j(not_equal, exit); | 856 __ j(not_equal, exit); |
| 856 | 857 |
| 857 __ Move(rcx, Smi::FromInt(first)); | 858 __ Move(rcx, Smi::FromInt(first)); |
| 858 | 859 |
| 859 __ incq(rax); // Test 4. | 860 __ incq(rax); // Test 4. |
| 860 __ SmiSubConstant(r9, rcx, Smi::FromInt(second), exit); | 861 __ SmiSubConstant(r9, rcx, Smi::FromInt(second), exit); |
| 861 __ SmiCompare(r9, r8); | 862 __ cmpq(r9, r8); |
| 862 __ j(not_equal, exit); | 863 __ j(not_equal, exit); |
| 863 | 864 |
| 864 __ incq(rax); // Test 5. | 865 __ incq(rax); // Test 5. |
| 865 __ SmiSubConstant(rcx, rcx, Smi::FromInt(second), exit); | 866 __ SmiSubConstant(rcx, rcx, Smi::FromInt(second), exit); |
| 866 __ SmiCompare(rcx, r8); | 867 __ cmpq(rcx, r8); |
| 867 __ j(not_equal, exit); | 868 __ j(not_equal, exit); |
| 868 } | 869 } |
| 869 | 870 |
| 870 static void SmiSubOverflowTest(MacroAssembler* masm, | 871 static void SmiSubOverflowTest(MacroAssembler* masm, |
| 871 Label* exit, | 872 Label* exit, |
| 872 int id, | 873 int id, |
| 873 int x) { | 874 int x) { |
| 874 // Subtracts a Smi from x so that the subtraction overflows. | 875 // Subtracts a Smi from x so that the subtraction overflows. |
| 875 ASSERT(x != -1); // Can't overflow by subtracting a Smi. | 876 ASSERT(x != -1); // Can't overflow by subtracting a Smi. |
| 876 int y_max = (x < 0) ? (Smi::kMaxValue + 0) : (Smi::kMinValue + 0); | 877 int y_max = (x < 0) ? (Smi::kMaxValue + 0) : (Smi::kMinValue + 0); |
| 877 int y_min = (x < 0) ? (Smi::kMaxValue + x + 2) : (Smi::kMinValue + x); | 878 int y_min = (x < 0) ? (Smi::kMaxValue + x + 2) : (Smi::kMinValue + x); |
| 878 | 879 |
| 879 __ movl(rax, Immediate(id)); | 880 __ movl(rax, Immediate(id)); |
| 880 __ Move(rcx, Smi::FromInt(x)); | 881 __ Move(rcx, Smi::FromInt(x)); |
| 881 __ movq(r11, rcx); // Store original Smi value of x in r11. | 882 __ movq(r11, rcx); // Store original Smi value of x in r11. |
| 882 __ Move(rdx, Smi::FromInt(y_min)); | 883 __ Move(rdx, Smi::FromInt(y_min)); |
| 883 { | 884 { |
| 884 Label overflow_ok; | 885 Label overflow_ok; |
| 885 __ SmiSub(r9, rcx, rdx, &overflow_ok); | 886 __ SmiSub(r9, rcx, rdx, &overflow_ok); |
| 886 __ jmp(exit); | 887 __ jmp(exit); |
| 887 __ bind(&overflow_ok); | 888 __ bind(&overflow_ok); |
| 888 __ incq(rax); | 889 __ incq(rax); |
| 889 __ SmiCompare(rcx, r11); | 890 __ cmpq(rcx, r11); |
| 890 __ j(not_equal, exit); | 891 __ j(not_equal, exit); |
| 891 } | 892 } |
| 892 | 893 |
| 893 { | 894 { |
| 894 Label overflow_ok; | 895 Label overflow_ok; |
| 895 __ incq(rax); | 896 __ incq(rax); |
| 896 __ SmiSub(rcx, rcx, rdx, &overflow_ok); | 897 __ SmiSub(rcx, rcx, rdx, &overflow_ok); |
| 897 __ jmp(exit); | 898 __ jmp(exit); |
| 898 __ bind(&overflow_ok); | 899 __ bind(&overflow_ok); |
| 899 __ incq(rax); | 900 __ incq(rax); |
| 900 __ SmiCompare(rcx, r11); | 901 __ cmpq(rcx, r11); |
| 901 __ j(not_equal, exit); | 902 __ j(not_equal, exit); |
| 902 } | 903 } |
| 903 | 904 |
| 904 __ movq(rcx, r11); | 905 __ movq(rcx, r11); |
| 905 { | 906 { |
| 906 Label overflow_ok; | 907 Label overflow_ok; |
| 907 __ incq(rax); | 908 __ incq(rax); |
| 908 __ SmiSubConstant(r9, rcx, Smi::FromInt(y_min), &overflow_ok); | 909 __ SmiSubConstant(r9, rcx, Smi::FromInt(y_min), &overflow_ok); |
| 909 __ jmp(exit); | 910 __ jmp(exit); |
| 910 __ bind(&overflow_ok); | 911 __ bind(&overflow_ok); |
| 911 __ incq(rax); | 912 __ incq(rax); |
| 912 __ SmiCompare(rcx, r11); | 913 __ cmpq(rcx, r11); |
| 913 __ j(not_equal, exit); | 914 __ j(not_equal, exit); |
| 914 } | 915 } |
| 915 | 916 |
| 916 { | 917 { |
| 917 Label overflow_ok; | 918 Label overflow_ok; |
| 918 __ incq(rax); | 919 __ incq(rax); |
| 919 __ SmiSubConstant(rcx, rcx, Smi::FromInt(y_min), &overflow_ok); | 920 __ SmiSubConstant(rcx, rcx, Smi::FromInt(y_min), &overflow_ok); |
| 920 __ jmp(exit); | 921 __ jmp(exit); |
| 921 __ bind(&overflow_ok); | 922 __ bind(&overflow_ok); |
| 922 __ incq(rax); | 923 __ incq(rax); |
| 923 __ SmiCompare(rcx, r11); | 924 __ cmpq(rcx, r11); |
| 924 __ j(not_equal, exit); | 925 __ j(not_equal, exit); |
| 925 } | 926 } |
| 926 | 927 |
| 927 __ Move(rdx, Smi::FromInt(y_max)); | 928 __ Move(rdx, Smi::FromInt(y_max)); |
| 928 | 929 |
| 929 { | 930 { |
| 930 Label overflow_ok; | 931 Label overflow_ok; |
| 931 __ incq(rax); | 932 __ incq(rax); |
| 932 __ SmiSub(r9, rcx, rdx, &overflow_ok); | 933 __ SmiSub(r9, rcx, rdx, &overflow_ok); |
| 933 __ jmp(exit); | 934 __ jmp(exit); |
| 934 __ bind(&overflow_ok); | 935 __ bind(&overflow_ok); |
| 935 __ incq(rax); | 936 __ incq(rax); |
| 936 __ SmiCompare(rcx, r11); | 937 __ cmpq(rcx, r11); |
| 937 __ j(not_equal, exit); | 938 __ j(not_equal, exit); |
| 938 } | 939 } |
| 939 | 940 |
| 940 { | 941 { |
| 941 Label overflow_ok; | 942 Label overflow_ok; |
| 942 __ incq(rax); | 943 __ incq(rax); |
| 943 __ SmiSub(rcx, rcx, rdx, &overflow_ok); | 944 __ SmiSub(rcx, rcx, rdx, &overflow_ok); |
| 944 __ jmp(exit); | 945 __ jmp(exit); |
| 945 __ bind(&overflow_ok); | 946 __ bind(&overflow_ok); |
| 946 __ incq(rax); | 947 __ incq(rax); |
| 947 __ SmiCompare(rcx, r11); | 948 __ cmpq(rcx, r11); |
| 948 __ j(not_equal, exit); | 949 __ j(not_equal, exit); |
| 949 } | 950 } |
| 950 | 951 |
| 951 __ movq(rcx, r11); | 952 __ movq(rcx, r11); |
| 952 { | 953 { |
| 953 Label overflow_ok; | 954 Label overflow_ok; |
| 954 __ incq(rax); | 955 __ incq(rax); |
| 955 __ SmiSubConstant(r9, rcx, Smi::FromInt(y_max), &overflow_ok); | 956 __ SmiSubConstant(r9, rcx, Smi::FromInt(y_max), &overflow_ok); |
| 956 __ jmp(exit); | 957 __ jmp(exit); |
| 957 __ bind(&overflow_ok); | 958 __ bind(&overflow_ok); |
| 958 __ incq(rax); | 959 __ incq(rax); |
| 959 __ SmiCompare(rcx, r11); | 960 __ cmpq(rcx, r11); |
| 960 __ j(not_equal, exit); | 961 __ j(not_equal, exit); |
| 961 } | 962 } |
| 962 | 963 |
| 963 { | 964 { |
| 964 Label overflow_ok; | 965 Label overflow_ok; |
| 965 __ incq(rax); | 966 __ incq(rax); |
| 966 __ SmiSubConstant(rcx, rcx, Smi::FromInt(y_max), &overflow_ok); | 967 __ SmiSubConstant(rcx, rcx, Smi::FromInt(y_max), &overflow_ok); |
| 967 __ jmp(exit); | 968 __ jmp(exit); |
| 968 __ bind(&overflow_ok); | 969 __ bind(&overflow_ok); |
| 969 __ incq(rax); | 970 __ incq(rax); |
| 970 __ SmiCompare(rcx, r11); | 971 __ cmpq(rcx, r11); |
| 971 __ j(not_equal, exit); | 972 __ j(not_equal, exit); |
| 972 } | 973 } |
| 973 } | 974 } |
| 974 | 975 |
| 975 | 976 |
| 976 TEST(SmiSub) { | 977 TEST(SmiSub) { |
| 977 // Allocate an executable page of memory. | 978 // Allocate an executable page of memory. |
| 978 size_t actual_size; | 979 size_t actual_size; |
| 979 byte* buffer = | 980 byte* buffer = |
| 980 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, | 981 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1025 int64_t result = static_cast<int64_t>(x) * static_cast<int64_t>(y); | 1026 int64_t result = static_cast<int64_t>(x) * static_cast<int64_t>(y); |
| 1026 bool negative_zero = (result == 0) && (x < 0 || y < 0); | 1027 bool negative_zero = (result == 0) && (x < 0 || y < 0); |
| 1027 __ Move(rcx, Smi::FromInt(x)); | 1028 __ Move(rcx, Smi::FromInt(x)); |
| 1028 __ movq(r11, rcx); | 1029 __ movq(r11, rcx); |
| 1029 __ Move(rdx, Smi::FromInt(y)); | 1030 __ Move(rdx, Smi::FromInt(y)); |
| 1030 if (Smi::IsValid(result) && !negative_zero) { | 1031 if (Smi::IsValid(result) && !negative_zero) { |
| 1031 __ movl(rax, Immediate(id)); | 1032 __ movl(rax, Immediate(id)); |
| 1032 __ Move(r8, Smi::FromIntptr(result)); | 1033 __ Move(r8, Smi::FromIntptr(result)); |
| 1033 __ SmiMul(r9, rcx, rdx, exit); | 1034 __ SmiMul(r9, rcx, rdx, exit); |
| 1034 __ incq(rax); | 1035 __ incq(rax); |
| 1035 __ SmiCompare(r11, rcx); | 1036 __ cmpq(r11, rcx); |
| 1036 __ j(not_equal, exit); | 1037 __ j(not_equal, exit); |
| 1037 __ incq(rax); | 1038 __ incq(rax); |
| 1038 __ SmiCompare(r9, r8); | 1039 __ cmpq(r9, r8); |
| 1039 __ j(not_equal, exit); | 1040 __ j(not_equal, exit); |
| 1040 | 1041 |
| 1041 __ incq(rax); | 1042 __ incq(rax); |
| 1042 __ SmiMul(rcx, rcx, rdx, exit); | 1043 __ SmiMul(rcx, rcx, rdx, exit); |
| 1043 __ SmiCompare(rcx, r8); | 1044 __ cmpq(rcx, r8); |
| 1044 __ j(not_equal, exit); | 1045 __ j(not_equal, exit); |
| 1045 } else { | 1046 } else { |
| 1046 __ movl(rax, Immediate(id + 8)); | 1047 __ movl(rax, Immediate(id + 8)); |
| 1047 Label overflow_ok, overflow_ok2; | 1048 Label overflow_ok, overflow_ok2; |
| 1048 __ SmiMul(r9, rcx, rdx, &overflow_ok); | 1049 __ SmiMul(r9, rcx, rdx, &overflow_ok); |
| 1049 __ jmp(exit); | 1050 __ jmp(exit); |
| 1050 __ bind(&overflow_ok); | 1051 __ bind(&overflow_ok); |
| 1051 __ incq(rax); | 1052 __ incq(rax); |
| 1052 __ SmiCompare(r11, rcx); | 1053 __ cmpq(r11, rcx); |
| 1053 __ j(not_equal, exit); | 1054 __ j(not_equal, exit); |
| 1054 __ incq(rax); | 1055 __ incq(rax); |
| 1055 __ SmiMul(rcx, rcx, rdx, &overflow_ok2); | 1056 __ SmiMul(rcx, rcx, rdx, &overflow_ok2); |
| 1056 __ jmp(exit); | 1057 __ jmp(exit); |
| 1057 __ bind(&overflow_ok2); | 1058 __ bind(&overflow_ok2); |
| 1058 // 31-bit version doesn't preserve rcx on failure. | 1059 // 31-bit version doesn't preserve rcx on failure. |
| 1059 // __ incq(rax); | 1060 // __ incq(rax); |
| 1060 // __ SmiCompare(r11, rcx); | 1061 // __ cmpq(r11, rcx); |
| 1061 // __ j(not_equal, exit); | 1062 // __ j(not_equal, exit); |
| 1062 } | 1063 } |
| 1063 } | 1064 } |
| 1064 | 1065 |
| 1065 | 1066 |
| 1066 TEST(SmiMul) { | 1067 TEST(SmiMul) { |
| 1067 // Allocate an executable page of memory. | 1068 // Allocate an executable page of memory. |
| 1068 size_t actual_size; | 1069 size_t actual_size; |
| 1069 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 1070 byte* buffer = static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
| 1070 &actual_size, | 1071 &actual_size, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1119 __ Move(r14, Smi::FromInt(y)); | 1120 __ Move(r14, Smi::FromInt(y)); |
| 1120 if (!fraction && !overflow && !negative_zero && !division_by_zero) { | 1121 if (!fraction && !overflow && !negative_zero && !division_by_zero) { |
| 1121 // Division succeeds | 1122 // Division succeeds |
| 1122 __ movq(rcx, r11); | 1123 __ movq(rcx, r11); |
| 1123 __ movq(r15, Immediate(id)); | 1124 __ movq(r15, Immediate(id)); |
| 1124 int result = x / y; | 1125 int result = x / y; |
| 1125 __ Move(r8, Smi::FromInt(result)); | 1126 __ Move(r8, Smi::FromInt(result)); |
| 1126 __ SmiDiv(r9, rcx, r14, exit); | 1127 __ SmiDiv(r9, rcx, r14, exit); |
| 1127 // Might have destroyed rcx and r14. | 1128 // Might have destroyed rcx and r14. |
| 1128 __ incq(r15); | 1129 __ incq(r15); |
| 1129 __ SmiCompare(r9, r8); | 1130 __ cmpq(r9, r8); |
| 1130 __ j(not_equal, exit); | 1131 __ j(not_equal, exit); |
| 1131 | 1132 |
| 1132 __ incq(r15); | 1133 __ incq(r15); |
| 1133 __ movq(rcx, r11); | 1134 __ movq(rcx, r11); |
| 1134 __ Move(r14, Smi::FromInt(y)); | 1135 __ Move(r14, Smi::FromInt(y)); |
| 1135 __ SmiCompare(rcx, r11); | 1136 __ cmpq(rcx, r11); |
| 1136 __ j(not_equal, exit); | 1137 __ j(not_equal, exit); |
| 1137 | 1138 |
| 1138 __ incq(r15); | 1139 __ incq(r15); |
| 1139 __ SmiDiv(rcx, rcx, r14, exit); | 1140 __ SmiDiv(rcx, rcx, r14, exit); |
| 1140 | 1141 |
| 1141 __ incq(r15); | 1142 __ incq(r15); |
| 1142 __ SmiCompare(rcx, r8); | 1143 __ cmpq(rcx, r8); |
| 1143 __ j(not_equal, exit); | 1144 __ j(not_equal, exit); |
| 1144 } else { | 1145 } else { |
| 1145 // Division fails. | 1146 // Division fails. |
| 1146 __ movq(r15, Immediate(id + 8)); | 1147 __ movq(r15, Immediate(id + 8)); |
| 1147 | 1148 |
| 1148 Label fail_ok, fail_ok2; | 1149 Label fail_ok, fail_ok2; |
| 1149 __ movq(rcx, r11); | 1150 __ movq(rcx, r11); |
| 1150 __ SmiDiv(r9, rcx, r14, &fail_ok); | 1151 __ SmiDiv(r9, rcx, r14, &fail_ok); |
| 1151 __ jmp(exit); | 1152 __ jmp(exit); |
| 1152 __ bind(&fail_ok); | 1153 __ bind(&fail_ok); |
| 1153 | 1154 |
| 1154 __ incq(r15); | 1155 __ incq(r15); |
| 1155 __ SmiCompare(rcx, r11); | 1156 __ cmpq(rcx, r11); |
| 1156 __ j(not_equal, exit); | 1157 __ j(not_equal, exit); |
| 1157 | 1158 |
| 1158 __ incq(r15); | 1159 __ incq(r15); |
| 1159 __ SmiDiv(rcx, rcx, r14, &fail_ok2); | 1160 __ SmiDiv(rcx, rcx, r14, &fail_ok2); |
| 1160 __ jmp(exit); | 1161 __ jmp(exit); |
| 1161 __ bind(&fail_ok2); | 1162 __ bind(&fail_ok2); |
| 1162 | 1163 |
| 1163 __ incq(r15); | 1164 __ incq(r15); |
| 1164 __ SmiCompare(rcx, r11); | 1165 __ cmpq(rcx, r11); |
| 1165 __ j(not_equal, exit); | 1166 __ j(not_equal, exit); |
| 1166 } | 1167 } |
| 1167 } | 1168 } |
| 1168 | 1169 |
| 1169 | 1170 |
| 1170 TEST(SmiDiv) { | 1171 TEST(SmiDiv) { |
| 1171 // Allocate an executable page of memory. | 1172 // Allocate an executable page of memory. |
| 1172 size_t actual_size; | 1173 size_t actual_size; |
| 1173 byte* buffer = | 1174 byte* buffer = |
| 1174 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, | 1175 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1231 __ movq(r11, rcx); | 1232 __ movq(r11, rcx); |
| 1232 __ Move(r14, Smi::FromInt(y)); | 1233 __ Move(r14, Smi::FromInt(y)); |
| 1233 if (!division_overflow && !negative_zero && !division_by_zero) { | 1234 if (!division_overflow && !negative_zero && !division_by_zero) { |
| 1234 // Modulo succeeds | 1235 // Modulo succeeds |
| 1235 __ movq(r15, Immediate(id)); | 1236 __ movq(r15, Immediate(id)); |
| 1236 int result = x % y; | 1237 int result = x % y; |
| 1237 __ Move(r8, Smi::FromInt(result)); | 1238 __ Move(r8, Smi::FromInt(result)); |
| 1238 __ SmiMod(r9, rcx, r14, exit); | 1239 __ SmiMod(r9, rcx, r14, exit); |
| 1239 | 1240 |
| 1240 __ incq(r15); | 1241 __ incq(r15); |
| 1241 __ SmiCompare(r9, r8); | 1242 __ cmpq(r9, r8); |
| 1242 __ j(not_equal, exit); | 1243 __ j(not_equal, exit); |
| 1243 | 1244 |
| 1244 __ incq(r15); | 1245 __ incq(r15); |
| 1245 __ SmiCompare(rcx, r11); | 1246 __ cmpq(rcx, r11); |
| 1246 __ j(not_equal, exit); | 1247 __ j(not_equal, exit); |
| 1247 | 1248 |
| 1248 __ incq(r15); | 1249 __ incq(r15); |
| 1249 __ SmiMod(rcx, rcx, r14, exit); | 1250 __ SmiMod(rcx, rcx, r14, exit); |
| 1250 | 1251 |
| 1251 __ incq(r15); | 1252 __ incq(r15); |
| 1252 __ SmiCompare(rcx, r8); | 1253 __ cmpq(rcx, r8); |
| 1253 __ j(not_equal, exit); | 1254 __ j(not_equal, exit); |
| 1254 } else { | 1255 } else { |
| 1255 // Modulo fails. | 1256 // Modulo fails. |
| 1256 __ movq(r15, Immediate(id + 8)); | 1257 __ movq(r15, Immediate(id + 8)); |
| 1257 | 1258 |
| 1258 Label fail_ok, fail_ok2; | 1259 Label fail_ok, fail_ok2; |
| 1259 __ SmiMod(r9, rcx, r14, &fail_ok); | 1260 __ SmiMod(r9, rcx, r14, &fail_ok); |
| 1260 __ jmp(exit); | 1261 __ jmp(exit); |
| 1261 __ bind(&fail_ok); | 1262 __ bind(&fail_ok); |
| 1262 | 1263 |
| 1263 __ incq(r15); | 1264 __ incq(r15); |
| 1264 __ SmiCompare(rcx, r11); | 1265 __ cmpq(rcx, r11); |
| 1265 __ j(not_equal, exit); | 1266 __ j(not_equal, exit); |
| 1266 | 1267 |
| 1267 __ incq(r15); | 1268 __ incq(r15); |
| 1268 __ SmiMod(rcx, rcx, r14, &fail_ok2); | 1269 __ SmiMod(rcx, rcx, r14, &fail_ok2); |
| 1269 __ jmp(exit); | 1270 __ jmp(exit); |
| 1270 __ bind(&fail_ok2); | 1271 __ bind(&fail_ok2); |
| 1271 | 1272 |
| 1272 __ incq(r15); | 1273 __ incq(r15); |
| 1273 __ SmiCompare(rcx, r11); | 1274 __ cmpq(rcx, r11); |
| 1274 __ j(not_equal, exit); | 1275 __ j(not_equal, exit); |
| 1275 } | 1276 } |
| 1276 } | 1277 } |
| 1277 | 1278 |
| 1278 | 1279 |
| 1279 TEST(SmiMod) { | 1280 TEST(SmiMod) { |
| 1280 // Allocate an executable page of memory. | 1281 // Allocate an executable page of memory. |
| 1281 size_t actual_size; | 1282 size_t actual_size; |
| 1282 byte* buffer = | 1283 byte* buffer = |
| 1283 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, | 1284 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1333 | 1334 |
| 1334 void TestSmiIndex(MacroAssembler* masm, Label* exit, int id, int x) { | 1335 void TestSmiIndex(MacroAssembler* masm, Label* exit, int id, int x) { |
| 1335 __ movl(rax, Immediate(id)); | 1336 __ movl(rax, Immediate(id)); |
| 1336 | 1337 |
| 1337 for (int i = 0; i < 8; i++) { | 1338 for (int i = 0; i < 8; i++) { |
| 1338 __ Move(rcx, Smi::FromInt(x)); | 1339 __ Move(rcx, Smi::FromInt(x)); |
| 1339 SmiIndex index = masm->SmiToIndex(rdx, rcx, i); | 1340 SmiIndex index = masm->SmiToIndex(rdx, rcx, i); |
| 1340 ASSERT(index.reg.is(rcx) || index.reg.is(rdx)); | 1341 ASSERT(index.reg.is(rcx) || index.reg.is(rdx)); |
| 1341 __ shl(index.reg, Immediate(index.scale)); | 1342 __ shl(index.reg, Immediate(index.scale)); |
| 1342 __ Set(r8, static_cast<intptr_t>(x) << i); | 1343 __ Set(r8, static_cast<intptr_t>(x) << i); |
| 1343 __ SmiCompare(index.reg, r8); | 1344 __ cmpq(index.reg, r8); |
| 1344 __ j(not_equal, exit); | 1345 __ j(not_equal, exit); |
| 1345 __ incq(rax); | 1346 __ incq(rax); |
| 1346 __ Move(rcx, Smi::FromInt(x)); | 1347 __ Move(rcx, Smi::FromInt(x)); |
| 1347 index = masm->SmiToIndex(rcx, rcx, i); | 1348 index = masm->SmiToIndex(rcx, rcx, i); |
| 1348 ASSERT(index.reg.is(rcx)); | 1349 ASSERT(index.reg.is(rcx)); |
| 1349 __ shl(rcx, Immediate(index.scale)); | 1350 __ shl(rcx, Immediate(index.scale)); |
| 1350 __ Set(r8, static_cast<intptr_t>(x) << i); | 1351 __ Set(r8, static_cast<intptr_t>(x) << i); |
| 1351 __ SmiCompare(rcx, r8); | 1352 __ cmpq(rcx, r8); |
| 1352 __ j(not_equal, exit); | 1353 __ j(not_equal, exit); |
| 1353 __ incq(rax); | 1354 __ incq(rax); |
| 1354 | 1355 |
| 1355 __ Move(rcx, Smi::FromInt(x)); | 1356 __ Move(rcx, Smi::FromInt(x)); |
| 1356 index = masm->SmiToNegativeIndex(rdx, rcx, i); | 1357 index = masm->SmiToNegativeIndex(rdx, rcx, i); |
| 1357 ASSERT(index.reg.is(rcx) || index.reg.is(rdx)); | 1358 ASSERT(index.reg.is(rcx) || index.reg.is(rdx)); |
| 1358 __ shl(index.reg, Immediate(index.scale)); | 1359 __ shl(index.reg, Immediate(index.scale)); |
| 1359 __ Set(r8, static_cast<intptr_t>(-x) << i); | 1360 __ Set(r8, static_cast<intptr_t>(-x) << i); |
| 1360 __ SmiCompare(index.reg, r8); | 1361 __ cmpq(index.reg, r8); |
| 1361 __ j(not_equal, exit); | 1362 __ j(not_equal, exit); |
| 1362 __ incq(rax); | 1363 __ incq(rax); |
| 1363 __ Move(rcx, Smi::FromInt(x)); | 1364 __ Move(rcx, Smi::FromInt(x)); |
| 1364 index = masm->SmiToNegativeIndex(rcx, rcx, i); | 1365 index = masm->SmiToNegativeIndex(rcx, rcx, i); |
| 1365 ASSERT(index.reg.is(rcx)); | 1366 ASSERT(index.reg.is(rcx)); |
| 1366 __ shl(rcx, Immediate(index.scale)); | 1367 __ shl(rcx, Immediate(index.scale)); |
| 1367 __ Set(r8, static_cast<intptr_t>(-x) << i); | 1368 __ Set(r8, static_cast<intptr_t>(-x) << i); |
| 1368 __ SmiCompare(rcx, r8); | 1369 __ cmpq(rcx, r8); |
| 1369 __ j(not_equal, exit); | 1370 __ j(not_equal, exit); |
| 1370 __ incq(rax); | 1371 __ incq(rax); |
| 1371 } | 1372 } |
| 1372 } | 1373 } |
| 1373 | 1374 |
| 1374 TEST(SmiIndex) { | 1375 TEST(SmiIndex) { |
| 1375 // Allocate an executable page of memory. | 1376 // Allocate an executable page of memory. |
| 1376 size_t actual_size; | 1377 size_t actual_size; |
| 1377 byte* buffer = | 1378 byte* buffer = |
| 1378 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 3, | 1379 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 3, |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 1407 | 1408 |
| 1408 | 1409 |
| 1409 void TestSelectNonSmi(MacroAssembler* masm, Label* exit, int id, int x, int y) { | 1410 void TestSelectNonSmi(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
| 1410 __ movl(rax, Immediate(id)); | 1411 __ movl(rax, Immediate(id)); |
| 1411 __ Move(rcx, Smi::FromInt(x)); | 1412 __ Move(rcx, Smi::FromInt(x)); |
| 1412 __ Move(rdx, Smi::FromInt(y)); | 1413 __ Move(rdx, Smi::FromInt(y)); |
| 1413 __ xor_(rdx, Immediate(kSmiTagMask)); | 1414 __ xor_(rdx, Immediate(kSmiTagMask)); |
| 1414 __ SelectNonSmi(r9, rcx, rdx, exit); | 1415 __ SelectNonSmi(r9, rcx, rdx, exit); |
| 1415 | 1416 |
| 1416 __ incq(rax); | 1417 __ incq(rax); |
| 1417 __ SmiCompare(r9, rdx); | 1418 __ cmpq(r9, rdx); |
| 1418 __ j(not_equal, exit); | 1419 __ j(not_equal, exit); |
| 1419 | 1420 |
| 1420 __ incq(rax); | 1421 __ incq(rax); |
| 1421 __ Move(rcx, Smi::FromInt(x)); | 1422 __ Move(rcx, Smi::FromInt(x)); |
| 1422 __ Move(rdx, Smi::FromInt(y)); | 1423 __ Move(rdx, Smi::FromInt(y)); |
| 1423 __ xor_(rcx, Immediate(kSmiTagMask)); | 1424 __ xor_(rcx, Immediate(kSmiTagMask)); |
| 1424 __ SelectNonSmi(r9, rcx, rdx, exit); | 1425 __ SelectNonSmi(r9, rcx, rdx, exit); |
| 1425 | 1426 |
| 1426 __ incq(rax); | 1427 __ incq(rax); |
| 1427 __ SmiCompare(r9, rcx); | 1428 __ cmpq(r9, rcx); |
| 1428 __ j(not_equal, exit); | 1429 __ j(not_equal, exit); |
| 1429 | 1430 |
| 1430 __ incq(rax); | 1431 __ incq(rax); |
| 1431 Label fail_ok; | 1432 Label fail_ok; |
| 1432 __ Move(rcx, Smi::FromInt(x)); | 1433 __ Move(rcx, Smi::FromInt(x)); |
| 1433 __ Move(rdx, Smi::FromInt(y)); | 1434 __ Move(rdx, Smi::FromInt(y)); |
| 1434 __ xor_(rcx, Immediate(kSmiTagMask)); | 1435 __ xor_(rcx, Immediate(kSmiTagMask)); |
| 1435 __ xor_(rdx, Immediate(kSmiTagMask)); | 1436 __ xor_(rdx, Immediate(kSmiTagMask)); |
| 1436 __ SelectNonSmi(r9, rcx, rdx, &fail_ok); | 1437 __ SelectNonSmi(r9, rcx, rdx, &fail_ok); |
| 1437 __ jmp(exit); | 1438 __ jmp(exit); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1481 void TestSmiAnd(MacroAssembler* masm, Label* exit, int id, int x, int y) { | 1482 void TestSmiAnd(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
| 1482 int result = x & y; | 1483 int result = x & y; |
| 1483 | 1484 |
| 1484 __ movl(rax, Immediate(id)); | 1485 __ movl(rax, Immediate(id)); |
| 1485 | 1486 |
| 1486 __ Move(rcx, Smi::FromInt(x)); | 1487 __ Move(rcx, Smi::FromInt(x)); |
| 1487 __ movq(r11, rcx); | 1488 __ movq(r11, rcx); |
| 1488 __ Move(rdx, Smi::FromInt(y)); | 1489 __ Move(rdx, Smi::FromInt(y)); |
| 1489 __ Move(r8, Smi::FromInt(result)); | 1490 __ Move(r8, Smi::FromInt(result)); |
| 1490 __ SmiAnd(r9, rcx, rdx); | 1491 __ SmiAnd(r9, rcx, rdx); |
| 1491 __ SmiCompare(r8, r9); | 1492 __ cmpq(r8, r9); |
| 1492 __ j(not_equal, exit); | 1493 __ j(not_equal, exit); |
| 1493 | 1494 |
| 1494 __ incq(rax); | 1495 __ incq(rax); |
| 1495 __ SmiCompare(r11, rcx); | 1496 __ cmpq(r11, rcx); |
| 1496 __ j(not_equal, exit); | 1497 __ j(not_equal, exit); |
| 1497 | 1498 |
| 1498 __ incq(rax); | 1499 __ incq(rax); |
| 1499 __ SmiAnd(rcx, rcx, rdx); | 1500 __ SmiAnd(rcx, rcx, rdx); |
| 1500 __ SmiCompare(r8, rcx); | 1501 __ cmpq(r8, rcx); |
| 1501 __ j(not_equal, exit); | 1502 __ j(not_equal, exit); |
| 1502 | 1503 |
| 1503 __ movq(rcx, r11); | 1504 __ movq(rcx, r11); |
| 1504 __ incq(rax); | 1505 __ incq(rax); |
| 1505 __ SmiAndConstant(r9, rcx, Smi::FromInt(y)); | 1506 __ SmiAndConstant(r9, rcx, Smi::FromInt(y)); |
| 1506 __ SmiCompare(r8, r9); | 1507 __ cmpq(r8, r9); |
| 1507 __ j(not_equal, exit); | 1508 __ j(not_equal, exit); |
| 1508 | 1509 |
| 1509 __ incq(rax); | 1510 __ incq(rax); |
| 1510 __ SmiCompare(r11, rcx); | 1511 __ cmpq(r11, rcx); |
| 1511 __ j(not_equal, exit); | 1512 __ j(not_equal, exit); |
| 1512 | 1513 |
| 1513 __ incq(rax); | 1514 __ incq(rax); |
| 1514 __ SmiAndConstant(rcx, rcx, Smi::FromInt(y)); | 1515 __ SmiAndConstant(rcx, rcx, Smi::FromInt(y)); |
| 1515 __ SmiCompare(r8, rcx); | 1516 __ cmpq(r8, rcx); |
| 1516 __ j(not_equal, exit); | 1517 __ j(not_equal, exit); |
| 1517 } | 1518 } |
| 1518 | 1519 |
| 1519 | 1520 |
| 1520 TEST(SmiAnd) { | 1521 TEST(SmiAnd) { |
| 1521 // Allocate an executable page of memory. | 1522 // Allocate an executable page of memory. |
| 1522 size_t actual_size; | 1523 size_t actual_size; |
| 1523 byte* buffer = | 1524 byte* buffer = |
| 1524 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 1525 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
| 1525 &actual_size, | 1526 &actual_size, |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1561 void TestSmiOr(MacroAssembler* masm, Label* exit, int id, int x, int y) { | 1562 void TestSmiOr(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
| 1562 int result = x | y; | 1563 int result = x | y; |
| 1563 | 1564 |
| 1564 __ movl(rax, Immediate(id)); | 1565 __ movl(rax, Immediate(id)); |
| 1565 | 1566 |
| 1566 __ Move(rcx, Smi::FromInt(x)); | 1567 __ Move(rcx, Smi::FromInt(x)); |
| 1567 __ movq(r11, rcx); | 1568 __ movq(r11, rcx); |
| 1568 __ Move(rdx, Smi::FromInt(y)); | 1569 __ Move(rdx, Smi::FromInt(y)); |
| 1569 __ Move(r8, Smi::FromInt(result)); | 1570 __ Move(r8, Smi::FromInt(result)); |
| 1570 __ SmiOr(r9, rcx, rdx); | 1571 __ SmiOr(r9, rcx, rdx); |
| 1571 __ SmiCompare(r8, r9); | 1572 __ cmpq(r8, r9); |
| 1572 __ j(not_equal, exit); | 1573 __ j(not_equal, exit); |
| 1573 | 1574 |
| 1574 __ incq(rax); | 1575 __ incq(rax); |
| 1575 __ SmiCompare(r11, rcx); | 1576 __ cmpq(r11, rcx); |
| 1576 __ j(not_equal, exit); | 1577 __ j(not_equal, exit); |
| 1577 | 1578 |
| 1578 __ incq(rax); | 1579 __ incq(rax); |
| 1579 __ SmiOr(rcx, rcx, rdx); | 1580 __ SmiOr(rcx, rcx, rdx); |
| 1580 __ SmiCompare(r8, rcx); | 1581 __ cmpq(r8, rcx); |
| 1581 __ j(not_equal, exit); | 1582 __ j(not_equal, exit); |
| 1582 | 1583 |
| 1583 __ movq(rcx, r11); | 1584 __ movq(rcx, r11); |
| 1584 __ incq(rax); | 1585 __ incq(rax); |
| 1585 __ SmiOrConstant(r9, rcx, Smi::FromInt(y)); | 1586 __ SmiOrConstant(r9, rcx, Smi::FromInt(y)); |
| 1586 __ SmiCompare(r8, r9); | 1587 __ cmpq(r8, r9); |
| 1587 __ j(not_equal, exit); | 1588 __ j(not_equal, exit); |
| 1588 | 1589 |
| 1589 __ incq(rax); | 1590 __ incq(rax); |
| 1590 __ SmiCompare(r11, rcx); | 1591 __ cmpq(r11, rcx); |
| 1591 __ j(not_equal, exit); | 1592 __ j(not_equal, exit); |
| 1592 | 1593 |
| 1593 __ incq(rax); | 1594 __ incq(rax); |
| 1594 __ SmiOrConstant(rcx, rcx, Smi::FromInt(y)); | 1595 __ SmiOrConstant(rcx, rcx, Smi::FromInt(y)); |
| 1595 __ SmiCompare(r8, rcx); | 1596 __ cmpq(r8, rcx); |
| 1596 __ j(not_equal, exit); | 1597 __ j(not_equal, exit); |
| 1597 } | 1598 } |
| 1598 | 1599 |
| 1599 | 1600 |
| 1600 TEST(SmiOr) { | 1601 TEST(SmiOr) { |
| 1601 // Allocate an executable page of memory. | 1602 // Allocate an executable page of memory. |
| 1602 size_t actual_size; | 1603 size_t actual_size; |
| 1603 byte* buffer = | 1604 byte* buffer = |
| 1604 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 1605 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
| 1605 &actual_size, | 1606 &actual_size, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1643 void TestSmiXor(MacroAssembler* masm, Label* exit, int id, int x, int y) { | 1644 void TestSmiXor(MacroAssembler* masm, Label* exit, int id, int x, int y) { |
| 1644 int result = x ^ y; | 1645 int result = x ^ y; |
| 1645 | 1646 |
| 1646 __ movl(rax, Immediate(id)); | 1647 __ movl(rax, Immediate(id)); |
| 1647 | 1648 |
| 1648 __ Move(rcx, Smi::FromInt(x)); | 1649 __ Move(rcx, Smi::FromInt(x)); |
| 1649 __ movq(r11, rcx); | 1650 __ movq(r11, rcx); |
| 1650 __ Move(rdx, Smi::FromInt(y)); | 1651 __ Move(rdx, Smi::FromInt(y)); |
| 1651 __ Move(r8, Smi::FromInt(result)); | 1652 __ Move(r8, Smi::FromInt(result)); |
| 1652 __ SmiXor(r9, rcx, rdx); | 1653 __ SmiXor(r9, rcx, rdx); |
| 1653 __ SmiCompare(r8, r9); | 1654 __ cmpq(r8, r9); |
| 1654 __ j(not_equal, exit); | 1655 __ j(not_equal, exit); |
| 1655 | 1656 |
| 1656 __ incq(rax); | 1657 __ incq(rax); |
| 1657 __ SmiCompare(r11, rcx); | 1658 __ cmpq(r11, rcx); |
| 1658 __ j(not_equal, exit); | 1659 __ j(not_equal, exit); |
| 1659 | 1660 |
| 1660 __ incq(rax); | 1661 __ incq(rax); |
| 1661 __ SmiXor(rcx, rcx, rdx); | 1662 __ SmiXor(rcx, rcx, rdx); |
| 1662 __ SmiCompare(r8, rcx); | 1663 __ cmpq(r8, rcx); |
| 1663 __ j(not_equal, exit); | 1664 __ j(not_equal, exit); |
| 1664 | 1665 |
| 1665 __ movq(rcx, r11); | 1666 __ movq(rcx, r11); |
| 1666 __ incq(rax); | 1667 __ incq(rax); |
| 1667 __ SmiXorConstant(r9, rcx, Smi::FromInt(y)); | 1668 __ SmiXorConstant(r9, rcx, Smi::FromInt(y)); |
| 1668 __ SmiCompare(r8, r9); | 1669 __ cmpq(r8, r9); |
| 1669 __ j(not_equal, exit); | 1670 __ j(not_equal, exit); |
| 1670 | 1671 |
| 1671 __ incq(rax); | 1672 __ incq(rax); |
| 1672 __ SmiCompare(r11, rcx); | 1673 __ cmpq(r11, rcx); |
| 1673 __ j(not_equal, exit); | 1674 __ j(not_equal, exit); |
| 1674 | 1675 |
| 1675 __ incq(rax); | 1676 __ incq(rax); |
| 1676 __ SmiXorConstant(rcx, rcx, Smi::FromInt(y)); | 1677 __ SmiXorConstant(rcx, rcx, Smi::FromInt(y)); |
| 1677 __ SmiCompare(r8, rcx); | 1678 __ cmpq(r8, rcx); |
| 1678 __ j(not_equal, exit); | 1679 __ j(not_equal, exit); |
| 1679 } | 1680 } |
| 1680 | 1681 |
| 1681 | 1682 |
| 1682 TEST(SmiXor) { | 1683 TEST(SmiXor) { |
| 1683 // Allocate an executable page of memory. | 1684 // Allocate an executable page of memory. |
| 1684 size_t actual_size; | 1685 size_t actual_size; |
| 1685 byte* buffer = | 1686 byte* buffer = |
| 1686 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 1687 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
| 1687 &actual_size, | 1688 &actual_size, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1724 | 1725 |
| 1725 void TestSmiNot(MacroAssembler* masm, Label* exit, int id, int x) { | 1726 void TestSmiNot(MacroAssembler* masm, Label* exit, int id, int x) { |
| 1726 int result = ~x; | 1727 int result = ~x; |
| 1727 __ movl(rax, Immediate(id)); | 1728 __ movl(rax, Immediate(id)); |
| 1728 | 1729 |
| 1729 __ Move(r8, Smi::FromInt(result)); | 1730 __ Move(r8, Smi::FromInt(result)); |
| 1730 __ Move(rcx, Smi::FromInt(x)); | 1731 __ Move(rcx, Smi::FromInt(x)); |
| 1731 __ movq(r11, rcx); | 1732 __ movq(r11, rcx); |
| 1732 | 1733 |
| 1733 __ SmiNot(r9, rcx); | 1734 __ SmiNot(r9, rcx); |
| 1734 __ SmiCompare(r9, r8); | 1735 __ cmpq(r9, r8); |
| 1735 __ j(not_equal, exit); | 1736 __ j(not_equal, exit); |
| 1736 | 1737 |
| 1737 __ incq(rax); | 1738 __ incq(rax); |
| 1738 __ SmiCompare(r11, rcx); | 1739 __ cmpq(r11, rcx); |
| 1739 __ j(not_equal, exit); | 1740 __ j(not_equal, exit); |
| 1740 | 1741 |
| 1741 __ incq(rax); | 1742 __ incq(rax); |
| 1742 __ SmiNot(rcx, rcx); | 1743 __ SmiNot(rcx, rcx); |
| 1743 __ SmiCompare(rcx, r8); | 1744 __ cmpq(rcx, r8); |
| 1744 __ j(not_equal, exit); | 1745 __ j(not_equal, exit); |
| 1745 } | 1746 } |
| 1746 | 1747 |
| 1747 | 1748 |
| 1748 TEST(SmiNot) { | 1749 TEST(SmiNot) { |
| 1749 // Allocate an executable page of memory. | 1750 // Allocate an executable page of memory. |
| 1750 size_t actual_size; | 1751 size_t actual_size; |
| 1751 byte* buffer = | 1752 byte* buffer = |
| 1752 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, | 1753 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize, |
| 1753 &actual_size, | 1754 &actual_size, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1790 for (int i = 0; i < kNumShifts; i++) { | 1791 for (int i = 0; i < kNumShifts; i++) { |
| 1791 // rax == id + i * 10. | 1792 // rax == id + i * 10. |
| 1792 int shift = shifts[i]; | 1793 int shift = shifts[i]; |
| 1793 int result = x << shift; | 1794 int result = x << shift; |
| 1794 CHECK(Smi::IsValid(result)); | 1795 CHECK(Smi::IsValid(result)); |
| 1795 __ Move(r8, Smi::FromInt(result)); | 1796 __ Move(r8, Smi::FromInt(result)); |
| 1796 __ Move(rcx, Smi::FromInt(x)); | 1797 __ Move(rcx, Smi::FromInt(x)); |
| 1797 __ SmiShiftLeftConstant(r9, rcx, shift); | 1798 __ SmiShiftLeftConstant(r9, rcx, shift); |
| 1798 | 1799 |
| 1799 __ incq(rax); | 1800 __ incq(rax); |
| 1800 __ SmiCompare(r9, r8); | 1801 __ cmpq(r9, r8); |
| 1801 __ j(not_equal, exit); | 1802 __ j(not_equal, exit); |
| 1802 | 1803 |
| 1803 __ incq(rax); | 1804 __ incq(rax); |
| 1804 __ Move(rcx, Smi::FromInt(x)); | 1805 __ Move(rcx, Smi::FromInt(x)); |
| 1805 __ SmiShiftLeftConstant(rcx, rcx, shift); | 1806 __ SmiShiftLeftConstant(rcx, rcx, shift); |
| 1806 | 1807 |
| 1807 __ incq(rax); | 1808 __ incq(rax); |
| 1808 __ SmiCompare(rcx, r8); | 1809 __ cmpq(rcx, r8); |
| 1809 __ j(not_equal, exit); | 1810 __ j(not_equal, exit); |
| 1810 | 1811 |
| 1811 __ incq(rax); | 1812 __ incq(rax); |
| 1812 __ Move(rdx, Smi::FromInt(x)); | 1813 __ Move(rdx, Smi::FromInt(x)); |
| 1813 __ Move(rcx, Smi::FromInt(shift)); | 1814 __ Move(rcx, Smi::FromInt(shift)); |
| 1814 __ SmiShiftLeft(r9, rdx, rcx); | 1815 __ SmiShiftLeft(r9, rdx, rcx); |
| 1815 | 1816 |
| 1816 __ incq(rax); | 1817 __ incq(rax); |
| 1817 __ SmiCompare(r9, r8); | 1818 __ cmpq(r9, r8); |
| 1818 __ j(not_equal, exit); | 1819 __ j(not_equal, exit); |
| 1819 | 1820 |
| 1820 __ incq(rax); | 1821 __ incq(rax); |
| 1821 __ Move(rdx, Smi::FromInt(x)); | 1822 __ Move(rdx, Smi::FromInt(x)); |
| 1822 __ Move(r11, Smi::FromInt(shift)); | 1823 __ Move(r11, Smi::FromInt(shift)); |
| 1823 __ SmiShiftLeft(r9, rdx, r11); | 1824 __ SmiShiftLeft(r9, rdx, r11); |
| 1824 | 1825 |
| 1825 __ incq(rax); | 1826 __ incq(rax); |
| 1826 __ SmiCompare(r9, r8); | 1827 __ cmpq(r9, r8); |
| 1827 __ j(not_equal, exit); | 1828 __ j(not_equal, exit); |
| 1828 | 1829 |
| 1829 __ incq(rax); | 1830 __ incq(rax); |
| 1830 __ Move(rdx, Smi::FromInt(x)); | 1831 __ Move(rdx, Smi::FromInt(x)); |
| 1831 __ Move(r11, Smi::FromInt(shift)); | 1832 __ Move(r11, Smi::FromInt(shift)); |
| 1832 __ SmiShiftLeft(rdx, rdx, r11); | 1833 __ SmiShiftLeft(rdx, rdx, r11); |
| 1833 | 1834 |
| 1834 __ incq(rax); | 1835 __ incq(rax); |
| 1835 __ SmiCompare(rdx, r8); | 1836 __ cmpq(rdx, r8); |
| 1836 __ j(not_equal, exit); | 1837 __ j(not_equal, exit); |
| 1837 | 1838 |
| 1838 __ incq(rax); | 1839 __ incq(rax); |
| 1839 } | 1840 } |
| 1840 } | 1841 } |
| 1841 | 1842 |
| 1842 | 1843 |
| 1843 TEST(SmiShiftLeft) { | 1844 TEST(SmiShiftLeft) { |
| 1844 // Allocate an executable page of memory. | 1845 // Allocate an executable page of memory. |
| 1845 size_t actual_size; | 1846 size_t actual_size; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1886 __ movl(rax, Immediate(id)); | 1887 __ movl(rax, Immediate(id)); |
| 1887 for (int i = 0; i < kNumShifts; i++) { | 1888 for (int i = 0; i < kNumShifts; i++) { |
| 1888 int shift = shifts[i]; | 1889 int shift = shifts[i]; |
| 1889 intptr_t result = static_cast<unsigned int>(x) >> shift; | 1890 intptr_t result = static_cast<unsigned int>(x) >> shift; |
| 1890 if (Smi::IsValid(result)) { | 1891 if (Smi::IsValid(result)) { |
| 1891 __ Move(r8, Smi::FromInt(static_cast<int>(result))); | 1892 __ Move(r8, Smi::FromInt(static_cast<int>(result))); |
| 1892 __ Move(rcx, Smi::FromInt(x)); | 1893 __ Move(rcx, Smi::FromInt(x)); |
| 1893 __ SmiShiftLogicalRightConstant(r9, rcx, shift, exit); | 1894 __ SmiShiftLogicalRightConstant(r9, rcx, shift, exit); |
| 1894 | 1895 |
| 1895 __ incq(rax); | 1896 __ incq(rax); |
| 1896 __ SmiCompare(r9, r8); | 1897 __ cmpq(r9, r8); |
| 1897 __ j(not_equal, exit); | 1898 __ j(not_equal, exit); |
| 1898 | 1899 |
| 1899 __ incq(rax); | 1900 __ incq(rax); |
| 1900 __ Move(rdx, Smi::FromInt(x)); | 1901 __ Move(rdx, Smi::FromInt(x)); |
| 1901 __ Move(rcx, Smi::FromInt(shift)); | 1902 __ Move(rcx, Smi::FromInt(shift)); |
| 1902 __ SmiShiftLogicalRight(r9, rdx, rcx, exit); | 1903 __ SmiShiftLogicalRight(r9, rdx, rcx, exit); |
| 1903 | 1904 |
| 1904 __ incq(rax); | 1905 __ incq(rax); |
| 1905 __ SmiCompare(r9, r8); | 1906 __ cmpq(r9, r8); |
| 1906 __ j(not_equal, exit); | 1907 __ j(not_equal, exit); |
| 1907 | 1908 |
| 1908 __ incq(rax); | 1909 __ incq(rax); |
| 1909 __ Move(rdx, Smi::FromInt(x)); | 1910 __ Move(rdx, Smi::FromInt(x)); |
| 1910 __ Move(r11, Smi::FromInt(shift)); | 1911 __ Move(r11, Smi::FromInt(shift)); |
| 1911 __ SmiShiftLogicalRight(r9, rdx, r11, exit); | 1912 __ SmiShiftLogicalRight(r9, rdx, r11, exit); |
| 1912 | 1913 |
| 1913 __ incq(rax); | 1914 __ incq(rax); |
| 1914 __ SmiCompare(r9, r8); | 1915 __ cmpq(r9, r8); |
| 1915 __ j(not_equal, exit); | 1916 __ j(not_equal, exit); |
| 1916 | 1917 |
| 1917 __ incq(rax); | 1918 __ incq(rax); |
| 1918 } else { | 1919 } else { |
| 1919 // Cannot happen with long smis. | 1920 // Cannot happen with long smis. |
| 1920 Label fail_ok; | 1921 Label fail_ok; |
| 1921 __ Move(rcx, Smi::FromInt(x)); | 1922 __ Move(rcx, Smi::FromInt(x)); |
| 1922 __ movq(r11, rcx); | 1923 __ movq(r11, rcx); |
| 1923 __ SmiShiftLogicalRightConstant(r9, rcx, shift, &fail_ok); | 1924 __ SmiShiftLogicalRightConstant(r9, rcx, shift, &fail_ok); |
| 1924 __ jmp(exit); | 1925 __ jmp(exit); |
| 1925 __ bind(&fail_ok); | 1926 __ bind(&fail_ok); |
| 1926 | 1927 |
| 1927 __ incq(rax); | 1928 __ incq(rax); |
| 1928 __ SmiCompare(rcx, r11); | 1929 __ cmpq(rcx, r11); |
| 1929 __ j(not_equal, exit); | 1930 __ j(not_equal, exit); |
| 1930 | 1931 |
| 1931 __ incq(rax); | 1932 __ incq(rax); |
| 1932 __ Move(r8, Smi::FromInt(shift)); | 1933 __ Move(r8, Smi::FromInt(shift)); |
| 1933 Label fail_ok3; | 1934 Label fail_ok3; |
| 1934 __ SmiShiftLogicalRight(r9, rcx, r8, &fail_ok3); | 1935 __ SmiShiftLogicalRight(r9, rcx, r8, &fail_ok3); |
| 1935 __ jmp(exit); | 1936 __ jmp(exit); |
| 1936 __ bind(&fail_ok3); | 1937 __ bind(&fail_ok3); |
| 1937 | 1938 |
| 1938 __ incq(rax); | 1939 __ incq(rax); |
| 1939 __ SmiCompare(rcx, r11); | 1940 __ cmpq(rcx, r11); |
| 1940 __ j(not_equal, exit); | 1941 __ j(not_equal, exit); |
| 1941 | 1942 |
| 1942 __ addq(rax, Immediate(3)); | 1943 __ addq(rax, Immediate(3)); |
| 1943 } | 1944 } |
| 1944 } | 1945 } |
| 1945 } | 1946 } |
| 1946 | 1947 |
| 1947 | 1948 |
| 1948 TEST(SmiShiftLogicalRight) { | 1949 TEST(SmiShiftLogicalRight) { |
| 1949 // Allocate an executable page of memory. | 1950 // Allocate an executable page of memory. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1990 const int kNumShifts = 5; | 1991 const int kNumShifts = 5; |
| 1991 __ movl(rax, Immediate(id)); | 1992 __ movl(rax, Immediate(id)); |
| 1992 for (int i = 0; i < kNumShifts; i++) { | 1993 for (int i = 0; i < kNumShifts; i++) { |
| 1993 int shift = shifts[i]; | 1994 int shift = shifts[i]; |
| 1994 // Guaranteed arithmetic shift. | 1995 // Guaranteed arithmetic shift. |
| 1995 int result = (x < 0) ? ~((~x) >> shift) : (x >> shift); | 1996 int result = (x < 0) ? ~((~x) >> shift) : (x >> shift); |
| 1996 __ Move(r8, Smi::FromInt(result)); | 1997 __ Move(r8, Smi::FromInt(result)); |
| 1997 __ Move(rcx, Smi::FromInt(x)); | 1998 __ Move(rcx, Smi::FromInt(x)); |
| 1998 __ SmiShiftArithmeticRightConstant(rcx, rcx, shift); | 1999 __ SmiShiftArithmeticRightConstant(rcx, rcx, shift); |
| 1999 | 2000 |
| 2000 __ SmiCompare(rcx, r8); | 2001 __ cmpq(rcx, r8); |
| 2001 __ j(not_equal, exit); | 2002 __ j(not_equal, exit); |
| 2002 | 2003 |
| 2003 __ incq(rax); | 2004 __ incq(rax); |
| 2004 __ Move(rdx, Smi::FromInt(x)); | 2005 __ Move(rdx, Smi::FromInt(x)); |
| 2005 __ Move(r11, Smi::FromInt(shift)); | 2006 __ Move(r11, Smi::FromInt(shift)); |
| 2006 __ SmiShiftArithmeticRight(rdx, rdx, r11); | 2007 __ SmiShiftArithmeticRight(rdx, rdx, r11); |
| 2007 | 2008 |
| 2008 __ SmiCompare(rdx, r8); | 2009 __ cmpq(rdx, r8); |
| 2009 __ j(not_equal, exit); | 2010 __ j(not_equal, exit); |
| 2010 | 2011 |
| 2011 __ incq(rax); | 2012 __ incq(rax); |
| 2012 } | 2013 } |
| 2013 } | 2014 } |
| 2014 | 2015 |
| 2015 | 2016 |
| 2016 TEST(SmiShiftArithmeticRight) { | 2017 TEST(SmiShiftArithmeticRight) { |
| 2017 // Allocate an executable page of memory. | 2018 // Allocate an executable page of memory. |
| 2018 size_t actual_size; | 2019 size_t actual_size; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2055 int powers[] = { 0, 1, 2, 3, 8, 16, 24, 31 }; | 2056 int powers[] = { 0, 1, 2, 3, 8, 16, 24, 31 }; |
| 2056 int power_count = 8; | 2057 int power_count = 8; |
| 2057 __ movl(rax, Immediate(id)); | 2058 __ movl(rax, Immediate(id)); |
| 2058 for (int i = 0; i < power_count; i++) { | 2059 for (int i = 0; i < power_count; i++) { |
| 2059 int power = powers[i]; | 2060 int power = powers[i]; |
| 2060 intptr_t result = static_cast<intptr_t>(x) << power; | 2061 intptr_t result = static_cast<intptr_t>(x) << power; |
| 2061 __ Set(r8, result); | 2062 __ Set(r8, result); |
| 2062 __ Move(rcx, Smi::FromInt(x)); | 2063 __ Move(rcx, Smi::FromInt(x)); |
| 2063 __ movq(r11, rcx); | 2064 __ movq(r11, rcx); |
| 2064 __ PositiveSmiTimesPowerOfTwoToInteger64(rdx, rcx, power); | 2065 __ PositiveSmiTimesPowerOfTwoToInteger64(rdx, rcx, power); |
| 2065 __ SmiCompare(rdx, r8); | 2066 __ cmpq(rdx, r8); |
| 2066 __ j(not_equal, exit); | 2067 __ j(not_equal, exit); |
| 2067 __ incq(rax); | 2068 __ incq(rax); |
| 2068 __ SmiCompare(r11, rcx); // rcx unchanged. | 2069 __ cmpq(r11, rcx); // rcx unchanged. |
| 2069 __ j(not_equal, exit); | 2070 __ j(not_equal, exit); |
| 2070 __ incq(rax); | 2071 __ incq(rax); |
| 2071 __ PositiveSmiTimesPowerOfTwoToInteger64(rcx, rcx, power); | 2072 __ PositiveSmiTimesPowerOfTwoToInteger64(rcx, rcx, power); |
| 2072 __ SmiCompare(rdx, r8); | 2073 __ cmpq(rdx, r8); |
| 2073 __ j(not_equal, exit); | 2074 __ j(not_equal, exit); |
| 2074 __ incq(rax); | 2075 __ incq(rax); |
| 2075 } | 2076 } |
| 2076 } | 2077 } |
| 2077 | 2078 |
| 2078 | 2079 |
| 2079 TEST(PositiveSmiTimesPowerOfTwoToInteger64) { | 2080 TEST(PositiveSmiTimesPowerOfTwoToInteger64) { |
| 2081 v8::V8::Initialize(); | |
| 2080 // Allocate an executable page of memory. | 2082 // Allocate an executable page of memory. |
| 2081 size_t actual_size; | 2083 size_t actual_size; |
| 2082 byte* buffer = | 2084 byte* buffer = |
| 2083 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 2, | 2085 static_cast<byte*>(OS::Allocate(Assembler::kMinimalBufferSize * 4, |
| 2084 &actual_size, | 2086 &actual_size, |
| 2085 true)); | 2087 true)); |
| 2086 CHECK(buffer); | 2088 CHECK(buffer); |
| 2087 HandleScope handles; | 2089 HandleScope handles; |
| 2088 MacroAssembler assembler(buffer, static_cast<int>(actual_size)); | 2090 MacroAssembler assembler(buffer, static_cast<int>(actual_size)); |
| 2089 | 2091 |
| 2090 MacroAssembler* masm = &assembler; | 2092 MacroAssembler* masm = &assembler; |
| 2091 masm->set_allow_stub_calls(false); | 2093 masm->set_allow_stub_calls(false); |
| 2092 EntryCode(masm); | 2094 EntryCode(masm); |
| 2093 Label exit; | 2095 Label exit; |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2465 CodeDesc desc; | 2467 CodeDesc desc; |
| 2466 masm->GetCode(&desc); | 2468 masm->GetCode(&desc); |
| 2467 // Call the function from C++. | 2469 // Call the function from C++. |
| 2468 int result = FUNCTION_CAST<F0>(buffer)(); | 2470 int result = FUNCTION_CAST<F0>(buffer)(); |
| 2469 CHECK_EQ(0, result); | 2471 CHECK_EQ(0, result); |
| 2470 } | 2472 } |
| 2471 | 2473 |
| 2472 | 2474 |
| 2473 | 2475 |
| 2474 #undef __ | 2476 #undef __ |
| OLD | NEW |