public static string LoadAttribute(CodeGenContext context, AstOperation operation) { IAstNode src1 = operation.GetSource(0); IAstNode src2 = operation.GetSource(1); if (!(src1 is AstOperand attr) || attr.Type != OperandType.Attribute) { throw new InvalidOperationException("First source of LoadAttribute must be a attribute."); } string indexExpr = GetSoureExpr(context, src2, GetSrcVarType(operation.Inst, 1)); return(OperandManager.GetAttributeName(attr, context.Config, isOutAttr: false, indexExpr)); }
public static string LoadAttribute(CodeGenContext context, AstOperation operation) { IAstNode src1 = operation.GetSource(0); IAstNode src2 = operation.GetSource(1); IAstNode src3 = operation.GetSource(2); if (!(src1 is AstOperand baseAttr) || baseAttr.Type != OperandType.Constant) { throw new InvalidOperationException($"First input of {nameof(Instruction.LoadAttribute)} must be a constant operand."); } string indexExpr = GetSoureExpr(context, src3, GetSrcVarType(operation.Inst, 2)); if (src2 is AstOperand operand && operand.Type == OperandType.Constant) { int attrOffset = baseAttr.Value + (operand.Value << 2); return OperandManager.GetAttributeName(attrOffset, context.Config, perPatch: false, isOutAttr: false, indexExpr); }