Tue, 27 Apr 2010 11:19:12 -0700
6946892: c1 shouldn't sign-extend to upper 32bits on x64
Summary: c1 does sign-extension when it loads ints and shorts from memory to 64-bit registers. This causes problems for c2 because it relies on the fact the int passed in a 64-bit register is zero-extended.
Reviewed-by: never
src/cpu/x86/vm/c1_LIRAssembler_x86.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Mon Apr 26 23:59:45 2010 -0700 1.2 +++ b/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Tue Apr 27 11:19:12 2010 -0700 1.3 @@ -1244,8 +1244,7 @@ 1.4 break; 1.5 #endif // _L64 1.6 case T_INT: 1.7 - // %%% could this be a movl? this is safer but longer instruction 1.8 - __ movl2ptr(dest->as_register(), from_addr); 1.9 + __ movl(dest->as_register(), from_addr); 1.10 break; 1.11 1.12 case T_LONG: { 1.13 @@ -1303,7 +1302,6 @@ 1.14 __ shll(dest_reg, 24); 1.15 __ sarl(dest_reg, 24); 1.16 } 1.17 - // These are unsigned so the zero extension on 64bit is just what we need 1.18 break; 1.19 } 1.20 1.21 @@ -1315,8 +1313,6 @@ 1.22 } else { 1.23 __ movw(dest_reg, from_addr); 1.24 } 1.25 - // This is unsigned so the zero extension on 64bit is just what we need 1.26 - // __ movl2ptr(dest_reg, dest_reg); 1.27 break; 1.28 } 1.29 1.30 @@ -1329,8 +1325,6 @@ 1.31 __ shll(dest_reg, 16); 1.32 __ sarl(dest_reg, 16); 1.33 } 1.34 - // Might not be needed in 64bit but certainly doesn't hurt (except for code size) 1.35 - __ movl2ptr(dest_reg, dest_reg); 1.36 break; 1.37 } 1.38