Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 // | 4 // |
| 5 // The intrinsic code below is executed before a method has built its frame. | 5 // The intrinsic code below is executed before a method has built its frame. |
| 6 // The return address is on the stack and the arguments below it. | 6 // The return address is on the stack and the arguments below it. |
| 7 // Registers EDX (arguments descriptor) and ECX (function) must be preserved. | 7 // Registers EDX (arguments descriptor) and ECX (function) must be preserved. |
| 8 // Each intrinsification method returns true if the corresponding | 8 // Each intrinsification method returns true if the corresponding |
| 9 // Dart method was intrinsified. | 9 // Dart method was intrinsified. |
| 10 | 10 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 | 27 |
| 28 // List of intrinsics: (class-name, function-name, intrinsification method). | 28 // List of intrinsics: (class-name, function-name, intrinsification method). |
| 29 #define INTRINSIC_LIST(V) \ | 29 #define INTRINSIC_LIST(V) \ |
| 30 V(IntegerImplementation, addFromInteger, Integer_addFromInteger) \ | 30 V(IntegerImplementation, addFromInteger, Integer_addFromInteger) \ |
| 31 V(IntegerImplementation, +, Integer_addFromInteger) \ | 31 V(IntegerImplementation, +, Integer_addFromInteger) \ |
| 32 V(IntegerImplementation, subFromInteger, Integer_subFromInteger) \ | 32 V(IntegerImplementation, subFromInteger, Integer_subFromInteger) \ |
| 33 V(IntegerImplementation, -, Integer_sub) \ | 33 V(IntegerImplementation, -, Integer_sub) \ |
| 34 V(IntegerImplementation, mulFromInteger, Integer_mulFromInteger) \ | 34 V(IntegerImplementation, mulFromInteger, Integer_mulFromInteger) \ |
| 35 V(IntegerImplementation, *, Integer_mulFromInteger) \ | 35 V(IntegerImplementation, *, Integer_mulFromInteger) \ |
| 36 V(IntegerImplementation, %, Integer_modulo) \ | 36 V(IntegerImplementation, %, Integer_modulo) \ |
| 37 V(IntegerImplementation, ~/, Integer_truncDivide) \ | |
| 37 V(IntegerImplementation, negate, Integer_negate) \ | 38 V(IntegerImplementation, negate, Integer_negate) \ |
| 38 V(IntegerImplementation, bitAndFromInteger, Integer_bitAndFromInteger) \ | 39 V(IntegerImplementation, bitAndFromInteger, Integer_bitAndFromInteger) \ |
| 39 V(IntegerImplementation, &, Integer_bitAndFromInteger) \ | 40 V(IntegerImplementation, &, Integer_bitAndFromInteger) \ |
| 40 V(IntegerImplementation, bitOrFromInteger, Integer_bitOrFromInteger) \ | 41 V(IntegerImplementation, bitOrFromInteger, Integer_bitOrFromInteger) \ |
| 41 V(IntegerImplementation, |, Integer_bitOrFromInteger) \ | 42 V(IntegerImplementation, |, Integer_bitOrFromInteger) \ |
| 42 V(IntegerImplementation, bitXorFromInteger, Integer_bitXorFromInteger) \ | 43 V(IntegerImplementation, bitXorFromInteger, Integer_bitXorFromInteger) \ |
| 43 V(IntegerImplementation, ^, Integer_bitXorFromInteger) \ | 44 V(IntegerImplementation, ^, Integer_bitXorFromInteger) \ |
| 44 V(IntegerImplementation, greaterThanFromInteger, Integer_lessThan) \ | 45 V(IntegerImplementation, greaterThanFromInteger, Integer_lessThan) \ |
| 45 V(IntegerImplementation, >, Integer_greaterThan) \ | 46 V(IntegerImplementation, >, Integer_greaterThan) \ |
| 46 V(IntegerImplementation, ==, Integer_equalToInteger) \ | 47 V(IntegerImplementation, ==, Integer_equalToInteger) \ |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 350 __ movl(EAX, EBX); // Return dividend. | 351 __ movl(EAX, EBX); // Return dividend. |
| 351 __ ret(); | 352 __ ret(); |
| 352 __ Bind(&return_zero); | 353 __ Bind(&return_zero); |
| 353 __ xorl(EAX, EAX); // Return zero. | 354 __ xorl(EAX, EAX); // Return zero. |
| 354 __ ret(); | 355 __ ret(); |
| 355 __ Bind(&fall_through); | 356 __ Bind(&fall_through); |
| 356 return false; | 357 return false; |
| 357 } | 358 } |
| 358 | 359 |
| 359 | 360 |
| 361 static bool Integer_truncDivide(Assembler* assembler) { | |
| 362 Label fall_through; | |
| 363 TestBothArgumentsSmis(assembler, &fall_through); | |
| 364 // EAX: right argument (divisor) | |
| 365 __ cmpl(EAX, Immediate(0)); | |
| 366 __ j(EQUAL, &fall_through, Assembler::kNearJump); | |
| 367 __ movl(EBX, EAX); | |
| 368 __ SmiUntag(EBX); | |
| 369 __ movl(EAX, Address(ESP, + 2 * kWordSize)); // Left argument (dividend). | |
| 370 __ SmiUntag(EAX); | |
| 371 __ cdq(); | |
| 372 __ idivl(EBX); | |
| 373 __ SmiTag(EAX); | |
|
sra1
2011/12/13 21:12:08
MIN_SMI / -1 is not a Smi.
srdjan
2011/12/13 21:29:35
Thanks, fixing it now.
| |
| 374 __ ret(); | |
| 375 __ Bind(&fall_through); | |
| 376 return false; | |
| 377 } | |
| 378 | |
| 379 | |
| 360 static bool Integer_negate(Assembler* assembler) { | 380 static bool Integer_negate(Assembler* assembler) { |
| 361 Label fall_through; | 381 Label fall_through; |
| 362 __ movl(EAX, Address(ESP, + 1 * kWordSize)); | 382 __ movl(EAX, Address(ESP, + 1 * kWordSize)); |
| 363 __ testl(EAX, Immediate(kSmiTagMask)); | 383 __ testl(EAX, Immediate(kSmiTagMask)); |
| 364 __ j(NOT_ZERO, &fall_through, Assembler::kNearJump); // Non-smi value. | 384 __ j(NOT_ZERO, &fall_through, Assembler::kNearJump); // Non-smi value. |
| 365 __ negl(EAX); | 385 __ negl(EAX); |
| 366 __ j(OVERFLOW, &fall_through, Assembler::kNearJump); | 386 __ j(OVERFLOW, &fall_through, Assembler::kNearJump); |
| 367 // Result is in EAX. | 387 // Result is in EAX. |
| 368 __ ret(); | 388 __ ret(); |
| 369 __ Bind(&fall_through); | 389 __ Bind(&fall_through); |
| (...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 981 } \ | 1001 } \ |
| 982 | 1002 |
| 983 INTRINSIC_LIST(FIND_INTRINSICS); | 1003 INTRINSIC_LIST(FIND_INTRINSICS); |
| 984 #undef FIND_INTRINSICS | 1004 #undef FIND_INTRINSICS |
| 985 return false; | 1005 return false; |
| 986 } | 1006 } |
| 987 | 1007 |
| 988 } // namespace dart | 1008 } // namespace dart |
| 989 | 1009 |
| 990 #endif // defined TARGET_ARCH_IA32 | 1010 #endif // defined TARGET_ARCH_IA32 |
| OLD | NEW |