/* ISA definitions header for media.

THIS FILE IS MACHINE GENERATED WITH CGEN.

Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.

This file is part of the GNU Simulators.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

*/

#ifndef DEFS_SH64_MEDIA_H
#define DEFS_SH64_MEDIA_H

/* Instruction argument buffer.  */

union sem_fields {
  struct { /* no operands */
    int empty;
  } fmt_empty;
  struct { /*  */
    UINT f_dest;
    UINT f_uimm16;
  } sfmt_shori;
  struct { /*  */
    DI f_disp16;
    UINT f_tra;
  } sfmt_pta;
  struct { /*  */
    INT f_imm16;
    UINT f_dest;
  } sfmt_movi;
  struct { /*  */
    UINT f_dest;
    UINT f_left_right;
  } sfmt_fabsd;
  struct { /*  */
    UINT f_dest;
    UINT f_trb;
  } sfmt_blink;
  struct { /*  */
    INT f_imm6;
    UINT f_dest;
    UINT f_left;
  } sfmt_xori;
  struct { /*  */
    INT f_disp6;
    UINT f_dest;
    UINT f_left;
  } sfmt_sthil;
  struct { /*  */
    UINT f_dest;
    UINT f_left;
    UINT f_uimm6;
  } sfmt_shari;
  struct { /*  */
    INT f_imm10;
    UINT f_dest;
    UINT f_left;
  } sfmt_ori;
  struct { /*  */
    SI f_disp10x2;
    UINT f_dest;
    UINT f_left;
  } sfmt_lduw;
  struct { /*  */
    SI f_disp10x4;
    UINT f_dest;
    UINT f_left;
  } sfmt_flds;
  struct { /*  */
    SI f_disp10x8;
    UINT f_dest;
    UINT f_left;
  } sfmt_fldd;
  struct { /*  */
    INT f_imm6;
    UINT f_left;
    UINT f_tra;
  } sfmt_beqi;
  struct { /*  */
    UINT f_left;
    UINT f_right;
    UINT f_tra;
  } sfmt_beq;
  struct { /*  */
    INT f_disp10;
    UINT f_dest;
    UINT f_left;
  } sfmt_addi;
  struct { /*  */
    UINT f_dest;
    UINT f_left;
    UINT f_right;
  } sfmt_add;
#if WITH_SCACHE_PBB
  /* Writeback handler.  */
  struct {
    /* Pointer to argbuf entry for insn whose results need writing back.  */
    const struct argbuf *abuf;
  } write;
  /* x-before handler */
  struct {
    /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
    int first_p;
  } before;
  /* x-after handler */
  struct {
    int empty;
  } after;
  /* This entry is used to terminate each pbb.  */
  struct {
    /* Number of insns in pbb.  */
    int insn_count;
    /* Next pbb to execute.  */
    SCACHE *next;
    SCACHE *branch_target;
  } chain;
#endif
};

/* The ARGBUF struct.  */
struct argbuf {
  /* These are the baseclass definitions.  */
  IADDR addr;
  const IDESC *idesc;
  char trace_p;
  char profile_p;
  /* ??? Temporary hack for skip insns.  */
  char skip_count;
  char unused;
  /* cpu specific data follows */
  union sem semantic;
  int written;
  union sem_fields fields;
};

/* A cached insn.

   ??? SCACHE used to contain more than just argbuf.  We could delete the
   type entirely and always just use ARGBUF, but for future concerns and as
   a level of abstraction it is left in.  */

struct scache {
  struct argbuf argbuf;
};

/* Macros to simplify extraction, reading and semantic code.
   These define and assign the local vars that contain the insn's fields.  */

#define EXTRACT_IFMT_EMPTY_VARS \
  unsigned int length;
#define EXTRACT_IFMT_EMPTY_CODE \
  length = 0; \

#define EXTRACT_IFMT_ADD_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_ADD_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_ADDI_VARS \
  UINT f_op; \
  UINT f_left; \
  INT f_disp10; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_ADDI_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_disp10 = EXTRACT_LSB0_INT (insn, 32, 19, 10); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_ALLOCO_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  SI f_disp6x32; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_ALLOCO_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_disp6x32 = ((EXTRACT_LSB0_INT (insn, 32, 15, 6)) << (5)); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_BEQ_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_likely; \
  UINT f_8_2; \
  UINT f_tra; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_BEQ_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_likely = EXTRACT_LSB0_UINT (insn, 32, 9, 1); \
  f_8_2 = EXTRACT_LSB0_UINT (insn, 32, 8, 2); \
  f_tra = EXTRACT_LSB0_UINT (insn, 32, 6, 3); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_BEQI_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  INT f_imm6; \
  UINT f_likely; \
  UINT f_8_2; \
  UINT f_tra; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_BEQI_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_imm6 = EXTRACT_LSB0_INT (insn, 32, 15, 6); \
  f_likely = EXTRACT_LSB0_UINT (insn, 32, 9, 1); \
  f_8_2 = EXTRACT_LSB0_UINT (insn, 32, 8, 2); \
  f_tra = EXTRACT_LSB0_UINT (insn, 32, 6, 3); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_BLINK_VARS \
  UINT f_op; \
  UINT f_25; \
  UINT f_trb; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_BLINK_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_25 = EXTRACT_LSB0_UINT (insn, 32, 25, 3); \
  f_trb = EXTRACT_LSB0_UINT (insn, 32, 22, 3); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_BRK_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_BRK_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_BYTEREV_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_BYTEREV_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FABSD_VARS \
  UINT f_op; \
  UINT f_ext; \
  UINT f_left; \
  UINT f_right; \
  UINT f_left_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FABSD_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_left_right = f_left;\
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FABSS_VARS \
  UINT f_op; \
  UINT f_ext; \
  UINT f_left; \
  UINT f_right; \
  UINT f_left_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FABSS_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_left_right = f_left;\
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FADDD_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FADDD_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FADDS_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FADDS_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FCMPEQD_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FCMPEQD_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FCMPEQS_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FCMPEQS_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FCNVDS_VARS \
  UINT f_op; \
  UINT f_ext; \
  UINT f_left; \
  UINT f_right; \
  UINT f_left_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FCNVDS_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_left_right = f_left;\
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FCNVSD_VARS \
  UINT f_op; \
  UINT f_ext; \
  UINT f_left; \
  UINT f_right; \
  UINT f_left_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FCNVSD_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_left_right = f_left;\
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FGETSCR_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FGETSCR_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FIPRS_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FIPRS_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FLDD_VARS \
  UINT f_op; \
  UINT f_left; \
  SI f_disp10x8; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FLDD_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_disp10x8 = ((EXTRACT_LSB0_INT (insn, 32, 19, 10)) << (3)); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FLDP_VARS \
  UINT f_op; \
  UINT f_left; \
  SI f_disp10x8; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FLDP_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_disp10x8 = ((EXTRACT_LSB0_INT (insn, 32, 19, 10)) << (3)); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FLDS_VARS \
  UINT f_op; \
  UINT f_left; \
  SI f_disp10x4; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FLDS_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_disp10x4 = ((EXTRACT_LSB0_INT (insn, 32, 19, 10)) << (2)); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FLDXD_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FLDXD_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FLDXP_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FLDXP_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FMOVDQ_VARS \
  UINT f_op; \
  UINT f_ext; \
  UINT f_left; \
  UINT f_right; \
  UINT f_left_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FMOVDQ_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_left_right = f_left;\
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FMOVLS_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FMOVLS_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FMOVSL_VARS \
  UINT f_op; \
  UINT f_ext; \
  UINT f_left; \
  UINT f_right; \
  UINT f_left_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FMOVSL_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_left_right = f_left;\
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FPUTSCR_VARS \
  UINT f_op; \
  UINT f_ext; \
  UINT f_left; \
  UINT f_right; \
  UINT f_left_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FPUTSCR_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_left_right = f_left;\
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FSTXD_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FSTXD_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_FTRVS_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_FTRVS_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_GETCFG_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  INT f_disp6; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_GETCFG_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_disp6 = EXTRACT_LSB0_INT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_GETCON_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_GETCON_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_LDL_VARS \
  UINT f_op; \
  UINT f_left; \
  SI f_disp10x4; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_LDL_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_disp10x4 = ((EXTRACT_LSB0_INT (insn, 32, 19, 10)) << (2)); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_LDQ_VARS \
  UINT f_op; \
  UINT f_left; \
  SI f_disp10x8; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_LDQ_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_disp10x8 = ((EXTRACT_LSB0_INT (insn, 32, 19, 10)) << (3)); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_MMACNFX_WL_VARS \
  UINT f_op; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_MMACNFX_WL_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_MOVI_VARS \
  UINT f_op; \
  INT f_imm16; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_MOVI_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_imm16 = EXTRACT_LSB0_INT (insn, 32, 25, 16); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_ORI_VARS \
  UINT f_op; \
  UINT f_left; \
  INT f_imm10; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_ORI_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_imm10 = EXTRACT_LSB0_INT (insn, 32, 19, 10); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_PREFI_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  SI f_disp6x32; \
  UINT f_right; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_PREFI_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_disp6x32 = ((EXTRACT_LSB0_INT (insn, 32, 15, 6)) << (5)); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_PTA_VARS \
  UINT f_op; \
  DI f_disp16; \
  UINT f_likely; \
  UINT f_8_2; \
  UINT f_tra; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_PTA_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_disp16 = ((((EXTRACT_LSB0_INT (insn, 32, 25, 16)) << (2))) + (pc)); \
  f_likely = EXTRACT_LSB0_UINT (insn, 32, 9, 1); \
  f_8_2 = EXTRACT_LSB0_UINT (insn, 32, 8, 2); \
  f_tra = EXTRACT_LSB0_UINT (insn, 32, 6, 3); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_PTABS_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_likely; \
  UINT f_8_2; \
  UINT f_tra; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_PTABS_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_likely = EXTRACT_LSB0_UINT (insn, 32, 9, 1); \
  f_8_2 = EXTRACT_LSB0_UINT (insn, 32, 8, 2); \
  f_tra = EXTRACT_LSB0_UINT (insn, 32, 6, 3); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_PUTCON_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_PUTCON_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_SHARI_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_uimm6; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_SHARI_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_uimm6 = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_SHORI_VARS \
  UINT f_op; \
  UINT f_uimm16; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_SHORI_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_uimm16 = EXTRACT_LSB0_UINT (insn, 32, 25, 16); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_STW_VARS \
  UINT f_op; \
  UINT f_left; \
  SI f_disp10x2; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_STW_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_disp10x2 = ((EXTRACT_LSB0_INT (insn, 32, 19, 10)) << (1)); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#define EXTRACT_IFMT_TRAPA_VARS \
  UINT f_op; \
  UINT f_left; \
  UINT f_ext; \
  UINT f_right; \
  UINT f_dest; \
  UINT f_rsvd; \
  unsigned int length;
#define EXTRACT_IFMT_TRAPA_CODE \
  length = 4; \
  f_op = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
  f_left = EXTRACT_LSB0_UINT (insn, 32, 25, 6); \
  f_ext = EXTRACT_LSB0_UINT (insn, 32, 19, 4); \
  f_right = EXTRACT_LSB0_UINT (insn, 32, 15, 6); \
  f_dest = EXTRACT_LSB0_UINT (insn, 32, 9, 6); \
  f_rsvd = EXTRACT_LSB0_UINT (insn, 32, 3, 4); \

#endif /* DEFS_SH64_MEDIA_H */
