| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #if V8_TARGET_ARCH_ARM | 5 #if V8_TARGET_ARCH_ARM |
| 6 | 6 |
| 7 #include "src/codegen.h" | 7 #include "src/codegen.h" |
| 8 #include "src/debug/debug.h" | 8 #include "src/debug/debug.h" |
| 9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
| 10 #include "src/full-codegen/full-codegen.h" | 10 #include "src/full-codegen/full-codegen.h" |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 // parameter to a number first using the ToNumber builtin if necessary. | 159 // parameter to a number first using the ToNumber builtin if necessary. |
| 160 Label convert, convert_smi, convert_number, done_convert; | 160 Label convert, convert_smi, convert_number, done_convert; |
| 161 __ bind(&convert); | 161 __ bind(&convert); |
| 162 __ JumpIfSmi(r2, &convert_smi); | 162 __ JumpIfSmi(r2, &convert_smi); |
| 163 __ ldr(r3, FieldMemOperand(r2, HeapObject::kMapOffset)); | 163 __ ldr(r3, FieldMemOperand(r2, HeapObject::kMapOffset)); |
| 164 __ JumpIfRoot(r3, Heap::kHeapNumberMapRootIndex, &convert_number); | 164 __ JumpIfRoot(r3, Heap::kHeapNumberMapRootIndex, &convert_number); |
| 165 { | 165 { |
| 166 // Parameter is not a Number, use the ToNumber builtin to convert it. | 166 // Parameter is not a Number, use the ToNumber builtin to convert it. |
| 167 DCHECK(!FLAG_enable_embedded_constant_pool); | 167 DCHECK(!FLAG_enable_embedded_constant_pool); |
| 168 FrameScope scope(masm, StackFrame::MANUAL); | 168 FrameScope scope(masm, StackFrame::MANUAL); |
| 169 __ Push(lr, fp, cp, r1); | |
| 170 __ add(fp, sp, Operand(2 * kPointerSize)); | |
| 171 __ SmiTag(r0); | 169 __ SmiTag(r0); |
| 172 __ SmiTag(r4); | 170 __ SmiTag(r4); |
| 173 __ Push(r0, r4, r5); | 171 __ EnterBuiltinFrame(cp, r1, r0); |
| 172 __ Push(r4, r5); |
| 174 __ mov(r0, r2); | 173 __ mov(r0, r2); |
| 175 __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET); | 174 __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET); |
| 176 __ mov(r2, r0); | 175 __ mov(r2, r0); |
| 177 __ Pop(r0, r4, r5); | 176 __ Pop(r4, r5); |
| 177 __ LeaveBuiltinFrame(cp, r1, r0); |
| 178 __ SmiUntag(r4); |
| 179 __ SmiUntag(r0); |
| 178 { | 180 { |
| 179 // Restore the double accumulator value (d1). | 181 // Restore the double accumulator value (d1). |
| 180 Label done_restore; | 182 Label done_restore; |
| 181 __ SmiToDouble(d1, r5); | 183 __ SmiToDouble(d1, r5); |
| 182 __ JumpIfSmi(r5, &done_restore); | 184 __ JumpIfSmi(r5, &done_restore); |
| 183 __ vldr(d1, FieldMemOperand(r5, HeapNumber::kValueOffset)); | 185 __ vldr(d1, FieldMemOperand(r5, HeapNumber::kValueOffset)); |
| 184 __ bind(&done_restore); | 186 __ bind(&done_restore); |
| 185 } | 187 } |
| 186 __ SmiUntag(r4); | |
| 187 __ SmiUntag(r0); | |
| 188 __ Pop(lr, fp, cp, r1); | |
| 189 } | 188 } |
| 190 __ b(&convert); | 189 __ b(&convert); |
| 191 __ bind(&convert_number); | 190 __ bind(&convert_number); |
| 192 __ vldr(d2, FieldMemOperand(r2, HeapNumber::kValueOffset)); | 191 __ vldr(d2, FieldMemOperand(r2, HeapNumber::kValueOffset)); |
| 193 __ b(&done_convert); | 192 __ b(&done_convert); |
| 194 __ bind(&convert_smi); | 193 __ bind(&convert_smi); |
| 195 __ SmiToDouble(d2, r2); | 194 __ SmiToDouble(d2, r2); |
| 196 __ bind(&done_convert); | 195 __ bind(&done_convert); |
| 197 | 196 |
| 198 // Perform the actual comparison with the accumulator value on the left hand | 197 // Perform the actual comparison with the accumulator value on the left hand |
| (...skipping 28 matching lines...) Expand all Loading... |
| 227 __ Drop(r0); | 226 __ Drop(r0); |
| 228 __ mov(r0, r5); | 227 __ mov(r0, r5); |
| 229 __ Ret(); | 228 __ Ret(); |
| 230 } | 229 } |
| 231 | 230 |
| 232 // static | 231 // static |
| 233 void Builtins::Generate_NumberConstructor(MacroAssembler* masm) { | 232 void Builtins::Generate_NumberConstructor(MacroAssembler* masm) { |
| 234 // ----------- S t a t e ------------- | 233 // ----------- S t a t e ------------- |
| 235 // -- r0 : number of arguments | 234 // -- r0 : number of arguments |
| 236 // -- r1 : constructor function | 235 // -- r1 : constructor function |
| 236 // -- cp : context |
| 237 // -- lr : return address | 237 // -- lr : return address |
| 238 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) | 238 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) |
| 239 // -- sp[argc * 4] : receiver | 239 // -- sp[argc * 4] : receiver |
| 240 // ----------------------------------- | 240 // ----------------------------------- |
| 241 | 241 |
| 242 // 1. Load the first argument into r0 and get rid of the rest (including the | 242 // 1. Load the first argument into r0. |
| 243 // receiver). | |
| 244 Label no_arguments; | 243 Label no_arguments; |
| 245 { | 244 { |
| 245 __ mov(r2, r0); // Store argc in r2. |
| 246 __ sub(r0, r0, Operand(1), SetCC); | 246 __ sub(r0, r0, Operand(1), SetCC); |
| 247 __ b(lo, &no_arguments); | 247 __ b(lo, &no_arguments); |
| 248 __ ldr(r0, MemOperand(sp, r0, LSL, kPointerSizeLog2, PreIndex)); | 248 __ ldr(r0, MemOperand(sp, r0, LSL, kPointerSizeLog2)); |
| 249 __ Drop(2); | |
| 250 } | 249 } |
| 251 | 250 |
| 252 // 2a. Convert the first argument to a number. | 251 // 2a. Convert the first argument to a number. |
| 253 __ Jump(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET); | 252 { |
| 253 FrameScope scope(masm, StackFrame::MANUAL); |
| 254 __ SmiTag(r2); |
| 255 __ EnterBuiltinFrame(cp, r1, r2); |
| 256 __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET); |
| 257 __ LeaveBuiltinFrame(cp, r1, r2); |
| 258 __ SmiUntag(r2); |
| 259 } |
| 260 |
| 261 { |
| 262 // Drop all arguments including the receiver. |
| 263 __ Drop(r2); |
| 264 __ Ret(1); |
| 265 } |
| 254 | 266 |
| 255 // 2b. No arguments, return +0. | 267 // 2b. No arguments, return +0. |
| 256 __ bind(&no_arguments); | 268 __ bind(&no_arguments); |
| 257 __ Move(r0, Smi::FromInt(0)); | 269 __ Move(r0, Smi::FromInt(0)); |
| 258 __ Ret(1); | 270 __ Ret(1); |
| 259 } | 271 } |
| 260 | 272 |
| 261 | 273 |
| 262 // static | 274 // static |
| 263 void Builtins::Generate_NumberConstructor_ConstructStub(MacroAssembler* masm) { | 275 void Builtins::Generate_NumberConstructor_ConstructStub(MacroAssembler* masm) { |
| 264 // ----------- S t a t e ------------- | 276 // ----------- S t a t e ------------- |
| 265 // -- r0 : number of arguments | 277 // -- r0 : number of arguments |
| 266 // -- r1 : constructor function | 278 // -- r1 : constructor function |
| 267 // -- r3 : new target | 279 // -- r3 : new target |
| 280 // -- cp : context |
| 268 // -- lr : return address | 281 // -- lr : return address |
| 269 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) | 282 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) |
| 270 // -- sp[argc * 4] : receiver | 283 // -- sp[argc * 4] : receiver |
| 271 // ----------------------------------- | 284 // ----------------------------------- |
| 272 | 285 |
| 273 // 1. Make sure we operate in the context of the called function. | 286 // 1. Make sure we operate in the context of the called function. |
| 274 __ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); | 287 __ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); |
| 275 | 288 |
| 276 // 2. Load the first argument into r2 and get rid of the rest (including the | 289 // 2. Load the first argument into r2. |
| 277 // receiver). | |
| 278 { | 290 { |
| 279 Label no_arguments, done; | 291 Label no_arguments, done; |
| 292 __ mov(r6, r0); // Store argc in r6. |
| 280 __ sub(r0, r0, Operand(1), SetCC); | 293 __ sub(r0, r0, Operand(1), SetCC); |
| 281 __ b(lo, &no_arguments); | 294 __ b(lo, &no_arguments); |
| 282 __ ldr(r2, MemOperand(sp, r0, LSL, kPointerSizeLog2, PreIndex)); | 295 __ ldr(r2, MemOperand(sp, r0, LSL, kPointerSizeLog2)); |
| 283 __ Drop(2); | |
| 284 __ b(&done); | 296 __ b(&done); |
| 285 __ bind(&no_arguments); | 297 __ bind(&no_arguments); |
| 286 __ Move(r2, Smi::FromInt(0)); | 298 __ Move(r2, Smi::FromInt(0)); |
| 287 __ Drop(1); | |
| 288 __ bind(&done); | 299 __ bind(&done); |
| 289 } | 300 } |
| 290 | 301 |
| 291 // 3. Make sure r2 is a number. | 302 // 3. Make sure r2 is a number. |
| 292 { | 303 { |
| 293 Label done_convert; | 304 Label done_convert; |
| 294 __ JumpIfSmi(r2, &done_convert); | 305 __ JumpIfSmi(r2, &done_convert); |
| 295 __ CompareObjectType(r2, r4, r4, HEAP_NUMBER_TYPE); | 306 __ CompareObjectType(r2, r4, r4, HEAP_NUMBER_TYPE); |
| 296 __ b(eq, &done_convert); | 307 __ b(eq, &done_convert); |
| 297 { | 308 { |
| 298 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); | 309 FrameScope scope(masm, StackFrame::MANUAL); |
| 299 __ Push(r1, r3); | 310 __ SmiTag(r6); |
| 311 __ EnterBuiltinFrame(cp, r1, r6); |
| 312 __ Push(r3); |
| 300 __ Move(r0, r2); | 313 __ Move(r0, r2); |
| 301 __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET); | 314 __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET); |
| 302 __ Move(r2, r0); | 315 __ Move(r2, r0); |
| 303 __ Pop(r1, r3); | 316 __ Pop(r3); |
| 317 __ LeaveBuiltinFrame(cp, r1, r6); |
| 318 __ SmiUntag(r6); |
| 304 } | 319 } |
| 305 __ bind(&done_convert); | 320 __ bind(&done_convert); |
| 306 } | 321 } |
| 307 | 322 |
| 308 // 4. Check if new target and constructor differ. | 323 // 4. Check if new target and constructor differ. |
| 309 Label new_object; | 324 Label drop_frame_and_ret, new_object; |
| 310 __ cmp(r1, r3); | 325 __ cmp(r1, r3); |
| 311 __ b(ne, &new_object); | 326 __ b(ne, &new_object); |
| 312 | 327 |
| 313 // 5. Allocate a JSValue wrapper for the number. | 328 // 5. Allocate a JSValue wrapper for the number. |
| 314 __ AllocateJSValue(r0, r1, r2, r4, r5, &new_object); | 329 __ AllocateJSValue(r0, r1, r2, r4, r5, &new_object); |
| 315 __ Ret(); | 330 __ b(&drop_frame_and_ret); |
| 316 | 331 |
| 317 // 6. Fallback to the runtime to create new object. | 332 // 6. Fallback to the runtime to create new object. |
| 318 __ bind(&new_object); | 333 __ bind(&new_object); |
| 319 { | 334 { |
| 320 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); | 335 FrameScope scope(masm, StackFrame::MANUAL); |
| 336 FastNewObjectStub stub(masm->isolate()); |
| 337 __ SmiTag(r6); |
| 338 __ EnterBuiltinFrame(cp, r1, r6); |
| 321 __ Push(r2); // first argument | 339 __ Push(r2); // first argument |
| 322 FastNewObjectStub stub(masm->isolate()); | |
| 323 __ CallStub(&stub); | 340 __ CallStub(&stub); |
| 324 __ Pop(r2); | 341 __ Pop(r2); |
| 342 __ LeaveBuiltinFrame(cp, r1, r6); |
| 343 __ SmiUntag(r6); |
| 325 } | 344 } |
| 326 __ str(r2, FieldMemOperand(r0, JSValue::kValueOffset)); | 345 __ str(r2, FieldMemOperand(r0, JSValue::kValueOffset)); |
| 327 __ Ret(); | 346 |
| 347 __ bind(&drop_frame_and_ret); |
| 348 { |
| 349 __ Drop(r6); |
| 350 __ Ret(1); |
| 351 } |
| 328 } | 352 } |
| 329 | 353 |
| 330 | 354 |
| 331 // static | 355 // static |
| 332 void Builtins::Generate_StringConstructor(MacroAssembler* masm) { | 356 void Builtins::Generate_StringConstructor(MacroAssembler* masm) { |
| 333 // ----------- S t a t e ------------- | 357 // ----------- S t a t e ------------- |
| 334 // -- r0 : number of arguments | 358 // -- r0 : number of arguments |
| 335 // -- r1 : constructor function | 359 // -- r1 : constructor function |
| 360 // -- cp : context |
| 336 // -- lr : return address | 361 // -- lr : return address |
| 337 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) | 362 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) |
| 338 // -- sp[argc * 4] : receiver | 363 // -- sp[argc * 4] : receiver |
| 339 // ----------------------------------- | 364 // ----------------------------------- |
| 340 | 365 |
| 341 // 1. Load the first argument into r0 and get rid of the rest (including the | 366 // 1. Load the first argument into r0. |
| 342 // receiver). | |
| 343 Label no_arguments; | 367 Label no_arguments; |
| 344 { | 368 { |
| 369 __ mov(r2, r0); // Store argc in r2. |
| 345 __ sub(r0, r0, Operand(1), SetCC); | 370 __ sub(r0, r0, Operand(1), SetCC); |
| 346 __ b(lo, &no_arguments); | 371 __ b(lo, &no_arguments); |
| 347 __ ldr(r0, MemOperand(sp, r0, LSL, kPointerSizeLog2, PreIndex)); | 372 __ ldr(r0, MemOperand(sp, r0, LSL, kPointerSizeLog2)); |
| 348 __ Drop(2); | |
| 349 } | 373 } |
| 350 | 374 |
| 351 // 2a. At least one argument, return r0 if it's a string, otherwise | 375 // 2a. At least one argument, return r0 if it's a string, otherwise |
| 352 // dispatch to appropriate conversion. | 376 // dispatch to appropriate conversion. |
| 353 Label to_string, symbol_descriptive_string; | 377 Label drop_frame_and_ret, to_string, symbol_descriptive_string; |
| 354 { | 378 { |
| 355 __ JumpIfSmi(r0, &to_string); | 379 __ JumpIfSmi(r0, &to_string); |
| 356 STATIC_ASSERT(FIRST_NONSTRING_TYPE == SYMBOL_TYPE); | 380 STATIC_ASSERT(FIRST_NONSTRING_TYPE == SYMBOL_TYPE); |
| 357 __ CompareObjectType(r0, r1, r1, FIRST_NONSTRING_TYPE); | 381 __ CompareObjectType(r0, r3, r3, FIRST_NONSTRING_TYPE); |
| 358 __ b(hi, &to_string); | 382 __ b(hi, &to_string); |
| 359 __ b(eq, &symbol_descriptive_string); | 383 __ b(eq, &symbol_descriptive_string); |
| 360 __ Ret(); | 384 __ b(&drop_frame_and_ret); |
| 361 } | 385 } |
| 362 | 386 |
| 363 // 2b. No arguments, return the empty string (and pop the receiver). | 387 // 2b. No arguments, return the empty string (and pop the receiver). |
| 364 __ bind(&no_arguments); | 388 __ bind(&no_arguments); |
| 365 { | 389 { |
| 366 __ LoadRoot(r0, Heap::kempty_stringRootIndex); | 390 __ LoadRoot(r0, Heap::kempty_stringRootIndex); |
| 367 __ Ret(1); | 391 __ Ret(1); |
| 368 } | 392 } |
| 369 | 393 |
| 370 // 3a. Convert r0 to a string. | 394 // 3a. Convert r0 to a string. |
| 371 __ bind(&to_string); | 395 __ bind(&to_string); |
| 372 { | 396 { |
| 397 FrameScope scope(masm, StackFrame::MANUAL); |
| 373 ToStringStub stub(masm->isolate()); | 398 ToStringStub stub(masm->isolate()); |
| 374 __ TailCallStub(&stub); | 399 __ SmiTag(r2); |
| 400 __ EnterBuiltinFrame(cp, r1, r2); |
| 401 __ CallStub(&stub); |
| 402 __ LeaveBuiltinFrame(cp, r1, r2); |
| 403 __ SmiUntag(r2); |
| 375 } | 404 } |
| 405 __ b(&drop_frame_and_ret); |
| 376 | 406 |
| 377 // 3b. Convert symbol in r0 to a string. | 407 // 3b. Convert symbol in r0 to a string. |
| 378 __ bind(&symbol_descriptive_string); | 408 __ bind(&symbol_descriptive_string); |
| 379 { | 409 { |
| 410 __ Drop(r2); |
| 411 __ Drop(1); |
| 380 __ Push(r0); | 412 __ Push(r0); |
| 381 __ TailCallRuntime(Runtime::kSymbolDescriptiveString); | 413 __ TailCallRuntime(Runtime::kSymbolDescriptiveString); |
| 382 } | 414 } |
| 415 |
| 416 __ bind(&drop_frame_and_ret); |
| 417 { |
| 418 __ Drop(r2); |
| 419 __ Ret(1); |
| 420 } |
| 383 } | 421 } |
| 384 | 422 |
| 385 | 423 |
| 386 // static | 424 // static |
| 387 void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) { | 425 void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) { |
| 388 // ----------- S t a t e ------------- | 426 // ----------- S t a t e ------------- |
| 389 // -- r0 : number of arguments | 427 // -- r0 : number of arguments |
| 390 // -- r1 : constructor function | 428 // -- r1 : constructor function |
| 391 // -- r3 : new target | 429 // -- r3 : new target |
| 430 // -- cp : context |
| 392 // -- lr : return address | 431 // -- lr : return address |
| 393 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) | 432 // -- sp[(argc - n - 1) * 4] : arg[n] (zero based) |
| 394 // -- sp[argc * 4] : receiver | 433 // -- sp[argc * 4] : receiver |
| 395 // ----------------------------------- | 434 // ----------------------------------- |
| 396 | 435 |
| 397 // 1. Make sure we operate in the context of the called function. | 436 // 1. Make sure we operate in the context of the called function. |
| 398 __ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); | 437 __ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset)); |
| 399 | 438 |
| 400 // 2. Load the first argument into r2 and get rid of the rest (including the | 439 // 2. Load the first argument into r2. |
| 401 // receiver). | |
| 402 { | 440 { |
| 403 Label no_arguments, done; | 441 Label no_arguments, done; |
| 442 __ mov(r6, r0); // Store argc in r6. |
| 404 __ sub(r0, r0, Operand(1), SetCC); | 443 __ sub(r0, r0, Operand(1), SetCC); |
| 405 __ b(lo, &no_arguments); | 444 __ b(lo, &no_arguments); |
| 406 __ ldr(r2, MemOperand(sp, r0, LSL, kPointerSizeLog2, PreIndex)); | 445 __ ldr(r2, MemOperand(sp, r0, LSL, kPointerSizeLog2)); |
| 407 __ Drop(2); | |
| 408 __ b(&done); | 446 __ b(&done); |
| 409 __ bind(&no_arguments); | 447 __ bind(&no_arguments); |
| 410 __ LoadRoot(r2, Heap::kempty_stringRootIndex); | 448 __ LoadRoot(r2, Heap::kempty_stringRootIndex); |
| 411 __ Drop(1); | |
| 412 __ bind(&done); | 449 __ bind(&done); |
| 413 } | 450 } |
| 414 | 451 |
| 415 // 3. Make sure r2 is a string. | 452 // 3. Make sure r2 is a string. |
| 416 { | 453 { |
| 417 Label convert, done_convert; | 454 Label convert, done_convert; |
| 418 __ JumpIfSmi(r2, &convert); | 455 __ JumpIfSmi(r2, &convert); |
| 419 __ CompareObjectType(r2, r4, r4, FIRST_NONSTRING_TYPE); | 456 __ CompareObjectType(r2, r4, r4, FIRST_NONSTRING_TYPE); |
| 420 __ b(lo, &done_convert); | 457 __ b(lo, &done_convert); |
| 421 __ bind(&convert); | 458 __ bind(&convert); |
| 422 { | 459 { |
| 423 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); | 460 FrameScope scope(masm, StackFrame::MANUAL); |
| 424 ToStringStub stub(masm->isolate()); | 461 ToStringStub stub(masm->isolate()); |
| 425 __ Push(r1, r3); | 462 __ SmiTag(r6); |
| 463 __ EnterBuiltinFrame(cp, r1, r6); |
| 464 __ Push(r3); |
| 426 __ Move(r0, r2); | 465 __ Move(r0, r2); |
| 427 __ CallStub(&stub); | 466 __ CallStub(&stub); |
| 428 __ Move(r2, r0); | 467 __ Move(r2, r0); |
| 429 __ Pop(r1, r3); | 468 __ Pop(r3); |
| 469 __ LeaveBuiltinFrame(cp, r1, r6); |
| 470 __ SmiUntag(r6); |
| 430 } | 471 } |
| 431 __ bind(&done_convert); | 472 __ bind(&done_convert); |
| 432 } | 473 } |
| 433 | 474 |
| 434 // 4. Check if new target and constructor differ. | 475 // 4. Check if new target and constructor differ. |
| 435 Label new_object; | 476 Label drop_frame_and_ret, new_object; |
| 436 __ cmp(r1, r3); | 477 __ cmp(r1, r3); |
| 437 __ b(ne, &new_object); | 478 __ b(ne, &new_object); |
| 438 | 479 |
| 439 // 5. Allocate a JSValue wrapper for the string. | 480 // 5. Allocate a JSValue wrapper for the string. |
| 440 __ AllocateJSValue(r0, r1, r2, r4, r5, &new_object); | 481 __ AllocateJSValue(r0, r1, r2, r4, r5, &new_object); |
| 441 __ Ret(); | 482 __ b(&drop_frame_and_ret); |
| 442 | 483 |
| 443 // 6. Fallback to the runtime to create new object. | 484 // 6. Fallback to the runtime to create new object. |
| 444 __ bind(&new_object); | 485 __ bind(&new_object); |
| 445 { | 486 { |
| 446 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); | 487 FrameScope scope(masm, StackFrame::MANUAL); |
| 488 FastNewObjectStub stub(masm->isolate()); |
| 489 __ SmiTag(r6); |
| 490 __ EnterBuiltinFrame(cp, r1, r6); |
| 447 __ Push(r2); // first argument | 491 __ Push(r2); // first argument |
| 448 FastNewObjectStub stub(masm->isolate()); | |
| 449 __ CallStub(&stub); | 492 __ CallStub(&stub); |
| 450 __ Pop(r2); | 493 __ Pop(r2); |
| 494 __ LeaveBuiltinFrame(cp, r1, r6); |
| 495 __ SmiUntag(r6); |
| 451 } | 496 } |
| 452 __ str(r2, FieldMemOperand(r0, JSValue::kValueOffset)); | 497 __ str(r2, FieldMemOperand(r0, JSValue::kValueOffset)); |
| 453 __ Ret(); | 498 |
| 499 __ bind(&drop_frame_and_ret); |
| 500 { |
| 501 __ Drop(r6); |
| 502 __ Ret(1); |
| 503 } |
| 454 } | 504 } |
| 455 | 505 |
| 456 | 506 |
| 457 static void GenerateTailCallToSharedCode(MacroAssembler* masm) { | 507 static void GenerateTailCallToSharedCode(MacroAssembler* masm) { |
| 458 __ ldr(r2, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); | 508 __ ldr(r2, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); |
| 459 __ ldr(r2, FieldMemOperand(r2, SharedFunctionInfo::kCodeOffset)); | 509 __ ldr(r2, FieldMemOperand(r2, SharedFunctionInfo::kCodeOffset)); |
| 460 __ add(r2, r2, Operand(Code::kHeaderSize - kHeapObjectTag)); | 510 __ add(r2, r2, Operand(Code::kHeaderSize - kHeapObjectTag)); |
| 461 __ Jump(r2); | 511 __ Jump(r2); |
| 462 } | 512 } |
| 463 | 513 |
| (...skipping 1335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1799 __ mov(r1, Operand(Smi::FromInt(field_index))); | 1849 __ mov(r1, Operand(Smi::FromInt(field_index))); |
| 1800 __ CallCFunction( | 1850 __ CallCFunction( |
| 1801 ExternalReference::get_date_field_function(masm->isolate()), 2); | 1851 ExternalReference::get_date_field_function(masm->isolate()), 2); |
| 1802 } | 1852 } |
| 1803 __ Ret(); | 1853 __ Ret(); |
| 1804 | 1854 |
| 1805 // 3. Raise a TypeError if the receiver is not a date. | 1855 // 3. Raise a TypeError if the receiver is not a date. |
| 1806 __ bind(&receiver_not_date); | 1856 __ bind(&receiver_not_date); |
| 1807 { | 1857 { |
| 1808 FrameScope scope(masm, StackFrame::MANUAL); | 1858 FrameScope scope(masm, StackFrame::MANUAL); |
| 1809 __ Push(r0, lr, fp); | 1859 __ Push(r0); |
| 1810 __ Move(fp, sp); | 1860 __ Move(r0, Smi::FromInt(0)); |
| 1811 __ Push(cp, r1); | 1861 __ EnterBuiltinFrame(cp, r1, r0); |
| 1812 __ Push(Smi::FromInt(0)); | |
| 1813 __ CallRuntime(Runtime::kThrowNotDateError); | 1862 __ CallRuntime(Runtime::kThrowNotDateError); |
| 1814 } | 1863 } |
| 1815 } | 1864 } |
| 1816 | 1865 |
| 1817 // static | 1866 // static |
| 1818 void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { | 1867 void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { |
| 1819 // ----------- S t a t e ------------- | 1868 // ----------- S t a t e ------------- |
| 1820 // -- r0 : argc | 1869 // -- r0 : argc |
| 1821 // -- sp[0] : argArray | 1870 // -- sp[0] : argArray |
| 1822 // -- sp[4] : thisArg | 1871 // -- sp[4] : thisArg |
| (...skipping 1099 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2922 } | 2971 } |
| 2923 } | 2972 } |
| 2924 | 2973 |
| 2925 | 2974 |
| 2926 #undef __ | 2975 #undef __ |
| 2927 | 2976 |
| 2928 } // namespace internal | 2977 } // namespace internal |
| 2929 } // namespace v8 | 2978 } // namespace v8 |
| 2930 | 2979 |
| 2931 #endif // V8_TARGET_ARCH_ARM | 2980 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |