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

Side by Side Diff: src/mips/macro-assembler-mips.h

Issue 7328013: MIPS: Cleaned up calling-related methods in the assembler. (Closed)
Patch Set: Created 9 years, 5 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
« no previous file with comments | « src/mips/full-codegen-mips.cc ('k') | src/mips/macro-assembler-mips.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 92
93 // MacroAssembler implements a collection of frequently used macros. 93 // MacroAssembler implements a collection of frequently used macros.
94 class MacroAssembler: public Assembler { 94 class MacroAssembler: public Assembler {
95 public: 95 public:
96 // The isolate parameter can be NULL if the macro assembler should 96 // The isolate parameter can be NULL if the macro assembler should
97 // not use isolate-dependent functionality. In this case, it's the 97 // not use isolate-dependent functionality. In this case, it's the
98 // responsibility of the caller to never invoke such function on the 98 // responsibility of the caller to never invoke such function on the
99 // macro assembler. 99 // macro assembler.
100 MacroAssembler(Isolate* isolate, void* buffer, int size); 100 MacroAssembler(Isolate* isolate, void* buffer, int size);
101 101
102 // Arguments macros. 102 // Arguments macros.
103 #define COND_TYPED_ARGS Condition cond, Register r1, const Operand& r2 103 #define COND_TYPED_ARGS Condition cond, Register r1, const Operand& r2
104 #define COND_ARGS cond, r1, r2 104 #define COND_ARGS cond, r1, r2
105 105
106 // Prototypes. 106 // Cases when relocation is not needed.
107
108 // Prototypes for functions with no target (eg Ret()).
109 #define DECLARE_NOTARGET_PROTOTYPE(Name) \
110 void Name(BranchDelaySlot bd = PROTECT); \
111 void Name(COND_TYPED_ARGS, BranchDelaySlot bd = PROTECT); \
112 inline void Name(BranchDelaySlot bd, COND_TYPED_ARGS) { \
113 Name(COND_ARGS, bd); \
114 }
115
116 // Prototypes for functions with a target.
117
118 // Cases when relocation may be needed.
119 #define DECLARE_RELOC_PROTOTYPE(Name, target_type) \
120 void Name(target_type target, \
121 RelocInfo::Mode rmode, \
122 BranchDelaySlot bd = PROTECT); \
123 inline void Name(BranchDelaySlot bd, \
124 target_type target, \
125 RelocInfo::Mode rmode) { \
126 Name(target, rmode, bd); \
127 } \
128 void Name(target_type target, \
129 RelocInfo::Mode rmode, \
130 COND_TYPED_ARGS, \
131 BranchDelaySlot bd = PROTECT); \
132 inline void Name(BranchDelaySlot bd, \
133 target_type target, \
134 RelocInfo::Mode rmode, \
135 COND_TYPED_ARGS) { \
136 Name(target, rmode, COND_ARGS, bd); \
137 }
138
139 // Cases when relocation is not needed.
140 #define DECLARE_NORELOC_PROTOTYPE(Name, target_type) \ 107 #define DECLARE_NORELOC_PROTOTYPE(Name, target_type) \
141 void Name(target_type target, BranchDelaySlot bd = PROTECT); \ 108 void Name(target_type target, BranchDelaySlot bd = PROTECT); \
142 inline void Name(BranchDelaySlot bd, target_type target) { \ 109 inline void Name(BranchDelaySlot bd, target_type target) { \
143 Name(target, bd); \ 110 Name(target, bd); \
144 } \ 111 } \
145 void Name(target_type target, \ 112 void Name(target_type target, \
146 COND_TYPED_ARGS, \ 113 COND_TYPED_ARGS, \
147 BranchDelaySlot bd = PROTECT); \ 114 BranchDelaySlot bd = PROTECT); \
148 inline void Name(BranchDelaySlot bd, \ 115 inline void Name(BranchDelaySlot bd, \
149 target_type target, \ 116 target_type target, \
150 COND_TYPED_ARGS) { \ 117 COND_TYPED_ARGS) { \
151 Name(target, COND_ARGS, bd); \ 118 Name(target, COND_ARGS, bd); \
152 } 119 }
153 120
154 // Target prototypes.
155
156 #define DECLARE_JUMP_CALL_PROTOTYPES(Name) \
157 DECLARE_NORELOC_PROTOTYPE(Name, Register) \
158 DECLARE_NORELOC_PROTOTYPE(Name, const Operand&) \
159 DECLARE_RELOC_PROTOTYPE(Name, byte*) \
160 DECLARE_RELOC_PROTOTYPE(Name, Handle<Code>)
161
162 #define DECLARE_BRANCH_PROTOTYPES(Name) \ 121 #define DECLARE_BRANCH_PROTOTYPES(Name) \
163 DECLARE_NORELOC_PROTOTYPE(Name, Label*) \ 122 DECLARE_NORELOC_PROTOTYPE(Name, Label*) \
164 DECLARE_NORELOC_PROTOTYPE(Name, int16_t) 123 DECLARE_NORELOC_PROTOTYPE(Name, int16_t)
165 124
125 DECLARE_BRANCH_PROTOTYPES(Branch)
126 DECLARE_BRANCH_PROTOTYPES(BranchAndLink)
166 127
167 DECLARE_JUMP_CALL_PROTOTYPES(Jump) 128 #undef DECLARE_BRANCH_PROTOTYPES
168 DECLARE_JUMP_CALL_PROTOTYPES(Call)
169
170 DECLARE_BRANCH_PROTOTYPES(Branch)
171 DECLARE_BRANCH_PROTOTYPES(BranchAndLink)
172
173 DECLARE_NOTARGET_PROTOTYPE(Ret)
174
175 #undef COND_TYPED_ARGS 129 #undef COND_TYPED_ARGS
176 #undef COND_ARGS 130 #undef COND_ARGS
177 #undef DECLARE_NOTARGET_PROTOTYPE
178 #undef DECLARE_NORELOC_PROTOTYPE
179 #undef DECLARE_RELOC_PROTOTYPE
180 #undef DECLARE_JUMP_CALL_PROTOTYPES
181 #undef DECLARE_BRANCH_PROTOTYPES
182 131
183 void CallWithAstId(Handle<Code> code,
184 RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
185 unsigned ast_id = kNoASTId,
186 Condition cond = al,
187 Register r1 = zero_reg,
188 const Operand& r2 = Operand(zero_reg));
189 132
190 int CallSize(Register reg); 133 // Jump, Call, and Ret pseudo instructions implementing inter-working.
191 int CallSize(Handle<Code> code, RelocInfo::Mode rmode); 134 #define COND_ARGS Condition cond = al, Register rs = zero_reg, \
135 const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT
136
137 void Jump(Register target, COND_ARGS);
138 void Jump(intptr_t target, RelocInfo::Mode rmode, COND_ARGS);
139 void Jump(Address target, RelocInfo::Mode rmode, COND_ARGS);
140 void Jump(Handle<Code> code, RelocInfo::Mode rmode, COND_ARGS);
141 int CallSize(Register target, COND_ARGS);
142 void Call(Register target, COND_ARGS);
143 int CallSize(Address target, RelocInfo::Mode rmode, COND_ARGS);
144 void Call(Address target, RelocInfo::Mode rmode, COND_ARGS);
145 int CallSize(Handle<Code> code,
146 RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
147 unsigned ast_id = kNoASTId,
148 COND_ARGS);
149 void Call(Handle<Code> code,
150 RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
151 unsigned ast_id = kNoASTId,
152 COND_ARGS);
153 void Ret(COND_ARGS);
154 inline void Ret(BranchDelaySlot bd) {
155 Ret(al, zero_reg, Operand(zero_reg), bd);
156 }
157
158 #undef COND_ARGS
192 159
193 // Emit code to discard a non-negative number of pointer-sized elements 160 // Emit code to discard a non-negative number of pointer-sized elements
194 // from the stack, clobbering only the sp register. 161 // from the stack, clobbering only the sp register.
195 void Drop(int count, 162 void Drop(int count,
196 Condition cond = cc_always, 163 Condition cond = cc_always,
197 Register reg = no_reg, 164 Register reg = no_reg,
198 const Operand& op = Operand(no_reg)); 165 const Operand& op = Operand(no_reg));
199 166
200 void DropAndRet(int drop = 0, 167 void DropAndRet(int drop = 0,
201 Condition cond = cc_always, 168 Condition cond = cc_always,
(...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 const Operand& rt, 1085 const Operand& rt,
1119 BranchDelaySlot bdslot = PROTECT); 1086 BranchDelaySlot bdslot = PROTECT);
1120 void BranchAndLinkShort(Label* L, BranchDelaySlot bdslot = PROTECT); 1087 void BranchAndLinkShort(Label* L, BranchDelaySlot bdslot = PROTECT);
1121 void BranchAndLinkShort(Label* L, Condition cond, Register rs, 1088 void BranchAndLinkShort(Label* L, Condition cond, Register rs,
1122 const Operand& rt, 1089 const Operand& rt,
1123 BranchDelaySlot bdslot = PROTECT); 1090 BranchDelaySlot bdslot = PROTECT);
1124 void J(Label* L, BranchDelaySlot bdslot); 1091 void J(Label* L, BranchDelaySlot bdslot);
1125 void Jr(Label* L, BranchDelaySlot bdslot); 1092 void Jr(Label* L, BranchDelaySlot bdslot);
1126 void Jalr(Label* L, BranchDelaySlot bdslot); 1093 void Jalr(Label* L, BranchDelaySlot bdslot);
1127 1094
1128 void Jump(intptr_t target, RelocInfo::Mode rmode,
1129 BranchDelaySlot bd = PROTECT);
1130 void Jump(intptr_t target, RelocInfo::Mode rmode, Condition cond = cc_always,
1131 Register r1 = zero_reg, const Operand& r2 = Operand(zero_reg),
1132 BranchDelaySlot bd = PROTECT);
1133 void Call(intptr_t target, RelocInfo::Mode rmode,
1134 BranchDelaySlot bd = PROTECT);
1135 void Call(intptr_t target, RelocInfo::Mode rmode, Condition cond = cc_always,
1136 Register r1 = zero_reg, const Operand& r2 = Operand(zero_reg),
1137 BranchDelaySlot bd = PROTECT);
1138
1139 // Helper functions for generating invokes. 1095 // Helper functions for generating invokes.
1140 void InvokePrologue(const ParameterCount& expected, 1096 void InvokePrologue(const ParameterCount& expected,
1141 const ParameterCount& actual, 1097 const ParameterCount& actual,
1142 Handle<Code> code_constant, 1098 Handle<Code> code_constant,
1143 Register code_reg, 1099 Register code_reg,
1144 Label* done, 1100 Label* done,
1145 InvokeFlag flag, 1101 InvokeFlag flag,
1146 const CallWrapper& call_wrapper, 1102 const CallWrapper& call_wrapper,
1147 CallKind call_kind); 1103 CallKind call_kind);
1148 1104
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1244 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x) 1200 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x)
1245 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) 1201 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__)
1246 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm-> 1202 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm->
1247 #else 1203 #else
1248 #define ACCESS_MASM(masm) masm-> 1204 #define ACCESS_MASM(masm) masm->
1249 #endif 1205 #endif
1250 1206
1251 } } // namespace v8::internal 1207 } } // namespace v8::internal
1252 1208
1253 #endif // V8_MIPS_MACRO_ASSEMBLER_MIPS_H_ 1209 #endif // V8_MIPS_MACRO_ASSEMBLER_MIPS_H_
OLDNEW
« no previous file with comments | « src/mips/full-codegen-mips.cc ('k') | src/mips/macro-assembler-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698