mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-15 04:31:49 +08:00
d81352b8b8
(v850_callback): Declare. (do_format_5): Fix extraction of OP[0]. (sim_size): Remove debugging printf. (sim_set_callbacks): Do something useful. (sim_stop_reason): Gross hacks to get c-torture running. * simops.c: Simplify code for computing targets of bCC insns. Invert 's' bit if 'ov' bit is set for some instructions. Fix 'cy' bit handling for numerous instructions. Make the simulator stop when a halt instruction is encountered. Very crude support for emulated syscalls (trap 0). * v850_sim.h: Include "callback.h" and declare v850_callback. Items in the operand array are 32bits. Fixes & syscall stuff.
102 lines
2.3 KiB
C
102 lines
2.3 KiB
C
#include <stdio.h>
|
|
#include <ctype.h>
|
|
#include "ansidecl.h"
|
|
#include "callback.h"
|
|
#include "opcode/v850.h"
|
|
|
|
extern host_callback *v850_callback;
|
|
|
|
/* FIXME: host defines */
|
|
typedef unsigned char uint8;
|
|
typedef unsigned short uint16;
|
|
typedef unsigned int uint32;
|
|
typedef signed char int8;
|
|
typedef signed short int16;
|
|
typedef signed int int32;
|
|
typedef signed long long int64;
|
|
|
|
/* FIXME: V850 defines */
|
|
typedef uint32 reg_t;
|
|
|
|
struct simops
|
|
{
|
|
long opcode;
|
|
long mask;
|
|
void (*func)();
|
|
int numops;
|
|
int operands[9];
|
|
};
|
|
|
|
struct _state
|
|
{
|
|
reg_t regs[32]; /* general-purpose registers */
|
|
reg_t sregs[32]; /* system regsiters, including psw */
|
|
reg_t pc;
|
|
uint8 *mem;
|
|
int exception;
|
|
} State;
|
|
|
|
extern uint32 OP[4];
|
|
extern struct simops Simops[];
|
|
|
|
#define PC (State.pc)
|
|
|
|
#define PSW_NP 0x80
|
|
#define PSW_EP 0x40
|
|
#define PSW_ID 0x20
|
|
#define PSW_SAT 0x10
|
|
#define PSW_CY 0x8
|
|
#define PSW_OV 0x4
|
|
#define PSW_S 0x2
|
|
#define PSW_Z 0x1
|
|
|
|
#define SEXT3(x) ((((x)&0x7)^(~3))+4)
|
|
|
|
/* sign-extend a 4-bit number */
|
|
#define SEXT4(x) ((((x)&0xf)^(~7))+8)
|
|
|
|
/* sign-extend an 8-bit number */
|
|
#define SEXT8(x) ((((x)&0xff)^(~0x7f))+0x80)
|
|
|
|
/* sign-extend a 16-bit number */
|
|
#define SEXT16(x) ((((x)&0xffff)^(~0x7fff))+0x8000)
|
|
|
|
/* sign-extend a 32-bit number */
|
|
#define SEXT32(x) ((((x)&0xffffffffLL)^(~0x7fffffffLL))+0x80000000LL)
|
|
|
|
/* sign extend a 40 bit number */
|
|
#define SEXT40(x) ((((x)&0xffffffffffLL)^(~0x7fffffffffLL))+0x8000000000LL)
|
|
|
|
/* sign extend a 44 bit number */
|
|
#define SEXT44(x) ((((x)&0xfffffffffffLL)^(~0x7ffffffffffLL))+0x80000000000LL)
|
|
|
|
/* sign extend a 60 bit number */
|
|
#define SEXT60(x) ((((x)&0xfffffffffffffffLL)^(~0x7ffffffffffffffLL))+0x800000000000000LL)
|
|
|
|
#define MAX32 0x7fffffffLL
|
|
#define MIN32 0xff80000000LL
|
|
#define MASK32 0xffffffffLL
|
|
#define MASK40 0xffffffffffLL
|
|
|
|
#define INC_ADDR(x,i) x = ((State.MD && x == MOD_E) ? MOD_S : (x)+(i))
|
|
|
|
#define RB(x) (*((uint8 *)((x)+State.mem)))
|
|
#define SB(addr,data) ( RB(addr) = (data & 0xff))
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
|
|
uint32 get_word PARAMS ((uint8 *));
|
|
uint16 get_half PARAMS ((uint8 *));
|
|
uint8 get_byte PARAMS ((uint8 *));
|
|
#define RLW(x) (*((uint32 *)((x)+State.mem)))
|
|
|
|
#else
|
|
|
|
uint32 get_word PARAMS ((uint8 *));
|
|
uint16 get_half PARAMS ((uint8 *));
|
|
uint8 get_byte PARAMS ((uint8 *));
|
|
|
|
#define RLW(x) get_word((long)(x)+State.mem)
|
|
|
|
#endif /* not WORDS_BIGENDIAN */
|