projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
2005-09-19 David Edelsohn <edelsohn@gnu.org>
[deliverable/binutils-gdb.git]
/
opcodes
/
s390-dis.c
diff --git
a/opcodes/s390-dis.c
b/opcodes/s390-dis.c
index 8745a8943739e10960973b7c07eb7aa71489caa5..9b0a063b93696a5e8c442e7609af42bd548ab37c 100644
(file)
--- a/
opcodes/s390-dis.c
+++ b/
opcodes/s390-dis.c
@@
-1,5
+1,5
@@
/* s390-dis.c -- Disassemble S390 instructions
/* s390-dis.c -- Disassemble S390 instructions
- Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
+ Copyright 2000, 2001, 2002
, 2003, 2005
Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of GDB, GAS and the GNU binutils.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of GDB, GAS and the GNU binutils.
@@
-16,8
+16,8
@@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
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., 5
9 Temple Place - Suite 330
, Boston, MA
- 0211
1-1307
, USA. */
+ Foundation, Inc., 5
1 Franklin Street - Fifth Floor
, Boston, MA
+ 0211
0-1301
, USA. */
#include <stdio.h>
#include "ansidecl.h"
#include <stdio.h>
#include "ansidecl.h"
@@
-29,15
+29,10
@@
static int init_flag = 0;
static int opc_index[256];
static int current_arch_mask = 0;
static int opc_index[256];
static int current_arch_mask = 0;
-static void init_disasm PARAMS ((struct disassemble_info *));
-static unsigned int s390_extract_operand
- PARAMS ((unsigned char *, const struct s390_operand *));
-
/* Set up index table for first opcode byte. */
static void
/* Set up index table for first opcode byte. */
static void
-init_disasm (info)
- struct disassemble_info *info;
+init_disasm (struct disassemble_info *info)
{
const struct s390_opcode *opcode;
const struct s390_opcode *opcode_end;
{
const struct s390_opcode *opcode;
const struct s390_opcode *opcode_end;
@@
-57,7
+52,7
@@
init_disasm (info)
current_arch_mask = 1 << S390_OPCODE_ESA;
break;
case bfd_mach_s390_64:
current_arch_mask = 1 << S390_OPCODE_ESA;
break;
case bfd_mach_s390_64:
- current_arch_mask = 1 << S390_OPCODE_
ESAME
;
+ current_arch_mask = 1 << S390_OPCODE_
ZARCH
;
break;
default:
abort ();
break;
default:
abort ();
@@
-68,9
+63,7
@@
init_disasm (info)
/* Extracts an operand value from an instruction. */
static inline unsigned int
/* Extracts an operand value from an instruction. */
static inline unsigned int
-s390_extract_operand (insn, operand)
- unsigned char *insn;
- const struct s390_operand *operand;
+s390_extract_operand (unsigned char *insn, const struct s390_operand *operand)
{
unsigned int val;
int bits;
{
unsigned int val;
int bits;
@@
-89,6
+82,10
@@
s390_extract_operand (insn, operand)
val >>= -bits;
val &= ((1U << (operand->bits - 1)) << 1) - 1;
val >>= -bits;
val &= ((1U << (operand->bits - 1)) << 1) - 1;
+ /* Check for special long displacement case. */
+ if (operand->bits == 20 && operand->shift == 20)
+ val = (val & 0xff) << 12 | (val & 0xfff00) >> 8;
+
/* Sign extend value if the operand is signed or pc relative. */
if ((operand->flags & (S390_OPERAND_SIGNED | S390_OPERAND_PCREL))
&& (val & (1U << (operand->bits - 1))))
/* Sign extend value if the operand is signed or pc relative. */
if ((operand->flags & (S390_OPERAND_SIGNED | S390_OPERAND_PCREL))
&& (val & (1U << (operand->bits - 1))))
@@
-98,7
+95,7
@@
s390_extract_operand (insn, operand)
if (operand->flags & S390_OPERAND_PCREL)
val <<= 1;
if (operand->flags & S390_OPERAND_PCREL)
val <<= 1;
- /* Length x in an instructions has real length x
+
1. */
+ /* Length x in an instructions has real length x
+
1. */
if (operand->flags & S390_OPERAND_LENGTH)
val++;
return val;
if (operand->flags & S390_OPERAND_LENGTH)
val++;
return val;
@@
-107,9
+104,7
@@
s390_extract_operand (insn, operand)
/* Print a S390 instruction. */
int
/* Print a S390 instruction. */
int
-print_insn_s390 (memaddr, info)
- bfd_vma memaddr;
- struct disassemble_info *info;
+print_insn_s390 (bfd_vma memaddr, struct disassemble_info *info)
{
bfd_byte buffer[6];
const struct s390_opcode *opcode;
{
bfd_byte buffer[6];
const struct s390_opcode *opcode;
@@
-161,7
+156,7
@@
print_insn_s390 (memaddr, info)
const unsigned char *opindex;
/* Check architecture. */
const unsigned char *opindex;
/* Check architecture. */
- if (!(opcode->
architecture
& current_arch_mask))
+ if (!(opcode->
modes
& current_arch_mask))
continue;
/* Check signature of the opcode. */
if ((buffer[1] & opcode->mask[1]) != opcode->opcode[1]
continue;
/* Check signature of the opcode. */
if ((buffer[1] & opcode->mask[1]) != opcode->opcode[1]
@@
-211,7
+206,7
@@
print_insn_s390 (memaddr, info)
else if (operand->flags & S390_OPERAND_SIGNED)
(*info->fprintf_func) (info->stream, "%i", (int) value);
else
else if (operand->flags & S390_OPERAND_SIGNED)
(*info->fprintf_func) (info->stream, "%i", (int) value);
else
- (*info->fprintf_func) (info->stream, "%
i
", value);
+ (*info->fprintf_func) (info->stream, "%
u
", value);
if (operand->flags & S390_OPERAND_DISP)
{
if (operand->flags & S390_OPERAND_DISP)
{
This page took
0.024942 seconds
and
4
git commands to generate.