X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=sim%2Frx%2Frx.c;h=f6f93966b97278fc3103a33d7822be1622477440;hb=a1d1fa3e417b4bd8e79e2a731f9c6089e2d5f747;hp=c53c27b97e4119c7a74ba309aa126ba7f171cd00;hpb=7b6bb8daaceb9ecf3f42dea57ae82733d6a3b2f6;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/rx/rx.c b/sim/rx/rx.c index c53c27b97e..f6f93966b9 100644 --- a/sim/rx/rx.c +++ b/sim/rx/rx.c @@ -1,6 +1,6 @@ /* rx.c --- opcode semantics for stand-alone RX simulator. -Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +Copyright (C) 2008-2020 Free Software Foundation, Inc. Contributed by Red Hat, Inc. This file is part of the GNU simulators. @@ -23,6 +23,7 @@ along with this program. If not, see . */ #include #include #include +#include "libiberty.h" #include "opcode/rx.h" #include "cpu.h" @@ -80,6 +81,10 @@ static const char * id_names[] = { "RXO_nop", "RXO_nop2", "RXO_nop3", + "RXO_nop4", + "RXO_nop5", + "RXO_nop6", + "RXO_nop7", "RXO_scmpu", "RXO_smovu", @@ -147,9 +152,9 @@ static const char * optype_names[] = { "RbRi" /* [Rb + scale * Ri] */ }; -#define N_RXO (sizeof(id_names)/sizeof(id_names[0])) -#define N_RXT (sizeof(optype_names)/sizeof(optype_names[0])) -#define N_MAP 30 +#define N_RXO ARRAY_SIZE (id_names) +#define N_RXT ARRAY_SIZE (optype_names) +#define N_MAP 90 static unsigned long long benchmark_start_cycle; static unsigned long long benchmark_end_cycle; @@ -406,6 +411,7 @@ get_op (const RX_Opcode_Decoded *rd, int i) put_reg (o->reg, get_reg (o->reg) - size2bytes[o->size]); /* fall through */ case RX_Operand_Postinc: /* [Rn+] */ + case RX_Operand_Zero_Indirect: /* [Rn + 0] */ case RX_Operand_Indirect: /* [Rn + addend] */ case RX_Operand_TwoReg: /* [Rn + scale * R2] */ #ifdef CYCLE_ACCURATE @@ -433,6 +439,7 @@ get_op (const RX_Opcode_Decoded *rd, int i) switch (o->size) { + default: case RX_AnySize: rx_abort (); @@ -473,6 +480,7 @@ get_op (const RX_Opcode_Decoded *rd, int i) to the size. */ switch (o->size) { + default: case RX_AnySize: rx_abort (); @@ -518,6 +526,7 @@ put_op (const RX_Opcode_Decoded *rd, int i, int v) switch (o->size) { + default: case RX_AnySize: if (o->type != RX_Operand_Register) rx_abort (); @@ -574,6 +583,7 @@ put_op (const RX_Opcode_Decoded *rd, int i, int v) put_reg (o->reg, get_reg (o->reg) - size2bytes[o->size]); /* fall through */ case RX_Operand_Postinc: /* [Rn+] */ + case RX_Operand_Zero_Indirect: /* [Rn + 0] */ case RX_Operand_Indirect: /* [Rn + addend] */ case RX_Operand_TwoReg: /* [Rn + scale * R2] */ @@ -597,6 +607,7 @@ put_op (const RX_Opcode_Decoded *rd, int i, int v) switch (o->size) { + default: case RX_AnySize: rx_abort (); @@ -732,8 +743,7 @@ poppc() c = val & carry_mask; \ val OP 1; \ } \ - if (count) \ - set_oszc (val, 4, c); \ + set_oszc (val, 4, c); \ PD (val); \ } @@ -1505,6 +1515,10 @@ decode_opcode () case RXO_nop: case RXO_nop2: case RXO_nop3: + case RXO_nop4: + case RXO_nop5: + case RXO_nop6: + case RXO_nop7: E1; break; @@ -1802,6 +1816,22 @@ decode_opcode () E1; break; + case RXO_satr: + if (FLAG_O && ! FLAG_S) + { + put_reg (6, 0x0); + put_reg (5, 0x7fffffff); + put_reg (4, 0xffffffff); + } + else if (FLAG_O && FLAG_S) + { + put_reg (6, 0xffffffff); + put_reg (5, 0x80000000); + put_reg (4, 0x0); + } + E1; + break; + case RXO_sbb: MATH_OP (-, ! carry); break;