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/macro-assembler-ia32.cc

Issue 9178017: Allow call-known-global to be used for call-sites with mismatched number of arguments. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Relax call-constant-function restrictions as well Created 8 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/ia32/macro-assembler-ia32.h ('k') | src/x64/lithium-codegen-x64.cc » ('j') | 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 1915 matching lines...) Expand 10 before | Expand all | Expand 10 after
1926 xor_(dst, dst); 1926 xor_(dst, dst);
1927 } 1927 }
1928 } 1928 }
1929 1929
1930 1930
1931 void MacroAssembler::InvokePrologue(const ParameterCount& expected, 1931 void MacroAssembler::InvokePrologue(const ParameterCount& expected,
1932 const ParameterCount& actual, 1932 const ParameterCount& actual,
1933 Handle<Code> code_constant, 1933 Handle<Code> code_constant,
1934 const Operand& code_operand, 1934 const Operand& code_operand,
1935 Label* done, 1935 Label* done,
1936 bool* definitely_mismatches,
1936 InvokeFlag flag, 1937 InvokeFlag flag,
1937 Label::Distance done_near, 1938 Label::Distance done_near,
1938 const CallWrapper& call_wrapper, 1939 const CallWrapper& call_wrapper,
1939 CallKind call_kind) { 1940 CallKind call_kind) {
1940 bool definitely_matches = false; 1941 bool definitely_matches = false;
1942 *definitely_mismatches = false;
1941 Label invoke; 1943 Label invoke;
1942 if (expected.is_immediate()) { 1944 if (expected.is_immediate()) {
1943 ASSERT(actual.is_immediate()); 1945 ASSERT(actual.is_immediate());
1944 if (expected.immediate() == actual.immediate()) { 1946 if (expected.immediate() == actual.immediate()) {
1945 definitely_matches = true; 1947 definitely_matches = true;
1946 } else { 1948 } else {
1947 mov(eax, actual.immediate()); 1949 mov(eax, actual.immediate());
1948 const int sentinel = SharedFunctionInfo::kDontAdaptArgumentsSentinel; 1950 const int sentinel = SharedFunctionInfo::kDontAdaptArgumentsSentinel;
1949 if (expected.immediate() == sentinel) { 1951 if (expected.immediate() == sentinel) {
1950 // Don't worry about adapting arguments for builtins that 1952 // Don't worry about adapting arguments for builtins that
1951 // don't want that done. Skip adaption code by making it look 1953 // don't want that done. Skip adaption code by making it look
1952 // like we have a match between expected and actual number of 1954 // like we have a match between expected and actual number of
1953 // arguments. 1955 // arguments.
1954 definitely_matches = true; 1956 definitely_matches = true;
1955 } else { 1957 } else {
1958 *definitely_mismatches = true;
1956 mov(ebx, expected.immediate()); 1959 mov(ebx, expected.immediate());
1957 } 1960 }
1958 } 1961 }
1959 } else { 1962 } else {
1960 if (actual.is_immediate()) { 1963 if (actual.is_immediate()) {
1961 // Expected is in register, actual is immediate. This is the 1964 // Expected is in register, actual is immediate. This is the
1962 // case when we invoke function values without going through the 1965 // case when we invoke function values without going through the
1963 // IC mechanism. 1966 // IC mechanism.
1964 cmp(expected.reg(), actual.immediate()); 1967 cmp(expected.reg(), actual.immediate());
1965 j(equal, &invoke); 1968 j(equal, &invoke);
(...skipping 17 matching lines...) Expand all
1983 add(edx, Immediate(Code::kHeaderSize - kHeapObjectTag)); 1986 add(edx, Immediate(Code::kHeaderSize - kHeapObjectTag));
1984 } else if (!code_operand.is_reg(edx)) { 1987 } else if (!code_operand.is_reg(edx)) {
1985 mov(edx, code_operand); 1988 mov(edx, code_operand);
1986 } 1989 }
1987 1990
1988 if (flag == CALL_FUNCTION) { 1991 if (flag == CALL_FUNCTION) {
1989 call_wrapper.BeforeCall(CallSize(adaptor, RelocInfo::CODE_TARGET)); 1992 call_wrapper.BeforeCall(CallSize(adaptor, RelocInfo::CODE_TARGET));
1990 SetCallKind(ecx, call_kind); 1993 SetCallKind(ecx, call_kind);
1991 call(adaptor, RelocInfo::CODE_TARGET); 1994 call(adaptor, RelocInfo::CODE_TARGET);
1992 call_wrapper.AfterCall(); 1995 call_wrapper.AfterCall();
1993 jmp(done, done_near); 1996 if (!*definitely_mismatches) {
1997 jmp(done, done_near);
1998 }
1994 } else { 1999 } else {
1995 SetCallKind(ecx, call_kind); 2000 SetCallKind(ecx, call_kind);
1996 jmp(adaptor, RelocInfo::CODE_TARGET); 2001 jmp(adaptor, RelocInfo::CODE_TARGET);
1997 } 2002 }
1998 bind(&invoke); 2003 bind(&invoke);
1999 } 2004 }
2000 } 2005 }
2001 2006
2002 2007
2003 void MacroAssembler::InvokeCode(const Operand& code, 2008 void MacroAssembler::InvokeCode(const Operand& code,
2004 const ParameterCount& expected, 2009 const ParameterCount& expected,
2005 const ParameterCount& actual, 2010 const ParameterCount& actual,
2006 InvokeFlag flag, 2011 InvokeFlag flag,
2007 const CallWrapper& call_wrapper, 2012 const CallWrapper& call_wrapper,
2008 CallKind call_kind) { 2013 CallKind call_kind) {
2009 // You can't call a function without a valid frame. 2014 // You can't call a function without a valid frame.
2010 ASSERT(flag == JUMP_FUNCTION || has_frame()); 2015 ASSERT(flag == JUMP_FUNCTION || has_frame());
2011 2016
2012 Label done; 2017 Label done;
2018 bool definitely_mismatches = false;
2013 InvokePrologue(expected, actual, Handle<Code>::null(), code, 2019 InvokePrologue(expected, actual, Handle<Code>::null(), code,
2014 &done, flag, Label::kNear, call_wrapper, 2020 &done, &definitely_mismatches, flag, Label::kNear,
2015 call_kind); 2021 call_wrapper, call_kind);
2016 if (flag == CALL_FUNCTION) { 2022 if (!definitely_mismatches) {
2017 call_wrapper.BeforeCall(CallSize(code)); 2023 if (flag == CALL_FUNCTION) {
2018 SetCallKind(ecx, call_kind); 2024 call_wrapper.BeforeCall(CallSize(code));
2019 call(code); 2025 SetCallKind(ecx, call_kind);
2020 call_wrapper.AfterCall(); 2026 call(code);
2021 } else { 2027 call_wrapper.AfterCall();
2022 ASSERT(flag == JUMP_FUNCTION); 2028 } else {
2023 SetCallKind(ecx, call_kind); 2029 ASSERT(flag == JUMP_FUNCTION);
2024 jmp(code); 2030 SetCallKind(ecx, call_kind);
2031 jmp(code);
2032 }
2033 bind(&done);
2025 } 2034 }
2026 bind(&done);
2027 } 2035 }
2028 2036
2029 2037
2030 void MacroAssembler::InvokeCode(Handle<Code> code, 2038 void MacroAssembler::InvokeCode(Handle<Code> code,
2031 const ParameterCount& expected, 2039 const ParameterCount& expected,
2032 const ParameterCount& actual, 2040 const ParameterCount& actual,
2033 RelocInfo::Mode rmode, 2041 RelocInfo::Mode rmode,
2034 InvokeFlag flag, 2042 InvokeFlag flag,
2035 const CallWrapper& call_wrapper, 2043 const CallWrapper& call_wrapper,
2036 CallKind call_kind) { 2044 CallKind call_kind) {
2037 // You can't call a function without a valid frame. 2045 // You can't call a function without a valid frame.
2038 ASSERT(flag == JUMP_FUNCTION || has_frame()); 2046 ASSERT(flag == JUMP_FUNCTION || has_frame());
2039 2047
2040 Label done; 2048 Label done;
2041 Operand dummy(eax, 0); 2049 Operand dummy(eax, 0);
2042 InvokePrologue(expected, actual, code, dummy, &done, flag, Label::kNear, 2050 bool definitely_mismatches = false;
2043 call_wrapper, call_kind); 2051 InvokePrologue(expected, actual, code, dummy, &done, &definitely_mismatches,
2044 if (flag == CALL_FUNCTION) { 2052 flag, Label::kNear, call_wrapper, call_kind);
2045 call_wrapper.BeforeCall(CallSize(code, rmode)); 2053 if (!definitely_mismatches) {
2046 SetCallKind(ecx, call_kind); 2054 if (flag == CALL_FUNCTION) {
2047 call(code, rmode); 2055 call_wrapper.BeforeCall(CallSize(code, rmode));
2048 call_wrapper.AfterCall(); 2056 SetCallKind(ecx, call_kind);
2049 } else { 2057 call(code, rmode);
2050 ASSERT(flag == JUMP_FUNCTION); 2058 call_wrapper.AfterCall();
2051 SetCallKind(ecx, call_kind); 2059 } else {
2052 jmp(code, rmode); 2060 ASSERT(flag == JUMP_FUNCTION);
2061 SetCallKind(ecx, call_kind);
2062 jmp(code, rmode);
2063 }
2064 bind(&done);
2053 } 2065 }
2054 bind(&done);
2055 } 2066 }
2056 2067
2057 2068
2058 void MacroAssembler::InvokeFunction(Register fun, 2069 void MacroAssembler::InvokeFunction(Register fun,
2059 const ParameterCount& actual, 2070 const ParameterCount& actual,
2060 InvokeFlag flag, 2071 InvokeFlag flag,
2061 const CallWrapper& call_wrapper, 2072 const CallWrapper& call_wrapper,
2062 CallKind call_kind) { 2073 CallKind call_kind) {
2063 // You can't call a function without a valid frame. 2074 // You can't call a function without a valid frame.
2064 ASSERT(flag == JUMP_FUNCTION || has_frame()); 2075 ASSERT(flag == JUMP_FUNCTION || has_frame());
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after
2739 cmp(length, Operand(bitmap_scratch, MemoryChunk::kSizeOffset)); 2750 cmp(length, Operand(bitmap_scratch, MemoryChunk::kSizeOffset));
2740 Check(less_equal, "Live Bytes Count overflow chunk size"); 2751 Check(less_equal, "Live Bytes Count overflow chunk size");
2741 } 2752 }
2742 2753
2743 bind(&done); 2754 bind(&done);
2744 } 2755 }
2745 2756
2746 } } // namespace v8::internal 2757 } } // namespace v8::internal
2747 2758
2748 #endif // V8_TARGET_ARCH_IA32 2759 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/macro-assembler-ia32.h ('k') | src/x64/lithium-codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698