feature. See also
. The project being documented here (as the example) is the Zig library itself.
Translator.transConvertvectorExpr
fn transConvertvectorExpr(
t: *Translator,
scope: *Scope,
convertvector: Node.Convertvector,
) TransError!ZigNode
File
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();
}