| 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);
 | 
| 
 |