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

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

Issue 5989013: ARM: support arguments access in lithium-codegen-arm. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years, 11 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 | « src/arm/lithium-codegen-arm.cc ('k') | 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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 1982 matching lines...) Expand 10 before | Expand all | Expand 10 after
1993 1993
1994 void LCodeGen::DoAccessArgumentsAt(LAccessArgumentsAt* instr) { 1994 void LCodeGen::DoAccessArgumentsAt(LAccessArgumentsAt* instr) {
1995 Register arguments = ToRegister(instr->arguments()); 1995 Register arguments = ToRegister(instr->arguments());
1996 Register length = ToRegister(instr->length()); 1996 Register length = ToRegister(instr->length());
1997 Operand index = ToOperand(instr->index()); 1997 Operand index = ToOperand(instr->index());
1998 Register result = ToRegister(instr->result()); 1998 Register result = ToRegister(instr->result());
1999 1999
2000 __ sub(length, index); 2000 __ sub(length, index);
2001 DeoptimizeIf(below_equal, instr->environment()); 2001 DeoptimizeIf(below_equal, instr->environment());
2002 2002
2003 // There are two words between the frame pointer and the last argument.
2004 // Subtracting from length accounts for one of them add one more.
2003 __ mov(result, Operand(arguments, length, times_4, kPointerSize)); 2005 __ mov(result, Operand(arguments, length, times_4, kPointerSize));
2004 } 2006 }
2005 2007
2006 2008
2007 void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) { 2009 void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) {
2008 Register elements = ToRegister(instr->elements()); 2010 Register elements = ToRegister(instr->elements());
2009 Register key = ToRegister(instr->key()); 2011 Register key = ToRegister(instr->key());
2010 Register result; 2012 Register result;
2011 if (instr->load_result() != NULL) { 2013 if (instr->load_result() != NULL) {
2012 result = ToRegister(instr->load_result()); 2014 result = ToRegister(instr->load_result());
(...skipping 29 matching lines...) Expand all
2042 2044
2043 Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); 2045 Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
2044 CallCode(ic, RelocInfo::CODE_TARGET, instr); 2046 CallCode(ic, RelocInfo::CODE_TARGET, instr);
2045 } 2047 }
2046 2048
2047 2049
2048 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) { 2050 void LCodeGen::DoArgumentsElements(LArgumentsElements* instr) {
2049 Register result = ToRegister(instr->result()); 2051 Register result = ToRegister(instr->result());
2050 2052
2051 // Check for arguments adapter frame. 2053 // Check for arguments adapter frame.
2052 Label done, adapted; 2054 NearLabel done, adapted;
2053 __ mov(result, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); 2055 __ mov(result, Operand(ebp, StandardFrameConstants::kCallerFPOffset));
2054 __ mov(result, Operand(result, StandardFrameConstants::kContextOffset)); 2056 __ mov(result, Operand(result, StandardFrameConstants::kContextOffset));
2055 __ cmp(Operand(result), 2057 __ cmp(Operand(result),
2056 Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); 2058 Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
2057 __ j(equal, &adapted); 2059 __ j(equal, &adapted);
2058 2060
2059 // No arguments adaptor frame. 2061 // No arguments adaptor frame.
2060 __ mov(result, Operand(ebp)); 2062 __ mov(result, Operand(ebp));
2061 __ jmp(&done); 2063 __ jmp(&done);
2062 2064
2063 // Arguments adaptor frame present. 2065 // Arguments adaptor frame present.
2064 __ bind(&adapted); 2066 __ bind(&adapted);
2065 __ mov(result, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); 2067 __ mov(result, Operand(ebp, StandardFrameConstants::kCallerFPOffset));
2066 2068
2067 // Done. Pointer to topmost argument is in result. 2069 // Result is the frame pointer for the frame if not adapted and for the real
2070 // frame below the adaptor frame if adapted.
2068 __ bind(&done); 2071 __ bind(&done);
2069 } 2072 }
2070 2073
2071 2074
2072 void LCodeGen::DoArgumentsLength(LArgumentsLength* instr) { 2075 void LCodeGen::DoArgumentsLength(LArgumentsLength* instr) {
2073 Operand elem = ToOperand(instr->input()); 2076 Operand elem = ToOperand(instr->input());
2074 Register result = ToRegister(instr->result()); 2077 Register result = ToRegister(instr->result());
2075 2078
2076 Label done; 2079 NearLabel done;
2077 2080
2078 // No arguments adaptor frame. Number of arguments is fixed. 2081 // If no arguments adaptor frame the number of arguments is fixed.
2079 __ cmp(ebp, elem); 2082 __ cmp(ebp, elem);
2080 __ mov(result, Immediate(scope()->num_parameters())); 2083 __ mov(result, Immediate(scope()->num_parameters()));
2081 __ j(equal, &done); 2084 __ j(equal, &done);
2082 2085
2083 // Arguments adaptor frame present. Get argument length from there. 2086 // Arguments adaptor frame present. Get argument length from there.
2084 __ mov(result, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); 2087 __ mov(result, Operand(ebp, StandardFrameConstants::kCallerFPOffset));
2085 __ mov(result, Operand(result, 2088 __ mov(result, Operand(result,
2086 ArgumentsAdaptorFrameConstants::kLengthOffset)); 2089 ArgumentsAdaptorFrameConstants::kLengthOffset));
2087 __ SmiUntag(result); 2090 __ SmiUntag(result);
2088 2091
2089 // Done. Argument length is in result register. 2092 // Argument length is in result register.
2090 __ bind(&done); 2093 __ bind(&done);
2091 } 2094 }
2092 2095
2093 2096
2094 void LCodeGen::DoApplyArguments(LApplyArguments* instr) { 2097 void LCodeGen::DoApplyArguments(LApplyArguments* instr) {
2095 Register receiver = ToRegister(instr->receiver()); 2098 Register receiver = ToRegister(instr->receiver());
2096 ASSERT(ToRegister(instr->function()).is(edi)); 2099 ASSERT(ToRegister(instr->function()).is(edi));
2097 ASSERT(ToRegister(instr->result()).is(eax)); 2100 ASSERT(ToRegister(instr->result()).is(eax));
2098 2101
2099 // If the receiver is null or undefined, we have to pass the 2102 // If the receiver is null or undefined, we have to pass the
(...skipping 1301 matching lines...) Expand 10 before | Expand all | Expand 10 after
3401 ASSERT(!environment->HasBeenRegistered()); 3404 ASSERT(!environment->HasBeenRegistered());
3402 RegisterEnvironmentForDeoptimization(environment); 3405 RegisterEnvironmentForDeoptimization(environment);
3403 ASSERT(osr_pc_offset_ == -1); 3406 ASSERT(osr_pc_offset_ == -1);
3404 osr_pc_offset_ = masm()->pc_offset(); 3407 osr_pc_offset_ = masm()->pc_offset();
3405 } 3408 }
3406 3409
3407 3410
3408 #undef __ 3411 #undef __
3409 3412
3410 } } // namespace v8::internal 3413 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm/lithium-codegen-arm.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698