OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 int builtins_offset = | 201 int builtins_offset = |
202 JSBuiltinsObject::kJSBuiltinsOffset + (id * kPointerSize); | 202 JSBuiltinsObject::kJSBuiltinsOffset + (id * kPointerSize); |
203 movq(rdi, FieldOperand(rdx, builtins_offset)); | 203 movq(rdi, FieldOperand(rdx, builtins_offset)); |
204 | 204 |
205 | 205 |
206 return Builtins::GetCode(id, resolved); | 206 return Builtins::GetCode(id, resolved); |
207 } | 207 } |
208 | 208 |
209 | 209 |
210 void MacroAssembler::Set(Register dst, int64_t x) { | 210 void MacroAssembler::Set(Register dst, int64_t x) { |
211 if (is_int32(x)) { | 211 if (x == 0) { |
| 212 xor_(dst, dst); |
| 213 } else if (is_int32(x)) { |
212 movq(dst, Immediate(x)); | 214 movq(dst, Immediate(x)); |
213 } else if (is_uint32(x)) { | 215 } else if (is_uint32(x)) { |
214 movl(dst, Immediate(x)); | 216 movl(dst, Immediate(x)); |
215 } else { | 217 } else { |
216 movq(dst, x, RelocInfo::NONE); | 218 movq(dst, x, RelocInfo::NONE); |
217 } | 219 } |
218 } | 220 } |
219 | 221 |
220 | 222 |
221 void MacroAssembler::Set(const Operand& dst, int64_t x) { | 223 void MacroAssembler::Set(const Operand& dst, int64_t x) { |
222 if (is_int32(x)) { | 224 if (x == 0) { |
223 movq(kScratchRegister, Immediate(x)); | 225 xor_(kScratchRegister, kScratchRegister); |
| 226 movq(dst, kScratchRegister); |
| 227 } else if (is_int32(x)) { |
| 228 movq(dst, Immediate(x)); |
224 } else if (is_uint32(x)) { | 229 } else if (is_uint32(x)) { |
225 movl(kScratchRegister, Immediate(x)); | 230 movl(dst, Immediate(x)); |
226 } else { | 231 } else { |
227 movq(kScratchRegister, x, RelocInfo::NONE); | 232 movq(kScratchRegister, x, RelocInfo::NONE); |
| 233 movq(dst, kScratchRegister); |
228 } | 234 } |
229 movq(dst, kScratchRegister); | |
230 } | 235 } |
231 | 236 |
232 | 237 |
233 bool MacroAssembler::IsUnsafeSmi(Smi* value) { | 238 bool MacroAssembler::IsUnsafeSmi(Smi* value) { |
234 return false; | 239 return false; |
235 } | 240 } |
236 | 241 |
237 void MacroAssembler::LoadUnsafeSmi(Register dst, Smi* source) { | 242 void MacroAssembler::LoadUnsafeSmi(Register dst, Smi* source) { |
238 UNIMPLEMENTED(); | 243 UNIMPLEMENTED(); |
239 } | 244 } |
240 | 245 |
241 | 246 |
242 void MacroAssembler::Move(Register dst, Handle<Object> source) { | 247 void MacroAssembler::Move(Register dst, Handle<Object> source) { |
| 248 ASSERT(!source->IsFailure()); |
243 if (source->IsSmi()) { | 249 if (source->IsSmi()) { |
244 if (IsUnsafeSmi(source)) { | 250 if (IsUnsafeSmi(source)) { |
245 LoadUnsafeSmi(dst, source); | 251 LoadUnsafeSmi(dst, source); |
246 } else { | 252 } else { |
247 movq(dst, source, RelocInfo::NONE); | 253 int32_t smi = static_cast<int32_t>(reinterpret_cast<intptr_t>(*source)); |
| 254 movq(dst, Immediate(smi)); |
248 } | 255 } |
249 } else { | 256 } else { |
250 movq(dst, source, RelocInfo::EMBEDDED_OBJECT); | 257 movq(dst, source, RelocInfo::EMBEDDED_OBJECT); |
251 } | 258 } |
252 } | 259 } |
253 | 260 |
254 | 261 |
255 void MacroAssembler::Move(const Operand& dst, Handle<Object> source) { | 262 void MacroAssembler::Move(const Operand& dst, Handle<Object> source) { |
256 Move(kScratchRegister, source); | 263 if (source->IsSmi()) { |
257 movq(dst, kScratchRegister); | 264 int32_t smi = static_cast<int32_t>(reinterpret_cast<intptr_t>(*source)); |
| 265 movq(dst, Immediate(smi)); |
| 266 } else { |
| 267 movq(kScratchRegister, source, RelocInfo::EMBEDDED_OBJECT); |
| 268 movq(dst, kScratchRegister); |
| 269 } |
258 } | 270 } |
259 | 271 |
260 | 272 |
261 void MacroAssembler::Cmp(Register dst, Handle<Object> source) { | 273 void MacroAssembler::Cmp(Register dst, Handle<Object> source) { |
262 Move(kScratchRegister, source); | 274 Move(kScratchRegister, source); |
263 cmpq(dst, kScratchRegister); | 275 cmpq(dst, kScratchRegister); |
264 } | 276 } |
265 | 277 |
266 | 278 |
267 void MacroAssembler::Cmp(const Operand& dst, Handle<Object> source) { | 279 void MacroAssembler::Cmp(const Operand& dst, Handle<Object> source) { |
268 Move(kScratchRegister, source); | 280 if (source->IsSmi()) { |
269 cmpq(dst, kScratchRegister); | 281 if (IsUnsafeSmi(source)) { |
| 282 LoadUnsafeSmi(kScratchRegister, source); |
| 283 cmpl(dst, kScratchRegister); |
| 284 } else { |
| 285 // For smi-comparison, it suffices to compare the low 32 bits. |
| 286 int32_t smi = static_cast<int32_t>(reinterpret_cast<intptr_t>(*source)); |
| 287 cmpl(dst, Immediate(smi)); |
| 288 } |
| 289 } else { |
| 290 ASSERT(source->IsHeapObject()); |
| 291 movq(kScratchRegister, source, RelocInfo::EMBEDDED_OBJECT); |
| 292 cmpq(dst, kScratchRegister); |
| 293 } |
270 } | 294 } |
271 | 295 |
272 | 296 |
273 void MacroAssembler::Push(Handle<Object> source) { | 297 void MacroAssembler::Push(Handle<Object> source) { |
274 Move(kScratchRegister, source); | 298 if (source->IsSmi()) { |
275 push(kScratchRegister); | 299 if (IsUnsafeSmi(source)) { |
| 300 LoadUnsafeSmi(kScratchRegister, source); |
| 301 push(kScratchRegister); |
| 302 } else { |
| 303 int32_t smi = static_cast<int32_t>(reinterpret_cast<intptr_t>(*source)); |
| 304 push(Immediate(smi)); |
| 305 } |
| 306 } else { |
| 307 ASSERT(source->IsHeapObject()); |
| 308 movq(kScratchRegister, source, RelocInfo::EMBEDDED_OBJECT); |
| 309 push(kScratchRegister); |
| 310 } |
276 } | 311 } |
277 | 312 |
278 | 313 |
279 void MacroAssembler::Jump(ExternalReference ext) { | 314 void MacroAssembler::Jump(ExternalReference ext) { |
280 movq(kScratchRegister, ext); | 315 movq(kScratchRegister, ext); |
281 jmp(kScratchRegister); | 316 jmp(kScratchRegister); |
282 } | 317 } |
283 | 318 |
284 | 319 |
285 void MacroAssembler::Jump(Address destination, RelocInfo::Mode rmode) { | 320 void MacroAssembler::Jump(Address destination, RelocInfo::Mode rmode) { |
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
841 push(rcx); | 876 push(rcx); |
842 | 877 |
843 // Clear the top frame. | 878 // Clear the top frame. |
844 ExternalReference c_entry_fp_address(Top::k_c_entry_fp_address); | 879 ExternalReference c_entry_fp_address(Top::k_c_entry_fp_address); |
845 movq(kScratchRegister, c_entry_fp_address); | 880 movq(kScratchRegister, c_entry_fp_address); |
846 movq(Operand(kScratchRegister, 0), Immediate(0)); | 881 movq(Operand(kScratchRegister, 0), Immediate(0)); |
847 } | 882 } |
848 | 883 |
849 | 884 |
850 } } // namespace v8::internal | 885 } } // namespace v8::internal |
OLD | NEW |