private static void EmitIadd( EmitterContext context, Operand srcA, Operand srcB, int rd, AvgMode avgMode, bool extended, bool writeCC) { srcA = context.INegate(srcA, avgMode == AvgMode.NegA); srcB = context.INegate(srcB, avgMode == AvgMode.NegB); Operand res = context.IAdd(srcA, srcB); if (extended) { res = context.IAdd(res, context.BitwiseAnd(GetCF(), Const(1))); } SetIaddFlags(context, res, srcA, srcB, writeCC, extended); // TODO: SAT. context.Copy(GetDest(rd), res); }
private static void EmitImad( EmitterContext context, Operand srcA, Operand srcB, Operand srcC, int rd, AvgMode avgMode, bool signedA, bool signedB, bool high) { srcB = context.INegate(srcB, avgMode == AvgMode.NegA); srcC = context.INegate(srcC, avgMode == AvgMode.NegB); Operand res; if (high) { if (signedA && signedB) { res = context.MultiplyHighS32(srcA, srcB); } else { res = context.MultiplyHighU32(srcA, srcB); if (signedA) { res = context.IAdd(res, context.IMultiply(srcB, context.ShiftRightS32(srcA, Const(31)))); } else if (signedB) { res = context.IAdd(res, context.IMultiply(srcA, context.ShiftRightS32(srcB, Const(31)))); } } } else { res = context.IMultiply(srcA, srcB); } if (srcC.Type != OperandType.Constant || srcC.Value != 0) { res = context.IAdd(res, srcC); } // TODO: CC, X, SAT, and more? context.Copy(GetDest(rd), res); }
private static void EmitIscadd( EmitterContext context, Operand srcA, Operand srcB, int rd, int shift, AvgMode avgMode, bool writeCC) { srcA = context.ShiftLeft(srcA, Const(shift)); srcA = context.INegate(srcA, avgMode == AvgMode.NegA); srcB = context.INegate(srcB, avgMode == AvgMode.NegB); Operand res = context.IAdd(srcA, srcB); SetIaddFlags(context, res, srcA, srcB, writeCC, false); context.Copy(GetDest(rd), res); }