60 }
61
62 public class HotSpotSwitchClosure extends SwitchClosure {
63 protected HotSpotSwitchClosure(Register keyRegister, Register constantBaseRegister, CompilationResultBuilder crb, SPARCMacroAssembler masm) {
64 super(keyRegister, constantBaseRegister, crb, masm);
65 }
66
67 @Override
68 protected void conditionalJump(int index, Condition condition, Label target) {
69 if (keyConstants[index] instanceof HotSpotMetaspaceConstant) {
70 HotSpotMetaspaceConstant constant = (HotSpotMetaspaceConstant) keyConstants[index];
71 CC conditionCode = constant.isCompressed() ? CC.Icc : CC.Xcc;
72 ConditionFlag conditionFlag = SPARCControlFlow.fromCondition(true, condition, false);
73 LabelHint hint = requestHint(masm, target);
74
75 // Load constant takes one instruction
76 int cbCondPosition = masm.position() + INSTRUCTION_SIZE;
77 boolean canUseShortBranch = masm.hasFeature(CPUFeature.CBCOND) && SPARCControlFlow.isShortBranch(masm, cbCondPosition, hint, target);
78
79 Register scratchRegister = asRegister(scratch);
80 final int byteCount = constant.isCompressed() ? 4 : 8;
81 loadFromConstantTable(crb, masm, byteCount, asRegister(constantTableBase), constant, scratchRegister, SPARCDelayedControlTransfer.DUMMY);
82
83 if (canUseShortBranch) {
84 CBCOND.emit(masm, conditionFlag, conditionCode == CC.Xcc, keyRegister, scratchRegister, target);
85 } else {
86 masm.cmp(keyRegister, scratchRegister);
87 BPCC.emit(masm, conditionCode, conditionFlag, ANNUL, PREDICT_TAKEN, target);
88 masm.nop(); // delay slot
89 }
90 } else {
91 super.conditionalJump(index, condition, target);
92 }
93 }
94 }
95
96 @Override
97 protected int estimateEmbeddedSize(Constant c) {
98 if (c instanceof HotSpotMetaspaceConstant) {
99 return ((HotSpotMetaspaceConstant) c).isCompressed() ? 4 : 8;
100 } else {
101 return super.estimateEmbeddedSize(c);
|
60 }
61
62 public class HotSpotSwitchClosure extends SwitchClosure {
63 protected HotSpotSwitchClosure(Register keyRegister, Register constantBaseRegister, CompilationResultBuilder crb, SPARCMacroAssembler masm) {
64 super(keyRegister, constantBaseRegister, crb, masm);
65 }
66
67 @Override
68 protected void conditionalJump(int index, Condition condition, Label target) {
69 if (keyConstants[index] instanceof HotSpotMetaspaceConstant) {
70 HotSpotMetaspaceConstant constant = (HotSpotMetaspaceConstant) keyConstants[index];
71 CC conditionCode = constant.isCompressed() ? CC.Icc : CC.Xcc;
72 ConditionFlag conditionFlag = SPARCControlFlow.fromCondition(true, condition, false);
73 LabelHint hint = requestHint(masm, target);
74
75 // Load constant takes one instruction
76 int cbCondPosition = masm.position() + INSTRUCTION_SIZE;
77 boolean canUseShortBranch = masm.hasFeature(CPUFeature.CBCOND) && SPARCControlFlow.isShortBranch(masm, cbCondPosition, hint, target);
78
79 Register scratchRegister = asRegister(scratch);
80 loadFromConstantTable(crb, masm, asRegister(constantTableBase), constant, scratchRegister, SPARCDelayedControlTransfer.DUMMY);
81
82 if (canUseShortBranch) {
83 CBCOND.emit(masm, conditionFlag, conditionCode == CC.Xcc, keyRegister, scratchRegister, target);
84 } else {
85 masm.cmp(keyRegister, scratchRegister);
86 BPCC.emit(masm, conditionCode, conditionFlag, ANNUL, PREDICT_TAKEN, target);
87 masm.nop(); // delay slot
88 }
89 } else {
90 super.conditionalJump(index, condition, target);
91 }
92 }
93 }
94
95 @Override
96 protected int estimateEmbeddedSize(Constant c) {
97 if (c instanceof HotSpotMetaspaceConstant) {
98 return ((HotSpotMetaspaceConstant) c).isCompressed() ? 4 : 8;
99 } else {
100 return super.estimateEmbeddedSize(c);
|