public void Emit(ILMethodBuilder context) { long intInputs = context.RegUsage.GetIntInputs(_block); long vecInputs = context.RegUsage.GetVecInputs(_block); if (Optimizations.AssumeStrictAbiCompliance && context.IsSubComplete) { intInputs = RegisterUsage.ClearCallerSavedIntRegs(intInputs, context.IsAarch64); vecInputs = RegisterUsage.ClearCallerSavedVecRegs(vecInputs, context.IsAarch64); } LoadLocals(context, intInputs, RegisterType.Int); LoadLocals(context, vecInputs, RegisterType.Vector); }
private void EmitStoreContext(ILGenerator generator, BasicBlock block) { RegisterMask outputs = _regUsage.GetOutputs(block); long intOutputs = outputs.IntMask; long vecOutputs = outputs.VecMask; if (Optimizations.AssumeStrictAbiCompliance && _isComplete) { intOutputs = RegisterUsage.ClearCallerSavedIntRegs(intOutputs, _mode); vecOutputs = RegisterUsage.ClearCallerSavedVecRegs(vecOutputs, _mode); } StoreLocals(generator, intOutputs, RegisterType.Int); StoreLocals(generator, vecOutputs, RegisterType.Vector); }
public void Emit(ILMethodBuilder context) { long intOutputs = context.RegUsage.GetIntOutputs(_block); long vecOutputs = context.RegUsage.GetVecOutputs(_block); if (Optimizations.AssumeStrictAbiCompliance && context.IsSubComplete) { intOutputs = RegisterUsage.ClearCallerSavedIntRegs(intOutputs, context.IsAarch64); vecOutputs = RegisterUsage.ClearCallerSavedVecRegs(vecOutputs, context.IsAarch64); } if (_callSub != null) { //Those register are assigned on the callee function, without //reading it's value first. We don't need to write them because //they are not going to be read on the callee. intOutputs &= ~_callSub.IntNiRegsMask; vecOutputs &= ~_callSub.VecNiRegsMask; } StoreLocals(context, intOutputs, RegisterType.Int); StoreLocals(context, vecOutputs, RegisterType.Vector); }