/// <summary> /// Lowers set field operations into separate SSA values. /// </summary> private static void Lower( RewriterContext context, TypeLowering <ViewType> typeLowering, ViewCast value) { var builder = context.Builder; var location = value.Location; var pointer = builder.CreateGetField( location, value.Value, new FieldSpan(0)); var length = builder.CreateGetField( location, value.Value, new FieldSpan(1)); // New pointer var newPointer = builder.CreatePointerCast( location, pointer, value.TargetElementType); // Compute new length: // newLength = length * sourceElementSize / targetElementSize; var sourceElementType = (typeLowering[value] as ViewType).ElementType; var sourceElementSize = builder.CreateLongSizeOf( location, sourceElementType); var targetElementSize = builder.CreateLongSizeOf( location, value.TargetElementType); var newLength = builder.CreateArithmetic( location, builder.CreateArithmetic( location, length, sourceElementSize, BinaryArithmeticKind.Mul), targetElementSize, BinaryArithmeticKind.Div); var newInstance = builder.CreateDynamicStructure( location, newPointer, newLength); context.ReplaceAndRemove(value, newInstance); }
/// <summary cref="IValueVisitor.Visit(ViewCast)"/> public void Visit(ViewCast value) { var source = LoadAs <ViewImplementationRegister>(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 lengthTimesSourceElementSize = AllocateRegister(length.Description); var newLength = AllocateRegister(length.Description); using (var command = BeginCommand( PTXInstructions.GetArithmeticOperation( BinaryArithmeticKind.Mul, ArithmeticBasicValueType.Int32, FastMath))) { command.AppendArgument(lengthTimesSourceElementSize); command.AppendArgument(length); command.AppendConstant(sourceElementSize); } using (var command = BeginCommand( PTXInstructions.GetArithmeticOperation( BinaryArithmeticKind.Div, ArithmeticBasicValueType.Int32, FastMath))) { command.AppendArgument(newLength); command.AppendArgument(lengthTimesSourceElementSize); command.AppendConstant(targetElementSize); } var newView = new ViewImplementationRegister( value.Type as ViewType, pointer, newLength); Bind(value, newView); FreeRegister(lengthTimesSourceElementSize); }
/// <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); }
public void Visit(ViewCast value) { }
/// <summary cref="IValueVisitor.Visit(ViewCast)"/> public void Visit(ViewCast value) => throw new InvalidCodeGenerationException();