blob: 38a33db6429dd7f3503d7b07fb65ba614bbdc48c [file] [log] [blame]
// Inferno utils/5c/5.out.h
// http://code.google.com/p/inferno-os/source/browse/utils/5c/5.out.h
//
// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
// Portions Copyright © 1997-1999 Vita Nuova Limited
// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
// Portions Copyright © 2004,2006 Bruce Ellis
// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
// Portions Copyright © 2009 The Go Authors. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
enum
{
NSNAME = 8,
NSYM = 50,
NREG = 16,
};
#include "../ld/textflag.h"
/* -1 disables use of REGARG */
#define REGARG -1
/*c2go enum { REGARG = -1 }; */
enum
{
REGRET = 0,
/* compiler allocates R1 up as temps */
/* compiler allocates register variables R3 up */
/* compiler allocates external registers R10 down */
REGEXT = 10,
/* these two registers are declared in runtime.h */
REGG = REGEXT-0,
REGM = REGEXT-1,
REGTMP = 11,
REGSP = 13,
REGLINK = 14,
REGPC = 15,
NFREG = 16,
FREGRET = 0,
FREGEXT = 7,
FREGTMP = 15,
};
/* compiler allocates register variables F0 up */
/* compiler allocates external registers F7 down */
enum
{
C_NONE,
C_REG,
C_REGREG,
C_REGREG2,
C_SHIFT,
C_FREG,
C_PSR,
C_FCR,
C_RCON, /* 0xff rotated */
C_NCON, /* ~RCON */
C_SCON, /* 0xffff */
C_LCON,
C_LCONADDR,
C_ZFCON,
C_SFCON,
C_LFCON,
C_RACON,
C_LACON,
C_SBRA,
C_LBRA,
C_HAUTO, /* halfword insn offset (-0xff to 0xff) */
C_FAUTO, /* float insn offset (0 to 0x3fc, word aligned) */
C_HFAUTO, /* both H and F */
C_SAUTO, /* -0xfff to 0xfff */
C_LAUTO,
C_HOREG,
C_FOREG,
C_HFOREG,
C_SOREG,
C_ROREG,
C_SROREG, /* both nil and R */
C_LOREG,
C_PC,
C_SP,
C_HREG,
C_ADDR, /* reference to relocatable address */
C_GOK,
C_NCLASS, /* must be the last */
};
enum
{
AXXX,
AAND,
AEOR,
ASUB,
ARSB,
AADD,
AADC,
ASBC,
ARSC,
ATST,
ATEQ,
ACMP,
ACMN,
AORR,
ABIC,
AMVN,
AB,
ABL,
/*
* Do not reorder or fragment the conditional branch
* opcodes, or the predication code will break
*/
ABEQ,
ABNE,
ABCS,
ABHS,
ABCC,
ABLO,
ABMI,
ABPL,
ABVS,
ABVC,
ABHI,
ABLS,
ABGE,
ABLT,
ABGT,
ABLE,
AMOVWD,
AMOVWF,
AMOVDW,
AMOVFW,
AMOVFD,
AMOVDF,
AMOVF,
AMOVD,
ACMPF,
ACMPD,
AADDF,
AADDD,
ASUBF,
ASUBD,
AMULF,
AMULD,
ADIVF,
ADIVD,
ASQRTF,
ASQRTD,
AABSF,
AABSD,
ASRL,
ASRA,
ASLL,
AMULU,
ADIVU,
AMUL,
ADIV,
AMOD,
AMODU,
AMOVB,
AMOVBS,
AMOVBU,
AMOVH,
AMOVHS,
AMOVHU,
AMOVW,
AMOVM,
ASWPBU,
ASWPW,
ANOP,
ARFE,
ASWI,
AMULA,
ADATA,
AGLOBL,
AGOK,
AHISTORY,
ANAME,
ARET,
ATEXT,
AWORD,
ADYNT_,
AINIT_,
ABCASE,
ACASE,
AEND,
AMULL,
AMULAL,
AMULLU,
AMULALU,
ABX,
ABXRET,
ADWORD,
ASIGNAME,
ALDREX,
ASTREX,
ALDREXD,
ASTREXD,
APLD,
AUNDEF,
ACLZ,
AMULWT,
AMULWB,
AMULAWT,
AMULAWB,
AUSEFIELD,
ATYPE,
AFUNCDATA,
APCDATA,
ACHECKNIL,
AVARDEF,
AVARKILL,
ADUFFCOPY,
ADUFFZERO,
ADATABUNDLE,
ADATABUNDLEEND,
AMRC, // MRC/MCR
ALAST,
};
/* scond byte */
enum
{
C_SCOND = (1<<4)-1,
C_SBIT = 1<<4,
C_PBIT = 1<<5,
C_WBIT = 1<<6,
C_FBIT = 1<<7, /* psr flags-only */
C_UBIT = 1<<7, /* up bit, unsigned bit */
C_SCOND_EQ = 0,
C_SCOND_NE = 1,
C_SCOND_HS = 2,
C_SCOND_LO = 3,
C_SCOND_MI = 4,
C_SCOND_PL = 5,
C_SCOND_VS = 6,
C_SCOND_VC = 7,
C_SCOND_HI = 8,
C_SCOND_LS = 9,
C_SCOND_GE = 10,
C_SCOND_LT = 11,
C_SCOND_GT = 12,
C_SCOND_LE = 13,
C_SCOND_NONE = 14,
C_SCOND_NV = 15,
/* D_SHIFT type */
SHIFT_LL = 0<<5,
SHIFT_LR = 1<<5,
SHIFT_AR = 2<<5,
SHIFT_RR = 3<<5,
};
enum
{
/* type/name */
D_GOK = 0,
D_NONE = 1,
/* type */
D_BRANCH = (D_NONE+1),
D_OREG = (D_NONE+2),
D_CONST = (D_NONE+7),
D_FCONST = (D_NONE+8),
D_SCONST = (D_NONE+9),
D_PSR = (D_NONE+10),
D_REG = (D_NONE+12),
D_FREG = (D_NONE+13),
D_FILE = (D_NONE+16),
D_OCONST = (D_NONE+17),
D_FILE1 = (D_NONE+18),
D_SHIFT = (D_NONE+19),
D_FPCR = (D_NONE+20),
D_REGREG = (D_NONE+21), // (reg, reg)
D_ADDR = (D_NONE+22),
D_SBIG = (D_NONE+23),
D_CONST2 = (D_NONE+24),
D_REGREG2 = (D_NONE+25), // reg, reg
/* name */
D_EXTERN = (D_NONE+3),
D_STATIC = (D_NONE+4),
D_AUTO = (D_NONE+5),
D_PARAM = (D_NONE+6),
D_LAST = (D_NONE+26),
};
/*
* this is the ranlib header
*/
#define SYMDEF "__.GOSYMDEF"
/*c2go extern char SYMDEF[]; */