Home | History | Annotate | Download | only in priv
      1 
      2 /*---------------------------------------------------------------*/
      3 /*--- begin                                   host_ppc_defs.h ---*/
      4 /*---------------------------------------------------------------*/
      5 
      6 /*
      7    This file is part of Valgrind, a dynamic binary instrumentation
      8    framework.
      9 
     10    Copyright (C) 2004-2012 OpenWorks LLP
     11       info (at) open-works.net
     12 
     13    This program is free software; you can redistribute it and/or
     14    modify it under the terms of the GNU General Public License as
     15    published by the Free Software Foundation; either version 2 of the
     16    License, or (at your option) any later version.
     17 
     18    This program is distributed in the hope that it will be useful, but
     19    WITHOUT ANY WARRANTY; without even the implied warranty of
     20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     21    General Public License for more details.
     22 
     23    You should have received a copy of the GNU General Public License
     24    along with this program; if not, write to the Free Software
     25    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     26    02110-1301, USA.
     27 
     28    The GNU General Public License is contained in the file COPYING.
     29 
     30    Neither the names of the U.S. Department of Energy nor the
     31    University of California nor the names of its contributors may be
     32    used to endorse or promote products derived from this software
     33    without prior written permission.
     34 */
     35 
     36 #ifndef __VEX_HOST_PPC_DEFS_H
     37 #define __VEX_HOST_PPC_DEFS_H
     38 
     39 /* Num registers used for function calls */
     40 #define PPC_N_REGPARMS 8
     41 
     42 
     43 /* --------- Registers. --------- */
     44 
     45 /* The usual HReg abstraction.  There are 32 real int regs,
     46    32 real float regs, and 32 real vector regs.
     47 */
     48 
     49 extern void ppHRegPPC ( HReg );
     50 
     51 extern HReg hregPPC_GPR0  ( Bool mode64 ); // scratch reg / zero reg
     52 extern HReg hregPPC_GPR1  ( Bool mode64 ); // Stack Frame Pointer
     53 extern HReg hregPPC_GPR2  ( Bool mode64 ); // not used: TOC pointer
     54 extern HReg hregPPC_GPR3  ( Bool mode64 );
     55 extern HReg hregPPC_GPR4  ( Bool mode64 );
     56 extern HReg hregPPC_GPR5  ( Bool mode64 );
     57 extern HReg hregPPC_GPR6  ( Bool mode64 );
     58 extern HReg hregPPC_GPR7  ( Bool mode64 );
     59 extern HReg hregPPC_GPR8  ( Bool mode64 );
     60 extern HReg hregPPC_GPR9  ( Bool mode64 );
     61 extern HReg hregPPC_GPR10 ( Bool mode64 );
     62 extern HReg hregPPC_GPR11 ( Bool mode64 );
     63 extern HReg hregPPC_GPR12 ( Bool mode64 );
     64 extern HReg hregPPC_GPR13 ( Bool mode64 );
     65 extern HReg hregPPC_GPR14 ( Bool mode64 );
     66 extern HReg hregPPC_GPR15 ( Bool mode64 );
     67 extern HReg hregPPC_GPR16 ( Bool mode64 );
     68 extern HReg hregPPC_GPR17 ( Bool mode64 );
     69 extern HReg hregPPC_GPR18 ( Bool mode64 );
     70 extern HReg hregPPC_GPR19 ( Bool mode64 );
     71 extern HReg hregPPC_GPR20 ( Bool mode64 );
     72 extern HReg hregPPC_GPR21 ( Bool mode64 );
     73 extern HReg hregPPC_GPR22 ( Bool mode64 );
     74 extern HReg hregPPC_GPR23 ( Bool mode64 );
     75 extern HReg hregPPC_GPR24 ( Bool mode64 );
     76 extern HReg hregPPC_GPR25 ( Bool mode64 );
     77 extern HReg hregPPC_GPR26 ( Bool mode64 );
     78 extern HReg hregPPC_GPR27 ( Bool mode64 );
     79 extern HReg hregPPC_GPR28 ( Bool mode64 );
     80 extern HReg hregPPC_GPR29 ( Bool mode64 ); // reserved for dispatcher
     81 extern HReg hregPPC_GPR30 ( Bool mode64 ); // used as VMX spill temp
     82 extern HReg hregPPC_GPR31 ( Bool mode64 ); // GuestStatePtr (callee-saved)
     83 
     84 extern HReg hregPPC_FPR0  ( void );
     85 extern HReg hregPPC_FPR1  ( void );
     86 extern HReg hregPPC_FPR2  ( void );
     87 extern HReg hregPPC_FPR3  ( void );
     88 extern HReg hregPPC_FPR4  ( void );
     89 extern HReg hregPPC_FPR5  ( void );
     90 extern HReg hregPPC_FPR6  ( void );
     91 extern HReg hregPPC_FPR7  ( void );
     92 extern HReg hregPPC_FPR8  ( void );
     93 extern HReg hregPPC_FPR9  ( void );
     94 extern HReg hregPPC_FPR10 ( void );
     95 extern HReg hregPPC_FPR11 ( void );
     96 extern HReg hregPPC_FPR12 ( void );
     97 extern HReg hregPPC_FPR13 ( void );
     98 extern HReg hregPPC_FPR14 ( void );
     99 extern HReg hregPPC_FPR15 ( void );
    100 extern HReg hregPPC_FPR16 ( void );
    101 extern HReg hregPPC_FPR17 ( void );
    102 extern HReg hregPPC_FPR18 ( void );
    103 extern HReg hregPPC_FPR19 ( void );
    104 extern HReg hregPPC_FPR20 ( void );
    105 extern HReg hregPPC_FPR21 ( void );
    106 extern HReg hregPPC_FPR22 ( void );
    107 extern HReg hregPPC_FPR23 ( void );
    108 extern HReg hregPPC_FPR24 ( void );
    109 extern HReg hregPPC_FPR25 ( void );
    110 extern HReg hregPPC_FPR26 ( void );
    111 extern HReg hregPPC_FPR27 ( void );
    112 extern HReg hregPPC_FPR28 ( void );
    113 extern HReg hregPPC_FPR29 ( void );
    114 extern HReg hregPPC_FPR30 ( void );
    115 extern HReg hregPPC_FPR31 ( void );
    116 
    117 extern HReg hregPPC_VR0  ( void );
    118 extern HReg hregPPC_VR1  ( void );
    119 extern HReg hregPPC_VR2  ( void );
    120 extern HReg hregPPC_VR3  ( void );
    121 extern HReg hregPPC_VR4  ( void );
    122 extern HReg hregPPC_VR5  ( void );
    123 extern HReg hregPPC_VR6  ( void );
    124 extern HReg hregPPC_VR7  ( void );
    125 extern HReg hregPPC_VR8  ( void );
    126 extern HReg hregPPC_VR9  ( void );
    127 extern HReg hregPPC_VR10 ( void );
    128 extern HReg hregPPC_VR11 ( void );
    129 extern HReg hregPPC_VR12 ( void );
    130 extern HReg hregPPC_VR13 ( void );
    131 extern HReg hregPPC_VR14 ( void );
    132 extern HReg hregPPC_VR15 ( void );
    133 extern HReg hregPPC_VR16 ( void );
    134 extern HReg hregPPC_VR17 ( void );
    135 extern HReg hregPPC_VR18 ( void );
    136 extern HReg hregPPC_VR19 ( void );
    137 extern HReg hregPPC_VR20 ( void );
    138 extern HReg hregPPC_VR21 ( void );
    139 extern HReg hregPPC_VR22 ( void );
    140 extern HReg hregPPC_VR23 ( void );
    141 extern HReg hregPPC_VR24 ( void );
    142 extern HReg hregPPC_VR25 ( void );
    143 extern HReg hregPPC_VR26 ( void );
    144 extern HReg hregPPC_VR27 ( void );
    145 extern HReg hregPPC_VR28 ( void );
    146 extern HReg hregPPC_VR29 ( void );
    147 extern HReg hregPPC_VR30 ( void );
    148 extern HReg hregPPC_VR31 ( void );
    149 
    150 #define StackFramePtr(_mode64) hregPPC_GPR1(_mode64)
    151 #define GuestStatePtr(_mode64) hregPPC_GPR31(_mode64)
    152 
    153 
    154 
    155 /* --------- Condition codes --------- */
    156 
    157 /* This gives names from bitfields in CR; hence it names BI numbers */
    158 /* Using IBM/hardware indexing convention */
    159 typedef
    160    enum {
    161       // CR7, which we use for integer compares
    162       Pcf_7LT  = 28,  /* neg  | lt          */
    163       Pcf_7GT  = 29,  /* pos  | gt          */
    164       Pcf_7EQ  = 30,  /* zero | equal       */
    165       Pcf_7SO  = 31,  /* summary overflow   */
    166       Pcf_NONE = 32   /* no condition; used with Pct_ALWAYS */
    167    }
    168    PPCCondFlag;
    169 
    170 typedef
    171    enum {   /* Maps bc bitfield BO */
    172       Pct_FALSE  = 0x4, /* associated PPCCondFlag must not be Pcf_NONE */
    173       Pct_TRUE   = 0xC, /* associated PPCCondFlag must not be Pcf_NONE */
    174       Pct_ALWAYS = 0x14 /* associated PPCCondFlag must be Pcf_NONE */
    175    }
    176    PPCCondTest;
    177 
    178 typedef
    179    struct {
    180       PPCCondFlag flag;
    181       PPCCondTest test;
    182    }
    183    PPCCondCode;
    184 
    185 extern HChar* showPPCCondCode ( PPCCondCode );
    186 
    187 /* constructor */
    188 extern PPCCondCode mk_PPCCondCode ( PPCCondTest, PPCCondFlag );
    189 
    190 /* false->true, true->false */
    191 extern PPCCondTest invertCondTest ( PPCCondTest );
    192 
    193 
    194 
    195 
    196 /* --------- Memory address expressions (amodes). --------- */
    197 
    198 typedef
    199    enum {
    200      Pam_IR=1,      /* Immediate (signed 16-bit) + Reg */
    201      Pam_RR=2       /* Reg1 + Reg2     */
    202    }
    203    PPCAModeTag;
    204 
    205 typedef
    206    struct {
    207       PPCAModeTag tag;
    208       union {
    209          struct {
    210             HReg base;
    211             Int  index;
    212          } IR;
    213          struct {
    214             HReg base;
    215             HReg index;
    216          } RR;
    217       } Pam;
    218    }
    219    PPCAMode;
    220 
    221 extern PPCAMode* PPCAMode_IR ( Int,  HReg );
    222 extern PPCAMode* PPCAMode_RR ( HReg, HReg );
    223 
    224 extern PPCAMode* dopyPPCAMode ( PPCAMode* );
    225 
    226 extern void ppPPCAMode ( PPCAMode* );
    227 
    228 
    229 /* --------- Operand, which can be a reg or a u16/s16. --------- */
    230 /* ("RH" == "Register or Halfword immediate") */
    231 typedef
    232    enum {
    233       Prh_Imm=3,
    234       Prh_Reg=4
    235    }
    236    PPCRHTag;
    237 
    238 typedef
    239    struct {
    240       PPCRHTag tag;
    241       union {
    242          struct {
    243             Bool   syned;
    244             UShort imm16;
    245          } Imm;
    246          struct {
    247             HReg reg;
    248          } Reg;
    249       }
    250       Prh;
    251    }
    252    PPCRH;
    253 
    254 extern PPCRH* PPCRH_Imm ( Bool, UShort );
    255 extern PPCRH* PPCRH_Reg ( HReg );
    256 
    257 extern void ppPPCRH ( PPCRH* );
    258 
    259 
    260 /* --------- Operand, which can be a reg or a u32/64. --------- */
    261 
    262 typedef
    263    enum {
    264       Pri_Imm=5,
    265       Pri_Reg=6
    266    }
    267    PPCRITag;
    268 
    269 typedef
    270    struct {
    271       PPCRITag tag;
    272       union {
    273          ULong Imm;
    274          HReg  Reg;
    275       }
    276       Pri;
    277    }
    278    PPCRI;
    279 
    280 extern PPCRI* PPCRI_Imm ( ULong );
    281 extern PPCRI* PPCRI_Reg( HReg );
    282 
    283 extern void ppPPCRI ( PPCRI* );
    284 
    285 
    286 /* --------- Operand, which can be a vector reg or a s6. --------- */
    287 /* ("VI" == "Vector Register or Immediate") */
    288 typedef
    289    enum {
    290       Pvi_Imm=7,
    291       Pvi_Reg=8
    292    }
    293    PPCVI5sTag;
    294 
    295 typedef
    296    struct {
    297       PPCVI5sTag tag;
    298       union {
    299          Char Imm5s;
    300          HReg Reg;
    301       }
    302       Pvi;
    303    }
    304    PPCVI5s;
    305 
    306 extern PPCVI5s* PPCVI5s_Imm ( Char );
    307 extern PPCVI5s* PPCVI5s_Reg ( HReg );
    308 
    309 extern void ppPPCVI5s ( PPCVI5s* );
    310 
    311 
    312 /* --------- Instructions. --------- */
    313 
    314 /* --------- */
    315 typedef
    316    enum {
    317       Pun_NEG,
    318       Pun_NOT,
    319       Pun_CLZ32,
    320       Pun_CLZ64,
    321       Pun_EXTSW
    322    }
    323    PPCUnaryOp;
    324 
    325 extern HChar* showPPCUnaryOp ( PPCUnaryOp );
    326 
    327 
    328 /* --------- */
    329 typedef
    330    enum {
    331       Palu_INVALID,
    332       Palu_ADD, Palu_SUB,
    333       Palu_AND, Palu_OR, Palu_XOR,
    334    }
    335    PPCAluOp;
    336 
    337 extern
    338 HChar* showPPCAluOp ( PPCAluOp,
    339                       Bool /* is the 2nd operand an immediate? */);
    340 
    341 
    342 /* --------- */
    343 typedef
    344    enum {
    345       Pshft_INVALID,
    346       Pshft_SHL, Pshft_SHR, Pshft_SAR,
    347    }
    348    PPCShftOp;
    349 
    350 extern
    351 HChar* showPPCShftOp ( PPCShftOp,
    352                        Bool /* is the 2nd operand an immediate? */,
    353                        Bool /* is this a 32bit or 64bit op? */ );
    354 
    355 
    356 /* --------- */
    357 typedef
    358    enum {
    359       Pfp_INVALID,
    360 
    361       /* Ternary */
    362       Pfp_MADDD,  Pfp_MSUBD,
    363       Pfp_MADDS,  Pfp_MSUBS,
    364       Pfp_DFPADD, Pfp_DFPADDQ,
    365       Pfp_DFPSUB, Pfp_DFPSUBQ,
    366       Pfp_DFPMUL, Pfp_DFPMULQ,
    367       Pfp_DFPDIV, Pfp_DFPDIVQ,
    368       Pfp_DQUAQ,  Pfp_DRRNDQ,
    369 
    370       /* Binary */
    371       Pfp_ADDD, Pfp_SUBD, Pfp_MULD, Pfp_DIVD,
    372       Pfp_ADDS, Pfp_SUBS, Pfp_MULS, Pfp_DIVS,
    373       Pfp_DRSP, Pfp_DRDPQ, Pfp_DCTFIX, Pfp_DCTFIXQ, Pfp_DCFFIX,
    374       Pfp_DQUA, Pfp_RRDTR, Pfp_DIEX, Pfp_DIEXQ,
    375 
    376       /* Unary */
    377       Pfp_SQRT, Pfp_ABS, Pfp_NEG, Pfp_MOV, Pfp_RES, Pfp_RSQRTE,
    378       Pfp_FRIN, Pfp_FRIM, Pfp_FRIP, Pfp_FRIZ,
    379       Pfp_DSCLI, Pfp_DSCRI, Pfp_DSCLIQ, Pfp_DSCRIQ, Pfp_DCTDP,
    380       Pfp_DCTQPQ, Pfp_DCFFIXQ, Pfp_DXEX, Pfp_DXEXQ,
    381 
    382    }
    383    PPCFpOp;
    384 
    385 extern HChar* showPPCFpOp ( PPCFpOp );
    386 
    387 
    388 /* --------- */
    389 typedef
    390    enum {
    391       Pav_INVALID,
    392 
    393       /* Integer Unary */
    394       Pav_MOV,                             /* Mov */
    395       Pav_NOT,                             /* Bitwise */
    396       Pav_UNPCKH8S,  Pav_UNPCKH16S,        /* Unpack */
    397       Pav_UNPCKL8S,  Pav_UNPCKL16S,
    398       Pav_UNPCKHPIX, Pav_UNPCKLPIX,
    399 
    400       /* Integer Binary */
    401       Pav_AND, Pav_OR, Pav_XOR,            /* Bitwise */
    402       Pav_ADDU, Pav_QADDU, Pav_QADDS,
    403       Pav_SUBU, Pav_QSUBU, Pav_QSUBS,
    404       Pav_OMULU, Pav_OMULS, Pav_EMULU, Pav_EMULS,
    405       Pav_AVGU, Pav_AVGS,
    406       Pav_MAXU, Pav_MAXS,
    407       Pav_MINU, Pav_MINS,
    408 
    409       /* Compare (always affects CR field 6) */
    410       Pav_CMPEQU, Pav_CMPGTU, Pav_CMPGTS,
    411 
    412       /* Shift */
    413       Pav_SHL, Pav_SHR, Pav_SAR, Pav_ROTL,
    414 
    415       /* Pack */
    416       Pav_PACKUU, Pav_QPACKUU, Pav_QPACKSU, Pav_QPACKSS,
    417       Pav_PACKPXL,
    418 
    419       /* Merge */
    420       Pav_MRGHI, Pav_MRGLO,
    421    }
    422    PPCAvOp;
    423 
    424 extern HChar* showPPCAvOp ( PPCAvOp );
    425 
    426 
    427 /* --------- */
    428 typedef
    429    enum {
    430       Pavfp_INVALID,
    431 
    432       /* Floating point binary */
    433       Pavfp_ADDF, Pavfp_SUBF, Pavfp_MULF,
    434       Pavfp_MAXF, Pavfp_MINF,
    435       Pavfp_CMPEQF, Pavfp_CMPGTF, Pavfp_CMPGEF,
    436 
    437       /* Floating point unary */
    438       Pavfp_RCPF, Pavfp_RSQRTF,
    439       Pavfp_CVTU2F, Pavfp_CVTS2F, Pavfp_QCVTF2U, Pavfp_QCVTF2S,
    440       Pavfp_ROUNDM, Pavfp_ROUNDP, Pavfp_ROUNDN, Pavfp_ROUNDZ,
    441    }
    442    PPCAvFpOp;
    443 
    444 extern HChar* showPPCAvFpOp ( PPCAvFpOp );
    445 
    446 
    447 /* --------- */
    448 typedef
    449    enum {
    450       Pin_LI,         /* load word (32/64-bit) immediate (fake insn) */
    451       Pin_Alu,        /* word add/sub/and/or/xor */
    452       Pin_Shft,       /* word shl/shr/sar */
    453       Pin_AddSubC,    /* add/sub with read/write carry */
    454       Pin_Cmp,        /* word compare */
    455       Pin_Unary,      /* not, neg, clz */
    456       Pin_MulL,       /* widening multiply */
    457       Pin_Div,        /* div */
    458       Pin_Call,       /* call to address in register */
    459       Pin_XDirect,    /* direct transfer to GA */
    460       Pin_XIndir,     /* indirect transfer to GA */
    461       Pin_XAssisted,  /* assisted transfer to GA */
    462       Pin_CMov,       /* conditional move */
    463       Pin_Load,       /* zero-extending load a 8|16|32|64 bit value from mem */
    464       Pin_LoadL,      /* load-linked (lwarx/ldarx) 32|64 bit value from mem */
    465       Pin_Store,      /* store a 8|16|32|64 bit value to mem */
    466       Pin_StoreC,     /* store-conditional (stwcx./stdcx.) 32|64 bit val */
    467       Pin_Set,        /* convert condition code to value 0 or 1 */
    468       Pin_MfCR,       /* move from condition register to GPR */
    469       Pin_MFence,     /* mem fence */
    470 
    471       Pin_FpUnary,    /* FP unary op */
    472       Pin_FpBinary,   /* FP binary op */
    473       Pin_FpMulAcc,   /* FP multipy-accumulate style op */
    474       Pin_FpLdSt,     /* FP load/store */
    475       Pin_FpSTFIW,    /* stfiwx */
    476       Pin_FpRSP,      /* FP round IEEE754 double to IEEE754 single */
    477       Pin_FpCftI,     /* fcfid[u,s,us]/fctid[u]/fctiw[u] */
    478       Pin_FpCMov,     /* FP floating point conditional move */
    479       Pin_FpLdFPSCR,  /* mtfsf */
    480       Pin_FpCmp,      /* FP compare, generating value into int reg */
    481 
    482       Pin_RdWrLR,     /* Read/Write Link Register */
    483 
    484       Pin_AvLdSt,     /* AV load/store (kludging for AMode_IR) */
    485       Pin_AvUnary,    /* AV unary general reg=>reg */
    486 
    487       Pin_AvBinary,   /* AV binary general reg,reg=>reg */
    488       Pin_AvBin8x16,  /* AV binary, 8x4 */
    489       Pin_AvBin16x8,  /* AV binary, 16x4 */
    490       Pin_AvBin32x4,  /* AV binary, 32x4 */
    491 
    492       Pin_AvBin32Fx4, /* AV FP binary, 32Fx4 */
    493       Pin_AvUn32Fx4,  /* AV FP unary,  32Fx4 */
    494 
    495       Pin_AvPerm,     /* AV permute (shuffle) */
    496       Pin_AvSel,      /* AV select */
    497       Pin_AvShlDbl,   /* AV shift-left double by imm */
    498       Pin_AvSplat,    /* One elem repeated throughout dst */
    499       Pin_AvLdVSCR,   /* mtvscr */
    500       Pin_AvCMov,     /* AV conditional move */
    501       Pin_Dfp64Unary,   /* DFP64  unary op */
    502       Pin_Dfp128Unary,  /* DFP128 unary op */
    503       Pin_DfpShift,     /* Decimal floating point shift by immediate value */
    504       Pin_Dfp64Binary,  /* DFP64  binary op */
    505       Pin_Dfp128Binary, /* DFP128 binary op */
    506       Pin_DfpShift128,  /* 128-bit Decimal floating point shift by
    507                          * immediate value */
    508       Pin_DfpD128toD64, /* DFP 128 to DFP 64 op */
    509       Pin_DfpI64StoD128, /* DFP signed integer to DFP 128 */
    510       Pin_DfpRound,       /* D64 round to D64 */
    511       Pin_DfpRound128,    /* D128 round to D128 */
    512       Pin_ExtractExpD128, /* DFP, extract 64 bit exponent */
    513       Pin_InsertExpD128,  /* DFP, insert 64 bit exponent and 128 bit binary
    514                            * significand into a DFP 128-bit value*/
    515       Pin_Dfp64Cmp,       /* DFP 64-bit compare, generating value into
    516                            * int reg */
    517       Pin_Dfp128Cmp,      /* DFP 128-bit  compare, generating value into
    518                            * int reg */
    519       Pin_DfpQuantize,    /* D64 quantize using register value, significance
    520                            * round */
    521       Pin_DfpQuantize128, /* D128 quantize using register value, significance
    522                            * round */
    523       Pin_EvCheck,    /* Event check */
    524       Pin_ProfInc     /* 64-bit profile counter increment */
    525    }
    526    PPCInstrTag;
    527 
    528 /* Destinations are on the LEFT (first operand) */
    529 
    530 typedef
    531    struct {
    532       PPCInstrTag tag;
    533       union {
    534          /* Get a 32/64-bit literal into a register.
    535             May turn into a number of real insns. */
    536          struct {
    537             HReg dst;
    538             ULong imm64;
    539          } LI;
    540          /* Integer add/sub/and/or/xor.  Limitations:
    541             - For add, the immediate, if it exists, is a signed 16.
    542             - For sub, the immediate, if it exists, is a signed 16
    543               which may not be -32768, since no such instruction
    544               exists, and so we have to emit addi with +32768, but
    545               that is not possible.
    546             - For and/or/xor,  the immediate, if it exists,
    547               is an unsigned 16.
    548          */
    549          struct {
    550             PPCAluOp op;
    551             HReg     dst;
    552             HReg     srcL;
    553             PPCRH*   srcR;
    554          } Alu;
    555          /* Integer shl/shr/sar.
    556             Limitations: the immediate, if it exists,
    557             is a signed 5-bit value between 1 and 31 inclusive.
    558          */
    559          struct {
    560             PPCShftOp op;
    561             Bool      sz32;   /* mode64 has both 32 and 64bit shft */
    562             HReg      dst;
    563             HReg      srcL;
    564             PPCRH*    srcR;
    565          } Shft;
    566          /*  */
    567          struct {
    568             Bool isAdd;  /* else sub */
    569             Bool setC;   /* else read carry */
    570             HReg dst;
    571             HReg srcL;
    572             HReg srcR;
    573          } AddSubC;
    574          /* If signed, the immediate, if it exists, is a signed 16,
    575             else it is an unsigned 16. */
    576          struct {
    577             Bool   syned;
    578             Bool   sz32;    /* mode64 has both 32 and 64bit cmp */
    579             UInt   crfD;
    580             HReg   srcL;
    581             PPCRH* srcR;
    582          } Cmp;
    583          /* Not, Neg, Clz32/64, Extsw */
    584          struct {
    585             PPCUnaryOp op;
    586             HReg       dst;
    587             HReg       src;
    588          } Unary;
    589          struct {
    590             Bool syned;  /* meaningless if hi32==False */
    591             Bool hi;     /* False=>low, True=>high */
    592             Bool sz32;   /* mode64 has both 32 & 64bit mull */
    593             HReg dst;
    594             HReg srcL;
    595             HReg srcR;
    596          } MulL;
    597          /* ppc32 div/divu instruction. */
    598          struct {
    599             Bool extended;
    600             Bool syned;
    601             Bool sz32;   /* mode64 has both 32 & 64bit div */
    602             HReg dst;
    603             HReg srcL;
    604             HReg srcR;
    605          } Div;
    606          /* Pseudo-insn.  Call target (an absolute address), on given
    607             condition (which could be Pct_ALWAYS).  argiregs indicates
    608             which of r3 .. r10 carries argument values for this call,
    609             using a bit mask (1<<N is set if rN holds an arg, for N in
    610             3 .. 10 inclusive). */
    611          struct {
    612             PPCCondCode cond;
    613             Addr64      target;
    614             UInt        argiregs;
    615          } Call;
    616          /* Update the guest CIA value, then exit requesting to chain
    617             to it.  May be conditional.  Use of Addr64 in order to cope
    618             with 64-bit hosts. */
    619          struct {
    620             Addr64      dstGA;    /* next guest address */
    621             PPCAMode*   amCIA;    /* amode in guest state for CIA */
    622             PPCCondCode cond;     /* can be ALWAYS */
    623             Bool        toFastEP; /* chain to the slow or fast point? */
    624          } XDirect;
    625          /* Boring transfer to a guest address not known at JIT time.
    626             Not chainable.  May be conditional. */
    627          struct {
    628             HReg        dstGA;
    629             PPCAMode*   amCIA;
    630             PPCCondCode cond; /* can be ALWAYS */
    631          } XIndir;
    632          /* Assisted transfer to a guest address, most general case.
    633             Not chainable.  May be conditional. */
    634          struct {
    635             HReg        dstGA;
    636             PPCAMode*   amCIA;
    637             PPCCondCode cond; /* can be ALWAYS */
    638             IRJumpKind  jk;
    639          } XAssisted;
    640          /* Mov src to dst on the given condition, which may not
    641             be the bogus Pct_ALWAYS. */
    642          struct {
    643             PPCCondCode cond;
    644             HReg        dst;
    645             PPCRI*      src;
    646          } CMov;
    647          /* Zero extending loads.  Dst size is host word size */
    648          struct {
    649             UChar     sz; /* 1|2|4|8 */
    650             HReg      dst;
    651             PPCAMode* src;
    652          } Load;
    653          /* Load-and-reserve (lwarx, ldarx) */
    654          struct {
    655             UChar sz; /* 4|8 */
    656             HReg  dst;
    657             HReg  src;
    658          } LoadL;
    659          /* 64/32/16/8 bit stores */
    660          struct {
    661             UChar     sz; /* 1|2|4|8 */
    662             PPCAMode* dst;
    663             HReg      src;
    664          } Store;
    665          /* Store-conditional (stwcx., stdcx.) */
    666          struct {
    667             UChar sz; /* 4|8 */
    668             HReg  dst;
    669             HReg  src;
    670          } StoreC;
    671          /* Convert a ppc condition code to value 0 or 1. */
    672          struct {
    673             PPCCondCode cond;
    674             HReg        dst;
    675          } Set;
    676          /* Move the entire CR to a GPR */
    677          struct {
    678             HReg dst;
    679          } MfCR;
    680          /* Mem fence.  In short, an insn which flushes all preceding
    681             loads and stores as much as possible before continuing.
    682             On PPC we emit a "sync". */
    683          struct {
    684          } MFence;
    685 
    686          /* PPC Floating point */
    687          struct {
    688             PPCFpOp op;
    689             HReg    dst;
    690             HReg    src;
    691          } FpUnary;
    692          struct {
    693             PPCFpOp op;
    694             HReg    dst;
    695             HReg    srcL;
    696             HReg    srcR;
    697          } FpBinary;
    698          struct {
    699             PPCFpOp op;
    700             HReg    dst;
    701             HReg    srcML;
    702             HReg    srcMR;
    703             HReg    srcAcc;
    704          } FpMulAcc;
    705          struct {
    706             Bool      isLoad;
    707             UChar     sz; /* only 4 (IEEE single) or 8 (IEEE double) */
    708             HReg      reg;
    709             PPCAMode* addr;
    710          } FpLdSt;
    711          struct {
    712             HReg addr; /* int reg */
    713             HReg data; /* float reg */
    714          } FpSTFIW;
    715          /* Round 64-bit FP value to 32-bit FP value in an FP reg. */
    716          struct {
    717             HReg src;
    718             HReg dst;
    719          } FpRSP;
    720          /* fcfid[u,s,us]/fctid[u]/fctiw[u].  Only some combinations
    721             of the various fields are allowed.  This is asserted for
    722             and documented in the code for the constructor,
    723             PPCInstr_FpCftI, in host_ppc_defs.c.  */
    724          struct {
    725             Bool fromI; /* True== I->F,    False== F->I */
    726             Bool int32; /* True== I is 32, False== I is 64 */
    727             Bool syned;
    728             Bool flt64; /* True== F is 64, False== F is 32 */
    729             HReg src;
    730             HReg dst;
    731          } FpCftI;
    732          /* FP mov src to dst on the given condition. */
    733          struct {
    734             PPCCondCode cond;
    735             HReg        dst;
    736             HReg        src;
    737          } FpCMov;
    738          /* Load FP Status & Control Register */
    739          struct {
    740             HReg src;
    741             UInt dfp_rm;
    742          } FpLdFPSCR;
    743          /* Do a compare, generating result into an int register. */
    744          struct {
    745             UChar crfD;
    746             HReg  dst;
    747             HReg  srcL;
    748             HReg  srcR;
    749          } FpCmp;
    750 
    751          /* Read/Write Link Register */
    752          struct {
    753             Bool wrLR;
    754             HReg gpr;
    755          } RdWrLR;
    756 
    757          /* Simplistic AltiVec */
    758          struct {
    759             Bool      isLoad;
    760             UChar     sz;      /* 8|16|32|128 */
    761             HReg      reg;
    762             PPCAMode* addr;
    763          } AvLdSt;
    764          struct {
    765             PPCAvOp op;
    766             HReg    dst;
    767             HReg    src;
    768          } AvUnary;
    769          struct {
    770             PPCAvOp op;
    771             HReg    dst;
    772             HReg    srcL;
    773             HReg    srcR;
    774          } AvBinary;
    775          struct {
    776             PPCAvOp op;
    777             HReg    dst;
    778             HReg    srcL;
    779             HReg    srcR;
    780          } AvBin8x16;
    781          struct {
    782             PPCAvOp op;
    783             HReg    dst;
    784             HReg    srcL;
    785             HReg    srcR;
    786          } AvBin16x8;
    787          struct {
    788             PPCAvOp op;
    789             HReg    dst;
    790             HReg    srcL;
    791             HReg    srcR;
    792          } AvBin32x4;
    793          struct {
    794             PPCAvFpOp op;
    795             HReg      dst;
    796             HReg      srcL;
    797             HReg      srcR;
    798          } AvBin32Fx4;
    799          struct {
    800             PPCAvFpOp op;
    801             HReg      dst;
    802             HReg      src;
    803          } AvUn32Fx4;
    804          /* Perm,Sel,SlDbl,Splat are all weird AV permutations */
    805          struct {
    806             HReg dst;
    807             HReg srcL;
    808             HReg srcR;
    809             HReg ctl;
    810          } AvPerm;
    811          struct {
    812             HReg dst;
    813             HReg srcL;
    814             HReg srcR;
    815             HReg ctl;
    816          } AvSel;
    817          struct {
    818             UChar shift;
    819             HReg  dst;
    820             HReg  srcL;
    821             HReg  srcR;
    822          } AvShlDbl;
    823          struct {
    824             UChar    sz;   /* 8,16,32 */
    825             HReg     dst;
    826             PPCVI5s* src;
    827          } AvSplat;
    828          /* Mov src to dst on the given condition, which may not
    829             be the bogus Xcc_ALWAYS. */
    830          struct {
    831             PPCCondCode cond;
    832             HReg        dst;
    833             HReg        src;
    834          } AvCMov;
    835          /* Load AltiVec Status & Control Register */
    836          struct {
    837             HReg src;
    838          } AvLdVSCR;
    839          struct {
    840             PPCFpOp op;
    841             HReg dst;
    842             HReg src;
    843          } Dfp64Unary;
    844          struct {
    845             PPCFpOp op;
    846             HReg dst;
    847             HReg srcL;
    848             HReg srcR;
    849          } Dfp64Binary;
    850          struct {
    851             PPCFpOp op;
    852             HReg   dst;
    853             HReg   src;
    854             PPCRI* shift;
    855          } DfpShift;
    856          struct {
    857             PPCFpOp op;
    858             HReg dst_hi;
    859             HReg dst_lo;
    860             HReg src_hi;
    861             HReg src_lo;
    862          } Dfp128Unary;
    863          struct {
    864             /* The dst is used to pass the left source operand in and return
    865              * the result.
    866              */
    867             PPCFpOp op;
    868             HReg dst_hi;
    869             HReg dst_lo;
    870             HReg srcR_hi;
    871             HReg srcR_lo;
    872          } Dfp128Binary;
    873          struct {
    874             PPCFpOp op;
    875             HReg   dst_hi;
    876             HReg   dst_lo;
    877             HReg   src_hi;
    878             HReg   src_lo;
    879             PPCRI* shift;
    880          } DfpShift128;
    881          struct {
    882             HReg dst;
    883             HReg src;
    884             PPCRI* r_rmc;
    885          } DfpRound;
    886          struct {
    887             HReg dst_hi;
    888             HReg dst_lo;
    889             HReg src_hi;
    890             HReg src_lo;
    891             PPCRI* r_rmc;
    892          } DfpRound128;
    893          struct {
    894 	    PPCFpOp op;
    895             HReg dst;
    896             HReg srcL;
    897             HReg srcR;
    898             PPCRI* rmc;
    899          } DfpQuantize;
    900          struct {
    901 	    PPCFpOp op;
    902             HReg dst_hi;
    903             HReg dst_lo;
    904             HReg src_hi;
    905             HReg src_lo;
    906   	    PPCRI* rmc;
    907          } DfpQuantize128;
    908          struct {
    909             PPCFpOp op;
    910             HReg dst;
    911             HReg src_hi;
    912             HReg src_lo;
    913          } ExtractExpD128;
    914          struct {
    915 	    PPCFpOp op;
    916             HReg dst_hi;
    917             HReg dst_lo;
    918             HReg srcL;
    919             HReg srcR_hi;
    920             HReg srcR_lo;
    921          } InsertExpD128;
    922          struct {
    923             PPCFpOp op;
    924             HReg   dst;
    925             HReg   src_hi;
    926             HReg   src_lo;
    927          } DfpD128toD64;
    928          struct {
    929             PPCFpOp op;
    930             HReg   dst_hi;
    931             HReg   dst_lo;
    932             HReg   src;
    933          } DfpI64StoD128;
    934          struct {
    935             UChar crfD;
    936             HReg  dst;
    937             HReg  srcL;
    938             HReg  srcR;
    939          } Dfp64Cmp;
    940          struct {
    941             UChar crfD;
    942             HReg  dst;
    943             HReg  srcL_hi;
    944             HReg  srcL_lo;
    945             HReg  srcR_hi;
    946             HReg  srcR_lo;
    947          } Dfp128Cmp;
    948          struct {
    949             PPCAMode* amCounter;
    950             PPCAMode* amFailAddr;
    951          } EvCheck;
    952          struct {
    953             /* No fields.  The address of the counter to inc is
    954                installed later, post-translation, by patching it in,
    955                as it is not known at translation time. */
    956          } ProfInc;
    957       } Pin;
    958    }
    959    PPCInstr;
    960 
    961 
    962 extern PPCInstr* PPCInstr_LI         ( HReg, ULong, Bool );
    963 extern PPCInstr* PPCInstr_Alu        ( PPCAluOp, HReg, HReg, PPCRH* );
    964 extern PPCInstr* PPCInstr_Shft       ( PPCShftOp, Bool sz32, HReg, HReg, PPCRH* );
    965 extern PPCInstr* PPCInstr_AddSubC    ( Bool, Bool, HReg, HReg, HReg );
    966 extern PPCInstr* PPCInstr_Cmp        ( Bool, Bool, UInt, HReg, PPCRH* );
    967 extern PPCInstr* PPCInstr_Unary      ( PPCUnaryOp op, HReg dst, HReg src );
    968 extern PPCInstr* PPCInstr_MulL       ( Bool syned, Bool hi32, Bool sz32, HReg, HReg, HReg );
    969 extern PPCInstr* PPCInstr_Div        ( Bool extended, Bool syned, Bool sz32, HReg dst, HReg srcL, HReg srcR );
    970 extern PPCInstr* PPCInstr_Call       ( PPCCondCode, Addr64, UInt );
    971 extern PPCInstr* PPCInstr_XDirect    ( Addr64 dstGA, PPCAMode* amCIA,
    972                                        PPCCondCode cond, Bool toFastEP );
    973 extern PPCInstr* PPCInstr_XIndir     ( HReg dstGA, PPCAMode* amCIA,
    974                                        PPCCondCode cond );
    975 extern PPCInstr* PPCInstr_XAssisted  ( HReg dstGA, PPCAMode* amCIA,
    976                                        PPCCondCode cond, IRJumpKind jk );
    977 extern PPCInstr* PPCInstr_CMov       ( PPCCondCode, HReg dst, PPCRI* src );
    978 extern PPCInstr* PPCInstr_Load       ( UChar sz,
    979                                        HReg dst, PPCAMode* src, Bool mode64 );
    980 extern PPCInstr* PPCInstr_LoadL      ( UChar sz,
    981                                        HReg dst, HReg src, Bool mode64 );
    982 extern PPCInstr* PPCInstr_Store      ( UChar sz, PPCAMode* dst,
    983                                        HReg src, Bool mode64 );
    984 extern PPCInstr* PPCInstr_StoreC     ( UChar sz, HReg dst, HReg src,
    985                                        Bool mode64 );
    986 extern PPCInstr* PPCInstr_Set        ( PPCCondCode cond, HReg dst );
    987 extern PPCInstr* PPCInstr_MfCR       ( HReg dst );
    988 extern PPCInstr* PPCInstr_MFence     ( void );
    989 
    990 extern PPCInstr* PPCInstr_FpUnary    ( PPCFpOp op, HReg dst, HReg src );
    991 extern PPCInstr* PPCInstr_FpBinary   ( PPCFpOp op, HReg dst, HReg srcL, HReg srcR );
    992 extern PPCInstr* PPCInstr_FpMulAcc   ( PPCFpOp op, HReg dst, HReg srcML,
    993                                                    HReg srcMR, HReg srcAcc );
    994 extern PPCInstr* PPCInstr_FpLdSt     ( Bool isLoad, UChar sz, HReg, PPCAMode* );
    995 extern PPCInstr* PPCInstr_FpSTFIW    ( HReg addr, HReg data );
    996 extern PPCInstr* PPCInstr_FpRSP      ( HReg dst, HReg src );
    997 extern PPCInstr* PPCInstr_FpCftI     ( Bool fromI, Bool int32, Bool syned,
    998                                        Bool dst64, HReg dst, HReg src );
    999 extern PPCInstr* PPCInstr_FpCMov     ( PPCCondCode, HReg dst, HReg src );
   1000 extern PPCInstr* PPCInstr_FpLdFPSCR  ( HReg src, Bool dfp_rm );
   1001 extern PPCInstr* PPCInstr_FpCmp      ( HReg dst, HReg srcL, HReg srcR );
   1002 
   1003 extern PPCInstr* PPCInstr_RdWrLR     ( Bool wrLR, HReg gpr );
   1004 
   1005 extern PPCInstr* PPCInstr_AvLdSt     ( Bool isLoad, UChar sz, HReg, PPCAMode* );
   1006 extern PPCInstr* PPCInstr_AvUnary    ( PPCAvOp op, HReg dst, HReg src );
   1007 extern PPCInstr* PPCInstr_AvBinary   ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
   1008 extern PPCInstr* PPCInstr_AvBin8x16  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
   1009 extern PPCInstr* PPCInstr_AvBin16x8  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
   1010 extern PPCInstr* PPCInstr_AvBin32x4  ( PPCAvOp op, HReg dst, HReg srcL, HReg srcR );
   1011 extern PPCInstr* PPCInstr_AvBin32Fx4 ( PPCAvFpOp op, HReg dst, HReg srcL, HReg srcR );
   1012 extern PPCInstr* PPCInstr_AvUn32Fx4  ( PPCAvFpOp op, HReg dst, HReg src );
   1013 extern PPCInstr* PPCInstr_AvPerm     ( HReg dst, HReg srcL, HReg srcR, HReg ctl );
   1014 extern PPCInstr* PPCInstr_AvSel      ( HReg ctl, HReg dst, HReg srcL, HReg srcR );
   1015 extern PPCInstr* PPCInstr_AvShlDbl   ( UChar shift, HReg dst, HReg srcL, HReg srcR );
   1016 extern PPCInstr* PPCInstr_AvSplat    ( UChar sz, HReg dst, PPCVI5s* src );
   1017 extern PPCInstr* PPCInstr_AvCMov     ( PPCCondCode, HReg dst, HReg src );
   1018 extern PPCInstr* PPCInstr_AvLdVSCR   ( HReg src );
   1019 
   1020 extern PPCInstr* PPCInstr_Dfp64Unary  ( PPCFpOp op, HReg dst, HReg src );
   1021 extern PPCInstr* PPCInstr_Dfp64Binary ( PPCFpOp op, HReg dst, HReg srcL,
   1022                                         HReg srcR );
   1023 extern PPCInstr* PPCInstr_DfpShift    ( PPCFpOp op, HReg dst, HReg src,
   1024                                         PPCRI* shift );
   1025 extern PPCInstr* PPCInstr_Dfp128Unary  ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
   1026                                          HReg srcR_hi, HReg srcR_lo );
   1027 extern PPCInstr* PPCInstr_Dfp128Binary ( PPCFpOp op, HReg dst_hi, HReg dst_lo,
   1028                                          HReg srcR_hi, HReg srcR_lo );
   1029 extern PPCInstr* PPCInstr_DfpShift128  ( PPCFpOp op, HReg dst_hi, HReg src_hi,
   1030                                          HReg dst_lo, HReg src_lo,
   1031                                          PPCRI* shift );
   1032 extern PPCInstr* PPCInstr_DfpD128toD64 ( PPCFpOp op, HReg dst,
   1033                                          HReg dst_lo, HReg src_lo);
   1034 extern PPCInstr* PPCInstr_DfpI64StoD128  ( PPCFpOp op, HReg dst_hi,
   1035                                            HReg dst_lo, HReg src);
   1036 extern PPCInstr* PPCInstr_DfpRound       ( HReg dst, HReg src, PPCRI* r_rmc );
   1037 extern PPCInstr* PPCInstr_DfpRound128    ( HReg dst_hi, HReg dst_lo, HReg src_hi,
   1038                                            HReg src_lo, PPCRI* r_rmc );
   1039 extern PPCInstr* PPCInstr_DfpQuantize    ( PPCFpOp op, HReg dst, HReg srcL,
   1040                                            HReg srcR, PPCRI* rmc );
   1041 extern PPCInstr* PPCInstr_DfpQuantize128 ( PPCFpOp op, HReg dst_hi,
   1042                                            HReg dst_lo,
   1043                                            HReg src_hi,
   1044                                            HReg src_lo, PPCRI* rmc );
   1045 extern PPCInstr* PPCInstr_ExtractExpD128 ( PPCFpOp op,   HReg dst,
   1046                                            HReg src_hi, HReg src_lo );
   1047 extern PPCInstr* PPCInstr_InsertExpD128  ( PPCFpOp op,   HReg dst_hi,
   1048                                            HReg dst_lo,  HReg srcL,
   1049                                            HReg srcR_hi, HReg srcR_lo );
   1050 extern PPCInstr* PPCInstr_Dfp64Cmp       ( HReg dst, HReg srcL, HReg srcR );
   1051 extern PPCInstr* PPCInstr_Dfp128Cmp      ( HReg dst, HReg srcL_hi, HReg srcL_lo,
   1052                                            HReg srcR_hi, HReg srcR_lo );
   1053 extern PPCInstr* PPCInstr_EvCheck     ( PPCAMode* amCounter,
   1054                                         PPCAMode* amFailAddr );
   1055 extern PPCInstr* PPCInstr_ProfInc     ( void );
   1056 
   1057 extern void ppPPCInstr(PPCInstr*, Bool mode64);
   1058 
   1059 
   1060 /* Some functions that insulate the register allocator from details
   1061    of the underlying instruction set. */
   1062 extern void         getRegUsage_PPCInstr ( HRegUsage*, PPCInstr*, Bool mode64 );
   1063 extern void         mapRegs_PPCInstr     ( HRegRemap*, PPCInstr* , Bool mode64);
   1064 extern Bool         isMove_PPCInstr      ( PPCInstr*, HReg*, HReg* );
   1065 extern Int          emit_PPCInstr        ( /*MB_MOD*/Bool* is_profInc,
   1066                                            UChar* buf, Int nbuf, PPCInstr* i,
   1067                                            Bool mode64,
   1068                                            void* disp_cp_chain_me_to_slowEP,
   1069                                            void* disp_cp_chain_me_to_fastEP,
   1070                                            void* disp_cp_xindir,
   1071                                            void* disp_cp_xassisted );
   1072 
   1073 extern void genSpill_PPC  ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
   1074                             HReg rreg, Int offsetB, Bool mode64 );
   1075 extern void genReload_PPC ( /*OUT*/HInstr** i1, /*OUT*/HInstr** i2,
   1076                             HReg rreg, Int offsetB, Bool mode64 );
   1077 
   1078 extern void         getAllocableRegs_PPC ( Int*, HReg**, Bool mode64 );
   1079 extern HInstrArray* iselSB_PPC           ( IRSB*,
   1080                                            VexArch,
   1081                                            VexArchInfo*,
   1082                                            VexAbiInfo*,
   1083                                            Int offs_Host_EvC_Counter,
   1084                                            Int offs_Host_EvC_FailAddr,
   1085                                            Bool chainingAllowed,
   1086                                            Bool addProfInc,
   1087                                            Addr64 max_ga );
   1088 
   1089 /* How big is an event check?  This is kind of a kludge because it
   1090    depends on the offsets of host_EvC_FAILADDR and
   1091    host_EvC_COUNTER. */
   1092 extern Int evCheckSzB_PPC ( void );
   1093 
   1094 /* Perform a chaining and unchaining of an XDirect jump. */
   1095 extern VexInvalRange chainXDirect_PPC ( void* place_to_chain,
   1096                                         void* disp_cp_chain_me_EXPECTED,
   1097                                         void* place_to_jump_to,
   1098                                         Bool  mode64 );
   1099 
   1100 extern VexInvalRange unchainXDirect_PPC ( void* place_to_unchain,
   1101                                           void* place_to_jump_to_EXPECTED,
   1102                                           void* disp_cp_chain_me,
   1103                                           Bool  mode64 );
   1104 
   1105 /* Patch the counter location into an existing ProfInc point. */
   1106 extern VexInvalRange patchProfInc_PPC ( void*  place_to_patch,
   1107                                         ULong* location_of_counter,
   1108                                         Bool   mode64 );
   1109 
   1110 
   1111 #endif /* ndef __VEX_HOST_PPC_DEFS_H */
   1112 
   1113 /*---------------------------------------------------------------*/
   1114 /*--- end                                     host_ppc_defs.h ---*/
   1115 /*---------------------------------------------------------------*/
   1116