Home | History | Annotate | Download | only in amd64
      1 // Derived from Inferno utils/6c/reg.c
      2 // http://code.google.com/p/inferno-os/source/browse/utils/6c/reg.c
      3 //
      4 //	Copyright  1994-1999 Lucent Technologies Inc.  All rights reserved.
      5 //	Portions Copyright  1995-1997 C H Forsyth (forsyth (a] 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 (a] 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 amd64
     32 
     33 import (
     34 	"cmd/compile/internal/gc"
     35 	"cmd/internal/obj"
     36 	"cmd/internal/obj/x86"
     37 )
     38 
     39 const (
     40 	NREGVAR = 32
     41 )
     42 
     43 var regname = []string{
     44 	".AX",
     45 	".CX",
     46 	".DX",
     47 	".BX",
     48 	".SP",
     49 	".BP",
     50 	".SI",
     51 	".DI",
     52 	".R8",
     53 	".R9",
     54 	".R10",
     55 	".R11",
     56 	".R12",
     57 	".R13",
     58 	".R14",
     59 	".R15",
     60 	".X0",
     61 	".X1",
     62 	".X2",
     63 	".X3",
     64 	".X4",
     65 	".X5",
     66 	".X6",
     67 	".X7",
     68 	".X8",
     69 	".X9",
     70 	".X10",
     71 	".X11",
     72 	".X12",
     73 	".X13",
     74 	".X14",
     75 	".X15",
     76 }
     77 
     78 func regnames(n *int) []string {
     79 	*n = NREGVAR
     80 	return regname
     81 }
     82 
     83 func excludedregs() uint64 {
     84 	return RtoB(x86.REG_SP)
     85 }
     86 
     87 func doregbits(r int) uint64 {
     88 	b := uint64(0)
     89 	if r >= x86.REG_AX && r <= x86.REG_R15 {
     90 		b |= RtoB(r)
     91 	} else if r >= x86.REG_AL && r <= x86.REG_R15B {
     92 		b |= RtoB(r - x86.REG_AL + x86.REG_AX)
     93 	} else if r >= x86.REG_AH && r <= x86.REG_BH {
     94 		b |= RtoB(r - x86.REG_AH + x86.REG_AX)
     95 	} else if r >= x86.REG_X0 && r <= x86.REG_X0+15 {
     96 		b |= FtoB(r)
     97 	}
     98 	return b
     99 }
    100 
    101 // For ProgInfo.
    102 const (
    103 	AX  = 1 << (x86.REG_AX - x86.REG_AX)
    104 	BX  = 1 << (x86.REG_BX - x86.REG_AX)
    105 	CX  = 1 << (x86.REG_CX - x86.REG_AX)
    106 	DX  = 1 << (x86.REG_DX - x86.REG_AX)
    107 	DI  = 1 << (x86.REG_DI - x86.REG_AX)
    108 	SI  = 1 << (x86.REG_SI - x86.REG_AX)
    109 	R15 = 1 << (x86.REG_R15 - x86.REG_AX)
    110 )
    111 
    112 func RtoB(r int) uint64 {
    113 	if r < x86.REG_AX || r > x86.REG_R15 {
    114 		return 0
    115 	}
    116 	return 1 << uint(r-x86.REG_AX)
    117 }
    118 
    119 func BtoR(b uint64) int {
    120 	b &= 0xffff
    121 	if gc.Nacl {
    122 		b &^= (1<<(x86.REG_BP-x86.REG_AX) | 1<<(x86.REG_R15-x86.REG_AX))
    123 	} else if obj.Framepointer_enabled != 0 {
    124 		// BP is part of the calling convention if framepointer_enabled.
    125 		b &^= (1 << (x86.REG_BP - x86.REG_AX))
    126 	}
    127 	if b == 0 {
    128 		return 0
    129 	}
    130 	return gc.Bitno(b) + x86.REG_AX
    131 }
    132 
    133 /*
    134  *	bit	reg
    135  *	16	X0
    136  *	...
    137  *	31	X15
    138  */
    139 func FtoB(f int) uint64 {
    140 	if f < x86.REG_X0 || f > x86.REG_X15 {
    141 		return 0
    142 	}
    143 	return 1 << uint(f-x86.REG_X0+16)
    144 }
    145 
    146 func BtoF(b uint64) int {
    147 	b &= 0xFFFF0000
    148 	if b == 0 {
    149 		return 0
    150 	}
    151 	return gc.Bitno(b) - 16 + x86.REG_X0
    152 }
    153