| /* Simulation code for the CR16 processor. |
| Copyright (C) 2008-2012 Free Software Foundation, Inc. |
| Contributed by M Ranga Swami Reddy <MR.Swami.Reddy@nsc.com> |
| |
| This file is part of GDB, the GNU debugger. |
| |
| This program 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. |
| |
| This program 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 program. If not, see <http://www.gnu.org/licenses/>. */ |
| |
| |
| /* If we're being compiled as a .c file, rather than being included in |
| cr16_sim.h, then ENDIAN_INLINE won't be defined yet. */ |
| |
| #ifndef ENDIAN_INLINE |
| #define NO_ENDIAN_INLINE |
| #include "cr16_sim.h" |
| #define ENDIAN_INLINE |
| #endif |
| |
| ENDIAN_INLINE uint16 |
| get_word (x) |
| uint8 *x; |
| { |
| return *(uint16 *)x; |
| } |
| |
| ENDIAN_INLINE uint32 |
| get_longword (x) |
| uint8 *x; |
| { |
| return (((uint32) *(uint16 *)x) << 16) | ((uint32) *(uint16 *)(x+2)); |
| } |
| |
| ENDIAN_INLINE int64 |
| get_longlong (x) |
| uint8 *x; |
| { |
| uint32 top = get_longword (x); |
| uint32 bottom = get_longword (x+4); |
| return (((int64)top)<<32) | (int64)bottom; |
| } |
| |
| ENDIAN_INLINE void |
| write_word (addr, data) |
| uint8 *addr; |
| uint16 data; |
| { |
| addr[1] = (data >> 8) & 0xff; |
| addr[0] = data & 0xff; |
| |
| } |
| |
| ENDIAN_INLINE void |
| write_longword (addr, data) |
| uint8 *addr; |
| uint32 data; |
| { |
| *(uint16 *)(addr + 2) = (uint16)(data >> 16); |
| *(uint16 *)(addr) = (uint16)data; |
| } |
| |
| ENDIAN_INLINE void |
| write_longlong (addr, data) |
| uint8 *addr; |
| int64 data; |
| { |
| write_longword (addr+4, (uint32)(data >> 32)); |
| write_longword (addr, (uint32)data); |
| } |