github.com/4ad/go@v0.0.0-20161219182952-69a12818b605/src/cmd/compile/internal/sparc64/peep.go (about)

     1  // Derived from Inferno utils/6c/peep.c
     2  // http://code.google.com/p/inferno-os/source/browse/utils/6c/peep.c
     3  //
     4  //	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
     5  //	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
     6  //	Portions Copyright © 1997-1999 Vita Nuova Limited
     7  //	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
     8  //	Portions Copyright © 2004,2006 Bruce Ellis
     9  //	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
    10  //	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
    11  //	Portions Copyright © 2009 The Go Authors.  All rights reserved.
    12  //
    13  // Permission is hereby granted, free of charge, to any person obtaining a copy
    14  // of this software and associated documentation files (the "Software"), to deal
    15  // in the Software without restriction, including without limitation the rights
    16  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    17  // copies of the Software, and to permit persons to whom the Software is
    18  // furnished to do so, subject to the following conditions:
    19  //
    20  // The above copyright notice and this permission notice shall be included in
    21  // all copies or substantial portions of the Software.
    22  //
    23  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    24  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    25  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    26  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    27  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    28  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    29  // THE SOFTWARE.
    30  
    31  package sparc64
    32  
    33  import (
    34  	"cmd/compile/internal/gc"
    35  	"cmd/internal/obj"
    36  	"cmd/internal/obj/sparc64"
    37  	"fmt"
    38  )
    39  
    40  var gactive uint32
    41  
    42  func peep(firstp *obj.Prog) {
    43  	// TODO(aram):
    44  }
    45  
    46  func excise(r *gc.Flow) {
    47  	p := r.Prog
    48  	if gc.Debug['P'] != 0 && gc.Debug['v'] != 0 {
    49  		fmt.Printf("%v ===delete===\n", p)
    50  	}
    51  	obj.Nopout(p)
    52  	gc.Ostats.Ndelmov++
    53  }
    54  
    55  func regtyp(a *obj.Addr) bool {
    56  	// TODO(rsc): Floating point register exclusions?
    57  	return a.Type == obj.TYPE_REG && sparc64.REG_G0 <= a.Reg && a.Reg <= sparc64.REG_Y15 && a.Reg != sparc64.REG_ZR
    58  }
    59  
    60  func sameaddr(a *obj.Addr, v *obj.Addr) bool {
    61  	if a.Type != v.Type {
    62  		return false
    63  	}
    64  	if regtyp(v) && a.Reg == v.Reg {
    65  		return true
    66  	}
    67  	if v.Type == obj.NAME_AUTO || v.Type == obj.NAME_PARAM {
    68  		if v.Offset == a.Offset {
    69  			return true
    70  		}
    71  	}
    72  	return false
    73  }
    74  
    75  func smallindir(a *obj.Addr, reg *obj.Addr) bool {
    76  	return reg.Type == obj.TYPE_REG && a.Type == obj.TYPE_MEM && a.Reg == reg.Reg && 0 <= a.Offset && a.Offset < 4096
    77  }
    78  
    79  func stackaddr(a *obj.Addr) bool {
    80  	return a.Type == obj.TYPE_REG && a.Reg == sparc64.REG_RSP
    81  }