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

Side by Side Diff: src/mips/builtins-mips.cc

Issue 9395003: Port r10674 to MIPS. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 10 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 // This function is used for both construct and normal calls of Array. The only 314 // This function is used for both construct and normal calls of Array. The only
315 // difference between handling a construct call and a normal call is that for a 315 // difference between handling a construct call and a normal call is that for a
316 // construct call the constructor function in a1 needs to be preserved for 316 // construct call the constructor function in a1 needs to be preserved for
317 // entering the generic code. In both cases argc in a0 needs to be preserved. 317 // entering the generic code. In both cases argc in a0 needs to be preserved.
318 // Both registers are preserved by this code so no need to differentiate between 318 // Both registers are preserved by this code so no need to differentiate between
319 // construct call and normal call. 319 // construct call and normal call.
320 static void ArrayNativeCode(MacroAssembler* masm, 320 static void ArrayNativeCode(MacroAssembler* masm,
321 Label* call_generic_code) { 321 Label* call_generic_code) {
322 Counters* counters = masm->isolate()->counters(); 322 Counters* counters = masm->isolate()->counters();
323 Label argc_one_or_more, argc_two_or_more, not_empty_array, empty_array, 323 Label argc_one_or_more, argc_two_or_more, not_empty_array, empty_array,
324 has_non_smi_element; 324 has_non_smi_element, finish, cant_transition_map, not_double;
325 325
326 // Check for array construction with zero arguments or one. 326 // Check for array construction with zero arguments or one.
327 __ Branch(&argc_one_or_more, ne, a0, Operand(zero_reg)); 327 __ Branch(&argc_one_or_more, ne, a0, Operand(zero_reg));
328 // Handle construction of an empty array. 328 // Handle construction of an empty array.
329 __ bind(&empty_array); 329 __ bind(&empty_array);
330 AllocateEmptyJSArray(masm, 330 AllocateEmptyJSArray(masm,
331 a1, 331 a1,
332 a2, 332 a2,
333 a3, 333 a3,
334 t0, 334 t0,
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 // a3: JSArray 410 // a3: JSArray
411 // t0: elements_array storage start (untagged) 411 // t0: elements_array storage start (untagged)
412 // t1: elements_array_end (untagged) 412 // t1: elements_array_end (untagged)
413 // sp[0]: last argument 413 // sp[0]: last argument
414 414
415 Label loop, entry; 415 Label loop, entry;
416 __ Branch(USE_DELAY_SLOT, &entry); 416 __ Branch(USE_DELAY_SLOT, &entry);
417 __ mov(t3, sp); 417 __ mov(t3, sp);
418 __ bind(&loop); 418 __ bind(&loop);
419 __ lw(a2, MemOperand(t3)); 419 __ lw(a2, MemOperand(t3));
420 __ Addu(t3, t3, kPointerSize);
421 if (FLAG_smi_only_arrays) { 420 if (FLAG_smi_only_arrays) {
422 __ JumpIfNotSmi(a2, &has_non_smi_element); 421 __ JumpIfNotSmi(a2, &has_non_smi_element);
423 } 422 }
423 __ Addu(t3, t3, kPointerSize);
424 __ Addu(t1, t1, -kPointerSize); 424 __ Addu(t1, t1, -kPointerSize);
425 __ sw(a2, MemOperand(t1)); 425 __ sw(a2, MemOperand(t1));
426 __ bind(&entry); 426 __ bind(&entry);
427 __ Branch(&loop, lt, t0, Operand(t1)); 427 __ Branch(&loop, lt, t0, Operand(t1));
428
429 __ bind(&finish);
428 __ mov(sp, t3); 430 __ mov(sp, t3);
429 431
430 // Remove caller arguments and receiver from the stack, setup return value and 432 // Remove caller arguments and receiver from the stack, setup return value and
431 // return. 433 // return.
432 // a0: argc 434 // a0: argc
433 // a3: JSArray 435 // a3: JSArray
434 // sp[0]: receiver 436 // sp[0]: receiver
435 __ Addu(sp, sp, Operand(kPointerSize)); 437 __ Addu(sp, sp, Operand(kPointerSize));
436 __ mov(v0, a3); 438 __ mov(v0, a3);
437 __ Ret(); 439 __ Ret();
438 440
439 __ bind(&has_non_smi_element); 441 __ bind(&has_non_smi_element);
442 // Double values are handled by the runtime.
443 __ CheckMap(
444 a2, t5, Heap::kHeapNumberMapRootIndex, &not_double, DONT_DO_SMI_CHECK);
445 __ bind(&cant_transition_map);
440 __ UndoAllocationInNewSpace(a3, t0); 446 __ UndoAllocationInNewSpace(a3, t0);
441 __ b(call_generic_code); 447 __ Branch(call_generic_code);
448
449 __ bind(&not_double);
450 // Transition FAST_SMI_ONLY_ELEMENTS to FAST_ELEMENTS.
451 // a3: JSArray
452 __ lw(a2, FieldMemOperand(a3, HeapObject::kMapOffset));
453 __ LoadTransitionedArrayMapConditional(FAST_SMI_ONLY_ELEMENTS,
454 FAST_ELEMENTS,
455 a2,
456 t5,
457 &cant_transition_map);
458 __ sw(a2, FieldMemOperand(a3, HeapObject::kMapOffset));
459 __ RecordWriteField(a3,
460 HeapObject::kMapOffset,
461 a2,
462 t5,
463 kRAHasNotBeenSaved,
464 kDontSaveFPRegs,
465 EMIT_REMEMBERED_SET,
466 OMIT_SMI_CHECK);
467 Label loop2;
468 __ bind(&loop2);
469 __ lw(a2, MemOperand(t3));
470 __ Addu(t3, t3, kPointerSize);
471 __ Subu(t1, t1, kPointerSize);
472 __ sw(a2, MemOperand(t1));
473 __ Branch(&loop2, lt, t0, Operand(t1));
474 __ Branch(&finish);
442 } 475 }
443 476
444 477
445 void Builtins::Generate_InternalArrayCode(MacroAssembler* masm) { 478 void Builtins::Generate_InternalArrayCode(MacroAssembler* masm) {
446 // ----------- S t a t e ------------- 479 // ----------- S t a t e -------------
447 // -- a0 : number of arguments 480 // -- a0 : number of arguments
448 // -- ra : return address 481 // -- ra : return address
449 // -- sp[...]: constructor arguments 482 // -- sp[...]: constructor arguments
450 // ----------------------------------- 483 // -----------------------------------
451 Label generic_array_code, one_or_more_arguments, two_or_more_arguments; 484 Label generic_array_code, one_or_more_arguments, two_or_more_arguments;
(...skipping 1304 matching lines...) Expand 10 before | Expand all | Expand 10 after
1756 __ bind(&dont_adapt_arguments); 1789 __ bind(&dont_adapt_arguments);
1757 __ Jump(a3); 1790 __ Jump(a3);
1758 } 1791 }
1759 1792
1760 1793
1761 #undef __ 1794 #undef __
1762 1795
1763 } } // namespace v8::internal 1796 } } // namespace v8::internal
1764 1797
1765 #endif // V8_TARGET_ARCH_MIPS 1798 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698