Chromium Code Reviews| Index: vm/intrinsifier_ia32.cc |
| =================================================================== |
| --- vm/intrinsifier_ia32.cc (revision 2388) |
| +++ vm/intrinsifier_ia32.cc (working copy) |
| @@ -34,6 +34,7 @@ |
| V(IntegerImplementation, mulFromInteger, Integer_mulFromInteger) \ |
| V(IntegerImplementation, *, Integer_mulFromInteger) \ |
| V(IntegerImplementation, %, Integer_modulo) \ |
| + V(IntegerImplementation, ~/, Integer_truncDivide) \ |
| V(IntegerImplementation, negate, Integer_negate) \ |
| V(IntegerImplementation, bitAndFromInteger, Integer_bitAndFromInteger) \ |
| V(IntegerImplementation, &, Integer_bitAndFromInteger) \ |
| @@ -357,6 +358,25 @@ |
| } |
| +static bool Integer_truncDivide(Assembler* assembler) { |
| + Label fall_through; |
| + TestBothArgumentsSmis(assembler, &fall_through); |
| + // EAX: right argument (divisor) |
| + __ cmpl(EAX, Immediate(0)); |
| + __ j(EQUAL, &fall_through, Assembler::kNearJump); |
| + __ movl(EBX, EAX); |
| + __ SmiUntag(EBX); |
| + __ movl(EAX, Address(ESP, + 2 * kWordSize)); // Left argument (dividend). |
| + __ SmiUntag(EAX); |
| + __ cdq(); |
| + __ idivl(EBX); |
| + __ 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.
|
| + __ ret(); |
| + __ Bind(&fall_through); |
| + return false; |
| +} |
| + |
| + |
| static bool Integer_negate(Assembler* assembler) { |
| Label fall_through; |
| __ movl(EAX, Address(ESP, + 1 * kWordSize)); |