| 110010,26.OFFSET:POOL32X:32::BC |
| "bc <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| NIA = CIA + (EXTEND26 (OFFSET) << 2) + 4; |
| } |
| |
| 111010,26.OFFSET:POOL32X:32::BALC |
| "balc <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| RA = CIA + 4; |
| NIA = CIA + (EXTEND26 (OFFSET) << 2) + 4; |
| } |
| |
| 110110,5.RS!0,21.OFFSET:POOL32X:32::BEQZC |
| "beqzc r<RS>, <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| if (GPR[RS] == 0) |
| NIA = CIA + (EXTEND21 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| |
| 110110,00000,5.RT,16.OFFSET:POOL32X:32::JIC |
| "jic r<RT>, <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| NIA = GPR[RT] + (EXTEND16(OFFSET) << 2); |
| } |
| |
| 111110,5.RS!0,21.OFFSET:POOL32X:32::BNEZC |
| "bnezc r<RS>, <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| if (GPR[RS] != 0) |
| NIA = CIA + (EXTEND21 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| |
| 111110,00000,5.RT,16.OFFSET:POOL32X:32::JIALC |
| "jialc r<RT>, <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| RA = CIA + 4; |
| NIA = GPR[RT] + EXTEND16(OFFSET); |
| } |
| |
| 010110,5.RS,5.RT,16.OFFSET:POOL32X:32::B1xxC |
| "blezc r<RT>, <OFFSET>": RS==0&&RT!=0 |
| "bgezc r<RT>, <OFFSET>":RS!=0&&RS==RT |
| "bgec r<RS>, r<RT>, <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| if (RS == 0 && RT != 0) |
| { |
| //BLEZC |
| if ((signed_word)GPR[RT] <= 0) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| else if (RS != 0 && RS == RT) |
| { |
| //BGEZC |
| if ((signed_word)GPR[RT] >= 0) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| else |
| { |
| //BGEC |
| if ((signed_word) GPR[RS] >= (signed_word) GPR[RT]) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| } |
| |
| 010111,5.RS,5.RT,16.OFFSET:POOL32X:32::B2xxC |
| "bgtzc r<RT>, <OFFSET>":RS==0&&RT!=0 |
| "bltzc r<RT>, <OFFSET>":RS!=0&&RS==RT |
| "bltc r<RS>, r<RT>, <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| if (RS == 0 && RT != 0) |
| { |
| //BGTZC |
| if ((signed_word)GPR[RT] > 0) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| else if (RS != 0 && RS == RT) |
| { |
| //BLTZC |
| if ((signed_word)GPR[RT] < 0) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| else |
| { |
| //BLTC |
| if ((signed_word) GPR[RS] < (signed_word) GPR[RT]) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| } |
| |
| 000110,5.RS,5.RT!0,16.OFFSET:POOL32X:32::B3xxC |
| "blezalc r<RT>, <OFFSET>":RS==0 |
| "bgezalc r<RT>, <OFFSET>":RS!=0&&RS==RT |
| "bgeuc r<RS>, r<RT>, <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| if (RS == 0 && RT != 0) |
| { |
| //BLEZALC |
| RA = CIA + 4; |
| if ((signed_word)GPR[RT] <= 0) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| else if (RS != 0 && RS == RT) |
| { |
| //BGEZALC |
| RA = CIA + 4; |
| if ((signed_word)GPR[RT] >= 0) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| else |
| { |
| //BGEUC |
| if (GPR[RS] >= GPR[RT]) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| } |
| |
| 000111,5.RS,5.RT!0,16.OFFSET:POOL32X:32::B4xxC |
| "bgtzalc r<RT>, <OFFSET>":RS==0 |
| "bltzalc r<RT>, <OFFSET>":RS!=0&&RS==RT |
| "bltuc r<RS>, r<RT>, <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| if (RS == 0 && RT != 0) |
| { |
| //BGTZALC |
| RA = CIA + 4; |
| if ((signed_word)GPR[RT] > 0) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| else if (RS != 0 && RS == RT) |
| { |
| //BLTZALC |
| RA = CIA + 4; |
| if ((signed_word)GPR[RT] < 0) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| else |
| { |
| //BLTUC |
| if (GPR[RS] < GPR[RT]) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| } |
| |
| 001000,5.RS,5.RT,16.OFFSET:POOL32X:32::BxxxC |
| "bovc r<RS>, r<RT>, <OFFSET>":RS>=RT |
| "beqzalc r<RT>, <OFFSET>":RS==0&&RT>RS |
| "beqc r<RS>, r<RT>, <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| if (RS >= RT) |
| { |
| //BOVC |
| ALU32_BEGIN (GPR[RS] & 0x0ffffffff); |
| ALU32_ADD (GPR[RT] & 0x0ffffffff); |
| |
| if (ALU32_HAD_OVERFLOW) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| else if (RS == 0) |
| { |
| RA = CIA + 4; |
| //BEQZALC |
| if (GPR[RT] == 0) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| else |
| { |
| //BEQC |
| if (GPR[RS] == GPR[RT]) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| } |
| |
| 011000,5.RS,5.RT,16.OFFSET:POOL32X:32::BNxxxC |
| "bnvc r<RS>, r<RT>, <OFFSET>":RS>=RT |
| "bnezalc r<RT>, <OFFSET>":RS==0&&RT>RS |
| "bnec r<RS>, r<RT>, <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| if (RS >= RT) |
| { |
| //BNVC |
| ALU32_BEGIN (GPR[RS] & 0x0ffffffff); |
| ALU32_ADD (GPR[RT] & 0x0ffffffff); |
| |
| if (!ALU32_HAD_OVERFLOW) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| else if (RS == 0 && RT > RS) |
| { |
| //BNEZALC |
| RA = CIA + 4; |
| if (GPR[RT] != 0) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| else |
| { |
| //BNEC |
| if (GPR[RT] != GPR[RS]) |
| NIA = CIA + (EXTEND16 (OFFSET) << 2) + 4; |
| else |
| FORBIDDEN_SLOT (); |
| } |
| } |
| |
| :%s::::R6COND:int r6cond |
| { |
| switch (r6cond) |
| { |
| case FP_R6CMP_SAF: |
| return "SAF"; |
| case FP_R6CMP_SUN: |
| return "SUN"; |
| case FP_R6CMP_SOR: |
| return "SOR"; |
| case FP_R6CMP_SEQ: |
| return "SEQ"; |
| case FP_R6CMP_SUNE: |
| return "SUNE"; |
| case FP_R6CMP_SUEQ: |
| return "SUEQ"; |
| case FP_R6CMP_SNE: |
| return "SNE"; |
| case FP_R6CMP_SLT: |
| return "SLT"; |
| case FP_R6CMP_SULT: |
| return "SULT"; |
| case FP_R6CMP_SLE: |
| return "SLE"; |
| case FP_R6CMP_SULE: |
| return "SULE"; |
| case FP_R6CMP_AF: |
| return "AF"; |
| case FP_R6CMP_UN: |
| return "UN"; |
| case FP_R6CMP_OR: |
| return "OR"; |
| case FP_R6CMP_EQ: |
| return "EQ"; |
| case FP_R6CMP_UNE: |
| return "UNE"; |
| case FP_R6CMP_UEQ: |
| return "UEQ"; |
| case FP_R6CMP_NE: |
| return "NE"; |
| case FP_R6CMP_LT: |
| return "LT"; |
| case FP_R6CMP_ULT: |
| return "ULT"; |
| case FP_R6CMP_LE: |
| return "LE"; |
| case FP_R6CMP_ULE: |
| return "ULE"; |
| default: |
| abort (); |
| } |
| } |
| |
| 010001,1010,1.FMT,5.FT,5.FS,5.FD,0,5.R6COND:POOL32X:32,f::CMP.cond.fmt |
| "cmp.%s<R6COND>.%s<FMT> f<FD>, f<FS>, f<FT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| uint64_t result; |
| check_fpu (SD_); |
| TRACE_ALU_INPUT2 (ValueFPR (FS, FMT), ValueFPR (FT, FMT)); |
| |
| result = R6Compare (ValueFPR (FS, FMT), ValueFPR (FT, FMT), FMT, R6COND); |
| StoreFPR (FD, FMT, result); |
| TRACE_ALU_RESULT (result); |
| } |
| |
| 010001,01001,5.FT,16.OFFSET:POOL32X:32,f::BC1EQZ |
| "bc1eqz f<FT>, <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| address_word offset = EXTEND16 (OFFSET) << 2; |
| check_fpu (SD_); |
| TRACE_ALU_INPUT1 (FGR[FT]); |
| if ((FGR[FT] & 0x01) == 0) |
| DELAY_SLOT (NIA + offset); |
| } |
| |
| 010001,01101,5.FT,16.OFFSET:POOL32X:32,f::BC1NEZ |
| "bc1nez f<FT>, <OFFSET>" |
| *mips32r6: |
| *mips64r6: |
| { |
| address_word offset = EXTEND16 (OFFSET) << 2; |
| check_fpu (SD_); |
| TRACE_ALU_INPUT1 (FGR[FT]); |
| if ((FGR[FT] & 0x01) != 0) |
| DELAY_SLOT (NIA + offset); |
| } |
| 010001,1000,1.FMT,5.FT,5.FS,5.FD,011000:POOLX:32,f::MADDF.fmt |
| "maddf.%s<FMT> f<FD>, f<FS>, f<FT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| int fmt = FMT; |
| check_fpu (SD_); |
| check_u64 (SD_, instruction_0); |
| check_fmt_p (SD_, fmt, instruction_0); |
| TRACE_ALU_INPUT3 (FGR[FD], FGR[FS], FGR[FT]); |
| StoreFPR (FD, fmt, FusedMultiplyAdd (ValueFPR (FS, fmt), |
| ValueFPR (FT, fmt), |
| ValueFPR (FD, fmt), fmt)); |
| TRACE_ALU_RESULT (FGR[FD]); |
| } |
| |
| 010001,1000,1.FMT,5.FT,5.FS,5.FD,011001:POOLX:32,f::MSUBF.fmt |
| "msubf.%s<FMT> f<FD>, f<FS>, f<FT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| int fmt = FMT; |
| check_fpu (SD_); |
| check_u64 (SD_, instruction_0); |
| check_fmt_p (SD_, fmt, instruction_0); |
| TRACE_ALU_INPUT3 (FGR[FD], FGR[FS], FGR[FT]); |
| StoreFPR (FD, fmt, FusedMultiplySub (ValueFPR (FS, fmt), |
| ValueFPR (FT, fmt), |
| ValueFPR (FD, fmt), fmt)); |
| TRACE_ALU_RESULT (FGR[FD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,000,2.IMM,000101:SPECIAL:32::LSA |
| "lsa r<RD>, r<RS>, r<RT>, <IMM + 1>" |
| *mips32r6: |
| *mips64r6: |
| { |
| uint32_t t = GPR[RS] << (IMM + 1); |
| GPR[RD] = EXTEND32(GPR[RT] + t); |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,000,2.IMM,010101:SPECIAL:64::DLSA |
| "dlsa r<RD>, r<RS>, r<RT>, <IMM + 1>" |
| *mips64r6: |
| { |
| uint64_t t = GPR[RS] << (IMM + 1); |
| GPR[RD] = GPR[RT] + t; |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 001111,5.RS!0,5.RT,16.IMMEDIATE:POOL32X:32::AUI |
| "aui r<RS>, r<RT>, <IMMEDIATE>" |
| *mips32r6: |
| *mips64r6: |
| { |
| TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE); |
| GPR[RT] = EXTEND32 (GPR[RS] + (EXTEND16 (IMMEDIATE) << 16)); |
| TRACE_ALU_RESULT (GPR[RT]); |
| } |
| |
| 011101,5.RS!0,5.RT,16.IMMEDIATE:POOL32X:64::DAUI |
| "daui r<RS>, r<RT>, <IMMEDIATE>" |
| *mips64r6: |
| { |
| TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE); |
| GPR[RT] = GPR[RS] + (EXTEND16 (IMMEDIATE) << 16); |
| TRACE_ALU_RESULT (GPR[RT]); |
| } |
| |
| 000001,5.RS,00110,16.IMMEDIATE:POOL32X:64::DAHI |
| "dahi r<RS>, <IMMEDIATE>" |
| *mips64r6: |
| { |
| TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE); |
| GPR[RS] = GPR[RS] + (EXTEND16 (IMMEDIATE) << 32); |
| TRACE_ALU_RESULT (GPR[RS]); |
| } |
| |
| 000001,5.RS,11110,16.IMMEDIATE:POOL32X:64::DATI |
| "dati r<RS>, <IMMEDIATE>" |
| *mips64r6: |
| { |
| TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE); |
| GPR[RS] = GPR[RS] + (EXTEND16 (IMMEDIATE) << 48); |
| TRACE_ALU_RESULT (GPR[RS]); |
| } |
| |
| 011111,5.RS,5.RT,5.RD,010,2.IMMEDIATE,100000:POOL32X:32::ALIGN |
| "align r<RD>, r<RS>, r<RT>, <IMMEDIATE>" |
| *mips32r6: |
| *mips64r6: |
| { |
| uint32_t rs = GPR[RS]; |
| uint32_t rt = GPR[RT]; |
| TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); |
| GPR[RD] = EXTEND32 (rs >> 8 * (4 - IMMEDIATE) | rt << 8 * IMMEDIATE); |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 011111,5.RS,5.RT,5.RD,01,3.IMMEDIATE,100100:POOL32X:64::DALIGN |
| "dalign r<RD>, r<RS>, r<RT>, <IMMEDIATE>" |
| *mips64r6: |
| { |
| uint64_t rs = GPR[RS]; |
| uint64_t rt = GPR[RT]; |
| TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); |
| GPR[RD] = rs >> 8 * (8 - IMMEDIATE) | rt << 8 * IMMEDIATE; |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 011111,00000,5.RT,5.RD,00000,100000:POOL32X:32::BITSWAP |
| "bitswap r<RD>, r<RT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| /* Taken from: http://graphics.stanford.edu/~seander/bithacks.html */ |
| uint32_t v = GPR[RT]; |
| |
| TRACE_ALU_INPUT1 (v); |
| v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1); |
| v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2); |
| v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4); |
| GPR[RD] = EXTEND32 (v); |
| TRACE_ALU_RESULT(GPR[RD]); |
| } |
| |
| 011111,00000,5.RT,5.RD,00000,100100:POOL32X:64::DBITSWAP |
| "dbitswap r<RD>, r<RT>" |
| *mips64r6: |
| { |
| /* Taken from: http://graphics.stanford.edu/~seander/bithacks.html */ |
| uint64_t v = GPR[RT]; |
| |
| TRACE_ALU_INPUT1 (v); |
| v = ((v >> 1) & 0x5555555555555555) | ((v & 0x5555555555555555) << 1); |
| v = ((v >> 2) & 0x3333333333333333) | ((v & 0x3333333333333333) << 2); |
| v = ((v >> 4) & 0x0F0F0F0F0F0F0F0F) | ((v & 0x0F0F0F0F0F0F0F0F) << 4); |
| TRACE_ALU_RESULT(v); |
| GPR[RD] = v; |
| } |
| |
| 111011,5.RS,00,19.IMMEDIATE:POOL32X:32::ADDIUPC |
| "addiupc r<RS>, <IMMEDIATE>" |
| *mips32r6: |
| *mips64r6: |
| { |
| TRACE_ALU_INPUT1 (IMMEDIATE); |
| GPR[RS] = loadstore_ea (SD_, CIA, EXTEND19 (IMMEDIATE) << 2); |
| TRACE_ALU_RESULT (GPR[RS]); |
| } |
| |
| 111011,5.RS,11110,16.IMMEDIATE:POOL32X:32::AUIPC |
| "auipc r<RS>, <IMMEDIATE>" |
| *mips32r6: |
| *mips64r6: |
| { |
| TRACE_ALU_INPUT1 (IMMEDIATE); |
| GPR[RS] = loadstore_ea (SD_, CIA, EXTEND32 (IMMEDIATE << 16)); |
| TRACE_ALU_RESULT (GPR[RS]); |
| } |
| |
| 111011,5.RS,11111,16.IMMEDIATE:POOL32X:32::ALUIPC |
| "aluipc r<RS>, <IMMEDIATE>" |
| *mips32r6: |
| *mips64r6: |
| { |
| TRACE_ALU_INPUT1 (IMMEDIATE); |
| GPR[RS] = ~0x0FFFF & loadstore_ea (SD_, CIA, EXTEND32 (IMMEDIATE << 16)); |
| TRACE_ALU_RESULT (GPR[RS]); |
| } |
| |
| 111011,5.RS,01,19.IMMEDIATE:POOL32X:32::LWPC |
| "lwpc r<RS>, <IMMEDIATE>" |
| *mips32r6: |
| *mips64r6: |
| { |
| uint32_t offset = EXTEND19 (IMMEDIATE) << 2; |
| TRACE_ALU_INPUT1 (IMMEDIATE); |
| GPR[RS] = EXTEND32 (do_load (SD_, AccessLength_WORD, CIA, offset)); |
| TRACE_ALU_RESULT (GPR[RS]); |
| } |
| |
| 111011,5.RS,10,19.IMMEDIATE:POOL32X:64::LWUPC |
| "lwupc r<RS>, <IMMEDIATE>" |
| *mips64r6: |
| { |
| uint32_t offset = EXTEND19 (IMMEDIATE) << 2; |
| TRACE_ALU_INPUT1 (CIA + offset); |
| GPR[RS] = do_load (SD_, AccessLength_WORD, CIA, offset); |
| TRACE_ALU_RESULT (GPR[RS]); |
| } |
| |
| 111011,5.RS,110,18.IMMEDIATE:POOL32X:64::LDPC |
| "ldpc r<RS>, <IMMEDIATE>" |
| *mips64r6: |
| { |
| uint32_t offset = EXTEND18 (IMMEDIATE) << 3; |
| TRACE_ALU_INPUT1 (IMMEDIATE); |
| GPR[RS] = do_load (SD_, AccessLength_DOUBLEWORD, CIA, offset); |
| TRACE_ALU_RESULT (GPR[RS]); |
| } |
| 010001,1000,1.FMT,00000,5.FS,5.FD,011010::32,64,f::RINT.fmt |
| "rint.%s<FMT> f<FD>, f<FS>" |
| *mips32r6: |
| *mips64r6: |
| { |
| uint64_t result; |
| int fmt = FMT; |
| check_fpu (SD_); |
| check_u64 (SD_, instruction_0); |
| check_fmt_p (SD_, fmt, instruction_0); |
| TRACE_ALU_INPUT1 (FGR[FS]); |
| RoundToIntegralExact (ValueFPR (FS, fmt), &result, fmt); |
| StoreFPR (FD, fmt, result); |
| TRACE_ALU_RESULT (FGR[FD]); |
| } |
| |
| 010001,1000,1.FMT,00000,5.FS,5.FD,011011::32,64,f::CLASS.fmt |
| "class.%s<FMT> f<FD>, f<FS>" |
| *mips32r6: |
| *mips64r6: |
| { |
| int fmt = FMT; |
| check_fpu (SD_); |
| check_u64 (SD_, instruction_0); |
| check_fmt_p (SD_, fmt, instruction_0); |
| StoreFPR (FD, fmt, Classify (ValueFPR (FS, fmt), fmt)); |
| } |
| |
| 010001,1000,1.FMT,5.FT,5.FS,5.FD,011100::32,64,f::MIN.fmt |
| "min.%s<FMT> f<FD>, f<FS>, f<FT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| int fmt = FMT; |
| check_fpu (SD_); |
| check_u64 (SD_, instruction_0); |
| check_fmt_p (SD_, fmt, instruction_0); |
| TRACE_ALU_INPUT2 (FGR[FS], FGR[FT]); |
| StoreFPR (FD, fmt, Min (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt)); |
| TRACE_ALU_RESULT (FGR[FD]); |
| } |
| |
| 010001,1000,1.FMT,5.FT,5.FS,5.FD,011110::32,64,f::MAX.fmt |
| "max.%s<FMT> f<FD>, f<FS>, f<FT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| int fmt = FMT; |
| check_fpu (SD_); |
| check_u64 (SD_, instruction_0); |
| check_fmt_p (SD_, fmt, instruction_0); |
| TRACE_ALU_INPUT2 (FGR[FS], FGR[FT]); |
| StoreFPR (FD, fmt, Max (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt)); |
| TRACE_ALU_RESULT (FGR[FD]); |
| } |
| |
| 010001,1000,1.FMT,5.FT,5.FS,5.FD,011101::32,64,f::MINA.fmt |
| "mina.%s<FMT> f<FD>, f<FS>, f<FT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| int fmt = FMT; |
| check_fpu (SD_); |
| check_u64 (SD_, instruction_0); |
| check_fmt_p (SD_, fmt, instruction_0); |
| TRACE_ALU_INPUT2 (FGR[FS], FGR[FT]); |
| StoreFPR (FD, fmt, MinA (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt)); |
| TRACE_ALU_RESULT (FGR[FD]); |
| } |
| |
| 010001,1000,1.FMT,5.FT,5.FS,5.FD,011111::32,64,f::MAXA.fmt |
| "maxa.%s<FMT> f<FD>, f<FS>, f<FT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| int fmt = FMT; |
| check_fpu (SD_); |
| check_u64 (SD_, instruction_0); |
| check_fmt_p (SD_, fmt, instruction_0); |
| TRACE_ALU_INPUT2 (FGR[FS], FGR[FT]); |
| StoreFPR (FD, fmt, MaxA (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt)); |
| TRACE_ALU_RESULT (FGR[FD]); |
| } |
| 000000,5.RS,5.RT,5.RD,00010,011000:POOL32X:32::MUL |
| "mul r<RD>, r<RS>, r<RT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| int64_t prod; |
| if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT])) |
| Unpredictable (); |
| TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); |
| prod = ((int64_t)(int32_t) GPR[RS]) |
| * ((int64_t)(int32_t) GPR[RT]); |
| GPR[RD] = EXTEND32 (VL4_8 (prod)); |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00011,011000:POOL32X:32::MUH |
| "muh r<RD>, r<RS>, r<RT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| int64_t prod; |
| if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT])) |
| Unpredictable (); |
| TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); |
| prod = ((int64_t)(int32_t) GPR[RS]) |
| * ((int64_t)(int32_t) GPR[RT]); |
| GPR[RD] = EXTEND32 (VH4_8 (prod)); |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00010,011001:POOL32X:32::MULU |
| "mulu r<RD>, r<RS>, r<RT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| uint64_t prod; |
| if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT])) |
| Unpredictable (); |
| TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); |
| prod = ((uint64_t)(uint32_t) GPR[RS]) |
| * ((uint64_t)(uint32_t) GPR[RT]); |
| GPR[RD] = EXTEND32 (VL4_8 (prod)); |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00011,011001:POOL32X:32::MUHU |
| "muhu r<RD>, r<RS>, r<RT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| uint64_t prod; |
| if (NotWordValue (GPR[RS]) || NotWordValue (GPR[RT])) |
| Unpredictable (); |
| TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); |
| prod = ((uint64_t)(uint32_t) GPR[RS]) |
| * ((uint64_t)(uint32_t) GPR[RT]); |
| GPR[RD] = EXTEND32 (VH4_8 (prod)); |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00010,011010:POOL32X:32::DIV |
| "div r<RD>, r<RS>, r<RT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| int32_t n = GPR[RS]; |
| int32_t d = GPR[RT]; |
| TRACE_ALU_INPUT2 (n,d); |
| if (d == 0) |
| GPR[RD] = EXTEND32 (0x80000000); |
| else if (n == SIGNED32 (0x80000000) && d == -1) |
| GPR[RD] = EXTEND32 (0x80000000); |
| else |
| GPR[RD] = EXTEND32 (n / d); |
| |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00011,011010:POOL32X:32::MOD |
| "mod r<RD>, r<RS>, r<RT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| int32_t n = GPR[RS]; |
| int32_t d = GPR[RT]; |
| TRACE_ALU_INPUT2 (n,d); |
| if (d == 0 || (n == SIGNED32 (0x80000000) && d == -1)) |
| GPR[RD] = EXTEND32 (0); |
| else |
| GPR[RD] = EXTEND32 (n % d); |
| |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00010,011011:POOL32X:32::DIVU |
| "divu r<RD>, r<RS>, r<RT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| uint32_t n = GPR[RS]; |
| uint32_t d = GPR[RT]; |
| TRACE_ALU_INPUT2 (n,d); |
| if (d == 0) |
| GPR[RD] = EXTEND32 (0x80000000); |
| else |
| GPR[RD] = EXTEND32 (n / d); |
| |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00011,011011:POOL32X:32::MODU |
| "modu r<RD>, r<RS>, r<RT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| uint32_t n = GPR[RS]; |
| uint32_t d = GPR[RT]; |
| TRACE_ALU_INPUT2 (n,d); |
| if (d == 0) |
| GPR[RD] = EXTEND32 (0); |
| else |
| GPR[RD] = EXTEND32 (n % d); |
| |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00010,011100:POOL32X:64::DMUL |
| "dmul r<RD>, r<RS>, r<RT>" |
| *mips64r6: |
| { |
| uint64_t lo; |
| uint64_t m00; |
| uint64_t m01; |
| uint64_t m10; |
| uint64_t mid; |
| int sign; |
| uint64_t op1 = GPR[RS]; |
| uint64_t op2 = GPR[RT]; |
| |
| check_u64 (SD_, instruction_0); |
| TRACE_ALU_INPUT2 (op1, op2); |
| /* make signed multiply unsigned */ |
| sign = 0; |
| if ((int64_t) op1 < 0) |
| { |
| op1 = - op1; |
| ++sign; |
| } |
| if ((int64_t) op2 < 0) |
| { |
| op2 = - op2; |
| ++sign; |
| } |
| /* multiply out the sub products */ |
| m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2)); |
| m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2)); |
| m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2)); |
| /* add the products */ |
| mid = ((uint64_t) VH4_8 (m00) |
| + (uint64_t) VL4_8 (m10) |
| + (uint64_t) VL4_8 (m01)); |
| lo = U8_4 (mid, m00); |
| /* fix the sign */ |
| if (sign & 1) |
| lo = -lo; |
| |
| GPR[RD] = lo; |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00011,011100:POOL32X:64::DMUH |
| "dmuh r<RD>, r<RS>, r<RT>" |
| *mips64r6: |
| { |
| uint64_t lo; |
| uint64_t hi; |
| uint64_t m00; |
| uint64_t m01; |
| uint64_t m10; |
| uint64_t m11; |
| uint64_t mid; |
| int sign; |
| uint64_t op1 = GPR[RS]; |
| uint64_t op2 = GPR[RT]; |
| |
| check_u64 (SD_, instruction_0); |
| TRACE_ALU_INPUT2 (op1, op2); |
| /* make signed multiply unsigned */ |
| sign = 0; |
| if ((int64_t) op1 < 0) |
| { |
| op1 = - op1; |
| ++sign; |
| } |
| if ((int64_t) op2 < 0) |
| { |
| op2 = - op2; |
| ++sign; |
| } |
| /* multiply out the 4 sub products */ |
| m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2)); |
| m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2)); |
| m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2)); |
| m11 = ((uint64_t) VH4_8 (op1) * (uint64_t) VH4_8 (op2)); |
| /* add the products */ |
| mid = ((uint64_t) VH4_8 (m00) |
| + (uint64_t) VL4_8 (m10) |
| + (uint64_t) VL4_8 (m01)); |
| lo = U8_4 (mid, m00); |
| hi = (m11 |
| + (uint64_t) VH4_8 (mid) |
| + (uint64_t) VH4_8 (m01) |
| + (uint64_t) VH4_8 (m10)); |
| /* fix the sign */ |
| if (sign & 1) |
| { |
| lo = -lo; |
| if (lo == 0) |
| hi = -hi; |
| else |
| hi = -hi - 1; |
| } |
| |
| GPR[RD] = hi; |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00010,011101:POOL32X:64::DMULU |
| "dmulu r<RD>, r<RS>, r<RT>" |
| *mips64r6: |
| { |
| uint64_t lo; |
| uint64_t m00; |
| uint64_t m01; |
| uint64_t m10; |
| uint64_t mid; |
| uint64_t op1 = GPR[RS]; |
| uint64_t op2 = GPR[RT]; |
| |
| check_u64 (SD_, instruction_0); |
| TRACE_ALU_INPUT2 (op1, op2); |
| /* multiply out the sub products */ |
| m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2)); |
| m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2)); |
| m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2)); |
| /* add the products */ |
| mid = ((uint64_t) VH4_8 (m00) |
| + (uint64_t) VL4_8 (m10) |
| + (uint64_t) VL4_8 (m01)); |
| lo = U8_4 (mid, m00); |
| |
| GPR[RD] = lo; |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00011,011101:POOL32X:64::DMUHU |
| "dmuhu r<RD>, r<RS>, r<RT>" |
| *mips64r6: |
| { |
| uint64_t lo; |
| uint64_t hi; |
| uint64_t m00; |
| uint64_t m01; |
| uint64_t m10; |
| uint64_t m11; |
| uint64_t mid; |
| uint64_t op1 = GPR[RS]; |
| uint64_t op2 = GPR[RT]; |
| |
| check_u64 (SD_, instruction_0); |
| TRACE_ALU_INPUT2 (op1, op2); |
| /* multiply out the 4 sub products */ |
| m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2)); |
| m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2)); |
| m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2)); |
| m11 = ((uint64_t) VH4_8 (op1) * (uint64_t) VH4_8 (op2)); |
| /* add the products */ |
| mid = ((uint64_t) VH4_8 (m00) |
| + (uint64_t) VL4_8 (m10) |
| + (uint64_t) VL4_8 (m01)); |
| lo = U8_4 (mid, m00); |
| hi = (m11 |
| + (uint64_t) VH4_8 (mid) |
| + (uint64_t) VH4_8 (m01) |
| + (uint64_t) VH4_8 (m10)); |
| |
| GPR[RD] = hi; |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00010,011110:POOL32X:64::DDIV |
| "ddiv r<RD>, r<RS>, r<RT>" |
| *mips64r6: |
| { |
| int64_t n = GPR[RS]; |
| int64_t d = GPR[RT]; |
| |
| check_u64 (SD_, instruction_0); |
| TRACE_ALU_INPUT2 (n, d); |
| if (d == 0) |
| GPR[RD] = SIGNED64 (0x8000000000000000); |
| else if (d == -1 && n == SIGNED64 (0x8000000000000000)) |
| GPR[RD] = SIGNED64 (0x8000000000000000); |
| else |
| GPR[RD] = (n / d); |
| |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00011,011110:POOL32X:64::DMOD |
| "dmod r<RD>, r<RS>, r<RT>" |
| *mips64r6: |
| { |
| int64_t n = GPR[RS]; |
| int64_t d = GPR[RT]; |
| |
| check_u64 (SD_, instruction_0); |
| TRACE_ALU_INPUT2 (n, d); |
| if (d == 0 || (d == -1 && n == SIGNED64 (0x8000000000000000))) |
| GPR[RD] = SIGNED64 (0); |
| else |
| GPR[RD] = (n % d); |
| |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00010,011111:POOL32X:64::DDIVU |
| "ddivu r<RD>, r<RS>, r<RT>" |
| *mips64r6: |
| { |
| uint64_t n = GPR[RS]; |
| uint64_t d = GPR[RT]; |
| |
| check_u64 (SD_, instruction_0); |
| TRACE_ALU_INPUT2 (n, d); |
| if (d == 0) |
| GPR[RD] = UNSIGNED64 (0x8000000000000000); |
| else |
| GPR[RD] = (n / d); |
| |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00011,011111:POOL32X:64::DMODU |
| "dmodu r<RD>, r<RS>, r<RT>" |
| *mips64r6: |
| { |
| uint64_t n = GPR[RS]; |
| uint64_t d = GPR[RT]; |
| |
| check_u64 (SD_, instruction_0); |
| TRACE_ALU_INPUT2 (n, d); |
| if (d == 0) |
| GPR[RD] = UNSIGNED64 (0); |
| else |
| GPR[RD] = (n % d); |
| |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 011111,5.BASE,5.RT,9.OFFSET,0,110110:SPECIAL3:32::LL |
| "ll r<RT>, <OFFSET>(r<BASE>)" |
| *mips32r6: |
| *mips64r6: |
| { |
| do_ll (SD_, RT, EXTEND9 (OFFSET), BASE); |
| } |
| |
| 011111,5.BASE,5.RT,5.RD,0000,1,110110:SPECIAL3:32::LLWP |
| "llwp r<RT>, r<RD>, (r<BASE>)" |
| *mips32r6: |
| *mips64r6: |
| { |
| int first, second; |
| int offset; |
| |
| if (RT == BASE) |
| { |
| first = RD; |
| second = RT; |
| offset = BigEndianCPU ? 0 : 4; |
| } |
| else |
| { |
| first = RT; |
| second = RD; |
| offset = BigEndianCPU ? 4 : 0; |
| } |
| |
| do_ll (SD_, first, offset, BASE); |
| do_ll (SD_, second, offset ^ 4, BASE); |
| } |
| |
| |
| 011111,5.BASE,5.RT,9.OFFSET,0,100110:SPECIAL3:32::SC |
| "sc r<RT>, <OFFSET>(r<BASE>)" |
| *mips32r6: |
| *mips64r6: |
| { |
| do_sc (SD_, RT, EXTEND9 (OFFSET), BASE, instruction_0, 1); |
| } |
| |
| 011111,5.BASE,5.RT,9.OFFSET,0,110111:SPECIAL3:64::LLD |
| "lld r<RT>, <OFFSET>(r<BASE>)" |
| *mips64r6: |
| { |
| check_u64 (SD_, instruction_0); |
| do_lld (SD_, RT, EXTEND9 (OFFSET), BASE); |
| } |
| |
| |
| 011111,5.BASE,5.RT,5.RD,0000,1,100110:SPECIAL3:32::SCWP |
| "scwp r<RT>, r<RD>, (r<BASE>)" |
| *mips32r6: |
| *mips64r6: |
| { |
| int offset = BigEndianCPU ? 0 : 4; |
| |
| do_sc (SD_, RD, offset, BASE, instruction_0, 0); |
| do_sc (SD_, RT, offset ^ 4, BASE, instruction_0, 1); |
| } |
| |
| 011111,5.BASE,5.RT,5.RD,0000,1,110111:SPECIAL3:64::LLDP |
| "lldp r<RT>, r<RD>, (r<BASE>)" |
| *mips64r6: |
| { |
| int first, second; |
| int offset; |
| |
| check_u64 (SD_, instruction_0); |
| |
| if (RT == BASE) |
| { |
| first = RD; |
| second = RT; |
| offset = BigEndianCPU ? 0 : 8; |
| } |
| else |
| { |
| first = RT; |
| second = RD; |
| offset = BigEndianCPU ? 8 : 0; |
| } |
| |
| do_lld (SD_, first, offset, BASE); |
| do_lld (SD_, second, offset ^ 8, BASE); |
| } |
| |
| 011111,5.BASE,5.RT,9.OFFSET,0,100111:SPECIAL3:64::SCD |
| "scd r<RT>, <OFFSET>(r<BASE>)" |
| *mips64r6: |
| { |
| check_u64 (SD_, instruction_0); |
| do_scd (SD_, RT, EXTEND9 (OFFSET), BASE, 1); |
| } |
| |
| 011111,5.BASE,5.RT,5.RD,0000,1,100111:SPECIAL3:64::SCDP |
| "scdp r<RT>, r<RD>, (r<BASE>)" |
| *mips64r6: |
| { |
| int offset = BigEndianCPU ? 0 : 8; |
| check_u64 (SD_, instruction_0); |
| |
| do_scd (SD_, RD, offset, BASE, 0); |
| do_scd (SD_, RT, offset ^ 8, BASE, 1); |
| } |
| |
| 011111,5.BASE,5.HINT,9.OFFSET,0,110101:SPECIAL3:32::PREF |
| "pref <HINT>, <OFFSET>(r<BASE>)" |
| *mips32r6: |
| *mips64r6: |
| { |
| do_pref (SD_, HINT, EXTEND9 (OFFSET), BASE); |
| } |
| |
| 011111,5.BASE,5.HINT,9.OFFSET,0,100101:SPECIAL3:32::CACHE |
| "cache <HINT>, <OFFSET>(r<BASE>)" |
| *mips32r6: |
| *mips64r6: |
| { |
| do_cache (SD_, HINT, BASE, EXTEND9 (OFFSET), instruction_0); |
| } |
| |
| |
| 000000,5.RS,00000,5.RD,00001,010000:POOL32X:32::CLZ |
| "clz r<RD>, r<RS>" |
| *mips32r6: |
| *mips64r6: |
| { |
| do_clz (SD_, RD, RS); |
| } |
| |
| 000000,5.RS,00000,5.RD,00001,010001:POOL32X:32::CLO |
| "clo r<RD>, r<RS>" |
| *mips32r6: |
| *mips64r6: |
| { |
| do_clo (SD_, RD, RS); |
| } |
| |
| 000000,5.RS,00000,5.RD,00001,010010:POOL32X:64::DCLZ |
| "dclz r<RD>, r<RS>" |
| *mips64r6: |
| { |
| check_u64 (SD_, instruction_0); |
| do_dclz (SD_, RD, RS); |
| } |
| |
| 000000,5.RS,00000,5.RD,00001,010011:POOL32X:64::DCLO |
| "dclo r<RD>, r<RS>" |
| *mips64r6: |
| { |
| check_u64 (SD_, instruction_0); |
| do_dclo (SD_, RD, RS); |
| } |
| 010001,1000,1.FMT,5.FT,5.FS,5.FD,010000:POOL32X:32,f::SEL.fmt |
| "sel.%s<FMT> f<FD>, f<FS>, f<FT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| check_fpu (SD_); |
| check_fmt_p (SD_, FMT, instruction_0); |
| TRACE_ALU_INPUT3 (FGR[FD], ValueFPR(FS, FMT), ValueFPR(FT, FMT)); |
| if ((FGR[FD] & 0x01) != 0) |
| StoreFPR (FD, FMT, ValueFPR (FT, FMT)); |
| else |
| StoreFPR (FD, FMT, ValueFPR (FS, FMT)); |
| TRACE_ALU_RESULT (ValueFPR(FD, FMT)); |
| } |
| |
| 010001,1000,1.FMT,5.FT,5.FS,5.FD,010100:POOL32X:32,f::SELEQZ.fmt |
| "seleqz.%s<FMT> f<FD>, f<FS>, f<FT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| check_fpu (SD_); |
| check_fmt_p (SD_, FMT, instruction_0); |
| TRACE_ALU_INPUT2 (ValueFPR(FS, FMT), FGR[FT]); |
| if ((FGR[FT] & 0x01) == 0) |
| StoreFPR (FD, FMT, ValueFPR (FS, FMT)); |
| else |
| StoreFPR (FD, FMT, 0); |
| TRACE_ALU_RESULT (ValueFPR(FD, FMT)); |
| } |
| |
| 010001,1000,1.FMT,5.FT,5.FS,5.FD,010111:POOL32X:32,f::SELNEZ.fmt |
| "selnez.%s<FMT> f<FD>, f<FS>, f<FT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| check_fpu (SD_); |
| check_fmt_p (SD_, FMT, instruction_0); |
| TRACE_ALU_INPUT2 (ValueFPR(FS, FMT), FGR[FT]); |
| if ((FGR[FT] & 0x01) == 0) |
| StoreFPR (FD, FMT, 0); |
| else |
| StoreFPR (FD, FMT, ValueFPR (FS, FMT)); |
| TRACE_ALU_RESULT (ValueFPR(FD, FMT)); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00000,110101:POOL32X:32::SELEQZ |
| "seleqz r<RD>, r<RS>, r<RT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); |
| if (GPR[RT] != 0) |
| GPR[RD] = 0; |
| else |
| GPR[RD] = GPR[RS]; |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |
| |
| 000000,5.RS,5.RT,5.RD,00000,110111:POOL32X:32::SELNEZ |
| "selnez r<RD>, r<RS>, r<RT>" |
| *mips32r6: |
| *mips64r6: |
| { |
| TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]); |
| if (GPR[RT] != 0) |
| GPR[RD] = GPR[RS]; |
| else |
| GPR[RD] = 0; |
| TRACE_ALU_RESULT (GPR[RD]); |
| } |