| // -*- C -*- | |
| // Simulator definition for the MIPS MDMX ASE. | |
| // Copyright (C) 2002-2024 Free Software Foundation, Inc. | |
| // Contributed by Ed Satterthwaite and Chris Demetriou, of Broadcom | |
| // Corporation (SiByte). | |
| // | |
| // 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/>. | |
| // Reference: MIPS64 Architecture Volume IV-b: | |
| // The MDMX Application-Specific Extension | |
| // Notes on "format selectors" (FMTSEL): | |
| // | |
| // A selector with final bit 0 indicates OB format. | |
| // A selector with final bits 01 indicates QH format. | |
| // A selector with final bits 11 has UNPREDICTABLE result per the spec. | |
| // | |
| // Similarly, for the single-bit fields which differentiate between | |
| // formats (FMTOP), 0 is OB format and 1 is QH format. | |
| // If you change this file to add instructions, please make sure that model | |
| // "sb1" configurations still build, and that you've added no new | |
| // instructions to the "sb1" model. | |
| // Helper: | |
| // | |
| // Check whether MDMX is usable, and if not signal an appropriate exception. | |
| // | |
| :function:::void:check_mdmx:instruction_word insn | |
| *mdmx: | |
| { | |
| if (! COP_Usable (1)) | |
| SignalExceptionCoProcessorUnusable (1); | |
| if ((SR & (status_MX|status_FR)) != (status_MX|status_FR)) | |
| SignalExceptionMDMX (); | |
| check_u64 (SD_, insn); | |
| } | |
| // Helper: | |
| // | |
| // Check whether a given MDMX format selector indicates a valid and usable | |
| // format, and if not signal an appropriate exception. | |
| // | |
| :function:::int:check_mdmx_fmtsel:instruction_word insn, int fmtsel | |
| *mdmx: | |
| { | |
| switch (fmtsel & 0x03) | |
| { | |
| case 0x00: /* ob */ | |
| case 0x02: | |
| case 0x01: /* qh */ | |
| return 1; | |
| case 0x03: /* UNPREDICTABLE */ | |
| SignalException (ReservedInstruction, insn); | |
| return 0; | |
| } | |
| return 0; | |
| } | |
| // Helper: | |
| // | |
| // Check whether a given MDMX format bit indicates a valid and usable | |
| // format, and if not signal an appropriate exception. | |
| // | |
| :function:::int:check_mdmx_fmtop:instruction_word insn, int fmtop | |
| *mdmx: | |
| { | |
| switch (fmtop & 0x01) | |
| { | |
| case 0x00: /* ob */ | |
| case 0x01: /* qh */ | |
| return 1; | |
| } | |
| return 0; | |
| } | |
| :%s::::FMTSEL:int fmtsel | |
| *mdmx: | |
| *sb1: | |
| { | |
| if ((fmtsel & 0x1) == 0) | |
| return "ob"; | |
| else if ((fmtsel & 0x3) == 1) | |
| return "qh"; | |
| else | |
| return "?"; | |
| } | |
| :%s::::FMTOP:int fmtop | |
| *mdmx: | |
| *sb1: | |
| { | |
| switch (fmtop) | |
| { | |
| case 0: return "ob"; | |
| case 1: return "qh"; | |
| default: return "?"; | |
| } | |
| } | |
| :%s::::SHOP:int shop | |
| *mdmx: | |
| *sb1: | |
| { | |
| if ((shop & 0x11) == 0x00) | |
| switch ((shop >> 1) & 0x07) | |
| { | |
| case 3: return "upsl.ob"; | |
| case 4: return "pach.ob"; | |
| case 6: return "mixh.ob"; | |
| case 7: return "mixl.ob"; | |
| default: return "?"; | |
| } | |
| else if ((shop & 0x03) == 0x01) | |
| switch ((shop >> 2) & 0x07) | |
| { | |
| case 0: return "mixh.qh"; | |
| case 1: return "mixl.qh"; | |
| case 2: return "pach.qh"; | |
| case 4: return "bfla.qh"; | |
| case 6: return "repa.qh"; | |
| case 7: return "repb.qh"; | |
| default: return "?"; | |
| } | |
| else | |
| return "?"; | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,5.VD,001011:MDMX:64::ADD.fmt | |
| "add.%s<FMTSEL> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_Add(ValueFPR(VS,fmt_mdmx),VT,FMTSEL)); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,0,0000,110111:MDMX:64::ADDA.fmt | |
| "adda.%s<FMTSEL> v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| MX_AddA(ValueFPR(VS,fmt_mdmx),VT,FMTSEL); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,1,0000,110111:MDMX:64::ADDL.fmt | |
| "addl.%s<FMTSEL> v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| MX_AddL(ValueFPR(VS,fmt_mdmx),VT,FMTSEL); | |
| } | |
| 011110,00,3.IMM,5.VT,5.VS,5.VD,0110,1.FMTOP,0:MDMX:64::ALNI.fmt | |
| "alni.%s<FMTOP> v<VD>, v<VS>, v<VT>, <IMM>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| uint64_t result; | |
| int s; | |
| check_mdmx (SD_, instruction_0); | |
| check_mdmx_fmtop (SD_, instruction_0, FMTOP); | |
| s = (IMM << 3); | |
| result = ValueFPR(VS,fmt_mdmx) << s; | |
| if (s != 0) // x86 gcc treats >> 64 as >> 0 | |
| result |= ValueFPR(VT,fmt_mdmx) >> (64 - s); | |
| StoreFPR(VD,fmt_mdmx,result); | |
| } | |
| 011110,5.RS,5.VT,5.VS,5.VD,0110,1.FMTOP,1:MDMX:64::ALNV.fmt | |
| "alnv.%s<FMTOP> v<VD>, v<VS>, v<VT>, r<RS>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| uint64_t result; | |
| int s; | |
| check_mdmx (SD_, instruction_0); | |
| check_mdmx_fmtop (SD_, instruction_0, FMTOP); | |
| s = ((GPR[RS] & 0x7) << 3); | |
| result = ValueFPR(VS,fmt_mdmx) << s; | |
| if (s != 0) // x86 gcc treats >> 64 as >> 0 | |
| result |= ValueFPR(VT,fmt_mdmx) >> (64 - s); | |
| StoreFPR(VD,fmt_mdmx,result); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,5.VD,001100:MDMX:64::AND.fmt | |
| "and.%s<FMTSEL> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_And(ValueFPR(VS,fmt_mdmx),VT,FMTSEL)); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,00000,000001:MDMX:64::C.EQ.fmt | |
| "c.eq.%s<FMTSEL> v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| MX_Comp(ValueFPR(VS,fmt_mdmx),MX_C_EQ,VT,FMTSEL); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,00000,000101:MDMX:64::C.LE.fmt | |
| "c.le.%s<FMTSEL> v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| MX_Comp(ValueFPR(VS,fmt_mdmx),MX_C_LT|MX_C_EQ,VT,FMTSEL); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,00000,000100:MDMX:64::C.LT.fmt | |
| "c.lt.%s<FMTSEL> v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| MX_Comp(ValueFPR(VS,fmt_mdmx),MX_C_LT,VT,FMTSEL); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,5.VD,000111:MDMX:64::MAX.fmt | |
| "max.%s<FMTSEL> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_Max(ValueFPR(VS,fmt_mdmx),VT,FMTSEL)); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,5.VD,000110:MDMX:64::MIN.fmt | |
| "min.%s<FMTSEL> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_Min(ValueFPR(VS,fmt_mdmx),VT,FMTSEL)); | |
| } | |
| 011110,3.SEL,01,5.VT,5.VS,5.VD,000000:MDMX:64::MSGN.QH | |
| "msgn.qh v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| StoreFPR(VD,fmt_mdmx,MX_Msgn(ValueFPR(VS,fmt_mdmx),VT,qh_fmtsel(SEL))); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,5.VD,110000:MDMX:64::MUL.fmt | |
| "mul.%s<FMTSEL> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_Mul(ValueFPR(VS,fmt_mdmx),VT,FMTSEL)); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,0,0000,110011:MDMX:64::MULA.fmt | |
| "mula.%s<FMTSEL> v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| MX_MulA(ValueFPR(VS,fmt_mdmx),VT,FMTSEL); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,1,0000,110011:MDMX:64::MULL.fmt | |
| "mull.%s<FMTSEL> v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| MX_MulL(ValueFPR(VS,fmt_mdmx),VT,FMTSEL); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,0,0000,110010:MDMX:64::MULS.fmt | |
| "muls.%s<FMTSEL> v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| MX_MulS(ValueFPR(VS,fmt_mdmx),VT,FMTSEL); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,1,0000,110010:MDMX:64::MULSL.fmt | |
| "mulsl.%s<FMTSEL> v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| MX_MulSL(ValueFPR(VS,fmt_mdmx),VT,FMTSEL); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,5.VD,001111:MDMX:64::NOR.fmt | |
| "nor.%s<FMTSEL> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_Nor(ValueFPR(VS,fmt_mdmx),VT,FMTSEL)); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,5.VD,001110:MDMX:64::OR.fmt | |
| "or.%s<FMTSEL> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_Or(ValueFPR(VS,fmt_mdmx),VT,FMTSEL)); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,5.VD,000010:MDMX:64::PICKF.fmt | |
| "pickf.%s<FMTSEL> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_Pick(0,ValueFPR(VS,fmt_mdmx),VT,FMTSEL)); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,5.VD,000011:MDMX:64::PICKT.fmt | |
| "pickt.%s<FMTSEL> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_Pick(1,ValueFPR(VS,fmt_mdmx),VT,FMTSEL)); | |
| } | |
| 011110,1000,1.FMTOP,00000,00000,5.VD,111111:MDMX:64::RACH.fmt | |
| "rach.%s<FMTOP> v<VD>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| check_mdmx_fmtop (SD_, instruction_0, FMTOP); | |
| StoreFPR(VD,fmt_mdmx,MX_RAC(MX_RAC_H,FMTOP)); | |
| } | |
| 011110,0000,1.FMTOP,00000,00000,5.VD,111111:MDMX:64::RACL.fmt | |
| "racl.%s<FMTOP> v<VD>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| check_mdmx_fmtop (SD_, instruction_0, FMTOP); | |
| StoreFPR(VD,fmt_mdmx,MX_RAC(MX_RAC_L,FMTOP)); | |
| } | |
| 011110,0100,1.FMTOP,00000,00000,5.VD,111111:MDMX:64::RACM.fmt | |
| "racm.%s<FMTOP> v<VD>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| check_mdmx_fmtop (SD_, instruction_0, FMTOP); | |
| StoreFPR(VD,fmt_mdmx,MX_RAC(MX_RAC_M,FMTOP)); | |
| } | |
| 011110,3.SEL,01,5.VT,00000,5.VD,100101:MDMX:64::RNAS.QH | |
| "rnas.qh v<VD>, v<VT>" | |
| *mdmx: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| StoreFPR(VD,fmt_mdmx,MX_RNAS(VT,qh_fmtsel(SEL))); | |
| } | |
| 011110,5.FMTSEL,5.VT,00000,5.VD,100001:MDMX:64::RNAU.fmt | |
| "rnau.%s<FMTSEL> v<VD>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_RNAU(VT,FMTSEL)); | |
| } | |
| 011110,3.SEL,01,5.VT,00000,5.VD,100110:MDMX:64::RNES.QH | |
| "rnes.qh v<VD>, v<VT>" | |
| *mdmx: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| StoreFPR(VD,fmt_mdmx,MX_RNES(VT,qh_fmtsel(SEL))); | |
| } | |
| 011110,5.FMTSEL,5.VT,00000,5.VD,100010:MDMX:64::RNEU.fmt | |
| "rneu.%s<FMTSEL> v<VD>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_RNEU(VT,FMTSEL)); | |
| } | |
| 011110,3.SEL,01,5.VT,00000,5.VD,100100:MDMX:64::RZS.QH | |
| "rzs.qh v<VD>, v<VT>" | |
| *mdmx: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| StoreFPR(VD,fmt_mdmx,MX_RZS(VT,qh_fmtsel(SEL))); | |
| } | |
| 011110,5.FMTSEL,5.VT,00000,5.VD,100000:MDMX:64::RZU.fmt | |
| "rzu.%s<FMTSEL> v<VD>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_RZU(VT,FMTSEL)); | |
| } | |
| 011110,5.SHOP,5.VT,5.VS,5.VD,011111:MDMX:64::SHFL.op.fmt | |
| "shfl.%s<SHOP> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, SHOP)) | |
| StoreFPR(VD,fmt_mdmx,MX_SHFL(SHOP,ValueFPR(VS,fmt_mdmx),ValueFPR(VT,fmt_mdmx))); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,5.VD,010000:MDMX:64::SLL.fmt | |
| "sll.%s<FMTSEL> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_ShiftLeftLogical(ValueFPR(VS,fmt_mdmx),VT,FMTSEL)); | |
| } | |
| 011110,3.SEL,01,5.VT,5.VS,5.VD,010011:MDMX:64::SRA.QH | |
| "sra.qh v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| StoreFPR(VD,fmt_mdmx,MX_ShiftRightArith(ValueFPR(VS,fmt_mdmx),VT,qh_fmtsel(SEL))); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,5.VD,010010:MDMX:64::SRL.fmt | |
| "srl.%s<FMTSEL> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_ShiftRightLogical(ValueFPR(VS,fmt_mdmx),VT,FMTSEL)); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,5.VD,001010:MDMX:64::SUB.fmt | |
| "sub.%s<FMTSEL> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_Sub(ValueFPR(VS,fmt_mdmx),VT,FMTSEL)); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,0,0000,110110:MDMX:64::SUBA.fmt | |
| "suba.%s<FMTSEL> v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| MX_SubA(ValueFPR(VS,fmt_mdmx),VT,FMTSEL); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,1,0000,110110:MDMX:64::SUBL.fmt | |
| "subl.%s<FMTSEL> v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| MX_SubL(ValueFPR(VS,fmt_mdmx),VT,FMTSEL); | |
| } | |
| 011110,1000,1.FMTOP,00000,5.VS,00000,111110:MDMX:64::WACH.fmt | |
| "wach.%s<FMTOP> v<VS>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| check_mdmx_fmtop (SD_, instruction_0, FMTOP); | |
| MX_WACH(FMTOP,ValueFPR(VS,fmt_mdmx)); | |
| } | |
| 011110,0000,1.FMTOP,5.VT,5.VS,00000,111110:MDMX:64::WACL.fmt | |
| "wacl.%s<FMTOP> v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| check_mdmx_fmtop (SD_, instruction_0, FMTOP); | |
| MX_WACL(FMTOP,ValueFPR(VS,fmt_mdmx),ValueFPR(VT,fmt_mdmx)); | |
| } | |
| 011110,5.FMTSEL,5.VT,5.VS,5.VD,001101:MDMX:64::XOR.fmt | |
| "xor.%s<FMTSEL> v<VD>, v<VS>, v<VT>" | |
| *mdmx: | |
| *sb1: | |
| { | |
| check_mdmx (SD_, instruction_0); | |
| if (check_mdmx_fmtsel (SD_, instruction_0, FMTSEL)) | |
| StoreFPR(VD,fmt_mdmx,MX_Xor(ValueFPR(VS,fmt_mdmx),VT,FMTSEL)); | |
| } |