private static string GenerateGetOperandValue(Operand operand, NumberType numberType, string contextName = "context", bool forUseInArrayIndex = false) { switch (operand.OperandType) { case OperandType.Immediate32: case OperandType.Immediate64: Number4 immediateValues; switch (operand.NumComponents) { case 1: immediateValues = operand.ImmediateValues.Xxxx; break; case 4: immediateValues = operand.ImmediateValues; break; default: throw new NotImplementedException(); } var value = OperandUtility.ApplyOperandModifier(immediateValues, numberType, operand.Modifier); return(string.Format("new Number4({0}f, {1}f, {2}f, {3}f)", value.Float0, value.Float1, value.Float2, value.Float3)); case OperandType.ConstantBuffer: case OperandType.IndexableTemp: case OperandType.Input: case OperandType.Temp: var swizzled = ApplyOperandSelectionMode(GetRegister(operand, contextName), operand, forUseInArrayIndex); switch (operand.Modifier) { case OperandModifier.None: return(swizzled); case OperandModifier.Neg: return(string.Format("Number4.Negate{0}({1})", numberType, swizzled)); case OperandModifier.Abs: throw new NotImplementedException(); case OperandModifier.AbsNeg: throw new NotImplementedException(); default: throw new ArgumentOutOfRangeException(); } default: throw new ArgumentException("Unsupported operand type: " + operand.OperandType); } }
/// <summary> /// Gets potentially-swizzled value for use on RHS of an operation. /// </summary> private static Number4 GetOperandValue(ExecutionContext context, Operand operand, NumberType numberType) { switch (operand.OperandType) { case OperandType.Immediate32: case OperandType.Immediate64: Number4 value; switch (operand.NumComponents) { case 1: value = operand.ImmediateValues.Xxxx; break; case 4: value = operand.ImmediateValues; break; default: throw new NotImplementedException(); } return(OperandUtility.ApplyOperandModifier(value, numberType, operand.Modifier)); case OperandType.ConstantBuffer: case OperandType.IndexableTemp: case OperandType.Input: case OperandType.Temp: Number4[] register; int index; GetRegister(context, operand, out register, out index); var swizzledNumber = OperandUtility.ApplyOperandSelectionMode(register[index], operand); return(OperandUtility.ApplyOperandModifier(swizzledNumber, numberType, operand.Modifier)); default: throw new ArgumentException("Unsupported operand type: " + operand.OperandType); } }