| 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 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 // expectation. | 344 // expectation. |
| 345 if (f->nargs >= 0 && f->nargs != num_arguments) { | 345 if (f->nargs >= 0 && f->nargs != num_arguments) { |
| 346 IllegalOperation(num_arguments); | 346 IllegalOperation(num_arguments); |
| 347 return; | 347 return; |
| 348 } | 348 } |
| 349 | 349 |
| 350 // TODO(1236192): Most runtime routines don't need the number of | 350 // TODO(1236192): Most runtime routines don't need the number of |
| 351 // arguments passed in because it is constant. At some point we | 351 // arguments passed in because it is constant. At some point we |
| 352 // should remove this need and make the runtime routine entry code | 352 // should remove this need and make the runtime routine entry code |
| 353 // smarter. | 353 // smarter. |
| 354 movq(rax, Immediate(num_arguments)); | 354 Set(rax, num_arguments); |
| 355 movq(rbx, ExternalReference(f)); | 355 movq(rbx, ExternalReference(f)); |
| 356 CEntryStub ces(f->result_size); | 356 CEntryStub ces(f->result_size); |
| 357 CallStub(&ces); | 357 CallStub(&ces); |
| 358 } | 358 } |
| 359 | 359 |
| 360 | 360 |
| 361 void MacroAssembler::CallExternalReference(const ExternalReference& ext, | 361 void MacroAssembler::CallExternalReference(const ExternalReference& ext, |
| 362 int num_arguments) { | 362 int num_arguments) { |
| 363 movq(rax, Immediate(num_arguments)); | 363 Set(rax, num_arguments); |
| 364 movq(rbx, ext); | 364 movq(rbx, ext); |
| 365 | 365 |
| 366 CEntryStub stub(1); | 366 CEntryStub stub(1); |
| 367 CallStub(&stub); | 367 CallStub(&stub); |
| 368 } | 368 } |
| 369 | 369 |
| 370 | 370 |
| 371 void MacroAssembler::TailCallExternalReference(const ExternalReference& ext, | 371 void MacroAssembler::TailCallExternalReference(const ExternalReference& ext, |
| 372 int num_arguments, | 372 int num_arguments, |
| 373 int result_size) { | 373 int result_size) { |
| 374 // ----------- S t a t e ------------- | 374 // ----------- S t a t e ------------- |
| 375 // -- rsp[0] : return address | 375 // -- rsp[0] : return address |
| 376 // -- rsp[8] : argument num_arguments - 1 | 376 // -- rsp[8] : argument num_arguments - 1 |
| 377 // ... | 377 // ... |
| 378 // -- rsp[8 * num_arguments] : argument 0 (receiver) | 378 // -- rsp[8 * num_arguments] : argument 0 (receiver) |
| 379 // ----------------------------------- | 379 // ----------------------------------- |
| 380 | 380 |
| 381 // TODO(1236192): Most runtime routines don't need the number of | 381 // TODO(1236192): Most runtime routines don't need the number of |
| 382 // arguments passed in because it is constant. At some point we | 382 // arguments passed in because it is constant. At some point we |
| 383 // should remove this need and make the runtime routine entry code | 383 // should remove this need and make the runtime routine entry code |
| 384 // smarter. | 384 // smarter. |
| 385 movq(rax, Immediate(num_arguments)); | 385 Set(rax, num_arguments); |
| 386 JumpToExternalReference(ext, result_size); | 386 JumpToExternalReference(ext, result_size); |
| 387 } | 387 } |
| 388 | 388 |
| 389 | 389 |
| 390 void MacroAssembler::TailCallRuntime(Runtime::FunctionId fid, | 390 void MacroAssembler::TailCallRuntime(Runtime::FunctionId fid, |
| 391 int num_arguments, | 391 int num_arguments, |
| 392 int result_size) { | 392 int result_size) { |
| 393 TailCallExternalReference(ExternalReference(fid), num_arguments, result_size); | 393 TailCallExternalReference(ExternalReference(fid), num_arguments, result_size); |
| 394 } | 394 } |
| 395 | 395 |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 633 rol(kScratchRegister, Immediate(1)); | 633 rol(kScratchRegister, Immediate(1)); |
| 634 testl(kScratchRegister, Immediate(0x03)); | 634 testl(kScratchRegister, Immediate(0x03)); |
| 635 return zero; | 635 return zero; |
| 636 } | 636 } |
| 637 | 637 |
| 638 | 638 |
| 639 Condition MacroAssembler::CheckBothSmi(Register first, Register second) { | 639 Condition MacroAssembler::CheckBothSmi(Register first, Register second) { |
| 640 if (first.is(second)) { | 640 if (first.is(second)) { |
| 641 return CheckSmi(first); | 641 return CheckSmi(first); |
| 642 } | 642 } |
| 643 movl(kScratchRegister, first); | 643 ASSERT(kSmiTag == 0 && kHeapObjectTag == 1 && kHeapObjectTagMask == 3); |
| 644 orl(kScratchRegister, second); | 644 leal(kScratchRegister, Operand(first, second, times_1, 0)); |
| 645 testb(kScratchRegister, Immediate(kSmiTagMask)); | 645 testb(kScratchRegister, Immediate(0x03)); |
| 646 return zero; | 646 return zero; |
| 647 } | 647 } |
| 648 | 648 |
| 649 | 649 |
| 650 Condition MacroAssembler::CheckBothPositiveSmi(Register first, | 650 Condition MacroAssembler::CheckBothPositiveSmi(Register first, |
| 651 Register second) { | 651 Register second) { |
| 652 if (first.is(second)) { | 652 if (first.is(second)) { |
| 653 return CheckPositiveSmi(first); | 653 return CheckPositiveSmi(first); |
| 654 } | 654 } |
| 655 movq(kScratchRegister, first); | 655 movq(kScratchRegister, first); |
| (...skipping 1274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1930 Register code_register, | 1930 Register code_register, |
| 1931 Label* done, | 1931 Label* done, |
| 1932 InvokeFlag flag) { | 1932 InvokeFlag flag) { |
| 1933 bool definitely_matches = false; | 1933 bool definitely_matches = false; |
| 1934 Label invoke; | 1934 Label invoke; |
| 1935 if (expected.is_immediate()) { | 1935 if (expected.is_immediate()) { |
| 1936 ASSERT(actual.is_immediate()); | 1936 ASSERT(actual.is_immediate()); |
| 1937 if (expected.immediate() == actual.immediate()) { | 1937 if (expected.immediate() == actual.immediate()) { |
| 1938 definitely_matches = true; | 1938 definitely_matches = true; |
| 1939 } else { | 1939 } else { |
| 1940 movq(rax, Immediate(actual.immediate())); | 1940 Set(rax, actual.immediate()); |
| 1941 if (expected.immediate() == | 1941 if (expected.immediate() == |
| 1942 SharedFunctionInfo::kDontAdaptArgumentsSentinel) { | 1942 SharedFunctionInfo::kDontAdaptArgumentsSentinel) { |
| 1943 // Don't worry about adapting arguments for built-ins that | 1943 // Don't worry about adapting arguments for built-ins that |
| 1944 // don't want that done. Skip adaption code by making it look | 1944 // don't want that done. Skip adaption code by making it look |
| 1945 // like we have a match between expected and actual number of | 1945 // like we have a match between expected and actual number of |
| 1946 // arguments. | 1946 // arguments. |
| 1947 definitely_matches = true; | 1947 definitely_matches = true; |
| 1948 } else { | 1948 } else { |
| 1949 movq(rbx, Immediate(expected.immediate())); | 1949 Set(rbx, expected.immediate()); |
| 1950 } | 1950 } |
| 1951 } | 1951 } |
| 1952 } else { | 1952 } else { |
| 1953 if (actual.is_immediate()) { | 1953 if (actual.is_immediate()) { |
| 1954 // Expected is in register, actual is immediate. This is the | 1954 // Expected is in register, actual is immediate. This is the |
| 1955 // case when we invoke function values without going through the | 1955 // case when we invoke function values without going through the |
| 1956 // IC mechanism. | 1956 // IC mechanism. |
| 1957 cmpq(expected.reg(), Immediate(actual.immediate())); | 1957 cmpq(expected.reg(), Immediate(actual.immediate())); |
| 1958 j(equal, &invoke); | 1958 j(equal, &invoke); |
| 1959 ASSERT(expected.reg().is(rbx)); | 1959 ASSERT(expected.reg().is(rbx)); |
| 1960 movq(rax, Immediate(actual.immediate())); | 1960 Set(rax, actual.immediate()); |
| 1961 } else if (!expected.reg().is(actual.reg())) { | 1961 } else if (!expected.reg().is(actual.reg())) { |
| 1962 // Both expected and actual are in (different) registers. This | 1962 // Both expected and actual are in (different) registers. This |
| 1963 // is the case when we invoke functions using call and apply. | 1963 // is the case when we invoke functions using call and apply. |
| 1964 cmpq(expected.reg(), actual.reg()); | 1964 cmpq(expected.reg(), actual.reg()); |
| 1965 j(equal, &invoke); | 1965 j(equal, &invoke); |
| 1966 ASSERT(actual.reg().is(rax)); | 1966 ASSERT(actual.reg().is(rax)); |
| 1967 ASSERT(expected.reg().is(rbx)); | 1967 ASSERT(expected.reg().is(rbx)); |
| 1968 } | 1968 } |
| 1969 } | 1969 } |
| 1970 | 1970 |
| (...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2755 CPU::FlushICache(address_, size_); | 2755 CPU::FlushICache(address_, size_); |
| 2756 | 2756 |
| 2757 // Check that the code was patched as expected. | 2757 // Check that the code was patched as expected. |
| 2758 ASSERT(masm_.pc_ == address_ + size_); | 2758 ASSERT(masm_.pc_ == address_ + size_); |
| 2759 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); | 2759 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); |
| 2760 } | 2760 } |
| 2761 | 2761 |
| 2762 } } // namespace v8::internal | 2762 } } // namespace v8::internal |
| 2763 | 2763 |
| 2764 #endif // V8_TARGET_ARCH_X64 | 2764 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |