Index: runtime/vm/intrinsifier_ia32.cc |
=================================================================== |
--- runtime/vm/intrinsifier_ia32.cc (revision 41048) |
+++ runtime/vm/intrinsifier_ia32.cc (working copy) |
@@ -654,7 +654,7 @@ |
__ movl(EAX, EBX); |
__ shll(EBX, ECX); |
__ xorl(EDI, EDI); |
- __ shld(EDI, EAX); |
+ __ shldl(EDI, EAX); |
// Result in EDI (high) and EBX (low). |
const Class& mint_class = Class::Handle( |
Isolate::Current()->object_store()->mint_class()); |
@@ -937,6 +937,7 @@ |
__ xorl(EDX, EDX); // EDX = 0, carry flag = 0. |
Label add_loop; |
__ Bind(&add_loop); |
+ // Loop a_used times, ECX = a_used, ECX > 0. |
__ movl(EAX, FieldAddress(EDI, EDX, TIMES_4, TypedData::data_offset())); |
__ adcl(EAX, FieldAddress(ESI, EDX, TIMES_4, TypedData::data_offset())); |
__ movl(FieldAddress(EBX, EDX, TIMES_4, TypedData::data_offset()), EAX); |
@@ -947,10 +948,11 @@ |
Label last_carry; |
__ popl(ECX); |
__ decl(ECX); // Does not affect carry flag. |
- __ j(ZERO, &last_carry, Assembler::kNearJump); |
+ __ j(ZERO, &last_carry, Assembler::kNearJump); // If used - a_used == 0. |
Label carry_loop; |
__ Bind(&carry_loop); |
+ // Loop used - a_used times, ECX = used - a_used, ECX > 0. |
__ movl(EAX, FieldAddress(EDI, EDX, TIMES_4, TypedData::data_offset())); |
__ adcl(EAX, Immediate(0)); |
__ movl(FieldAddress(EBX, EDX, TIMES_4, TypedData::data_offset()), EAX); |
@@ -995,6 +997,7 @@ |
__ xorl(EDX, EDX); // EDX = 0, carry flag = 0. |
Label sub_loop; |
__ Bind(&sub_loop); |
+ // Loop a_used times, ECX = a_used, ECX > 0. |
__ movl(EAX, FieldAddress(EDI, EDX, TIMES_4, TypedData::data_offset())); |
__ sbbl(EAX, FieldAddress(ESI, EDX, TIMES_4, TypedData::data_offset())); |
__ movl(FieldAddress(EBX, EDX, TIMES_4, TypedData::data_offset()), EAX); |
@@ -1005,10 +1008,11 @@ |
Label done; |
__ popl(ECX); |
__ decl(ECX); // Does not affect carry flag. |
- __ j(ZERO, &done, Assembler::kNearJump); |
+ __ j(ZERO, &done, Assembler::kNearJump); // If used - a_used == 0. |
Label carry_loop; |
__ Bind(&carry_loop); |
+ // Loop used - a_used times, ECX = used - a_used, ECX > 0. |
__ movl(EAX, FieldAddress(EDI, EDX, TIMES_4, TypedData::data_offset())); |
__ sbbl(EAX, Immediate(0)); |
__ movl(FieldAddress(EBX, EDX, TIMES_4, TypedData::data_offset()), EAX); |
@@ -1096,7 +1100,7 @@ |
// uint32_t mi = *mip++ |
__ movl(EAX, Address(EDI, 0)); |
- __ addl(EDI, Immediate(kWordSize)); |
+ __ addl(EDI, Immediate(Bigint::kBytesPerDigit)); |
// uint64_t t = x*mi |
__ mull(EBX); // t = EDX:EAX = EAX * EBX |
@@ -1109,7 +1113,7 @@ |
// *ajp++ = low32(t) |
__ movl(Address(ESI, 0), EAX); |
- __ addl(ESI, Immediate(kWordSize)); |
+ __ addl(ESI, Immediate(Bigint::kBytesPerDigit)); |
// c = high32(t) |
__ movl(ECX, EDX); |
@@ -1120,7 +1124,7 @@ |
Label done; |
__ testl(ECX, ECX); |
- __ j(ZERO, &done); |
+ __ j(ZERO, &done, Assembler::kNearJump); |
// *ajp += c |
__ addl(Address(ESI, 0), ECX); |
@@ -1128,7 +1132,7 @@ |
Label propagate_carry_loop; |
__ Bind(&propagate_carry_loop); |
- __ addl(ESI, Immediate(kWordSize)); |
+ __ addl(ESI, Immediate(Bigint::kBytesPerDigit)); |
__ incl(Address(ESI, 0)); // c == 0 or 1 |
__ j(CARRY, &propagate_carry_loop, Assembler::kNearJump); |
@@ -1178,8 +1182,8 @@ |
Label x_zero; |
__ movl(EBX, Address(EDI, 0)); |
__ cmpl(EBX, Immediate(0)); |
- __ j(EQUAL, &x_zero); |
- __ addl(EDI, Immediate(kWordSize)); |
+ __ j(EQUAL, &x_zero, Assembler::kNearJump); |
+ __ addl(EDI, Immediate(Bigint::kBytesPerDigit)); |
// Preserve CTX to free ESI. |
__ pushl(CTX); |
@@ -1197,7 +1201,7 @@ |
// *ajp++ = low32(t) |
__ movl(Address(ESI, 0), EAX); |
- __ addl(ESI, Immediate(kWordSize)); |
+ __ addl(ESI, Immediate(Bigint::kBytesPerDigit)); |
// int n = used - i - 1 |
__ movl(EAX, Address(ESP, 2 * kWordSize)); // used is Smi |
@@ -1225,17 +1229,17 @@ |
// while (--n >= 0) |
__ decl(Address(ESP, 2 * kWordSize)); // --n |
- __ j(NEGATIVE, &done); |
+ __ j(NEGATIVE, &done, Assembler::kNearJump); |
// uint32_t xi = *xip++ |
__ movl(EAX, Address(EDI, 0)); |
- __ addl(EDI, Immediate(kWordSize)); |
+ __ addl(EDI, Immediate(Bigint::kBytesPerDigit)); |
// uint96_t t = ECX:EDX:EAX = 2*x*xi + aj + c |
__ mull(EBX); // EDX:EAX = EAX * EBX |
__ xorl(ECX, ECX); // ECX = 0 |
- __ shld(ECX, EDX, Immediate(1)); |
- __ shld(EDX, EAX, Immediate(1)); |
+ __ shldl(ECX, EDX, Immediate(1)); |
+ __ shldl(EDX, EAX, Immediate(1)); |
__ shll(EAX, Immediate(1)); // ECX:EDX:EAX <<= 1 |
__ addl(EAX, Address(ESI, 0)); // t += aj |
__ adcl(EDX, Immediate(0)); |
@@ -1246,7 +1250,7 @@ |
// *ajp++ = low32(t) |
__ movl(Address(ESI, 0), EAX); |
- __ addl(ESI, Immediate(kWordSize)); |
+ __ addl(ESI, Immediate(Bigint::kBytesPerDigit)); |
// c = high64(t) |
__ movl(cl_addr, EDX); |
@@ -1264,7 +1268,7 @@ |
// *ajp++ = low32(t) |
// *ajp = high32(t) |
__ movl(Address(ESI, 0), EAX); |
- __ movl(Address(ESI, kWordSize), EDX); |
+ __ movl(Address(ESI, Bigint::kBytesPerDigit), EDX); |
// Restore CTX and return. |
__ Drop(3); |
@@ -1314,7 +1318,7 @@ |
__ j(EQUAL, &return_qd, Assembler::kNearJump); |
// EAX = dl = dp[-1] |
- __ movl(EAX, Address(EBX, -kWordSize)); |
+ __ movl(EAX, Address(EBX, -Bigint::kBytesPerDigit)); |
// EAX = qd = dh:dl / yt = EDX:EAX / ECX |
__ divl(ECX); |
@@ -1321,7 +1325,8 @@ |
__ Bind(&return_qd); |
// args[1] = qd |
- __ movl(FieldAddress(EDI, TypedData::data_offset() + kWordSize), EAX); |
+ __ movl(FieldAddress(EDI, TypedData::data_offset() + Bigint::kBytesPerDigit), |
+ EAX); |
// Returning Object::null() is not required, since this method is private. |
__ ret(); |
@@ -1352,7 +1357,8 @@ |
__ mull(ECX); |
// args[1] = t mod DIGIT_BASE = low32(t) |
- __ movl(FieldAddress(EDI, TypedData::data_offset() + kWordSize), EAX); |
+ __ movl(FieldAddress(EDI, TypedData::data_offset() + Bigint::kBytesPerDigit), |
+ EAX); |
// Returning Object::null() is not required, since this method is private. |
__ ret(); |