| Index: dart/runtime/vm/intermediate_language_ia32.cc
|
| ===================================================================
|
| --- dart/runtime/vm/intermediate_language_ia32.cc (revision 42037)
|
| +++ dart/runtime/vm/intermediate_language_ia32.cc (working copy)
|
| @@ -5921,7 +5921,6 @@
|
| __ movl(temp1, left_hi); // Preserve high 32 bits.
|
| if (shift > 31) {
|
| __ movl(left_hi, left_lo); // Shift by 32.
|
| - __ xorl(left_lo, left_lo); // Zero left_lo.
|
| if (shift > 32) {
|
| __ shll(left_hi, Immediate(shift - 32));
|
| }
|
| @@ -5931,6 +5930,15 @@
|
| __ sarl(temp2, Immediate(31));
|
| __ cmpl(temp1, temp2);
|
| __ j(NOT_EQUAL, deopt);
|
| + if (shift > 32) {
|
| + // Also compare low word from input with high word from
|
| + // output shifted back shift - 32.
|
| + __ movl(temp2, left_hi);
|
| + __ sarl(temp2, Immediate(shift - 32));
|
| + __ cmpl(left_lo, temp2);
|
| + __ j(NOT_EQUAL, deopt);
|
| + }
|
| + __ xorl(left_lo, left_lo); // Zero left_lo.
|
| } else {
|
| __ shldl(left_hi, left_lo, Immediate(shift));
|
| __ shll(left_lo, Immediate(shift));
|
| @@ -6006,7 +6014,6 @@
|
| __ Bind(&large_shift);
|
| // No need to subtract 32 from CL, only 5 bits used by shll.
|
| __ movl(left_hi, left_lo); // Shift by 32.
|
| - __ xorl(left_lo, left_lo); // Zero left_lo.
|
| __ shll(left_hi, ECX); // Shift count: CL % 32.
|
| // Check for overflow by sign extending the high 32 bits
|
| // and comparing with the input.
|
| @@ -6014,6 +6021,13 @@
|
| __ sarl(temp2, Immediate(31));
|
| __ cmpl(temp1, temp2);
|
| __ j(NOT_EQUAL, deopt);
|
| + // Also compare low word from input with high word from
|
| + // output shifted back shift - 32.
|
| + __ movl(temp2, left_hi);
|
| + __ sarl(temp2, ECX); // Shift count: CL % 32.
|
| + __ cmpl(left_lo, temp2);
|
| + __ j(NOT_EQUAL, deopt);
|
| + __ xorl(left_lo, left_lo); // Zero left_lo.
|
| } else {
|
| __ cmpl(ECX, Immediate(31));
|
| __ j(ABOVE, &large_shift);
|
|
|