xref: /netbsd-src/external/gpl3/gdb.old/dist/sim/mips/smartmips.igen (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1// -*- C -*-
2//
3// Simulator definition for the SmartMIPS extensions.
4// Copyright (C) 2005-2023 Free Software Foundation, Inc.
5// Contributed by Nigel Stephens (nigel@mips.com) and
6//                David Ung (davidu@mips.com) of MIPS Technologies.
7//
8// This file is part of GDB, the GNU debugger.
9//
10// This program is free software; you can redistribute it and/or modify
11// it under the terms of the GNU General Public License as published by
12// the Free Software Foundation; either version 3 of the License, or
13// (at your option) any later version.
14//
15// This program is distributed in the hope that it will be useful,
16// but WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
23011100,5.BASE,5.INDEX,5.RD,00010,001000:SPECIAL:32::LWXS
24"lwxs r<RD>, <INDEX>(r<BASE>)"
25*smartmips:
26{
27  GPR[RD] = EXTEND32 (do_load(SD_, AccessLength_WORD, GPR[BASE], GPR[INDEX]<<2));
28}
29
30011100,5.RS,5.RT,00000,10001,000001:SPECIAL:32::MADDP
31"maddp r<RS>, r<RT>"
32*smartmips:
33{
34  uint64_t res;
35  uint64_t rs, rt;
36  int i;
37
38  check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
39  TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
40
41  res = 0;
42  rs = GPR[RS];
43  rt = GPR[RT];
44  for (i = 0; i < 32; i++)
45  {
46      if (rs & 1)
47	  res ^= rt;
48      rs >>= 1;
49      rt <<= 1;
50  }
51  LO ^= EXTEND32 (VL4_8 (res));
52  HI ^= EXTEND32 (VH4_8 (res));
53  TRACE_ALU_RESULT2 (HI, LO);
54}
55
56
57000000,0000000000,5.RD,00001,010010:SPECIAL:32::MFLHXU
58"mflhxu r<RD>"
59*smartmips:
60{
61  check_mf_hilo (SD_, HIHISTORY, LOHISTORY);
62  TRACE_ALU_INPUT3 (ACX,HI,LO);
63  GPR[RD] = LO;
64  LO = HI;
65  HI = ACX;
66  ACX = 0;
67  TRACE_ALU_RESULT4 (ACX,HI,LO,GPR[RD]);
68}
69
70000000,5.RS,000000000000001,010011:SPECIAL:32::MTLHX
71"mtlhx r<RS>"
72*smartmips:
73{
74  check_mf_hilo (SD_, HIHISTORY, LOHISTORY);
75  TRACE_ALU_INPUT3 (HI,LO,GPR[RS]);
76  ACX = HI;
77  HI = LO;
78  LO = GPR[RS];
79  TRACE_ALU_RESULT4 (ACX,HI,LO,GPR[RS]);
80}
81
82000000,5.RS,5.RT,00000,10001,011001:SPECIAL:32::MULTP
83"multp r<RS>, r<RT>"
84*smartmips:
85{
86  uint64_t res;
87  uint64_t rs, rt;
88  int i;
89  check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
90  TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
91
92  res = 0;
93  rs = GPR[RS];
94  rt = GPR[RT];
95  for (i = 0; i < 32; i++)
96  {
97      if (rs & 1)
98	  res ^= rt;
99      rs >>= 1;
100      rt <<= 1;
101  }
102  LO = EXTEND32 (VL4_8 (res));
103  HI = EXTEND32 (VH4_8 (res));
104  ACX = 0;
105  TRACE_ALU_RESULT2 (HI, LO);
106}
107
108011100,5.RS,5.RT,00000,10010,000001:SPECIAL:32::PPERM
109"pperm r<RS>, r<RT>"
110*smartmips:
111{
112  int i;
113  ACX = (ACX << 6) | MSEXTRACTED(HI,26,31);
114  HI = EXTEND32 ((HI << 6) | MSEXTRACTED(LO,26,31));
115  LO = EXTEND32 (LO << 6);
116  for (i = 0; i < 6; i++) {
117    int sbit = 5*i;
118    int ebit = sbit + 4;
119    int tbit = EXTRACTED(GPR[RT],sbit,ebit);
120    LO |= MSEXTRACTED(GPR[RS],tbit,tbit) << i;
121  }
122}
123