Example #1
0
        /// <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);
        }
Example #2
0
        /// <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);
                }
            }
        }
Example #3
0
        /// <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);
        }
Example #4
0
        /// <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);
        }