/* Declarations for SH64 opcodes.
   Copyright (C) 2000-2016 Free Software Foundation, Inc.

   This file is part of the GNU opcodes library.

   This library 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 3, or (at your option)
   any later version.

   It 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 file; see the file COPYING.  If not, write to the
   Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#ifndef _SH64_OPC_INCLUDED_H
#define _SH64_OPC_INCLUDED_H

typedef enum
{
  /* A placeholder.  */
  OFFSET_NONE = 0,

  /* Bit number for where to insert operand.  */
  OFFSET_4  = 4,
  OFFSET_9  = 9,
  OFFSET_10 = 10,
  OFFSET_20 = 20
} shmedia_nibble_type;

typedef enum {
  /* First a placeholder.  */
  A_NONE = 0,

  /* Registers.  */
  A_GREG_M,
  A_GREG_N,
  A_GREG_D,
  A_FREG_G,
  A_FREG_H,
  A_FREG_F,
  A_DREG_G,
  A_DREG_H,
  A_DREG_F,
  A_FVREG_G,
  A_FVREG_H,
  A_FVREG_F,
  A_FMREG_G,
  A_FMREG_H,
  A_FMREG_F,
  A_FPREG_G,
  A_FPREG_H,
  A_FPREG_F,
  A_TREG_A,
  A_TREG_B,
  A_CREG_K,
  A_CREG_J,

  /* This one is only used in a shmedia_get_operand.  */
  A_IMMM,

  /* Copy of previous register.  */
  A_REUSE_PREV,

  /* Unsigned 5-bit operand.  */
  A_IMMU5,

  /* Signed 6-bit operand.  */
  A_IMMS6,

  /* Signed operand, 6 bits << 5.  */
  A_IMMS6BY32,

  /* Unsigned 6-bit operand.  */
  A_IMMU6,

  /* Signed 10-bit operand.  */
  A_IMMS10,

  /* Signed operand, 10 bits << 0.  */
  A_IMMS10BY1,

  /* Signed operand, 10 bits << 1.  */
  A_IMMS10BY2,

  /* Signed operand, 10 bits << 2.  */
  A_IMMS10BY4,

  /* Signed operand, 10 bits << 3.  */
  A_IMMS10BY8,

  /* Signed 16-bit operand.  */
  A_IMMS16,

  /* Unsigned 16-bit operand.  */
  A_IMMU16,

  /* PC-relative signed operand, 16 bits << 2, for PTA and PTB insns.  */
  A_PCIMMS16BY4,

  /* PC relative signed operand, 16 bits << 2, for PT insns.  Also adjusts
     the opcode to be PTA or PTB.  */
  A_PCIMMS16BY4_PT,
} shmedia_arg_type;

typedef struct {
  char *name;
  shmedia_arg_type arg[4];
  shmedia_nibble_type nibbles[4];
  unsigned long opcode_base;
} shmedia_opcode_info;

extern const shmedia_opcode_info shmedia_table[];

typedef struct {
  int cregno;
  char *name;
} shmedia_creg_info;

extern const shmedia_creg_info shmedia_creg_table[];

#define SHMEDIA_LIKELY_BIT    0x00000200
#define SHMEDIA_PT_OPC 	      0xe8000000
#define SHMEDIA_PTB_BIT	      0x04000000
#define SHMEDIA_PTA_OPC       0xe8000000
#define SHMEDIA_PTB_OPC       0xec000000

/* Note that this is ptrel/u.  "Or" in SHMEDIA_LIKELY_BIT for ptrel/l.  */
#define SHMEDIA_PTREL_OPC     0x6bf50000
#define SHMEDIA_MOVI_OPC      0xcc000000
#define SHMEDIA_SHORI_OPC     0xc8000000
#define SHMEDIA_ADDI_OPC      0xd0000000
#define SHMEDIA_ADD_OPC       0x00090000
#define SHMEDIA_NOP_OPC	      0x6ff0fff0
#define SHMEDIA_TEMP_REG      25

#endif /* _SH64_OPC_INCLUDED_H */
