Function isZeroInit [src]

Prototype

pub fn isZeroInit(self: Constant, builder: *const Builder) bool

Parameters

self: Constantbuilder: *const Builder

Source

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, } }