< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.sparc/src/org/graalvm/compiler/hotspot/sparc/SPARCHotSpotStrategySwitchOp.java

Print this page




  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);
< prev index next >