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);
        }
Example #2
0
        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);
        }