public UnaryOp(UnaryOpKind op, DestRegister dest, SrcRegister src) { this.op = op; this.dest = dest; this.src = src; }
public TernaryOp(TernaryOpKind op, DestRegister dest, SrcRegister src1, SrcRegister src2, SrcRegister src3) { this.op = op; this.dest = dest; this.src1 = src1; this.src2 = src2; this.src3 = src3; }
public TexLoad(DestRegister dest, SrcRegister sampler, SrcRegister tex) { this.dest = dest; this.sampler = sampler; this.tex = tex; }
public BinaryOp(BinOpKind op, DestRegister dest, SrcRegister src1, SrcRegister src2) { this.op = op; this.dest = dest; this.src1 = src1; this.src2 = src2; }
public Mov(DestRegister dest, SrcRegister src) { this.dest = dest; this.src = src; }
internal Vector4f ReadValue(SrcRegister src) { Vector4f val = GetReg (src); //if (Tracing.Enabled) Console.WriteLine ("\t {0} -> {1}", src, val); val = val.Shuffle ((ShuffleSel)src.Swizzle); switch (src.Modifier) { case SrcModifier.None: break; case SrcModifier.Negate: val = val * Vector4f.MinusOne; break; default: throw new Exception ("can't handle src reg modifier "+src.Modifier); } return val; }
internal void LoadValue(SrcRegister src) { ilgen.Emit (OpCodes.Ldloc, GetReg (src.Kind, src.Number)); if (src.Swizzle != SrcRegister.MakeSwizzle (0, 1, 2, 3)) { ilgen.Emit (OpCodes.Ldc_I4, src.Swizzle); ilgen.Emit (OpCodes.Call, typeof (VectorOperations).GetMethod ("Shuffle", new Type[] { typeof (Vector4f), typeof (ShuffleSel)})); } switch (src.Modifier) { case SrcModifier.None: break; case SrcModifier.Negate: //FIXME We could be using a ^ (1 << 31) to negate (could we?) //FIXME Make The JIT intrinsify this ilgen.Emit (OpCodes.Call, typeof (Vector4f).GetMethod ("get_MinusOne")); ilgen.Emit (OpCodes.Call, typeof (Vector4f).GetMethod ("op_Multiply")); break; default: throw new Exception ("can't handle src reg modifier " + src.Modifier); } }
SrcRegister ParseSrcReg() { int val = 0; if (!Read (ref val)) throw new Exception ("can't read src register"); SrcRegister reg = new SrcRegister (val); if (reg.Number >= 32) throw new Exception ("Invalid src reg number " + reg.Number); return reg; }
void VisitSrcReg(SrcRegister src) { VisitReg (src); }
void LoadScalar(SrcRegister src) { ilgen.Emit (OpCodes.Ldloca, GetReg (src.Kind, src.Number)); switch (src.Swizzle) { case 0: //R ilgen.Emit (OpCodes.Call, typeof (Vector4f).GetMethod ("get_X")); break; case (1 << 0) | (1 << 2) | (1 << 4) | (1 << 6): //G ilgen.Emit (OpCodes.Call, typeof (Vector4f).GetMethod ("get_Y")); break; case (2 << 0) | (2 << 2) | (2 << 4) | (2 << 6): //B ilgen.Emit (OpCodes.Call, typeof (Vector4f).GetMethod ("get_Z")); break; case (3 << 0) | (3 << 2) | (3 << 4) | (3 << 6): //A ilgen.Emit (OpCodes.Call, typeof (Vector4f).GetMethod ("get_W")); break; default: throw new Exception ("Invalid swizzle for scalar " + src.Swizzle.ToString ("X")); } }
void ApplyMathScalarUnaryToElement(DestRegister dest, SrcRegister src, string func, string element) { ilgen.Emit (OpCodes.Ldloca, GetReg (dest.Kind, dest.Number)); LoadScalar (src); ilgen.Emit (OpCodes.Call, typeof (Math).GetMethod (func)); ilgen.Emit (OpCodes.Conv_R4); ilgen.Emit (OpCodes.Call, typeof (Vector4f).GetMethod ("set_" + element)); }
internal void SampleTexture(int sampler, SrcRegister texReg) { ilgen.Emit (OpCodes.Ldloc, samplerMap [sampler]); LoadValue (texReg); ilgen.Emit (OpCodes.Call, typeof (Sampler).GetMethod ("Sample")); }