1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-01-11 08:30:55 +00:00

Decode [MUL/DIV][U/S].l.

This commit is contained in:
Thomas Harte 2022-10-30 11:32:36 -04:00
parent 63ad2e8263
commit bbd2cd47ea
4 changed files with 131 additions and 112 deletions

View File

@ -162,7 +162,7 @@ template <typename Predecoder<model>::OpT op> uint32_t Predecoder<model>::invali
// //
// All modes: the complete set (other than Quick). // All modes: the complete set (other than Quick).
// //
static constexpr auto AllModes = Dn | An | Ind | PostInc | PreDec | d16An | d8AnXn | XXXw | XXXl | d16PC | d8PCXn | Imm; static constexpr auto AllModes = Dn | An | Ind | PostInc | PreDec | d16An | d8AnXn | XXXw | XXXl | Imm | d16PC | d8PCXn;
static constexpr auto AllModesNoAn = AllModes & ~An; static constexpr auto AllModesNoAn = AllModes & ~An;
// //
@ -606,6 +606,13 @@ template <typename Predecoder<model>::OpT op> uint32_t Predecoder<model>::invali
return ~OneOperandMask< return ~OneOperandMask<
Dn Dn
>::value; >::value;
case OpT(Operation::DIVSorDIVUl):
case OpT(Operation::MULSorMULUl):
return ~TwoOperandMask<
Ext,
AllModesNoAn
>::value;
} }
return InvalidOperands; return InvalidOperands;
@ -1108,7 +1115,8 @@ template <typename Predecoder<model>::OpT op, bool validate> Preinstruction Pred
// b0b2 and b3b5: source effective address. // b0b2 and b3b5: source effective address.
// Plus an immediate word operand // Plus an immediate word operand
// //
case OpT(Operation::DIVSl): case OpT(Operation::DIVSorDIVUl):
case OpT(Operation::MULSorMULUl):
return validated<op, validate>( return validated<op, validate>(
AddressingMode::ExtensionWord, 0, AddressingMode::ExtensionWord, 0,
combined_mode(ea_mode, ea_register), ea_register); combined_mode(ea_mode, ea_register), ea_register);
@ -1505,8 +1513,11 @@ Preinstruction Predecoder<model>::decode4(uint16_t instruction) {
// 4-108 (p212) // 4-108 (p212)
case 0xec0: Decode(Op::JMP); case 0xec0: Decode(Op::JMP);
// 4-94 (p198) // 4-94 (p198) [DIVS.l]; 4-98 (p202) [DIVU.l]
// case 0xc40: DecodeReq(model >= Model::M68020, Op::DIVSl); case 0xc40: DecodeReq(model >= Model::M68020, Op::DIVSorDIVUl);
// 4-137 (p241) [MULS.l]; 4-140 (p244) [MULU.l]
case 0xc00: DecodeReq(model >= Model::M68020, Op::MULSorMULUl);
// 4-121 (p225) // 4-121 (p225)
case 0x2c0: DecodeReq(model >= Model::M68010, Op::MOVEfromCCR); case 0x2c0: DecodeReq(model >= Model::M68010, Op::MOVEfromCCR);

View File

@ -238,8 +238,11 @@ const char *_to_string(Operation operation, bool is_quick) {
case Operation::MULUw: return "MULU"; case Operation::MULUw: return "MULU";
case Operation::MULSw: return "MULS"; case Operation::MULSw: return "MULS";
case Operation::MULSorMULUl: return "[MULS/MULU]{L}.l";
case Operation::DIVUw: return "DIVU"; case Operation::DIVUw: return "DIVU";
case Operation::DIVSw: return "DIVS"; case Operation::DIVSw: return "DIVS";
case Operation::DIVSorDIVUl: return "[DIVS/DIVU]{L}.l";
case Operation::RTE: return "RTE"; case Operation::RTE: return "RTE";
case Operation::RTR: return "RTR"; case Operation::RTR: return "RTR";

View File

@ -138,8 +138,13 @@ enum class Operation: uint8_t {
// to the full things, the following enums result. // to the full things, the following enums result.
CHKorCMP2b, CHKorCMP2w, CHKorCMP2l, CHKorCMP2b, CHKorCMP2w, CHKorCMP2l,
DIVSl, DIVUl, // DIVS.l, DIVSL.l, DIVU.l and DIVUL.l are all distinguishable
MULSl, MULUl, // only by the extension word.
DIVSorDIVUl,
// MULS.l, MULSL.l, MULU.l and MULUL.l are all distinguishable
// only by the extension word.
MULSorMULUl,
Bccl, BSRl, Bccl, BSRl,
LINKl, CHKl, LINKl, CHKl,

View File

@ -19455,14 +19455,14 @@
"4bfd": "None", "4bfd": "None",
"4bfe": "None", "4bfe": "None",
"4bff": "None", "4bff": "None",
"4c00": "None", "4c00": "[MULS/MULU]{L}.l #, D0",
"4c01": "None", "4c01": "[MULS/MULU]{L}.l #, D1",
"4c02": "None", "4c02": "[MULS/MULU]{L}.l #, D2",
"4c03": "None", "4c03": "[MULS/MULU]{L}.l #, D3",
"4c04": "None", "4c04": "[MULS/MULU]{L}.l #, D4",
"4c05": "None", "4c05": "[MULS/MULU]{L}.l #, D5",
"4c06": "None", "4c06": "[MULS/MULU]{L}.l #, D6",
"4c07": "None", "4c07": "[MULS/MULU]{L}.l #, D7",
"4c08": "None", "4c08": "None",
"4c09": "None", "4c09": "None",
"4c0a": "None", "4c0a": "None",
@ -19471,62 +19471,62 @@
"4c0d": "None", "4c0d": "None",
"4c0e": "None", "4c0e": "None",
"4c0f": "None", "4c0f": "None",
"4c10": "None", "4c10": "[MULS/MULU]{L}.l #, (A0)",
"4c11": "None", "4c11": "[MULS/MULU]{L}.l #, (A1)",
"4c12": "None", "4c12": "[MULS/MULU]{L}.l #, (A2)",
"4c13": "None", "4c13": "[MULS/MULU]{L}.l #, (A3)",
"4c14": "None", "4c14": "[MULS/MULU]{L}.l #, (A4)",
"4c15": "None", "4c15": "[MULS/MULU]{L}.l #, (A5)",
"4c16": "None", "4c16": "[MULS/MULU]{L}.l #, (A6)",
"4c17": "None", "4c17": "[MULS/MULU]{L}.l #, (A7)",
"4c18": "None", "4c18": "[MULS/MULU]{L}.l #, (A0)+",
"4c19": "None", "4c19": "[MULS/MULU]{L}.l #, (A1)+",
"4c1a": "None", "4c1a": "[MULS/MULU]{L}.l #, (A2)+",
"4c1b": "None", "4c1b": "[MULS/MULU]{L}.l #, (A3)+",
"4c1c": "None", "4c1c": "[MULS/MULU]{L}.l #, (A4)+",
"4c1d": "None", "4c1d": "[MULS/MULU]{L}.l #, (A5)+",
"4c1e": "None", "4c1e": "[MULS/MULU]{L}.l #, (A6)+",
"4c1f": "None", "4c1f": "[MULS/MULU]{L}.l #, (A7)+",
"4c20": "None", "4c20": "[MULS/MULU]{L}.l #, -(A0)",
"4c21": "None", "4c21": "[MULS/MULU]{L}.l #, -(A1)",
"4c22": "None", "4c22": "[MULS/MULU]{L}.l #, -(A2)",
"4c23": "None", "4c23": "[MULS/MULU]{L}.l #, -(A3)",
"4c24": "None", "4c24": "[MULS/MULU]{L}.l #, -(A4)",
"4c25": "None", "4c25": "[MULS/MULU]{L}.l #, -(A5)",
"4c26": "None", "4c26": "[MULS/MULU]{L}.l #, -(A6)",
"4c27": "None", "4c27": "[MULS/MULU]{L}.l #, -(A7)",
"4c28": "None", "4c28": "[MULS/MULU]{L}.l #, (d16, A0)",
"4c29": "None", "4c29": "[MULS/MULU]{L}.l #, (d16, A1)",
"4c2a": "None", "4c2a": "[MULS/MULU]{L}.l #, (d16, A2)",
"4c2b": "None", "4c2b": "[MULS/MULU]{L}.l #, (d16, A3)",
"4c2c": "None", "4c2c": "[MULS/MULU]{L}.l #, (d16, A4)",
"4c2d": "None", "4c2d": "[MULS/MULU]{L}.l #, (d16, A5)",
"4c2e": "None", "4c2e": "[MULS/MULU]{L}.l #, (d16, A6)",
"4c2f": "None", "4c2f": "[MULS/MULU]{L}.l #, (d16, A7)",
"4c30": "None", "4c30": "[MULS/MULU]{L}.l #, (d8, A0, Xn)",
"4c31": "None", "4c31": "[MULS/MULU]{L}.l #, (d8, A1, Xn)",
"4c32": "None", "4c32": "[MULS/MULU]{L}.l #, (d8, A2, Xn)",
"4c33": "None", "4c33": "[MULS/MULU]{L}.l #, (d8, A3, Xn)",
"4c34": "None", "4c34": "[MULS/MULU]{L}.l #, (d8, A4, Xn)",
"4c35": "None", "4c35": "[MULS/MULU]{L}.l #, (d8, A5, Xn)",
"4c36": "None", "4c36": "[MULS/MULU]{L}.l #, (d8, A6, Xn)",
"4c37": "None", "4c37": "[MULS/MULU]{L}.l #, (d8, A7, Xn)",
"4c38": "None", "4c38": "[MULS/MULU]{L}.l #, (xxx).w",
"4c39": "None", "4c39": "[MULS/MULU]{L}.l #, (xxx).l",
"4c3a": "None", "4c3a": "[MULS/MULU]{L}.l #, (d16, PC)",
"4c3b": "None", "4c3b": "[MULS/MULU]{L}.l #, (d8, PC, Xn)",
"4c3c": "None", "4c3c": "[MULS/MULU]{L}.l #, #",
"4c3d": "None", "4c3d": "None",
"4c3e": "None", "4c3e": "None",
"4c3f": "None", "4c3f": "None",
"4c40": "None", "4c40": "[DIVS/DIVU]{L}.l #, D0",
"4c41": "None", "4c41": "[DIVS/DIVU]{L}.l #, D1",
"4c42": "None", "4c42": "[DIVS/DIVU]{L}.l #, D2",
"4c43": "None", "4c43": "[DIVS/DIVU]{L}.l #, D3",
"4c44": "None", "4c44": "[DIVS/DIVU]{L}.l #, D4",
"4c45": "None", "4c45": "[DIVS/DIVU]{L}.l #, D5",
"4c46": "None", "4c46": "[DIVS/DIVU]{L}.l #, D6",
"4c47": "None", "4c47": "[DIVS/DIVU]{L}.l #, D7",
"4c48": "None", "4c48": "None",
"4c49": "None", "4c49": "None",
"4c4a": "None", "4c4a": "None",
@ -19535,51 +19535,51 @@
"4c4d": "None", "4c4d": "None",
"4c4e": "None", "4c4e": "None",
"4c4f": "None", "4c4f": "None",
"4c50": "None", "4c50": "[DIVS/DIVU]{L}.l #, (A0)",
"4c51": "None", "4c51": "[DIVS/DIVU]{L}.l #, (A1)",
"4c52": "None", "4c52": "[DIVS/DIVU]{L}.l #, (A2)",
"4c53": "None", "4c53": "[DIVS/DIVU]{L}.l #, (A3)",
"4c54": "None", "4c54": "[DIVS/DIVU]{L}.l #, (A4)",
"4c55": "None", "4c55": "[DIVS/DIVU]{L}.l #, (A5)",
"4c56": "None", "4c56": "[DIVS/DIVU]{L}.l #, (A6)",
"4c57": "None", "4c57": "[DIVS/DIVU]{L}.l #, (A7)",
"4c58": "None", "4c58": "[DIVS/DIVU]{L}.l #, (A0)+",
"4c59": "None", "4c59": "[DIVS/DIVU]{L}.l #, (A1)+",
"4c5a": "None", "4c5a": "[DIVS/DIVU]{L}.l #, (A2)+",
"4c5b": "None", "4c5b": "[DIVS/DIVU]{L}.l #, (A3)+",
"4c5c": "None", "4c5c": "[DIVS/DIVU]{L}.l #, (A4)+",
"4c5d": "None", "4c5d": "[DIVS/DIVU]{L}.l #, (A5)+",
"4c5e": "None", "4c5e": "[DIVS/DIVU]{L}.l #, (A6)+",
"4c5f": "None", "4c5f": "[DIVS/DIVU]{L}.l #, (A7)+",
"4c60": "None", "4c60": "[DIVS/DIVU]{L}.l #, -(A0)",
"4c61": "None", "4c61": "[DIVS/DIVU]{L}.l #, -(A1)",
"4c62": "None", "4c62": "[DIVS/DIVU]{L}.l #, -(A2)",
"4c63": "None", "4c63": "[DIVS/DIVU]{L}.l #, -(A3)",
"4c64": "None", "4c64": "[DIVS/DIVU]{L}.l #, -(A4)",
"4c65": "None", "4c65": "[DIVS/DIVU]{L}.l #, -(A5)",
"4c66": "None", "4c66": "[DIVS/DIVU]{L}.l #, -(A6)",
"4c67": "None", "4c67": "[DIVS/DIVU]{L}.l #, -(A7)",
"4c68": "None", "4c68": "[DIVS/DIVU]{L}.l #, (d16, A0)",
"4c69": "None", "4c69": "[DIVS/DIVU]{L}.l #, (d16, A1)",
"4c6a": "None", "4c6a": "[DIVS/DIVU]{L}.l #, (d16, A2)",
"4c6b": "None", "4c6b": "[DIVS/DIVU]{L}.l #, (d16, A3)",
"4c6c": "None", "4c6c": "[DIVS/DIVU]{L}.l #, (d16, A4)",
"4c6d": "None", "4c6d": "[DIVS/DIVU]{L}.l #, (d16, A5)",
"4c6e": "None", "4c6e": "[DIVS/DIVU]{L}.l #, (d16, A6)",
"4c6f": "None", "4c6f": "[DIVS/DIVU]{L}.l #, (d16, A7)",
"4c70": "None", "4c70": "[DIVS/DIVU]{L}.l #, (d8, A0, Xn)",
"4c71": "None", "4c71": "[DIVS/DIVU]{L}.l #, (d8, A1, Xn)",
"4c72": "None", "4c72": "[DIVS/DIVU]{L}.l #, (d8, A2, Xn)",
"4c73": "None", "4c73": "[DIVS/DIVU]{L}.l #, (d8, A3, Xn)",
"4c74": "None", "4c74": "[DIVS/DIVU]{L}.l #, (d8, A4, Xn)",
"4c75": "None", "4c75": "[DIVS/DIVU]{L}.l #, (d8, A5, Xn)",
"4c76": "None", "4c76": "[DIVS/DIVU]{L}.l #, (d8, A6, Xn)",
"4c77": "None", "4c77": "[DIVS/DIVU]{L}.l #, (d8, A7, Xn)",
"4c78": "None", "4c78": "[DIVS/DIVU]{L}.l #, (xxx).w",
"4c79": "None", "4c79": "[DIVS/DIVU]{L}.l #, (xxx).l",
"4c7a": "None", "4c7a": "[DIVS/DIVU]{L}.l #, (d16, PC)",
"4c7b": "None", "4c7b": "[DIVS/DIVU]{L}.l #, (d8, PC, Xn)",
"4c7c": "None", "4c7c": "[DIVS/DIVU]{L}.l #, #",
"4c7d": "None", "4c7d": "None",
"4c7e": "None", "4c7e": "None",
"4c7f": "None", "4c7f": "None",