src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp

Print this page




3214   } else {
3215     // use normal move for all other volatiles since they don't need
3216     // special handling to remain atomic.
3217     move_op(src, dest, type, lir_patch_none, info, false, false, false);
3218   }
3219 }
3220 
3221 void LIR_Assembler::membar() {
3222   // only StoreLoad membars are ever explicitly needed on sparcs in TSO mode
3223   __ membar( Assembler::Membar_mask_bits(Assembler::StoreLoad) );
3224 }
3225 
3226 void LIR_Assembler::membar_acquire() {
3227   // no-op on TSO
3228 }
3229 
3230 void LIR_Assembler::membar_release() {
3231   // no-op on TSO
3232 }
3233 




















3234 // Pack two sequential registers containing 32 bit values
3235 // into a single 64 bit register.
3236 // src and src->successor() are packed into dst
3237 // src and dst may be the same register.
3238 // Note: src is destroyed
3239 void LIR_Assembler::pack64(LIR_Opr src, LIR_Opr dst) {
3240   Register rs = src->as_register();
3241   Register rd = dst->as_register_lo();
3242   __ sllx(rs, 32, rs);
3243   __ srl(rs->successor(), 0, rs->successor());
3244   __ or3(rs, rs->successor(), rd);
3245 }
3246 
3247 // Unpack a 64 bit value in a register into
3248 // two sequential registers.
3249 // src is unpacked into dst and dst->successor()
3250 void LIR_Assembler::unpack64(LIR_Opr src, LIR_Opr dst) {
3251   Register rs = src->as_register_lo();
3252   Register rd = dst->as_register_hi();
3253   assert_different_registers(rs, rd, rd->successor());




3214   } else {
3215     // use normal move for all other volatiles since they don't need
3216     // special handling to remain atomic.
3217     move_op(src, dest, type, lir_patch_none, info, false, false, false);
3218   }
3219 }
3220 
3221 void LIR_Assembler::membar() {
3222   // only StoreLoad membars are ever explicitly needed on sparcs in TSO mode
3223   __ membar( Assembler::Membar_mask_bits(Assembler::StoreLoad) );
3224 }
3225 
3226 void LIR_Assembler::membar_acquire() {
3227   // no-op on TSO
3228 }
3229 
3230 void LIR_Assembler::membar_release() {
3231   // no-op on TSO
3232 }
3233 
3234 void LIR_Assembler::membar_loadload() {
3235   // no-op
3236   //__ membar(Assembler::Membar_mask_bits(Assembler::loadload));
3237 }
3238 
3239 void LIR_Assembler::membar_storestore() {
3240   // no-op
3241   //__ membar(Assembler::Membar_mask_bits(Assembler::storestore));
3242 }
3243 
3244 void LIR_Assembler::membar_loadstore() {
3245   // no-op
3246   //__ membar(Assembler::Membar_mask_bits(Assembler::loadstore));
3247 }
3248 
3249 void LIR_Assembler::membar_storeload() {
3250   __ membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));
3251 }
3252 
3253 
3254 // Pack two sequential registers containing 32 bit values
3255 // into a single 64 bit register.
3256 // src and src->successor() are packed into dst
3257 // src and dst may be the same register.
3258 // Note: src is destroyed
3259 void LIR_Assembler::pack64(LIR_Opr src, LIR_Opr dst) {
3260   Register rs = src->as_register();
3261   Register rd = dst->as_register_lo();
3262   __ sllx(rs, 32, rs);
3263   __ srl(rs->successor(), 0, rs->successor());
3264   __ or3(rs, rs->successor(), rd);
3265 }
3266 
3267 // Unpack a 64 bit value in a register into
3268 // two sequential registers.
3269 // src is unpacked into dst and dst->successor()
3270 void LIR_Assembler::unpack64(LIR_Opr src, LIR_Opr dst) {
3271   Register rs = src->as_register_lo();
3272   Register rd = dst->as_register_hi();
3273   assert_different_registers(rs, rd, rd->successor());