text: // Copyright 2019 The Go Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  // +build !gccgo,!purego
  
  package poly1305
  
  //go:noescape
  func update(state *macState, msg []byte)
  
  // mac is a wrapper for macGeneric that redirects calls that would have gone to
  // updateGeneric to update.
  //
  // Its Write and Sum methods are otherwise identical to the macGeneric ones, but
  // using function pointers would carry a major performance cost.
  type mac struct{ macGeneric }
  
  func (h *mac) Write(p []byte) (int, error) {
  	nn := len(p)
  	if h.offset > 0 {
  		n := copy(h.buffer[h.offset:], p)
  		if h.offset+n < TagSize {
  			h.offset += n
  			return nn, nil
  		}
  		p = p[n:]
  		h.offset = 0
  		update(&h.macState, h.buffer[:])
  	}
  	if n := len(p) - (len(p) % TagSize); n > 0 {
  		update(&h.macState, p[:n])
  		p = p[n:]
  	}
  	if len(p) > 0 {
  		h.offset += copy(h.buffer[h.offset:], p)
  	}
  	return nn, nil
  }
  
  func (h *mac) Sum(out *[16]byte) {
  	state := h.macState
  	if h.offset > 0 {
  		update(&state, h.buffer[:h.offset])
  	}
  	finalize(out, &state.h, &state.s)
  }
  