src/cpu/sparc/vm/sharedRuntime_sparc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/cpu/sparc/vm

src/cpu/sparc/vm/sharedRuntime_sparc.cpp

Print this page
rev 10388 : 8148353: [linux-sparc] Crash in libawt.so on Linux SPARC
Summary: gcc expects clean 32 bit int in 64 bit register on function entry
Reviewed-by:


1332     __ mov(src.first()->as_Register(), dst.first()->as_Register());
1333   }
1334 }
1335 
1336 // On 64 bit we will store integer like items to the stack as
1337 // 64 bits items (sparc abi) even though java would only store
1338 // 32bits for a parameter. On 32bit it will simply be 32 bits
1339 // So this routine will do 32->32 on 32bit and 32->64 on 64bit
1340 static void move32_64(MacroAssembler* masm, VMRegPair src, VMRegPair dst) {
1341   if (src.first()->is_stack()) {
1342     if (dst.first()->is_stack()) {
1343       // stack to stack
1344       __ ld(FP, reg2offset(src.first()) + STACK_BIAS, L5);
1345       __ st_ptr(L5, SP, reg2offset(dst.first()) + STACK_BIAS);
1346     } else {
1347       // stack to reg
1348       __ ld(FP, reg2offset(src.first()) + STACK_BIAS, dst.first()->as_Register());
1349     }
1350   } else if (dst.first()->is_stack()) {
1351     // reg to stack
1352     __ st_ptr(src.first()->as_Register(), SP, reg2offset(dst.first()) + STACK_BIAS);



1353   } else {
1354     __ mov(src.first()->as_Register(), dst.first()->as_Register());



1355   }
1356 }
1357 
1358 
1359 static void move_ptr(MacroAssembler* masm, VMRegPair src, VMRegPair dst) {
1360   if (src.first()->is_stack()) {
1361     if (dst.first()->is_stack()) {
1362       // stack to stack
1363       __ ld_ptr(FP, reg2offset(src.first()) + STACK_BIAS, L5);
1364       __ st_ptr(L5, SP, reg2offset(dst.first()) + STACK_BIAS);
1365     } else {
1366       // stack to reg
1367       __ ld_ptr(FP, reg2offset(src.first()) + STACK_BIAS, dst.first()->as_Register());
1368     }
1369   } else if (dst.first()->is_stack()) {
1370     // reg to stack
1371     __ st_ptr(src.first()->as_Register(), SP, reg2offset(dst.first()) + STACK_BIAS);
1372   } else {
1373     __ mov(src.first()->as_Register(), dst.first()->as_Register());
1374   }




1332     __ mov(src.first()->as_Register(), dst.first()->as_Register());
1333   }
1334 }
1335 
1336 // On 64 bit we will store integer like items to the stack as
1337 // 64 bits items (sparc abi) even though java would only store
1338 // 32bits for a parameter. On 32bit it will simply be 32 bits
1339 // So this routine will do 32->32 on 32bit and 32->64 on 64bit
1340 static void move32_64(MacroAssembler* masm, VMRegPair src, VMRegPair dst) {
1341   if (src.first()->is_stack()) {
1342     if (dst.first()->is_stack()) {
1343       // stack to stack
1344       __ ld(FP, reg2offset(src.first()) + STACK_BIAS, L5);
1345       __ st_ptr(L5, SP, reg2offset(dst.first()) + STACK_BIAS);
1346     } else {
1347       // stack to reg
1348       __ ld(FP, reg2offset(src.first()) + STACK_BIAS, dst.first()->as_Register());
1349     }
1350   } else if (dst.first()->is_stack()) {
1351     // reg to stack
1352     Register src_reg = src.first()->as_Register();
1353     // Some compiler (gcc) expects a clean 32 bit value on function entry
1354     __ sra(src_reg, 0, L5);
1355     __ st_ptr(L5, SP, reg2offset(dst.first()) + STACK_BIAS);
1356   } else {
1357     Register src_reg = src.first()->as_Register();
1358     // Some compiler (gcc) expects a clean 32 bit value on function entry
1359     __ sra(src_reg, 0, L5);
1360     __ mov(L5, dst.first()->as_Register());
1361   }
1362 }
1363 
1364 
1365 static void move_ptr(MacroAssembler* masm, VMRegPair src, VMRegPair dst) {
1366   if (src.first()->is_stack()) {
1367     if (dst.first()->is_stack()) {
1368       // stack to stack
1369       __ ld_ptr(FP, reg2offset(src.first()) + STACK_BIAS, L5);
1370       __ st_ptr(L5, SP, reg2offset(dst.first()) + STACK_BIAS);
1371     } else {
1372       // stack to reg
1373       __ ld_ptr(FP, reg2offset(src.first()) + STACK_BIAS, dst.first()->as_Register());
1374     }
1375   } else if (dst.first()->is_stack()) {
1376     // reg to stack
1377     __ st_ptr(src.first()->as_Register(), SP, reg2offset(dst.first()) + STACK_BIAS);
1378   } else {
1379     __ mov(src.first()->as_Register(), dst.first()->as_Register());
1380   }


src/cpu/sparc/vm/sharedRuntime_sparc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File