Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/x64/lithium-codegen-x64.cc

Issue 196893003: Introduce addp, idivp, imulp and subp for x64 port (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 ASSERT(!frame_is_built_); 180 ASSERT(!frame_is_built_);
181 frame_is_built_ = true; 181 frame_is_built_ = true;
182 __ Prologue(info()->IsStub() ? BUILD_STUB_FRAME : BUILD_FUNCTION_FRAME); 182 __ Prologue(info()->IsStub() ? BUILD_STUB_FRAME : BUILD_FUNCTION_FRAME);
183 info()->AddNoFrameRange(0, masm_->pc_offset()); 183 info()->AddNoFrameRange(0, masm_->pc_offset());
184 } 184 }
185 185
186 // Reserve space for the stack slots needed by the code. 186 // Reserve space for the stack slots needed by the code.
187 int slots = GetStackSlotCount(); 187 int slots = GetStackSlotCount();
188 if (slots > 0) { 188 if (slots > 0) {
189 if (FLAG_debug_code) { 189 if (FLAG_debug_code) {
190 __ subq(rsp, Immediate(slots * kPointerSize)); 190 __ subp(rsp, Immediate(slots * kPointerSize));
191 #ifdef _MSC_VER 191 #ifdef _MSC_VER
192 MakeSureStackPagesMapped(slots * kPointerSize); 192 MakeSureStackPagesMapped(slots * kPointerSize);
193 #endif 193 #endif
194 __ Push(rax); 194 __ Push(rax);
195 __ Set(rax, slots); 195 __ Set(rax, slots);
196 __ movq(kScratchRegister, kSlotsZapValue); 196 __ movq(kScratchRegister, kSlotsZapValue);
197 Label loop; 197 Label loop;
198 __ bind(&loop); 198 __ bind(&loop);
199 __ movp(MemOperand(rsp, rax, times_pointer_size, 0), 199 __ movp(MemOperand(rsp, rax, times_pointer_size, 0),
200 kScratchRegister); 200 kScratchRegister);
201 __ decl(rax); 201 __ decl(rax);
202 __ j(not_zero, &loop); 202 __ j(not_zero, &loop);
203 __ Pop(rax); 203 __ Pop(rax);
204 } else { 204 } else {
205 __ subq(rsp, Immediate(slots * kPointerSize)); 205 __ subp(rsp, Immediate(slots * kPointerSize));
206 #ifdef _MSC_VER 206 #ifdef _MSC_VER
207 MakeSureStackPagesMapped(slots * kPointerSize); 207 MakeSureStackPagesMapped(slots * kPointerSize);
208 #endif 208 #endif
209 } 209 }
210 210
211 if (info()->saves_caller_doubles()) { 211 if (info()->saves_caller_doubles()) {
212 SaveCallerDoubles(); 212 SaveCallerDoubles();
213 } 213 }
214 } 214 }
215 215
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 // Generate the OSR entry prologue at the first unknown OSR value, or if there 262 // Generate the OSR entry prologue at the first unknown OSR value, or if there
263 // are none, at the OSR entrypoint instruction. 263 // are none, at the OSR entrypoint instruction.
264 if (osr_pc_offset_ >= 0) return; 264 if (osr_pc_offset_ >= 0) return;
265 265
266 osr_pc_offset_ = masm()->pc_offset(); 266 osr_pc_offset_ = masm()->pc_offset();
267 267
268 // Adjust the frame size, subsuming the unoptimized frame into the 268 // Adjust the frame size, subsuming the unoptimized frame into the
269 // optimized frame. 269 // optimized frame.
270 int slots = GetStackSlotCount() - graph()->osr()->UnoptimizedFrameSlots(); 270 int slots = GetStackSlotCount() - graph()->osr()->UnoptimizedFrameSlots();
271 ASSERT(slots >= 0); 271 ASSERT(slots >= 0);
272 __ subq(rsp, Immediate(slots * kPointerSize)); 272 __ subp(rsp, Immediate(slots * kPointerSize));
273 } 273 }
274 274
275 275
276 void LCodeGen::GenerateBodyInstructionPre(LInstruction* instr) { 276 void LCodeGen::GenerateBodyInstructionPre(LInstruction* instr) {
277 if (!instr->IsLazyBailout() && !instr->IsGap()) { 277 if (!instr->IsLazyBailout() && !instr->IsGap()) {
278 safepoints_.BumpLastLazySafepointIndex(); 278 safepoints_.BumpLastLazySafepointIndex();
279 } 279 }
280 } 280 }
281 281
282 282
(...skipping 1058 matching lines...) Expand 10 before | Expand all | Expand 10 after
1341 default: 1341 default:
1342 __ imull(left, left, Immediate(right_value)); 1342 __ imull(left, left, Immediate(right_value));
1343 break; 1343 break;
1344 } 1344 }
1345 } else { 1345 } else {
1346 __ imull(left, left, Immediate(right_value)); 1346 __ imull(left, left, Immediate(right_value));
1347 } 1347 }
1348 } else if (right->IsStackSlot()) { 1348 } else if (right->IsStackSlot()) {
1349 if (instr->hydrogen_value()->representation().IsSmi()) { 1349 if (instr->hydrogen_value()->representation().IsSmi()) {
1350 __ SmiToInteger64(left, left); 1350 __ SmiToInteger64(left, left);
1351 __ imul(left, ToOperand(right)); 1351 __ imulp(left, ToOperand(right));
1352 } else { 1352 } else {
1353 __ imull(left, ToOperand(right)); 1353 __ imull(left, ToOperand(right));
1354 } 1354 }
1355 } else { 1355 } else {
1356 if (instr->hydrogen_value()->representation().IsSmi()) { 1356 if (instr->hydrogen_value()->representation().IsSmi()) {
1357 __ SmiToInteger64(left, left); 1357 __ SmiToInteger64(left, left);
1358 __ imul(left, ToRegister(right)); 1358 __ imulp(left, ToRegister(right));
1359 } else { 1359 } else {
1360 __ imull(left, ToRegister(right)); 1360 __ imull(left, ToRegister(right));
1361 } 1361 }
1362 } 1362 }
1363 1363
1364 if (can_overflow) { 1364 if (can_overflow) {
1365 DeoptimizeIf(overflow, instr->environment()); 1365 DeoptimizeIf(overflow, instr->environment());
1366 } 1366 }
1367 1367
1368 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { 1368 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) {
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1536 void LCodeGen::DoSubI(LSubI* instr) { 1536 void LCodeGen::DoSubI(LSubI* instr) {
1537 LOperand* left = instr->left(); 1537 LOperand* left = instr->left();
1538 LOperand* right = instr->right(); 1538 LOperand* right = instr->right();
1539 ASSERT(left->Equals(instr->result())); 1539 ASSERT(left->Equals(instr->result()));
1540 1540
1541 if (right->IsConstantOperand()) { 1541 if (right->IsConstantOperand()) {
1542 __ subl(ToRegister(left), 1542 __ subl(ToRegister(left),
1543 Immediate(ToInteger32(LConstantOperand::cast(right)))); 1543 Immediate(ToInteger32(LConstantOperand::cast(right))));
1544 } else if (right->IsRegister()) { 1544 } else if (right->IsRegister()) {
1545 if (instr->hydrogen_value()->representation().IsSmi()) { 1545 if (instr->hydrogen_value()->representation().IsSmi()) {
1546 __ subq(ToRegister(left), ToRegister(right)); 1546 __ subp(ToRegister(left), ToRegister(right));
1547 } else { 1547 } else {
1548 __ subl(ToRegister(left), ToRegister(right)); 1548 __ subl(ToRegister(left), ToRegister(right));
1549 } 1549 }
1550 } else { 1550 } else {
1551 if (instr->hydrogen_value()->representation().IsSmi()) { 1551 if (instr->hydrogen_value()->representation().IsSmi()) {
1552 __ subq(ToRegister(left), ToOperand(right)); 1552 __ subp(ToRegister(left), ToOperand(right));
1553 } else { 1553 } else {
1554 __ subl(ToRegister(left), ToOperand(right)); 1554 __ subl(ToRegister(left), ToOperand(right));
1555 } 1555 }
1556 } 1556 }
1557 1557
1558 if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) { 1558 if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) {
1559 DeoptimizeIf(overflow, instr->environment()); 1559 DeoptimizeIf(overflow, instr->environment());
1560 } 1560 }
1561 } 1561 }
1562 1562
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
1724 } 1724 }
1725 } 1725 }
1726 } 1726 }
1727 1727
1728 1728
1729 void LCodeGen::DoAddI(LAddI* instr) { 1729 void LCodeGen::DoAddI(LAddI* instr) {
1730 LOperand* left = instr->left(); 1730 LOperand* left = instr->left();
1731 LOperand* right = instr->right(); 1731 LOperand* right = instr->right();
1732 1732
1733 Representation target_rep = instr->hydrogen()->representation(); 1733 Representation target_rep = instr->hydrogen()->representation();
1734 bool is_q = target_rep.IsSmi() || target_rep.IsExternal(); 1734 bool is_p = target_rep.IsSmi() || target_rep.IsExternal();
1735 1735
1736 if (LAddI::UseLea(instr->hydrogen()) && !left->Equals(instr->result())) { 1736 if (LAddI::UseLea(instr->hydrogen()) && !left->Equals(instr->result())) {
1737 if (right->IsConstantOperand()) { 1737 if (right->IsConstantOperand()) {
1738 int32_t offset = ToInteger32(LConstantOperand::cast(right)); 1738 int32_t offset = ToInteger32(LConstantOperand::cast(right));
1739 if (is_q) { 1739 if (is_p) {
1740 __ lea(ToRegister(instr->result()), 1740 __ lea(ToRegister(instr->result()),
1741 MemOperand(ToRegister(left), offset)); 1741 MemOperand(ToRegister(left), offset));
1742 } else { 1742 } else {
1743 __ leal(ToRegister(instr->result()), 1743 __ leal(ToRegister(instr->result()),
1744 MemOperand(ToRegister(left), offset)); 1744 MemOperand(ToRegister(left), offset));
1745 } 1745 }
1746 } else { 1746 } else {
1747 Operand address(ToRegister(left), ToRegister(right), times_1, 0); 1747 Operand address(ToRegister(left), ToRegister(right), times_1, 0);
1748 if (is_q) { 1748 if (is_p) {
1749 __ lea(ToRegister(instr->result()), address); 1749 __ lea(ToRegister(instr->result()), address);
1750 } else { 1750 } else {
1751 __ leal(ToRegister(instr->result()), address); 1751 __ leal(ToRegister(instr->result()), address);
1752 } 1752 }
1753 } 1753 }
1754 } else { 1754 } else {
1755 if (right->IsConstantOperand()) { 1755 if (right->IsConstantOperand()) {
1756 if (is_q) { 1756 if (is_p) {
1757 __ addq(ToRegister(left), 1757 __ addp(ToRegister(left),
1758 Immediate(ToInteger32(LConstantOperand::cast(right)))); 1758 Immediate(ToInteger32(LConstantOperand::cast(right))));
1759 } else { 1759 } else {
1760 __ addl(ToRegister(left), 1760 __ addl(ToRegister(left),
1761 Immediate(ToInteger32(LConstantOperand::cast(right)))); 1761 Immediate(ToInteger32(LConstantOperand::cast(right))));
1762 } 1762 }
1763 } else if (right->IsRegister()) { 1763 } else if (right->IsRegister()) {
1764 if (is_q) { 1764 if (is_p) {
1765 __ addq(ToRegister(left), ToRegister(right)); 1765 __ addp(ToRegister(left), ToRegister(right));
1766 } else { 1766 } else {
1767 __ addl(ToRegister(left), ToRegister(right)); 1767 __ addl(ToRegister(left), ToRegister(right));
1768 } 1768 }
1769 } else { 1769 } else {
1770 if (is_q) { 1770 if (is_p) {
1771 __ addq(ToRegister(left), ToOperand(right)); 1771 __ addp(ToRegister(left), ToOperand(right));
1772 } else { 1772 } else {
1773 __ addl(ToRegister(left), ToOperand(right)); 1773 __ addl(ToRegister(left), ToOperand(right));
1774 } 1774 }
1775 } 1775 }
1776 if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) { 1776 if (instr->hydrogen()->CheckFlag(HValue::kCanOverflow)) {
1777 DeoptimizeIf(overflow, instr->environment()); 1777 DeoptimizeIf(overflow, instr->environment());
1778 } 1778 }
1779 } 1779 }
1780 } 1780 }
1781 1781
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
2200 Register input_reg = ToRegister(instr->object()); 2200 Register input_reg = ToRegister(instr->object());
2201 __ Cmp(input_reg, factory()->the_hole_value()); 2201 __ Cmp(input_reg, factory()->the_hole_value());
2202 EmitBranch(instr, equal); 2202 EmitBranch(instr, equal);
2203 return; 2203 return;
2204 } 2204 }
2205 2205
2206 XMMRegister input_reg = ToDoubleRegister(instr->object()); 2206 XMMRegister input_reg = ToDoubleRegister(instr->object());
2207 __ ucomisd(input_reg, input_reg); 2207 __ ucomisd(input_reg, input_reg);
2208 EmitFalseBranch(instr, parity_odd); 2208 EmitFalseBranch(instr, parity_odd);
2209 2209
2210 __ subq(rsp, Immediate(kDoubleSize)); 2210 __ subp(rsp, Immediate(kDoubleSize));
2211 __ movsd(MemOperand(rsp, 0), input_reg); 2211 __ movsd(MemOperand(rsp, 0), input_reg);
2212 __ addq(rsp, Immediate(kDoubleSize)); 2212 __ addp(rsp, Immediate(kDoubleSize));
2213 2213
2214 int offset = sizeof(kHoleNanUpper32); 2214 int offset = sizeof(kHoleNanUpper32);
2215 __ cmpl(MemOperand(rsp, -offset), Immediate(kHoleNanUpper32)); 2215 __ cmpl(MemOperand(rsp, -offset), Immediate(kHoleNanUpper32));
2216 EmitBranch(instr, equal); 2216 EmitBranch(instr, equal);
2217 } 2217 }
2218 2218
2219 2219
2220 void LCodeGen::DoCompareMinusZeroAndBranch(LCompareMinusZeroAndBranch* instr) { 2220 void LCodeGen::DoCompareMinusZeroAndBranch(LCompareMinusZeroAndBranch* instr) {
2221 Representation rep = instr->hydrogen()->value()->representation(); 2221 Representation rep = instr->hydrogen()->value()->representation();
2222 ASSERT(!rep.IsInteger32()); 2222 ASSERT(!rep.IsInteger32());
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
2429 __ CmpObjectType(input, FIRST_SPEC_OBJECT_TYPE, temp); 2429 __ CmpObjectType(input, FIRST_SPEC_OBJECT_TYPE, temp);
2430 __ j(below, is_false); 2430 __ j(below, is_false);
2431 __ j(equal, is_true); 2431 __ j(equal, is_true);
2432 __ CmpInstanceType(temp, LAST_SPEC_OBJECT_TYPE); 2432 __ CmpInstanceType(temp, LAST_SPEC_OBJECT_TYPE);
2433 __ j(equal, is_true); 2433 __ j(equal, is_true);
2434 } else { 2434 } else {
2435 // Faster code path to avoid two compares: subtract lower bound from the 2435 // Faster code path to avoid two compares: subtract lower bound from the
2436 // actual type and do a signed compare with the width of the type range. 2436 // actual type and do a signed compare with the width of the type range.
2437 __ movp(temp, FieldOperand(input, HeapObject::kMapOffset)); 2437 __ movp(temp, FieldOperand(input, HeapObject::kMapOffset));
2438 __ movzxbl(temp2, FieldOperand(temp, Map::kInstanceTypeOffset)); 2438 __ movzxbl(temp2, FieldOperand(temp, Map::kInstanceTypeOffset));
2439 __ subq(temp2, Immediate(FIRST_NONCALLABLE_SPEC_OBJECT_TYPE)); 2439 __ subp(temp2, Immediate(FIRST_NONCALLABLE_SPEC_OBJECT_TYPE));
2440 __ cmpq(temp2, Immediate(LAST_NONCALLABLE_SPEC_OBJECT_TYPE - 2440 __ cmpq(temp2, Immediate(LAST_NONCALLABLE_SPEC_OBJECT_TYPE -
2441 FIRST_NONCALLABLE_SPEC_OBJECT_TYPE)); 2441 FIRST_NONCALLABLE_SPEC_OBJECT_TYPE));
2442 __ j(above, is_false); 2442 __ j(above, is_false);
2443 } 2443 }
2444 2444
2445 // Now we are in the FIRST-LAST_NONCALLABLE_SPEC_OBJECT_TYPE range. 2445 // Now we are in the FIRST-LAST_NONCALLABLE_SPEC_OBJECT_TYPE range.
2446 // Check if the constructor in the map is a function. 2446 // Check if the constructor in the map is a function.
2447 __ movp(temp, FieldOperand(temp, Map::kConstructorOffset)); 2447 __ movp(temp, FieldOperand(temp, Map::kConstructorOffset));
2448 2448
2449 // Objects with a non-function constructor have class 'Object'. 2449 // Objects with a non-function constructor have class 'Object'.
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
2660 if (instr->has_constant_parameter_count()) { 2660 if (instr->has_constant_parameter_count()) {
2661 __ Ret((ToInteger32(instr->constant_parameter_count()) + 1) * kPointerSize, 2661 __ Ret((ToInteger32(instr->constant_parameter_count()) + 1) * kPointerSize,
2662 rcx); 2662 rcx);
2663 } else { 2663 } else {
2664 Register reg = ToRegister(instr->parameter_count()); 2664 Register reg = ToRegister(instr->parameter_count());
2665 // The argument count parameter is a smi 2665 // The argument count parameter is a smi
2666 __ SmiToInteger32(reg, reg); 2666 __ SmiToInteger32(reg, reg);
2667 Register return_addr_reg = reg.is(rcx) ? rbx : rcx; 2667 Register return_addr_reg = reg.is(rcx) ? rbx : rcx;
2668 __ PopReturnAddressTo(return_addr_reg); 2668 __ PopReturnAddressTo(return_addr_reg);
2669 __ shl(reg, Immediate(kPointerSizeLog2)); 2669 __ shl(reg, Immediate(kPointerSizeLog2));
2670 __ addq(rsp, reg); 2670 __ addp(rsp, reg);
2671 __ jmp(return_addr_reg); 2671 __ jmp(return_addr_reg);
2672 } 2672 }
2673 if (no_frame_start != -1) { 2673 if (no_frame_start != -1) {
2674 info_->AddNoFrameRange(no_frame_start, masm_->pc_offset()); 2674 info_->AddNoFrameRange(no_frame_start, masm_->pc_offset());
2675 } 2675 }
2676 } 2676 }
2677 2677
2678 2678
2679 void LCodeGen::DoLoadGlobalCell(LLoadGlobalCell* instr) { 2679 void LCodeGen::DoLoadGlobalCell(LLoadGlobalCell* instr) {
2680 Register result = ToRegister(instr->result()); 2680 Register result = ToRegister(instr->result());
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after
3384 3384
3385 if (instr->target()->IsConstantOperand()) { 3385 if (instr->target()->IsConstantOperand()) {
3386 LConstantOperand* target = LConstantOperand::cast(instr->target()); 3386 LConstantOperand* target = LConstantOperand::cast(instr->target());
3387 Handle<Code> code = Handle<Code>::cast(ToHandle(target)); 3387 Handle<Code> code = Handle<Code>::cast(ToHandle(target));
3388 generator.BeforeCall(__ CallSize(code)); 3388 generator.BeforeCall(__ CallSize(code));
3389 __ call(code, RelocInfo::CODE_TARGET); 3389 __ call(code, RelocInfo::CODE_TARGET);
3390 } else { 3390 } else {
3391 ASSERT(instr->target()->IsRegister()); 3391 ASSERT(instr->target()->IsRegister());
3392 Register target = ToRegister(instr->target()); 3392 Register target = ToRegister(instr->target());
3393 generator.BeforeCall(__ CallSize(target)); 3393 generator.BeforeCall(__ CallSize(target));
3394 __ addq(target, Immediate(Code::kHeaderSize - kHeapObjectTag)); 3394 __ addp(target, Immediate(Code::kHeaderSize - kHeapObjectTag));
3395 __ call(target); 3395 __ call(target);
3396 } 3396 }
3397 generator.AfterCall(); 3397 generator.AfterCall();
3398 } 3398 }
3399 3399
3400 3400
3401 void LCodeGen::DoCallJSFunction(LCallJSFunction* instr) { 3401 void LCodeGen::DoCallJSFunction(LCallJSFunction* instr) {
3402 ASSERT(ToRegister(instr->function()).is(rdi)); 3402 ASSERT(ToRegister(instr->function()).is(rdi));
3403 ASSERT(ToRegister(instr->result()).is(rax)); 3403 ASSERT(ToRegister(instr->result()).is(rax));
3404 3404
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
3756 __ movsd(input_reg, nan_operand); 3756 __ movsd(input_reg, nan_operand);
3757 __ jmp(&done, Label::kNear); 3757 __ jmp(&done, Label::kNear);
3758 __ bind(&zero); 3758 __ bind(&zero);
3759 ExternalReference ninf = 3759 ExternalReference ninf =
3760 ExternalReference::address_of_negative_infinity(); 3760 ExternalReference::address_of_negative_infinity();
3761 Operand ninf_operand = masm()->ExternalOperand(ninf); 3761 Operand ninf_operand = masm()->ExternalOperand(ninf);
3762 __ movsd(input_reg, ninf_operand); 3762 __ movsd(input_reg, ninf_operand);
3763 __ jmp(&done, Label::kNear); 3763 __ jmp(&done, Label::kNear);
3764 __ bind(&positive); 3764 __ bind(&positive);
3765 __ fldln2(); 3765 __ fldln2();
3766 __ subq(rsp, Immediate(kDoubleSize)); 3766 __ subp(rsp, Immediate(kDoubleSize));
3767 __ movsd(Operand(rsp, 0), input_reg); 3767 __ movsd(Operand(rsp, 0), input_reg);
3768 __ fld_d(Operand(rsp, 0)); 3768 __ fld_d(Operand(rsp, 0));
3769 __ fyl2x(); 3769 __ fyl2x();
3770 __ fstp_d(Operand(rsp, 0)); 3770 __ fstp_d(Operand(rsp, 0));
3771 __ movsd(input_reg, Operand(rsp, 0)); 3771 __ movsd(input_reg, Operand(rsp, 0));
3772 __ addq(rsp, Immediate(kDoubleSize)); 3772 __ addp(rsp, Immediate(kDoubleSize));
3773 __ bind(&done); 3773 __ bind(&done);
3774 } 3774 }
3775 3775
3776 3776
3777 void LCodeGen::DoMathClz32(LMathClz32* instr) { 3777 void LCodeGen::DoMathClz32(LMathClz32* instr) {
3778 Register input = ToRegister(instr->value()); 3778 Register input = ToRegister(instr->value());
3779 Register result = ToRegister(instr->result()); 3779 Register result = ToRegister(instr->result());
3780 Label not_zero_input; 3780 Label not_zero_input;
3781 __ bsrl(result, input); 3781 __ bsrl(result, input);
3782 3782
(...skipping 1853 matching lines...) Expand 10 before | Expand all | Expand 10 after
5636 FixedArray::kHeaderSize - kPointerSize)); 5636 FixedArray::kHeaderSize - kPointerSize));
5637 __ bind(&done); 5637 __ bind(&done);
5638 } 5638 }
5639 5639
5640 5640
5641 #undef __ 5641 #undef __
5642 5642
5643 } } // namespace v8::internal 5643 } } // namespace v8::internal
5644 5644
5645 #endif // V8_TARGET_ARCH_X64 5645 #endif // V8_TARGET_ARCH_X64
OLDNEW
« src/x64/assembler-x64.h ('K') | « src/x64/ic-x64.cc ('k') | src/x64/macro-assembler-x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698