| 4645 | class DecodeFPU3 : public DecodeFunc { |
| 4646 | public: |
| 4647 | void decode(DecodeData* data, DecodedOp* op) const override { |
| 4648 | U8 rm = data->fetch8(); |
| 4649 | |
| 4650 | if (rm >= 0xc0) { |
| 4651 | op->reg = E(rm); |
| 4652 | switch ((rm >> 3) & 7) { |
| 4653 | case 0: op->inst = FCMOV_ST0_STj_NCF; break; |
| 4654 | case 1: op->inst = FCMOV_ST0_STj_NZF; break; |
| 4655 | case 2: op->inst = FCMOV_ST0_STj_NCF_AND_NZF; break; |
| 4656 | case 3: op->inst = FCMOV_ST0_STj_NPF; break; |
| 4657 | case 4: |
| 4658 | { |
| 4659 | switch (rm & 7) { |
| 4660 | case 2:op->inst = FNCLEX; break; |
| 4661 | case 3:op->inst = FNINIT; break; |
| 4662 | default:op->inst = Invalid; op->reg = rm; op->imm = data->inst; break; |
| 4663 | } |
| 4664 | break; |
| 4665 | } |
| 4666 | case 5: op->inst = FUCOMI_ST0_STj; break; |
| 4667 | case 6: op->inst = FCOMI_ST0_STj; break; |
| 4668 | default:op->inst = Invalid; op->reg = rm; op->imm = data->inst; break; |
| 4669 | } |
| 4670 | } else { |
| 4671 | decodeEa(data, op, rm); |
| 4672 | switch ((rm >> 3) & 7) { |
| 4673 | case 0: op->inst = FILD_DWORD_INTEGER; break; |
| 4674 | case 1: op->inst = FISTTP32; break; |
| 4675 | case 2: op->inst = FIST_DWORD_INTEGER; break; |
| 4676 | case 3: op->inst = FIST_DWORD_INTEGER_Pop; break; |
| 4677 | case 5: op->inst = FLD_EXTENDED_REAL; break; |
| 4678 | case 7: op->inst = FSTP_EXTENDED_REAL; break; |
| 4679 | default:op->inst = Invalid; op->reg = rm; op->imm = data->inst; break; |
| 4680 | } |
| 4681 | } |
| 4682 | } |
| 4683 | }; |
| 4684 | |
| 4685 | class DecodeFPU4 : public DecodeFunc { |