qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 09/35] s390: Disassemble some general-instructio


From: Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH 09/35] s390: Disassemble some general-instruction-extension insns.
Date: Thu, 10 Jun 2010 00:47:43 +0200
User-agent: Mutt/1.5.20 (2009-06-14)

On Fri, Jun 04, 2010 at 12:14:17PM -0700, Richard Henderson wrote:
> The full general-instruction-extension facility was added to binutils
> after the change to GPLv3.  This is not the entire extension, just
> what we're using in TCG.
> 
> Signed-off-by: Richard Henderson <address@hidden>
> ---
>  s390-dis.c |   89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
>  1 files changed, 81 insertions(+), 8 deletions(-)

Thanks, applied.

> diff --git a/s390-dis.c b/s390-dis.c
> index 3d96be0..2eed69b 100644
> --- a/s390-dis.c
> +++ b/s390-dis.c
> @@ -172,6 +172,31 @@ static const struct s390_operand s390_operands[];
>     the instruction may be optional.  */
>  #define S390_OPERAND_OPTIONAL 0x400
>  
> +/* QEMU-ADD */
> +/* ??? Not quite the format the assembler takes, but easy to implement
> +   without recourse to the table generator.  */
> +#define S390_OPERAND_CCODE  0x800
> +
> +static const char s390_ccode_name[16][4] = {
> +    "n",    /* 0000 */
> +    "o",    /* 0001 */
> +    "h",    /* 0010 */
> +    "nle",  /* 0011 */
> +    "l",    /* 0100 */
> +    "nhe",  /* 0101 */
> +    "lh",   /* 0110 */
> +    "ne",   /* 0111 */
> +    "e",    /* 1000 */
> +    "nlh",  /* 1001 */
> +    "he",   /* 1010 */
> +    "nl",   /* 1011 */
> +    "le",   /* 1100 */
> +    "nh",   /* 1101 */
> +    "no",   /* 1110 */
> +    "a"     /* 1111 */
> +};
> +/* QEMU-END */
> +
>  #endif /* S390_H */
>  
>  static int init_flag = 0;
> @@ -325,13 +350,16 @@ print_insn_s390 (bfd_vma memaddr, struct 
> disassemble_info *info)
>           continue;
>  
>         /* The instruction is valid.  */
> -       if (opcode->operands[0] != 0)
> -         (*info->fprintf_func) (info->stream, "%s\t", opcode->name);
> -       else
> -         (*info->fprintf_func) (info->stream, "%s", opcode->name);
> +/* QEMU-MOD */
> +         (*info->fprintf_func) (info->stream, "%s", opcode->name);
> +
> +         if (s390_operands[opcode->operands[0]].flags & S390_OPERAND_CCODE)
> +           separator = 0;
> +         else
> +           separator = '\t';
> +/* QEMU-END */
>  
>         /* Extract the operands.  */
> -       separator = 0;
>         for (opindex = opcode->operands; *opindex != 0; opindex++)
>           {
>             unsigned int value;
> @@ -363,6 +391,15 @@ print_insn_s390 (bfd_vma memaddr, struct 
> disassemble_info *info)
>               (*info->print_address_func) (memaddr + (int) value, info);
>             else if (operand->flags & S390_OPERAND_SIGNED)
>               (*info->fprintf_func) (info->stream, "%i", (int) value);
> +/* QEMU-ADD */
> +              else if (operand->flags & S390_OPERAND_CCODE)
> +                {
> +               (*info->fprintf_func) (info->stream, "%s",
> +                                         s390_ccode_name[(int) value]);
> +                  separator = '\t';
> +                  continue;
> +                }
> +/* QEMU-END */
>             else
>               (*info->fprintf_func) (info->stream, "%u", value);
>  
> @@ -543,8 +580,16 @@ static const struct s390_operand s390_operands[] =
>  #define M_16   42                 /* 4 bit optional mask starting at 16 */
>    { 4, 16, S390_OPERAND_OPTIONAL },
>  #define RO_28  43                 /* optional GPR starting at position 28 */
> -  { 4, 28, (S390_OPERAND_GPR | S390_OPERAND_OPTIONAL) }
> -
> +  { 4, 28, (S390_OPERAND_GPR | S390_OPERAND_OPTIONAL) },
> +
> +/* QEMU-ADD: */
> +#define M4_12 44                  /* 4-bit condition-code starting at 12 */
> +  { 4, 12, S390_OPERAND_CCODE },
> +#define M4_32 45                  /* 4-bit condition-code starting at 32 */
> +  { 4, 32, S390_OPERAND_CCODE },
> +#define I8_32 46                  /* 8 bit signed value starting at 32 */
> +  { 8, 32, S390_OPERAND_SIGNED },
> +/* QEMU-END */
>  };
>  
>  
> @@ -755,6 +800,14 @@ static const struct s390_operand s390_operands[] =
>  #define MASK_S_RD        { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }
>  #define MASK_SSF_RRDRD   { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 }
>  
> +/* QEMU-ADD: */
> +#define INSTR_RIE_MRRP   6, { M4_32,R_8,R_12,J16_16,0,0 }    /* e.g. crj */
> +#define MASK_RIE_MRRP    { 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff }
> +
> +#define INSTR_RIE_MRIP   6, { M4_12,R_8,I8_32,J16_16,0,0 }      /* e.g. cij 
> */
> +#define MASK_RIE_MRIP    { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff }
> +/* QEMU-END */
> +
>  /* The opcode formats table (blueprints for .insn pseudo mnemonic).  */
>  
>  static const struct s390_opcode s390_opformats[] =
> @@ -1092,6 +1145,10 @@ static const struct s390_opcode s390_opcodes[] =
>    { "agfi", OP16(0xc208LL), MASK_RIL_RI, INSTR_RIL_RI, 2, 4},
>    { "slfi", OP16(0xc205LL), MASK_RIL_RU, INSTR_RIL_RU, 2, 4},
>    { "slgfi", OP16(0xc204LL), MASK_RIL_RU, INSTR_RIL_RU, 2, 4},
> +/* QEMU-ADD: */
> +  { "msfi",  OP16(0xc201ll), MASK_RIL_RI, INSTR_RIL_RI, 3, 6},
> +  { "msgfi", OP16(0xc200ll), MASK_RIL_RI, INSTR_RIL_RI, 3, 6},
> +/* QEMU-END */
>    { "jg", OP16(0xc0f4LL), MASK_RIL_0P, INSTR_RIL_0P, 3, 2},
>    { "jgno", OP16(0xc0e4LL), MASK_RIL_0P, INSTR_RIL_0P, 3, 2},
>    { "jgnh", OP16(0xc0d4LL), MASK_RIL_0P, INSTR_RIL_0P, 3, 2},
> @@ -1716,7 +1773,23 @@ static const struct s390_opcode s390_opcodes[] =
>    { "pfpo", OP16(0x010aLL), MASK_E, INSTR_E, 2, 5},
>    { "sckpf", OP16(0x0107LL), MASK_E, INSTR_E, 3, 0},
>    { "upt", OP16(0x0102LL), MASK_E, INSTR_E, 3, 0},
> -  { "pr", OP16(0x0101LL), MASK_E, INSTR_E, 3, 0}
> +  { "pr", OP16(0x0101LL), MASK_E, INSTR_E, 3, 0},
> +
> +/* QEMU-ADD: */
> +  { "crj",   OP48(0xec0000000076LL), MASK_RIE_MRRP, INSTR_RIE_MRRP, 3, 6},
> +  { "cgrj",  OP48(0xec0000000064LL), MASK_RIE_MRRP, INSTR_RIE_MRRP, 3, 6},
> +  { "clrj",  OP48(0xec0000000077LL), MASK_RIE_MRRP, INSTR_RIE_MRRP, 3, 6},
> +  { "clgrj", OP48(0xec0000000065LL), MASK_RIE_MRRP, INSTR_RIE_MRRP, 3, 6},
> +
> +  { "cij",   OP48(0xec000000007eLL), MASK_RIE_MRIP, INSTR_RIE_MRIP, 3, 6},
> +  { "cgij",  OP48(0xec000000007cLL), MASK_RIE_MRIP, INSTR_RIE_MRIP, 3, 6},
> +  { "clij",  OP48(0xec000000007fLL), MASK_RIE_MRIP, INSTR_RIE_MRIP, 3, 6},
> +  { "clgij", OP48(0xec000000007dLL), MASK_RIE_MRIP, INSTR_RIE_MRIP, 3, 6},
> +
> +  { "lrl",   OP16(0xc40dll), MASK_RIL_RP, INSTR_RIL_RP, 3, 6},
> +  { "lgrl",  OP16(0xc408ll), MASK_RIL_RP, INSTR_RIL_RP, 3, 6},
> +  { "lgfrl", OP16(0xc40cll), MASK_RIL_RP, INSTR_RIL_RP, 3, 6},
> +/* QEMU-END */
>  };
>  
>  static const int s390_num_opcodes =
> -- 
> 1.7.0.1
> 
> 
> 

-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
address@hidden                 http://www.aurel32.net



reply via email to

[Prev in Thread] Current Thread [Next in Thread]