Browse Source
sim_igen_machine. * configure: Regenerate. * mips.igen (model): Add smartmips. (MADDU): Increment ACX if carry. (do_mult): Clear ACX. (ROR,RORV): Add smartmips. (include): Include smartmips.igen. * sim-main.h (ACX): Set to REGISTERS[89]. * smartmips.igen: New file.gdb_6_6-branch
5 changed files with 146 additions and 2 deletions
@ -0,0 +1,123 @@ |
|||
// -*- C -*- |
|||
// |
|||
// Simulator definition for the SmartMIPS extensions. |
|||
// Copyright (C) 2005 Free Software Foundation, Inc. |
|||
// Contributed by Nigel Stephens (nigel@mips.com) and |
|||
// David Ung (davidu@mips.com) of MIPS Technologies. |
|||
// |
|||
// 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 2, 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, write to the Free Software Foundation, Inc., |
|||
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|||
|
|||
011100,5.BASE,5.INDEX,5.RD,00010,001000:SPECIAL:32::LWXS |
|||
"lwxs r<RD>, <INDEX>(r<BASE>)" |
|||
*smartmips: |
|||
{ |
|||
GPR[RD] = EXTEND32 (do_load(SD_, AccessLength_WORD, GPR[BASE], GPR[INDEX]<<2)); |
|||
} |
|||
|
|||
011100,5.RS,5.RT,00000,10001,000001:SPECIAL:32::MADDP |
|||
"maddp r<RS>, r<RT>" |
|||
*smartmips: |
|||
{ |
|||
unsigned64 res; |
|||
unsigned64 rs, rt; |
|||
int i; |
|||
|
|||
check_mult_hilo (SD_, HIHISTORY, LOHISTORY); |
|||
TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); |
|||
|
|||
res = 0; |
|||
rs = GPR[RS]; |
|||
rt = GPR[RT]; |
|||
for (i = 0; i < 32; i++) |
|||
{ |
|||
if (rs & 1) |
|||
res ^= rt; |
|||
rs >>= 1; |
|||
rt <<= 1; |
|||
} |
|||
LO ^= EXTEND32 (VL4_8 (res)); |
|||
HI ^= EXTEND32 (VH4_8 (res)); |
|||
TRACE_ALU_RESULT2 (HI, LO); |
|||
} |
|||
|
|||
|
|||
000000,0000000000,5.RD,00001,010010:SPECIAL:32::MFLHXU |
|||
"mflhxu r<RD>" |
|||
*smartmips: |
|||
{ |
|||
check_mf_hilo (SD_, HIHISTORY, LOHISTORY); |
|||
TRACE_ALU_INPUT3 (ACX,HI,LO); |
|||
GPR[RD] = LO; |
|||
LO = HI; |
|||
HI = ACX; |
|||
ACX = 0; |
|||
TRACE_ALU_RESULT4 (ACX,HI,LO,GPR[RD]); |
|||
} |
|||
|
|||
000000,5.RS,000000000000001,010011:SPECIAL:32::MTLHX |
|||
"mtlhx r<RS>" |
|||
*smartmips: |
|||
{ |
|||
check_mf_hilo (SD_, HIHISTORY, LOHISTORY); |
|||
TRACE_ALU_INPUT3 (HI,LO,GPR[RS]); |
|||
ACX = HI; |
|||
HI = LO; |
|||
LO = GPR[RS]; |
|||
TRACE_ALU_RESULT4 (ACX,HI,LO,GPR[RS]); |
|||
} |
|||
|
|||
000000,5.RS,5.RT,00000,10001,011001:SPECIAL:32::MULTP |
|||
"multp r<RS>, r<RT>" |
|||
*smartmips: |
|||
{ |
|||
unsigned64 res; |
|||
unsigned64 rs, rt; |
|||
int i; |
|||
check_mult_hilo (SD_, HIHISTORY, LOHISTORY); |
|||
TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); |
|||
|
|||
res = 0; |
|||
rs = GPR[RS]; |
|||
rt = GPR[RT]; |
|||
for (i = 0; i < 32; i++) |
|||
{ |
|||
if (rs & 1) |
|||
res ^= rt; |
|||
rs >>= 1; |
|||
rt <<= 1; |
|||
} |
|||
LO = EXTEND32 (VL4_8 (res)); |
|||
HI = EXTEND32 (VH4_8 (res)); |
|||
ACX = 0; |
|||
TRACE_ALU_RESULT2 (HI, LO); |
|||
} |
|||
|
|||
011100,5.RS,5.RT,00000,10010,000001:SPECIAL:32::PPERM |
|||
"pperm r<RS>, r<RT>" |
|||
*smartmips: |
|||
{ |
|||
int i; |
|||
ACX = (ACX << 6) | MSEXTRACTED(HI,26,31); |
|||
HI = EXTEND32 ((HI << 6) | MSEXTRACTED(LO,26,31)); |
|||
LO = EXTEND32 (LO << 6); |
|||
for (i = 0; i < 6; i++) { |
|||
int sbit = 5*i; |
|||
int ebit = sbit + 4; |
|||
int tbit = EXTRACTED(GPR[RT],sbit,ebit); |
|||
LO |= MSEXTRACTED(GPR[RS],tbit,tbit) << i; |
|||
} |
|||
} |
|||
Loading…
Reference in new issue