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 3318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3329 Result left = frame_->Pop(); | 3329 Result left = frame_->Pop(); |
3330 right.ToRegister(); | 3330 right.ToRegister(); |
3331 left.ToRegister(); | 3331 left.ToRegister(); |
3332 __ cmpq(right.reg(), left.reg()); | 3332 __ cmpq(right.reg(), left.reg()); |
3333 right.Unuse(); | 3333 right.Unuse(); |
3334 left.Unuse(); | 3334 left.Unuse(); |
3335 destination()->Split(equal); | 3335 destination()->Split(equal); |
3336 } | 3336 } |
3337 | 3337 |
3338 | 3338 |
| 3339 void CodeGenerator::GenerateRandomPositiveSmi(ZoneList<Expression*>* args) { |
| 3340 ASSERT(args->length() == 0); |
| 3341 frame_->SpillAll(); |
3339 | 3342 |
3340 void CodeGenerator::GenerateRandomPositiveSmi(ZoneList<Expression*>* a) { | 3343 // Make sure the frame is aligned like the OS expects. |
3341 UNIMPLEMENTED(); | 3344 static const int kFrameAlignment = OS::ActivationFrameAlignment(); |
| 3345 if (kFrameAlignment > 0) { |
| 3346 ASSERT(IsPowerOf2(kFrameAlignment)); |
| 3347 __ movq(rbx, rsp); // Save in AMD-64 abi callee-saved register. |
| 3348 __ and_(rsp, Immediate(-kFrameAlignment)); |
| 3349 } |
| 3350 |
| 3351 // Call V8::RandomPositiveSmi(). |
| 3352 __ Call(FUNCTION_ADDR(V8::RandomPositiveSmi), RelocInfo::RUNTIME_ENTRY); |
| 3353 |
| 3354 // Restore stack pointer from callee-saved register edi. |
| 3355 if (kFrameAlignment > 0) { |
| 3356 __ movq(rsp, rbx); |
| 3357 } |
| 3358 |
| 3359 Result result = allocator_->Allocate(rax); |
| 3360 frame_->Push(&result); |
3342 } | 3361 } |
3343 | 3362 |
| 3363 |
3344 void CodeGenerator::GenerateFastMathOp(MathOp op, ZoneList<Expression*>* args) { | 3364 void CodeGenerator::GenerateFastMathOp(MathOp op, ZoneList<Expression*>* args) { |
3345 UNIMPLEMENTED(); | 3365 UNIMPLEMENTED(); |
3346 } | 3366 } |
3347 | 3367 |
3348 | 3368 |
3349 void CodeGenerator::GenerateClassOf(ZoneList<Expression*>* args) { | 3369 void CodeGenerator::GenerateClassOf(ZoneList<Expression*>* args) { |
3350 // TODO(X64): Optimize this like it's done on IA-32. | 3370 // TODO(X64): Optimize this like it's done on IA-32. |
3351 ASSERT(args->length() == 1); | 3371 ASSERT(args->length() == 1); |
3352 Load(args->at(0)); // Load the object. | 3372 Load(args->at(0)); // Load the object. |
3353 Result result = frame_->CallRuntime(Runtime::kClassOf, 1); | 3373 Result result = frame_->CallRuntime(Runtime::kClassOf, 1); |
(...skipping 2127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5481 frame_->Push(Handle<Object>(answer_object)); | 5501 frame_->Push(Handle<Object>(answer_object)); |
5482 return true; | 5502 return true; |
5483 } | 5503 } |
5484 | 5504 |
5485 | 5505 |
5486 // End of CodeGenerator implementation. | 5506 // End of CodeGenerator implementation. |
5487 | 5507 |
5488 void UnarySubStub::Generate(MacroAssembler* masm) { | 5508 void UnarySubStub::Generate(MacroAssembler* masm) { |
5489 Label slow; | 5509 Label slow; |
5490 Label done; | 5510 Label done; |
5491 Label try_float; | |
5492 | 5511 |
5493 // Check whether the value is a smi. | 5512 // Check whether the value is a smi. |
5494 __ testl(rax, Immediate(kSmiTagMask)); | 5513 __ testl(rax, Immediate(kSmiTagMask)); |
5495 // TODO(X64): Add inline code that handles floats, as on ia32 platform. | 5514 // TODO(X64): Add inline code that handles floats, as on ia32 platform. |
5496 __ j(not_zero, &slow); | 5515 __ j(not_zero, &slow); |
5497 | 5516 // Enter runtime system if the value of the smi is zero |
5498 // Enter runtime system if the value of the expression is zero | |
5499 // to make sure that we switch between 0 and -0. | 5517 // to make sure that we switch between 0 and -0. |
5500 __ testq(rax, rax); | 5518 // Also enter it if the value of the smi is Smi::kMinValue |
| 5519 __ testl(rax, Immediate(0x7FFFFFFE)); |
5501 __ j(zero, &slow); | 5520 __ j(zero, &slow); |
5502 | 5521 __ neg(rax); |
5503 // The value of the expression is a smi that is not zero. Try | 5522 __ jmp(&done); |
5504 // optimistic subtraction '0 - value'. | |
5505 __ movq(rdx, rax); | |
5506 __ xor_(rax, rax); | |
5507 __ subl(rax, rdx); | |
5508 __ j(no_overflow, &done); | |
5509 // Restore rax and enter runtime system. | |
5510 __ movq(rax, rdx); | |
5511 | |
5512 // Enter runtime system. | 5523 // Enter runtime system. |
5513 __ bind(&slow); | 5524 __ bind(&slow); |
5514 __ pop(rcx); // pop return address | 5525 __ pop(rcx); // pop return address |
5515 __ push(rax); | 5526 __ push(rax); |
5516 __ push(rcx); // push return address | 5527 __ push(rcx); // push return address |
5517 __ InvokeBuiltin(Builtins::UNARY_MINUS, JUMP_FUNCTION); | 5528 __ InvokeBuiltin(Builtins::UNARY_MINUS, JUMP_FUNCTION); |
5518 | 5529 |
5519 __ bind(&done); | 5530 __ bind(&done); |
5520 __ StubReturn(1); | 5531 __ StubReturn(1); |
5521 } | 5532 } |
(...skipping 1305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6827 int CompareStub::MinorKey() { | 6838 int CompareStub::MinorKey() { |
6828 // Encode the two parameters in a unique 16 bit value. | 6839 // Encode the two parameters in a unique 16 bit value. |
6829 ASSERT(static_cast<unsigned>(cc_) < (1 << 15)); | 6840 ASSERT(static_cast<unsigned>(cc_) < (1 << 15)); |
6830 return (static_cast<unsigned>(cc_) << 1) | (strict_ ? 1 : 0); | 6841 return (static_cast<unsigned>(cc_) << 1) | (strict_ ? 1 : 0); |
6831 } | 6842 } |
6832 | 6843 |
6833 | 6844 |
6834 #undef __ | 6845 #undef __ |
6835 | 6846 |
6836 } } // namespace v8::internal | 6847 } } // namespace v8::internal |
OLD | NEW |