/*
* arm64
*/

#define NSNAME          8
#define NSYM            50
#define NREG            32

#define NOPROF          (1<<0)
#define DUPOK           (1<<1)

#define REGRET          0
#define REGARG          0
/* R1 to R7 are potential parameter/return registers */
#define REGIRL          8       /* indirect result location (TO DO) */
/* compiler allocates R9 up as temps */
/* compiler allocates register variables R10 up */
#define REGMIN          9
#define REGMAX          15
#define REGIP0          16
#define REGIP1          17
#define REGTMP          REGIP1
/* compiler allocates external registers R27 down */
#define REGEXT          27
#define REGSB           28
#define REGFP           29
#define REGLINK         30
#define REGSP           31
#define REGZERO         31

#define NFREG           32
#define FREGRET         0
#define FREGMIN         7
#define FREGEXT         15

/* compiler allocates register variables F0 up */
/* compiler allocates external registers F15 down */

enum    as
{
       AXXX,

       AADC,
       AADCS,
       AADCSW,
       AADCW,
       AADD,
       AADDS,
       AADDSW,
       AADDW,
       AADR,
       AADRP,
       AAND,
       AANDS,
       AANDSW,
       AANDW,
       AASR,
       AASRW,
       AAT,
       AB,
       ABFI,
       ABFIW,
       ABFM,
       ABFMW,
       ABFXIL,
       ABFXILW,
       ABIC,
       ABICS,
       ABICSW,
       ABICW,
       ABL,
       ABRK,
       ACBNZ,
       ACBNZW,
       ACBZ,
       ACBZW,
       ACCMN,
       ACCMNW,
       ACCMP,
       ACCMPW,
       ACINC,
       ACINCW,
       ACINV,
       ACINVW,
       ACLREX,
       ACLS,
       ACLSW,
       ACLZ,
       ACLZW,
       ACMN,
       ACMNW,
       ACMP,
       ACMPW,
       ACNEG,
       ACNEGW,
       ACRC32B,
       ACRC32CB,
       ACRC32CH,
       ACRC32CW,
       ACRC32CX,
       ACRC32H,
       ACRC32W,
       ACRC32X,
       ACSEL,
       ACSELW,
       ACSET,
       ACSETM,
       ACSETMW,
       ACSETW,
       ACSINC,
       ACSINCW,
       ACSINV,
       ACSINVW,
       ACSNEG,
       ACSNEGW,
       ADC,
       ADCPS1,
       ADCPS2,
       ADCPS3,
       ADMB,
       ADRPS,
       ADSB,
       AEON,
       AEONW,
       AEOR,
       AEORW,
       AERET,
       AEXTR,
       AEXTRW,
       AHINT,
       AHLT,
       AHVC,
       AIC,
       AISB,
       ALDAR,
       ALDARB,
       ALDARH,
       ALDARW,
       ALDAXP,
       ALDAXPW,
       ALDAXR,
       ALDAXRB,
       ALDAXRH,
       ALDAXRW,
       ALDXR,
       ALDXRB,
       ALDXRH,
       ALDXRW,
       ALDXP,
       ALDXPW,
       ALSL,
       ALSLW,
       ALSR,
       ALSRW,
       AMADD,
       AMADDW,
       AMNEG,
       AMNEGW,
       AMOVK,
       AMOVKW,
       AMOVN,
       AMOVNW,
       AMOVZ,
       AMOVZW,
       AMRS,
       AMSR,
       AMSUB,
       AMSUBW,
       AMUL,
       AMULW,
       AMVN,
       AMVNW,
       ANEG,
       ANEGS,
       ANEGSW,
       ANEGW,
       ANGC,
       ANGCS,
       ANGCSW,
       ANGCW,
       ANOP,
       AORN,
       AORNW,
       AORR,
       AORRW,
       APRFM,
       APRFUM,
       ARBIT,
       ARBITW,
       AREM,
       AREMW,
       ARET,
       AREV,
       AREV16,
       AREV16W,
       AREV32,
       AREVW,
       AROR,
       ARORW,
       ASBC,
       ASBCS,
       ASBCSW,
       ASBCW,
       ASBFIZ,
       ASBFIZW,
       ASBFM,
       ASBFMW,
       ASBFX,
       ASBFXW,
       ASDIV,
       ASDIVW,
       ASEV,
       ASEVL,
       ASMADDL,
       ASMC,
       ASMNEGL,
       ASMSUBL,
       ASMULH,
       ASMULL,
       ASTXR,
       ASTXRB,
       ASTXRH,
       ASTXP,
       ASTXPW,
       ASTXRW,
       ASTLP,
       ASTLPW,
       ASTLR,
       ASTLRB,
       ASTLRH,
       ASTLRW,
       ASTLXP,
       ASTLXPW,
       ASTLXR,
       ASTLXRB,
       ASTLXRH,
       ASTLXRW,
       ASUB,
       ASUBS,
       ASUBSW,
       ASUBW,
       ASVC,
       ASXTB,
       ASXTBW,
       ASXTH,
       ASXTHW,
       ASXTW,
       ASYS,
       ASYSL,
       ATBNZ,
       ATBZ,
       ATLBI,
       ATST,
       ATSTW,
       AUBFIZ,
       AUBFIZW,
       AUBFM,
       AUBFMW,
       AUBFX,
       AUBFXW,
       AUDIV,
       AUDIVW,
       AUMADDL,
       AUMNEGL,
       AUMSUBL,
       AUMULH,
       AUMULL,
       AUREM,
       AUREMW,
       AUXTB,
       AUXTH,
       AUXTW,
       AUXTBW,
       AUXTHW,
       AWFE,
       AWFI,
       AYIELD,

       AMOVB,
       AMOVBU,
       AMOVH,
       AMOVHU,
       AMOVW,
       AMOVWU,
       AMOV,
       AMOVNP,
       AMOVNPW,
       AMOVP,
       AMOVPD,
       AMOVPQ,
       AMOVPS,
       AMOVPSW,
       AMOVPW,

/*
* 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,

       AFABSD,
       AFABSS,
       AFADDD,
       AFADDS,
       AFCCMPD,
       AFCCMPED,
       AFCCMPS,
       AFCCMPES,
       AFCMPD,
       AFCMPED,
       AFCMPES,
       AFCMPS,
       AFCVTSD,
       AFCVTDS,
       AFCVTZSD,
       AFCVTZSDW,
       AFCVTZSS,
       AFCVTZSSW,
       AFCVTZUD,
       AFCVTZUDW,
       AFCVTZUS,
       AFCVTZUSW,
       AFDIVD,
       AFDIVS,
       AFMOVD,
       AFMOVS,
       AFMULD,
       AFMULS,
       AFNEGD,
       AFNEGS,
       AFSQRTD,
       AFSQRTS,
       AFSUBD,
       AFSUBS,
       ASCVTFD,
       ASCVTFS,
       ASCVTFWD,
       ASCVTFWS,
       AUCVTFD,
       AUCVTFS,
       AUCVTFWD,
       AUCVTFWS,

       ATEXT,
       ADATA,
       AGLOBL,
       AHISTORY,
       ANAME,
       AWORD,
       ADYNT,
       AINIT,
       ABCASE,
       ACASE,
       ADWORD,
       ASIGNAME,
       AGOK,
       ARETURN,
       AEND,

       AFCSELS,
       AFCSELD,
       AFMAXS,
       AFMINS,
       AFMAXD,
       AFMIND,
       AFMAXNMS,
       AFMAXNMD,
       AFNMULS,
       AFNMULD,
       AFRINTNS,
       AFRINTND,
       AFRINTPS,
       AFRINTPD,
       AFRINTMS,
       AFRINTMD,
       AFRINTZS,
       AFRINTZD,
       AFRINTAS,
       AFRINTAD,
       AFRINTXS,
       AFRINTXD,
       AFRINTIS,
       AFRINTID,
       AFMADDS,
       AFMADDD,
       AFMSUBS,
       AFMSUBD,
       AFNMADDS,
       AFNMADDD,
       AFNMSUBS,
       AFNMSUBD,
       AFMINNMS,
       AFMINNMD,
       AFCVTDH,
       AFCVTHS,
       AFCVTHD,
       AFCVTSH,

       AAESD,
       AAESE,
       AAESIMC,
       AAESMC,
       ASHA1C,
       ASHA1H,
       ASHA1M,
       ASHA1P,
       ASHA1SU0,
       ASHA1SU1,
       ASHA256H,
       ASHA256H2,
       ASHA256SU0,
       ASHA256SU1,

       ALAST,
};

/* form offset parameter to SYS; special register number */
#define SYSARG5(op0,op1,Cn,Cm,op2)      ((op0)<<19|(op1)<<16|(Cn)<<12|(Cm)<<8|(op2)<<5)
#define SYSARG4(op1,Cn,Cm,op2)  SYSARG5(0,op1,Cn,Cm,op2)

/* type/name */
enum
{
       D_GOK   = 0,
       D_NONE,

/* name */
       D_EXTERN,
       D_STATIC,
       D_AUTO,
       D_PARAM,

/* type */
       D_BRANCH,
       D_OREG,         /* offset(reg) */
       D_XPRE,         /* offset(reg)! - pre-indexed */
       D_XPOST,                /* (reg)offset! - post-indexed */
       D_CONST,        /* 32-bit constant */
       D_DCONST,       /* 64-bit constant */
       D_FCONST,       /* floating-point constant */
       D_SCONST,       /* short string constant */
       D_REG,          /* Rn = Wn or Xn depending on op */
       D_SP,           /* distinguish REGSP from REGZERO */
       D_FREG,         /* Fn = Sn or Dn depending on op */
       D_VREG,         /* Vn = SIMD register */
       D_SPR,          /* special processor register */
       D_FILE,
       D_OCONST,       /* absolute address constant (unused) */
       D_FILE1,

       D_SHIFT,                /* Rm{, ashift #imm} */
       D_PAIR,         /* pair of gprs */
       D_ADDR,         /* address constant (dynamic loading) */
       D_ADRP,         /* pc-relative addressing, page */
       D_ADRLO,        /* low-order 12 bits of external reference */
       D_EXTREG,       /* Rm{, ext #imm} */
       D_ROFF,         /* register offset Rn+ext(Rm)<<s */
       D_COND,         /* condition EQ, NE, etc */
       D_VLANE,                /* Vn lane */
       D_VSET,         /* set of Vn */

       /* offset iff type is D_SPR */
       D_DAIF  = SYSARG5(3,3,4,2,1),
       D_NZCV  = SYSARG5(3,3,4,2,0),
       D_FPSR  = SYSARG5(3,3,4,4,1),
       D_FPCR  = SYSARG5(3,3,4,4,0),
       D_SPSR_EL1 = SYSARG5(3,0,4,0,0),
       D_ELR_EL1 = SYSARG5(3,0,4,0,1),
       D_SPSR_EL2 = SYSARG5(3,4,4,0,0),
       D_ELR_EL2 = SYSARG5(3,4,4,0,1),
//      D_SPSR_EL3 = SYSARG5(3,x,4,x,x),
//      D_ELR_EL3 = SYSARG5(3,x,4,x,x),
//      D_LR_EL0 = SYSARG5(3,x,4,x,x),
       D_CurrentEL = SYSARG5(3,0,4,2,2),
       D_SP_EL0 = SYSARG5(3,0,4,1,0),
//      D_SP_EL1 = SYSARG5(3,x,4,x,x),
//      D_SP_EL2 = SYSARG5(3,x,4,x,x),
       D_SPSel = SYSARG5(3,0,4,2,0),
//      D_SPSR_abt  = SYSARG5(3,x,4,x,x),
//      D_SPSR_fiq = SYSARG5(3,x,4,x,x),
//      D_SPSR_ieq = SYSARG5(3,x,4,x,x),
//      D_SPSR_und = SYSARG5(3,x,4,x,x),
       D_DAIFSet = (1<<30)|0,
       D_DAIFClr = (1<<30)|1
};

/*
* this is the ranlib header
*/
#define SYMDEF  "__.SYMDEF"

/*
* this is the simulated IEEE floating point
*/
typedef struct  Ieee    Ieee;
struct  Ieee
{
       long    l;      /* contains ls-man      0xffffffff */
       long    h;      /* contains sign        0x80000000
                                   exp         0x7ff00000
                                   ms-man      0x000fffff */
};