func arrayElementSize(t types.T) int32 { ret := t.Size() if t.RegSizeAlign() { return types.RegSizeAlignUp(ret) } return ret }
func buildCast(b *builder, from *ref, t types.T) *ref { srcType := from.Type() ret := b.newTemp(t) if types.IsNil(srcType) { size := t.Size() if size == arch8.RegSize { return newRef(t, ir.Num(0)) } if _, ok := t.(*types.Slice); !ok { panic("bug") } ret := b.newTemp(t) b.b.Zero(ret.IR()) return ret } if c, ok := srcType.(*types.Const); ok { if v, ok := types.NumConst(srcType); ok && types.IsInteger(t) { return newRef(t, constNumIr(v, t)) } // TODO: we do not support typed const right? // so why need this line? srcType = c.Type // using the underlying type } if types.IsInteger(t) && types.IsInteger(srcType) { b.b.Arith(ret.IR(), nil, "cast", from.IR()) return ret } if regSizeCastable(t, srcType) { b.b.Arith(ret.IR(), nil, "", from.IR()) return ret } panic("bug") }
func (b *builder) newGlobalVar(t types.T, name string) ir.Ref { name = b.anonyName(name) return b.p.NewGlobalVar(t.Size(), name, types.IsByte(t), t.RegSizeAlign()) }
func (b *builder) newLocal(t types.T, name string) ir.Ref { return b.f.NewLocal(t.Size(), name, types.IsByte(t), t.RegSizeAlign(), ) }
func (b *builder) newTempIR(t types.T) ir.Ref { return b.f.NewTemp(t.Size(), types.IsByte(t), t.RegSizeAlign()) }