// register = <general-register> | [ <access-mode> ] <control-register> . func (p *Parser) parseRegister() (er compiler.Node) { r := &compiler.RegisterNode{Position: p.pos} switch p.k { case '&', '|', '^': // access modes for control register. r.Kind = util.ControlRegisterKind & util.ControlModes[p.k] p.next() if err := p.lmexpect(lexer.REGISTER); err != nil { return nil } k, n, ok := util.Reginfo(p.lit) switch { case !ok: er = p.errorf("bad register: %s (%d,%d)", p.lit, k, n) return case k != util.ControlRegisterKind: er = p.errorf("register is not control: %s", p.lit) return } r.Index = n case '=': p.next() fallthrough default: if p.k != lexer.REGISTER { return nil } // TODO: get rid of repeating somehow. k, n, ok := util.Reginfo(p.lit) if !ok { er = p.errorf("bad register: %s (%d,%d)", p.lit, k, n) return } r.Kind = k r.Index = n } p.next() return r }
func registerp(s string) (ok bool) { _, _, ok = util.Reginfo(s) return }