Skip to content

Commit

Permalink
[ASM] Fix Register Name parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
tgtakaoka committed Jan 23, 2025
1 parent 19c3afc commit 0b42981
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 35 deletions.
40 changes: 13 additions & 27 deletions src/reg_base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,25 +29,23 @@ bool nameMatcher(int8_t &name, const NameEntry *item, int) {
return name == item->name();
}

int textMatcher(StrScanner &symbol, const NameEntry *item) {
const auto *text_P = item->text_P();
const auto res = strncasecmp_P(symbol.str(), text_P, symbol.size());
// |symbol| diffrs |item|.
if (res)
return res;
// |symbol| length may be shorter than |item|.
return symbol.size() < strlen_P(text_P) ? -1 : 0;
}

// Some architrectures have registers whose name contains a single
// quote, such as AFP'. Some architrectures represent constant
// using prefix and surrounded by single quotes, such as C'x'.
bool isNameLetter(char c) {
return isalnum(c) || c == '\'';
return isalnum(c) || c == '\'' || c == '_';
}

bool isPrefixLetter(char c) {
return isalpha(c);
int textMatcher(StrScanner &scan, const NameEntry *item) {
const auto *text_P = item->text_P();
const auto len = strlen_P(text_P);
const auto res = strncasecmp_P(scan.str(), text_P, len);
// |scan| diffrs |item|.
if (res)
return res;
auto p = scan;
// |scan| may be longer than }item|
return isNameLetter(*(p += len)) ? 1 : 0;
}

} // namespace
Expand All @@ -61,21 +59,9 @@ const NameEntry *NameTable::searchName(int8_t name) const {
}

const NameEntry *NameTable::searchText(StrScanner &scan) const {
return searchSymbol(scan, isNameLetter);
}

const NameEntry *NameTable::searchPrefix(StrScanner &scan) const {
return searchSymbol(scan, isPrefixLetter);
}

const NameEntry *NameTable::searchSymbol(StrScanner &scan, bool (*predicator)(char)) const {
auto symbol = scan;
auto next = symbol.takeWhile(predicator);
if (symbol.size() == 0)
return nullptr;
const auto *entry = _table.binarySearch(symbol, textMatcher);
const auto *entry = _table.binarySearch(scan, textMatcher);
if (entry)
scan = next;
scan += strlen_P(entry->text_P());
return entry;
}

Expand Down
8 changes: 0 additions & 8 deletions src/reg_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,16 +74,8 @@ struct NameTable {
*/
const NameEntry *searchText(StrScanner &scan) const;

/**
* Similar to searchText(StrScanner&) but checks only alphabet
* letters in |scan|.
*/
const NameEntry *searchPrefix(StrScanner &scan) const;

private:
const table::Table<NameEntry> _table;

const NameEntry *searchSymbol(StrScanner &scan, bool (*)(char)) const;
};

/**
Expand Down
4 changes: 4 additions & 0 deletions test/test_asm_mn1610.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,10 @@ void test_comment() {
}

void test_undef() {
ERUS("SBIT STR, STR_IRQ1", "STR_IRQ1", 0x3800|(6<<8)|(0<<4)|0);
ERUS("ST R0, UNDEF(X0)", "UNDEF(X0)", 0x8000|(4<<11)|(0<<8)|0);
ERUS("ST R1, UNDEF(X1)", "UNDEF(X1)", 0x8000|(5<<11)|(1<<8)|0);

symtab.intern(0x1020, "SYM1020");
ATEST(0x1000, "L R2, SYM1020", 0xC000|(1<<11)|(2<<8)|0x20);
AERUS(0x1000, "L R2, UNDEF", "UNDEF", 0xC000|(0<<11)|(2<<8)|0x00);
Expand Down

0 comments on commit 0b42981

Please sign in to comment.