void IVisitor.BitCast(Size size, Size targetSize, Size significantSize) => AddCode ( "data.Push(data.Pull({0}).BitCast({1}).BitCast({2}))", targetSize.SaveByteCount, significantSize.ToInt(), size.ToInt() );
internal FormalMachine(Size dataSize) { _startAddress = dataSize; _data = new FormalValueAccess[dataSize.ToInt()]; _points = new FormalPointer[dataSize.ToInt() + 1]; }
void SetFormalValues(IFormalValue element, int startAddress, Size size) { var size1 = size.ToInt(); for(var i = 0; i < size1; i++) _data[i + startAddress] = new FormalValueAccess(element, i, size1); }
void ResetInputValuesOfData(Size inputSize) { var start = _startAddress.ToInt(); for(var i = 0; i < inputSize.ToInt(); i++) _data[i + start] = null; }
IFormalValue[] GetInputValuesFromData(Size offset, Size inputSize) { var accesses = new List<FormalValueAccess>(); var start = (_startAddress + offset).ToInt(); for(var i = 0; i < inputSize.ToInt(); i++) accesses.Add(_data[i + start]); return FormalValueAccess.Transpose(accesses.ToArray()); }
IFormalValue[] GetInputValuesFromFrame(Size offset, Size size) { var accesses = new List<FormalValueAccess>(); var start = _frameData.Length + offset.ToInt(); for(var i = 0; i < size.ToInt(); i++) accesses.Add(_frameData[i + start]); return FormalValueAccess.Transpose(accesses.ToArray()); }
void AlignFrame(Size offset) { var minSize = -offset.ToInt(); if(_frameData.Length >= minSize) return; var frameData = _frameData; var framePoints = _framePoints; _frameData = new FormalValueAccess[minSize]; _framePoints = new FormalPointer[minSize + 1]; var delta = _frameData.Length - frameData.Length; for(var i = 0; i < frameData.Length; i++) _frameData[i + delta] = frameData[i]; for(var i = 0; i < framePoints.Length; i++) _framePoints[i + delta] = framePoints[i]; }
IFormalValue CreateValuesInFrame(Size size, Size offset) { var element = FormalValueAccess.Variable(Names[_nextValue++]); var size1 = size.ToInt(); var start = _frameData.Length + offset.ToInt(); for(var i = 0; i < size1; i++) _frameData[i + start] = new FormalValueAccess(element, i, size1); return element; }
void IVisitor.ReferencePlus(Size right) { var formalSubValue = PullInputValuesFromData(RefSize).Single(); var startAddress = _startAddress.ToInt(); var element = FormalValueAccess.RefPlus(formalSubValue, right.ToInt()); SetFormalValues(element, startAddress, RefSize); }
static string BitCast(Size size, Size dataSize) { if(size == dataSize) return ""; return $".BitCast({dataSize.ToInt()}).BitCast({size.ToInt()})"; }
static Size DivideSize(Size left, Size right) => Size.Create(DivideSize(left.ToInt(), right.ToInt()));
static Size MultiplySize(Size left, Size right) => Size.Create(MultiplySize(left.ToInt(), right.ToInt()));
static Size PlusSize(Size size, Size size1) => Size.Create(PlusSize(size.ToInt(), size1.ToInt()));
public BitsConst Divide(BitsConst right, Size size) { if(!(Marshal.SizeOf(typeof(long)) * 8 >= size.ToInt())) Tracer.AssertionFailed ( @"sizeof(Int64)*8 >= size.ToInt()", () => "right=" + right + ";size=" + size.Dump()); return Convert(ToInt64() / right.ToInt64()).Resize(size); }