|  | // -*- C -*- | 
|  | // | 
|  | // Simulator definition for the SmartMIPS extensions. | 
|  | // Copyright (C) 2005-2022 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 3 of the License, 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/>. | 
|  |  | 
|  | 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: | 
|  | { | 
|  | uint64_t res; | 
|  | uint64_t 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: | 
|  | { | 
|  | uint64_t res; | 
|  | uint64_t 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; | 
|  | } | 
|  | } |