DoxigAlpha

isZeroInit

Function parameters

Parameters

#
builder:*const Builder

Type definitions in this namespace

Types

#

Functions in this namespace

Functions

#

= 16

Values

#

Source

Implementation

#
pub fn isZeroInit(self: Constant, builder: *const Builder) bool {
    switch (self.unwrap()) {
        .constant => |constant| {
            const item = builder.constant_items.get(constant);
            return switch (item.tag) {
                .positive_integer => {
                    const extra: *align(@alignOf(std.math.big.Limb)) Integer =
                        @ptrCast(builder.constant_limbs.items[item.data..][0..Integer.limbs]);
                    const limbs = builder.constant_limbs
                        .items[item.data + Integer.limbs ..][0..extra.limbs_len];
                    return std.mem.eql(std.math.big.Limb, limbs, &.{0});
                },
                .half, .bfloat, .float => item.data == 0,
                .double => {
                    const extra = builder.constantExtraData(Constant.Double, item.data);
                    return extra.lo == 0 and extra.hi == 0;
                },
                .fp128, .ppc_fp128 => {
                    const extra = builder.constantExtraData(Constant.Fp128, item.data);
                    return extra.lo_lo == 0 and extra.lo_hi == 0 and
                        extra.hi_lo == 0 and extra.hi_hi == 0;
                },
                .x86_fp80 => {
                    const extra = builder.constantExtraData(Constant.Fp80, item.data);
                    return extra.lo_lo == 0 and extra.lo_hi == 0 and extra.hi == 0;
                },
                .vector => {
                    var extra = builder.constantExtraDataTrail(Aggregate, item.data);
                    const len: u32 = @intCast(extra.data.type.aggregateLen(builder));
                    const vals = extra.trail.next(len, Constant, builder);
                    for (vals) |val| if (!val.isZeroInit(builder)) return false;
                    return true;
                },
                .null, .zeroinitializer => true,
                else => false,
            };
        },
        .global => return false,
    }
}