Zig 0.17.0-dev (Split by item)

This is an example of documentation generated by ZigDoc, an alternative to Zig's built-in Auto Doc feature. See also examples in other modes/formats. The project being documented here (as the example) is the Zig library itself.

transConvertvectorExpr

Translator.transConvertvectorExpr
fn transConvertvectorExpr(
    t: *Translator,
    scope: *Scope,
    convertvector: Node.Convertvector,
) TransError!ZigNode

File

lib/compiler/translate-c/Translator.zig:3968

Code

fn transConvertvectorExpr(
    t: *Translator,
    scope: *Scope,
    convertvector: Node.Convertvector,
) TransError!ZigNode {
    var block_scope = try Scope.Block.init(t, scope, true);
    defer block_scope.deinit();

    const src_expr_node = try t.transExpr(&block_scope.base, convertvector.operand, .used);
    const tmp = try block_scope.reserveMangledName("tmp");
    const tmp_decl = try ZigTag.var_simple.create(t.arena, .{ .name = tmp, .init = src_expr_node });
    try block_scope.statements.append(t.gpa, tmp_decl);
    const tmp_ident = try ZigTag.identifier.create(t.arena, tmp);

    const dest_type_node = try t.transType(&block_scope.base, convertvector.dest_qt, convertvector.builtin_tok);
    const dest_vec_ty = convertvector.dest_qt.get(t.comp, .vector).?;
    const src_vec_ty = convertvector.operand.qt(t.tree).get(t.comp, .vector).?;

    const src_elem_sk = src_vec_ty.elem.scalarKind(t.comp);
    const dest_elem_sk = convertvector.dest_qt.childType(t.comp).scalarKind(t.comp);

    const items = try t.arena.alloc(ZigNode, dest_vec_ty.len);
    for (items, 0..dest_vec_ty.len) |*item, i| {
        const value = try ZigTag.array_access.create(t.arena, .{
            .lhs = tmp_ident,
            .rhs = try t.createNumberNode(i),
        });

        if (src_elem_sk == .float and dest_elem_sk == .float) {
            item.* = try ZigTag.float_cast.create(t.arena, value);
        } else if (src_elem_sk == .float) {
            item.* = try ZigTag.int_from_float.create(t.arena, value);
        } else if (dest_elem_sk == .float) {
            item.* = try ZigTag.float_from_int.create(t.arena, value);
        } else {
            item.* = try t.transIntCast(value, src_vec_ty.elem, dest_vec_ty.elem);
        }
    }

    const vec_init = try ZigTag.array_init.create(t.arena, .{
        .cond = dest_type_node,
        .cases = items,
    });
    const break_node = try ZigTag.break_val.create(t.arena, .{
        .label = block_scope.label,
        .val = vec_init,
    });
    try block_scope.statements.append(t.gpa, break_node);

    return block_scope.complete();
}