/// <summary cref="IValueVisitor.Visit(NewView)"/> public void Visit(NewView value) { var pointer = LoadAs <PointerVariable>(value.Pointer); var length = LoadAs <PrimitiveVariable>(value.Length); var viewValue = new ViewVariable( value.Type as ViewType, pointer, length); Bind(value, viewValue); }
/// <summary cref="IValueVisitor.Visit(AddressSpaceCast)"/> public void Visit(AddressSpaceCast value) { var targetType = value.TargetType as AddressSpaceType; var target = AllocatePointerType(targetType.ElementType, value.TargetAddressSpace); PointerVariable address; if (value.IsPointerCast) { address = LoadAs <PointerVariable>(value.Value); Bind(value, target); } else { var viewSource = LoadAs <ViewVariable>(value.Value); address = viewSource.Pointer; var viewTarget = new ViewVariable( value.Type as ViewType, target, viewSource.Length); Bind(value, viewTarget); } if (CLInstructions.TryGetAddressSpaceCast( value.TargetAddressSpace, out string operation)) { // There is a specific cast operation using (var statement = BeginStatement(target)) { statement.AppendCommand(operation); statement.BeginArguments(); statement.AppendArgument(address); statement.EndArguments(); } } else { // Use an unspecific generic pointer cast using (var statement = BeginStatement(target)) { statement.AppendCast( TypeGenerator[targetType.ElementType] + CLInstructions.DereferenceOperation); statement.Append(address); } } }
/// <summary cref="IValueVisitor.Visit(SubViewValue)"/> public void Visit(SubViewValue value) { var viewType = value.Type as ViewType; var source = LoadAs <ViewVariable>(value.Source); var offset = LoadAs <PrimitiveVariable>(value.Offset); var length = LoadAs <PrimitiveVariable>(value.Length); var target = AllocatePointerType(viewType.ElementType, viewType.AddressSpace); MakeLoadElementAddress( offset, target, source.Pointer); var newSubView = new ViewVariable( viewType, target, length); Bind(value, newSubView); }
/// <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); }