vm: fuse JMPIF and MATCHERR into conditional MATCHERR

Change OP_MATCHERR from Z format (unconditional) to B format
(conditional on register). This allows fusing JMPIF + MATCHERR
sequence into a single MATCHERR instruction for simple patterns.

Before: JMPIF R2 target (4 bytes) + MATCHERR (1 byte) = 5 bytes
After:  MATCHERR R2 (2 bytes)

Saves 3 bytes per pattern match with raise_on_fail.

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Yukihiro "Matz" Matsumoto
2026-01-19 13:07:32 +09:00
parent 2fa99a73c2
commit dece8cb343
4 changed files with 22 additions and 8 deletions
+2 -2
View File
@@ -572,8 +572,8 @@ codedump(mrb_state *mrb, const mrb_irep *irep, FILE *out)
fprintf(out, "RAISEIF\tR%d\t", a);
print_lv_a(mrb, irep, a, out);
break;
CASE(OP_MATCHERR, Z):
fprintf(out, "MATCHERR\n");
CASE(OP_MATCHERR, B):
fprintf(out, "MATCHERR\tR%d\n", a);
break;
CASE(OP_DEBUG, BBB):
+5 -2
View File
@@ -2167,8 +2167,11 @@ RETRY_TRY_BLOCK:
NEXT;
}
CASE(OP_MATCHERR, Z) {
RAISE_LIT(mrb, mrb_exc_get_id(mrb, MRB_ERROR_SYM(NoMatchingPatternError)), "pattern not matched");
CASE(OP_MATCHERR, B) {
if (!mrb_test(regs[a])) {
RAISE_LIT(mrb, mrb_exc_get_id(mrb, MRB_ERROR_SYM(NoMatchingPatternError)), "pattern not matched");
}
NEXT;
}
CASE(OP_SSEND, BBB) {