Skip to content

Commit 1dde5d5

Browse files
committed
[ASM] Make Pseudo handling a bit generic
1 parent 62ad9e7 commit 1dde5d5

File tree

13 files changed

+59
-36
lines changed

13 files changed

+59
-36
lines changed

src/asm_base.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,9 @@ Error Assembler::encode(const char *line, Insn &insn, const SymbolTable *symtab)
103103
}
104104

105105
Error Assembler::processPseudo(StrScanner &scan, Insn &insn) {
106-
const auto *p = _pseudos->search(insn);
106+
const auto *p = _pseudos->search(insn.name());
107107
if (p == nullptr)
108-
p = PSEUDO_TABLE.search(insn);
108+
p = PSEUDO_TABLE.search(insn.name());
109109
return p ? p->invoke(this, scan, insn) : UNKNOWN_DIRECTIVE;
110110
}
111111

src/asm_i8086.cpp

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -628,9 +628,8 @@ Error AsmInsn::emitTemporaryReal(const float80_t &val80) {
628628

629629
#endif
630630

631-
Error AsmI8086::defineConstant(StrScanner &scan, Insn &_insn, uint16_t extra) {
631+
Error AsmI8086::defineConstant(StrScanner &scan, AsmInsn &insn, uint16_t extra) {
632632
const auto type = static_cast<I8087Type>(extra);
633-
AsmInsn insn(_insn);
634633
ErrorAt error;
635634
do {
636635
scan.skipSpaces();
@@ -639,7 +638,7 @@ Error AsmI8086::defineConstant(StrScanner &scan, Insn &_insn, uint16_t extra) {
639638
auto end = scan;
640639
const auto err = isString(end, strErr);
641640
if (err == OK) {
642-
generateString(scan, end, _insn, DATA_LONG, strErr);
641+
generateString(scan, end, insn.insnBase(), DATA_LONG, strErr);
643642
if (error.setErrorIf(strErr) == NO_MEMORY)
644643
break;
645644
continue;
@@ -715,32 +714,32 @@ Error AsmI8086::defineConstant(StrScanner &scan, Insn &_insn, uint16_t extra) {
715714
if (error.setErrorIf(exprErr) == NO_MEMORY)
716715
break;
717716
} while (scan.skipSpaces().expect(','));
718-
return _insn.setError(error);
717+
return insn.insnBase().setError(error);
719718
}
720719

721-
Error AsmI8086::encodeRepeatInsn(StrScanner &scan, Insn &_insn, uint16_t opc) {
720+
Error AsmI8086::encodeRepeatInsn(StrScanner &scan, AsmInsn &insn, uint16_t opc) {
722721
if (endOfLine(scan))
723722
return UNKNOWN_DIRECTIVE;
724723
if ((opc == 0x64 || opc == 0x65) && _cpuSpec.cpu != V30)
725724
return UNKNOWN_DIRECTIVE;
726725

727-
AsmInsn insn(_insn);
728726
insn.setRepeat(opc);
729727
StrScanner symbol;
730728
_parser.readInstruction(scan, symbol);
731729
insn.nameBuffer().reset().text(symbol);
732730
return encodeImpl(scan.skipSpaces(), insn);
733731
}
734732

735-
Error AsmI8086::setCoprocessor(StrScanner &scan, Insn &insn, uint16_t) {
733+
Error AsmI8086::setCoprocessor(StrScanner &scan, AsmInsn &insn, uint16_t) {
736734
const auto at = scan;
737735
const auto error = _opt_fpu.set(scan);
738-
return error ? insn.setErrorIf(at, error) : OK;
736+
return error ? insn.insnBase().setErrorIf(at, error) : OK;
739737
}
740738

741-
Error AsmI8086::processPseudo(StrScanner &scan, Insn &insn) {
742-
const auto *p = PSEUDOS_I8086.search(insn);
743-
return p ? p->invoke(this, scan, insn) : Assembler::processPseudo(scan, insn);
739+
Error AsmI8086::processPseudo(StrScanner &scan, Insn &_insn) {
740+
AsmInsn insn(_insn);
741+
const auto *p = PSEUDOS_I8086.search(insn.name());
742+
return p ? p->invoke(this, scan, insn) : Assembler::processPseudo(scan, _insn);
744743
}
745744

746745
void AsmInsn::prepairModReg() {

src/asm_i8086.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,22 @@ struct AsmI8086 final : Assembler, Config {
5656
void emitStringOperand(AsmInsn &insn, const Operand &op, RegName seg, RegName index) const;
5757
void emitStringInst(AsmInsn &insn, const Operand &src, const Operand &dst) const;
5858

59-
Error setCoprocessor(StrScanner &scan, Insn &insn, uint16_t);
59+
Error setCoprocessor(StrScanner &scan, AsmInsn &insn, uint16_t);
6060
enum I8087Type : uint16_t {
6161
DATA_DD = 'D', // 32-bit binary or IEEE 754 floating point number
6262
DATA_DQ = 'Q', // 64-bit binary or IEEE 754 floating point number
6363
DATA_DT = 'T' // 80-bit BCD or i8087 Temporary Real
6464
};
65-
Error defineConstant(StrScanner &scan, Insn &insn, uint16_t i8087Type);
66-
Error encodeRepeatInsn(StrScanner &scan, Insn &insn, uint16_t opc);
65+
Error defineConstant(StrScanner &scan, AsmInsn &insn, uint16_t i8087Type);
66+
Error encodeRepeatInsn(StrScanner &scan, AsmInsn &insn, uint16_t opc);
6767
Error processPseudo(StrScanner &scan, Insn &insn) override;
6868
Error encodeImpl(StrScanner &scan, AsmInsn &insn) const;
6969
Error encodeImpl(StrScanner &scan, Insn &insn) const override;
7070
const ConfigBase &config() const override { return *this; }
7171
ConfigSetter &configSetter() override { return *this; }
7272
static const ValueParser::Plugins &defaultPlugins();
7373

74-
using PseudoI8086 = pseudo::__Pseudo<AsmI8086>;
74+
using PseudoI8086 = pseudo::__Pseudo<AsmI8086, AsmInsn>;
7575
using PseudosI8086 = pseudo::__Pseudos<PseudoI8086>;
7676
static const PseudoI8086 PSEUDO_I8086_TABLE[] PROGMEM;
7777
static const PseudosI8086 PSEUDOS_I8086 PROGMEM;

src/asm_mc68000.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1670,7 +1670,7 @@ Error AsmMc68000::setCoprocessor(StrScanner &scan, Insn &insn, uint16_t procType
16701670
}
16711671

16721672
Error AsmMc68000::processPseudo(StrScanner &scan, Insn &insn) {
1673-
const auto *p = PSEUDOS_MC68000.search(insn);
1673+
const auto *p = PSEUDOS_MC68000.search(insn.name());
16741674
return p ? p->invoke(this, scan, insn) : Assembler::processPseudo(scan, insn);
16751675
}
16761676

src/asm_mc68000.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ struct AsmMc68000 final : Assembler, Config {
8181
ConfigSetter &configSetter() override { return *this; }
8282
static const ValueParser::Plugins &defaultPlugins();
8383

84-
using PseudoMc68000 = pseudo::__Pseudo<AsmMc68000>;
84+
using PseudoMc68000 = pseudo::__Pseudo<AsmMc68000, Insn>;
8585
using PseudosMc68000 = pseudo::__Pseudos<PseudoMc68000>;
8686
static const PseudoMc68000 PSEUDO_MC68000_TABLE[] PROGMEM;
8787
static const PseudosMc68000 PSEUDOS_MC68000 PROGMEM;

src/asm_pdp11.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ Error AsmPdp11::setRadix(StrScanner &scan, Insn &insn, uint16_t) {
505505
}
506506

507507
Error AsmPdp11::processPseudo(StrScanner &scan, Insn &insn) {
508-
const auto *p = PSEUDOS_PDP11.search(insn);
508+
const auto *p = PSEUDOS_PDP11.search(insn.name());
509509
return p ? p->invoke(this, scan, insn) : Assembler::processPseudo(scan, insn);
510510
}
511511

src/asm_pdp11.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ struct AsmPdp11 final : Assembler, Config {
5959
ConfigSetter &configSetter() override { return *this; }
6060
static const ValueParser::Plugins &defaultPlugins();
6161

62-
using PseudoPdp11 = pseudo::__Pseudo<AsmPdp11>;
62+
using PseudoPdp11 = pseudo::__Pseudo<AsmPdp11, Insn>;
6363
using PseudosPdp11 = pseudo::__Pseudos<PseudoPdp11>;
6464
static const PseudoPdp11 PSEUDO_PDP11_TABLE[] PROGMEM;
6565
static const PseudosPdp11 PSEUDOS_PDP11 PROGMEM;

src/asm_pdp8.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ Error AsmPdp8::defineDec6String(StrScanner &scan, Insn &insn, uint16_t) {
327327
}
328328

329329
Error AsmPdp8::processPseudo(StrScanner &scan, Insn &insn) {
330-
const auto *p = PSEUDOS_PDP8.search(insn);
330+
const auto *p = PSEUDOS_PDP8.search(insn.name());
331331
return p ? p->invoke(this, scan, insn) : Assembler::processPseudo(scan, insn);
332332
}
333333

src/asm_pdp8.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ struct AsmPdp8 final : Assembler, Config {
5656
static const ValueParser::Plugins &defaultPlugins();
5757
static const pseudo::Pseudo PSEUDOS[] PROGMEM;
5858

59-
using PseudoPdp8 = pseudo::__Pseudo<AsmPdp8>;
59+
using PseudoPdp8 = pseudo::__Pseudo<AsmPdp8, Insn>;
6060
using PseudosPdp8 = pseudo::__Pseudos<PseudoPdp8>;
6161
static const PseudoPdp8 PSEUDO_PDP8_TABLE[] PROGMEM;
6262
static const PseudosPdp8 PSEUDOS_PDP8 PROGMEM;

src/asm_tms320f.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ Error AsmTms320f::defineFloat(StrScanner &scan, Insn &insn, uint16_t bits) {
571571
}
572572

573573
Error AsmTms320f::processPseudo(StrScanner &scan, Insn &insn) {
574-
const auto *p = PSEUDOS_TMS320F.search(insn);
574+
const auto *p = PSEUDOS_TMS320F.search(insn.name());
575575
return p ? p->invoke(this, scan, insn) : Assembler::processPseudo(scan, insn);
576576
}
577577

0 commit comments

Comments
 (0)