/// <summary cref="IValueVisitor.Visit(ViewCast)"/> public void Visit(ViewCast value) { var target = AllocateView(value); var source = LoadView(value.Value); // Declare view Declare(target); using (var statement = BeginStatement(target, target.PointerFieldIndex)) { statement.AppendPointerCast(TypeGenerator[target.ElementType]); statement.Append(source); statement.AppendField(source.PointerFieldIndex); } var sourceElementSize = ABI.GetSizeOf(value.SourceElementType); var targetElementSize = ABI.GetSizeOf(value.TargetElementType); // var newLength = length * sourceElementSize / targetElementSize; using (var statement = BeginStatement(target, target.LengthFieldIndex)) { statement.OpenParen(); statement.Append(source); statement.AppendField(source.LengthFieldIndex); statement.AppendOperation( CLInstructions.GetArithmeticOperation( BinaryArithmeticKind.Mul, false, out bool _)); statement.AppendConstant(sourceElementSize); statement.CloseParen(); statement.AppendOperation( CLInstructions.GetArithmeticOperation( BinaryArithmeticKind.Div, false, out bool _)); statement.AppendConstant(targetElementSize); } }
/// <summary cref="IValueVisitor.Visit(ViewCast)"/> public void Visit(ViewCast value) { var source = LoadAs <ViewVariable>(value.Value); var pointer = source.Pointer; var length = source.Length; var sourceElementSize = ABI.GetSizeOf(value.SourceElementType); var targetElementSize = ABI.GetSizeOf(value.TargetElementType); // var newLength = length * sourceElementSize / targetElementSize; var newLength = AllocateType(BasicValueType.Int32) as PrimitiveVariable; using (var statement = BeginStatement(newLength)) { statement.OpenParen(); statement.Append(length); statement.AppendOperation( CLInstructions.GetArithmeticOperation( BinaryArithmeticKind.Mul, false, out bool _)); statement.AppendConstant(sourceElementSize); statement.CloseParen(); statement.AppendOperation( CLInstructions.GetArithmeticOperation( BinaryArithmeticKind.Div, false, out bool _)); statement.AppendConstant(targetElementSize); } var newView = new ViewVariable( value.Type as ViewType, pointer, newLength); Bind(value, newView); }
/// <summary cref="IIntrinsicSpecializerConfiguration.TryGetSizeOf(TypeNode, out int)"/> public bool TryGetSizeOf(TypeNode type, out int size) { size = ABI.GetSizeOf(type); return(true); }