From 02879087ee659369c76e2011854798d3d90bcd89 Mon Sep 17 00:00:00 2001
From: "yu.dongliang" <18588496441@163.com>
Date: Fri, 24 Oct 2025 12:29:25 +0800
Subject: [PATCH] js: support PCRE2 for RegExpr match(), scf: fix some bugs
---
examples/js.html | 6 +-
js/Makefile | 1 +
js/abc_libjs.c | 268 ++++++++++++++++++++++++++-
js/abc_libjs.so | Bin 56720 -> 64456 bytes
js/core/scf_dag.c | 15 +-
js/core/scf_optimizer.c | 2 +-
js/core/scf_optimizer_auto_gc_find.c | 3 +
js/core/scf_optimizer_inline.c | 21 +--
js/doc.c | 217 ++++++++++++++++++----
js/elf/scf_elf_link.c | 3 +-
js/native/x64/scf_x64_peephole.c | 23 ++-
js/native/x64/scf_x64_reg.c | 17 +-
12 files changed, 502 insertions(+), 74 deletions(-)
diff --git a/examples/js.html b/examples/js.html
index 7a8bb36..4c21780 100644
--- a/examples/js.html
+++ b/examples/js.html
@@ -8,9 +8,9 @@
diff --git a/js/Makefile b/js/Makefile
index dc6778f..b4d00fb 100644
--- a/js/Makefile
+++ b/js/Makefile
@@ -13,6 +13,7 @@ CFLAGS += -I../js/native
CFLAGS += -I../js/native/x64
CFLAGS += -I../js/native/risc
+LDFLAGS += `pkg-config --cflags --libs libpcre2-8`
LDFLAGS += -ldl -lm -pthread
all:
diff --git a/js/abc_libjs.c b/js/abc_libjs.c
index a063ccd..5532441 100644
--- a/js/abc_libjs.c
+++ b/js/abc_libjs.c
@@ -1,4 +1,6 @@
#include"abc_html.h"
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include
static char* js_days[] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
@@ -18,7 +20,7 @@ int64_t abc_js_date()
return ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
}
-void abc_js_date_toString(char* s, int max, int64_t msec)
+int abc_js_date_toString(char* s, int max, int64_t msec)
{
struct tm tm;
@@ -29,7 +31,7 @@ void abc_js_date_toString(char* s, int max, int64_t msec)
int t0 = msec % (24 * 3600);
int t1 = tm.tm_hour * 3600 + tm.tm_min * 60 + tm.tm_sec;
- snprintf(s, max, "%s, %s %02d %d %02d:%02d:%02d GMT+%02d00",
+ return snprintf(s, max, "%s, %s %02d %d %02d:%02d:%02d GMT+%02d00",
js_days[tm.tm_wday],
js_mons[tm.tm_mon],
tm.tm_mday,
@@ -38,7 +40,7 @@ void abc_js_date_toString(char* s, int max, int64_t msec)
tm.tm_min,
tm.tm_sec,
(t1 - t0) / 3600);
-// strftime(s, max, "%A, %Y-%m-%d %T GMT%z", &tm);
+ // strftime(s, max, "%A, %Y-%m-%d %T GMT%z", &tm);
}
int abc_html_write(abc_html_t* html, const char* s)
@@ -153,3 +155,263 @@ int abc_html_write_d(abc_html_t* html, double d)
return abc_html_write(html, buf);
}
+
+int abc_pcre2_match(int** __ovector, const char* __subject, const char* __pattern)
+{
+ pcre2_code *re;
+ PCRE2_SPTR pattern = (PCRE2_SPTR)__pattern;
+ PCRE2_SPTR subject = (PCRE2_SPTR)__subject;
+ PCRE2_SIZE subject_len = (PCRE2_SIZE)strlen(__subject);
+
+ int crlf_is_newline;
+ int errornumber;
+ int find_all = 0;
+ int i;
+ int rc;
+ int utf8;
+
+ uint32_t option_bits = 0;
+ uint32_t newline;
+
+ PCRE2_SIZE erroroffset;
+ PCRE2_SIZE *ovector;
+
+ pcre2_match_data *match_data;
+
+ while ('/' == *pattern)
+ pattern++;
+
+ PCRE2_SPTR modifier = pattern;
+ while (*modifier && '/' != *modifier)
+ modifier++;
+
+ PCRE2_SIZE pattern_len = (PCRE2_SIZE)(modifier - pattern);
+
+ printf("pattern: %.*s\n", (int)pattern_len, (char *)pattern);
+ printf("modifier: %s\n", modifier);
+
+ while (*modifier) {
+ switch (*modifier) {
+ case 'g':
+ find_all = 1;
+ break;
+ case 'i':
+ option_bits |= PCRE2_CASELESS;
+ break;
+ case 'm':
+ option_bits |= PCRE2_MULTILINE;
+ break;
+ default:
+ break;
+ };
+
+ modifier++;
+ }
+
+ re = pcre2_compile(
+ pattern, /* the pattern */
+ pattern_len, /* indicates pattern is zero-terminated */
+ option_bits, /* default options */
+ &errornumber, /* for error number */
+ &erroroffset, /* for error offset */
+ NULL); /* use default compile context */
+ if (!re) {
+ PCRE2_UCHAR buffer[256];
+ pcre2_get_error_message(errornumber, buffer, sizeof(buffer));
+
+ scf_loge("PCRE2 compilation failed at offset %d: %s\n", (int)erroroffset, buffer);
+ return -1;
+ }
+
+ match_data = pcre2_match_data_create_from_pattern(re, NULL);
+
+ rc = pcre2_match(
+ re, /* the compiled pattern */
+ subject, /* the subject string */
+ subject_len, /* the length of the subject */
+ 0, /* start at offset 0 in the subject */
+ 0, /* default options */
+ match_data, /* block for storing the result */
+ NULL); /* use default match context */
+ if (rc < 0) {
+ if (PCRE2_ERROR_NOMATCH == rc)
+ scf_logi("No match\n");
+ else
+ scf_loge("Matching error %d\n", rc);
+
+ pcre2_match_data_free(match_data);
+ pcre2_code_free(re);
+ return -1;
+ }
+
+ ovector = pcre2_get_ovector_pointer(match_data);
+ printf("Match succeeded at offset %d\n", (int)ovector[0]);
+
+ if (0 == rc)
+ printf("ovector was not big enough for all the captured substrings\n");
+
+ if (ovector[0] > ovector[1])
+ {
+ printf("\\K was used in an assertion to set the match start after its end.\n"
+ "From end to start the match was: %.*s\n",
+ (int)(ovector[0] - ovector[1]),
+ (char *)(subject + ovector[1]));
+ printf("Run abandoned\n");
+
+ pcre2_match_data_free(match_data);
+ pcre2_code_free(re);
+ return -1;
+ }
+
+ int* outs = malloc(rc * sizeof(int) * 2);
+ if (!outs) {
+ pcre2_match_data_free(match_data);
+ pcre2_code_free(re);
+ return -ENOMEM;
+ }
+
+ for (i = 0; i < rc; i++)
+ {
+ PCRE2_SPTR str = subject + ovector[2 * i];
+ PCRE2_SIZE len = ovector[2 * i + 1] - ovector[2 * i];
+
+ printf("%2d: %.*s\n", i, (int)len, (char *)str);
+
+ outs[2 * i ] = ovector[2 * i ];
+ outs[2 * i + 1] = ovector[2 * i + 1];
+ }
+
+ if (!find_all) {
+ pcre2_match_data_free(match_data);
+ pcre2_code_free(re);
+
+ *__ovector = outs;
+ return rc;
+ }
+
+ int n_outs = rc;
+
+ pcre2_pattern_info(re, PCRE2_INFO_ALLOPTIONS, &option_bits);
+ pcre2_pattern_info(re, PCRE2_INFO_NEWLINE, &newline);
+
+ utf8 = (option_bits & PCRE2_UTF) != 0;
+ crlf_is_newline = (PCRE2_NEWLINE_ANY == newline || PCRE2_NEWLINE_CRLF == newline || PCRE2_NEWLINE_ANYCRLF == newline);
+
+ for (;;) {
+ uint32_t options = 0;
+ PCRE2_SIZE start_offset = ovector[1];
+
+ if (ovector[0] == ovector[1]) {
+ if (ovector[0] == subject_len)
+ break;
+ options = PCRE2_NOTEMPTY_ATSTART | PCRE2_ANCHORED;
+ } else {
+ PCRE2_SIZE startchar = pcre2_get_startchar(match_data);
+
+ if (start_offset <= startchar) {
+ if (startchar >= subject_len)
+ break;
+
+ start_offset = startchar + 1;
+ if (utf8) {
+ for (; start_offset < subject_len; start_offset++)
+ if ((subject[start_offset] & 0xc0) != 0x80)
+ break;
+ }
+ }
+ }
+
+ rc = pcre2_match(
+ re, /* the compiled pattern */
+ subject, /* the subject string */
+ subject_len, /* the length of the subject */
+ start_offset, /* starting offset in the subject */
+ options, /* options */
+ match_data, /* block for storing the result */
+ NULL); /* use default match context */
+
+ if (PCRE2_ERROR_NOMATCH == rc) {
+ if (options == 0) /* All matches found */
+ break;
+
+ ovector[1] = start_offset + 1; /* Advance one code unit */
+
+ if (crlf_is_newline
+ && start_offset < subject_len - 1
+ && '\r' == subject[start_offset]
+ && '\n' == subject[start_offset + 1])
+ ovector[1] += 1;
+ else if (utf8) {
+ while (ovector[1] < subject_len)
+ {
+ if ((subject[ovector[1]] & 0xc0) != 0x80)
+ break;
+ ovector[1] += 1;
+ }
+ }
+
+ continue;
+ }
+
+ if (rc < 0) {
+ scf_loge("Matching error %d\n", rc);
+
+ pcre2_match_data_free(match_data);
+ pcre2_code_free(re);
+ free(outs);
+ return -1;
+ }
+
+ printf("\nMatch succeeded again at offset %d\n", (int)ovector[0]);
+
+ if (rc == 0)
+ printf("ovector was not big enough for all the captured substrings\n");
+
+ if (ovector[0] > ovector[1])
+ {
+ printf("\\K was used in an assertion to set the match start after its end.\n"
+ "From end to start the match was: %.*s\n",
+ (int)(ovector[0] - ovector[1]),
+ (char *)(subject + ovector[1]));
+ printf("Run abandoned\n");
+
+ pcre2_match_data_free(match_data);
+ pcre2_code_free(re);
+ free(outs);
+ return -1;
+ }
+
+ void* p = realloc(outs, (n_outs + rc) * sizeof(int) * 2);
+ if (!p) {
+ pcre2_match_data_free(match_data);
+ pcre2_code_free(re);
+ free(outs);
+ return -ENOMEM;
+ }
+ outs = p;
+
+ for (i = 0; i < rc; i++)
+ {
+ PCRE2_SPTR str = subject + ovector[2 * i];
+ size_t len = ovector[2 * i + 1] - ovector[2 * i];
+
+ printf("%2d: %.*s\n", i, (int)len, (char*)str);
+
+ outs[2 * (n_outs + i) ] = ovector[2 * i ];
+ outs[2 * (n_outs + i) + 1] = ovector[2 * i + 1];
+ }
+
+ n_outs += rc;
+ }
+
+ printf("\n");
+ pcre2_match_data_free(match_data);
+ pcre2_code_free(re);
+
+ for (i = 0; i < n_outs; i++)
+ scf_logi("i: %d, %d,%d\n", i, outs[2 * i], outs[2 * i + 1]);
+
+
+ *__ovector = outs;
+ return n_outs;
+}
diff --git a/js/abc_libjs.so b/js/abc_libjs.so
index a7677e2e68d01af6f701e8c5f751defb5eeccc26..5dade4ecfb408a438cae51e889216ac9960d6494 100755
GIT binary patch
literal 64456
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∓u{DaEOj`8;EFY!p^O6_!gz
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
BvHt)7
delta 21797
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
C^15dL
diff --git a/js/core/scf_dag.c b/js/core/scf_dag.c
index fb92226..9fa2005 100644
--- a/js/core/scf_dag.c
+++ b/js/core/scf_dag.c
@@ -317,7 +317,7 @@ void scf_dn_status_print(scf_dn_status_t* ds)
}
}
- printf(" alias_type: %d\n", ds->alias_type);
+ printf(" alias_type: %d, ret_flag: %d, ret_index: %d\n", ds->alias_type, ds->ret_flag, ds->ret_index);
}
scf_dag_node_t* scf_dag_node_alloc(int type, scf_variable_t* var, const scf_node_t* node)
@@ -581,8 +581,11 @@ int scf_dag_node_same(scf_dag_node_t* dn, const scf_node_t* node)
}
if (!dn->childs) {
- if (SCF_OP_CALL == node->type && 1 == node->nb_nodes)
- return __dn_same_call(dn, node, split);
+ if (SCF_OP_CALL == node->type /*&& 1 == node->nb_nodes*/) {
+ int ret = __dn_same_call(dn, node, split);
+ return ret;
+ }
+
return 0;
}
@@ -682,8 +685,10 @@ cmp_childs:
}
}
- if (SCF_OP_CALL == dn->type)
- return __dn_same_call(dn, node, split);
+ if (SCF_OP_CALL == dn->type) {
+ int ret = __dn_same_call(dn, node, split);
+ return ret;
+ }
return 1;
}
diff --git a/js/core/scf_optimizer.c b/js/core/scf_optimizer.c
index b6b4ed6..30c7918 100644
--- a/js/core/scf_optimizer.c
+++ b/js/core/scf_optimizer.c
@@ -115,7 +115,7 @@ int scf_optimize(scf_ast_t* ast, scf_vector_t* functions)
if (!f->node.define_flag)
continue;
- if (strcmp(f->node.w->text->data, "P"))
+ if (strcmp(f->node.w->text->data, "__toString"))
continue;
printf("\n");
diff --git a/js/core/scf_optimizer_auto_gc_find.c b/js/core/scf_optimizer_auto_gc_find.c
index b60c0a1..2c5cf66 100644
--- a/js/core/scf_optimizer_auto_gc_find.c
+++ b/js/core/scf_optimizer_auto_gc_find.c
@@ -240,6 +240,9 @@ static int _bb_add_ds_for_ret(scf_basic_block_t* bb, scf_dn_status_t* ds_obj, sc
if (!ds2->ret_flag)
continue;
+ if (ds2->dag_node->var->type != ds_obj->dag_node->var->type)
+ continue;
+
__bb_add_ds_append(bb, ds_obj, bb2, ds2);
}
diff --git a/js/core/scf_optimizer_inline.c b/js/core/scf_optimizer_inline.c
index 233fe19..f710578 100644
--- a/js/core/scf_optimizer_inline.c
+++ b/js/core/scf_optimizer_inline.c
@@ -378,6 +378,7 @@ static int _optimize_inline2(scf_ast_t* ast, scf_function_t* f)
int n_calls = 0;
bb_cur = bb;
+ bb_cur->call_flag = 0;
for (l2 = scf_list_head(&bb->code_list_head); l2 != scf_list_sentinel(&bb->code_list_head); ) {
c = scf_list_data(l2, scf_3ac_code_t, list);
@@ -398,22 +399,22 @@ static int _optimize_inline2(scf_ast_t* ast, scf_function_t* f)
src = c->srcs->data[0];
v = _scf_operand_get(src->node);
- if (!v->const_literal_flag)
+ if (!v->const_literal_flag) {
+ bb_cur->call_flag |= n_calls > 0;
continue;
+ }
f2 = v->func_ptr;
- if (!f2->node.define_flag)
- continue;
-
- if (!f2->inline_flag)
- continue;
-
- if (f2->vargs_flag)
+ if (!f2->node.define_flag || !f2->inline_flag || f2->vargs_flag) {
+ bb_cur->call_flag |= n_calls > 0;
continue;
+ }
- if (f2->nb_basic_blocks > 10)
+ if (f2->nb_basic_blocks > 10) {
+ bb_cur->call_flag |= n_calls > 0;
continue;
+ }
#if 1
bb2 = bb_cur;
bb_cur->call_flag = 0;
@@ -436,8 +437,6 @@ static int _optimize_inline2(scf_ast_t* ast, scf_function_t* f)
}
#endif
}
-
- bb_cur->call_flag |= n_calls > 0;
}
#if 0
diff --git a/js/doc.c b/js/doc.c
index 9821bd1..5b6dfdd 100644
--- a/js/doc.c
+++ b/js/doc.c
@@ -6,8 +6,10 @@ int abc_html_write (Object* html, const char* s);
int abc_html_write_i(Object* html, int64_t i);
int abc_html_write_d(Object* html, double d);
+int abc_pcre2_match(int** __ovector, const char* __subject, const char* __pattern);
+
int64_t abc_js_date();
-void abc_js_date_toString(char* s, int max, int64_t msec);
+int abc_js_date_toString(char* s, int max, int64_t msec);
enum {
JS_Undef,
@@ -16,6 +18,7 @@ enum {
JS_Object,
JS_Date,
JS_Boolean,
+ JS_Array,
};
struct Object
@@ -189,10 +192,50 @@ struct Object
return res;
}
- const char* toString(Object* this)
+ int __toStringLen(Object* this)
+ {
+ int len;
+ int type = JS_Undef;
+
+ if (this)
+ type = this->type;
+
+ switch (type) {
+ case JS_Boolean:
+ len = 7;
+ break;
+
+ case JS_Number:
+ len = 127;
+ break;
+
+ case JS_Date:
+ len = 127;
+ break;
+
+ case JS_String:
+ len = strlen(this->str);
+ break;
+
+ case JS_Object:
+ len = strlen("[object Object]");
+ break;
+
+ case JS_Array:
+ len = strlen("[array Array]");
+ break;
+
+ default:
+ len = strlen("undefined");
+ break;
+ };
+
+ return len + 1;
+ }
+
+ int __toString(Object* this, char* s)
{
char* p;
- char* s;
int len;
int type = JS_Undef;
@@ -201,64 +244,90 @@ struct Object
switch (type) {
case JS_Boolean:
- s = scf__auto_malloc(8);
- if (!s)
- return NULL;
-
if (this->i64)
- sprintf(s, "true");
+ len = sprintf(s, "true");
else
- sprintf(s, "false");
+ len = sprintf(s, "false");
break;
case JS_Number:
- s = scf__auto_malloc(128);
- if (!s)
- return NULL;
+ len = sprintf(s, "%lg", this->d);
+ break;
- snprintf(s, 127, "%lg", this->d);
+ case JS_Date:
+ len = abc_js_date_toString(s, 127, this->i64);
break;
case JS_String:
len = strlen(this->str);
-
- s = scf__auto_malloc(len + 1);
- if (!s)
- return NULL;
-
memcpy(s, this->str, len + 1);
break;
case JS_Object:
p = "[object Object]";
len = strlen(p);
-
- s = scf__auto_malloc(len + 1);
- if (!s)
- return NULL;
-
memcpy(s, p, len + 1);
break;
- case JS_Date:
- s = scf__auto_malloc(128);
- if (!s)
- return NULL;
-
- abc_js_date_toString(s, 127, this->i64);
+ case JS_Array:
+ p = "[array Array]";
+ len = strlen(p);
+ memcpy(s, p, len + 1);
break;
+
default:
p = "undefined";
len = strlen(p);
-
- s = scf__auto_malloc(len + 1);
- if (!s)
- return NULL;
-
memcpy(s, p, len + 1);
break;
};
+ return len;
+ }
+
+ const char* toString(Object* this)
+ {
+ Object* obj;
+ char* s;
+ int len;
+ int type = JS_Undef;
+ int i;
+ int n;
+
+ if (this)
+ type = this->type;
+
+ if (JS_Array == type) {
+ len = 0;
+ for (i = 0; i < this->length; i++) {
+ n = this->members[i]->__toStringLen();
+ len += n + 1;
+ }
+
+ s = scf__auto_malloc(len);
+ if (!s)
+ return NULL;
+
+ len = 0;
+ for (i = 0; i < this->length; i++) {
+ n = this->members[i]->__toString(s + len);
+ len += n;
+
+ if (i < this->length - 1) {
+ sprintf(s + len, ", ");
+ len += 2;
+ }
+ }
+ } else {
+ len = this->__toStringLen();
+
+ s = scf__auto_malloc(len);
+ if (!s)
+ return NULL;
+
+ this->__toString(s);
+ }
+
return s;
}
@@ -324,6 +393,83 @@ struct Object
Object* res = new Object(sqrt(obj->d));
return res;
}
+
+ Object* RegExpr(Object* this, const char* pattern)
+ {
+ Object* res = new Object(pattern);
+ return res;
+ }
+
+ Object* RegExpr(Object* this, const char* pattern, const char* modifiers)
+ {
+ int n0 = strlen(pattern);
+ int n1 = strlen(modifiers);
+
+ char* s = malloc(n0 + n1 + 2);
+ if (!s)
+ return NULL;
+ sprintf(s, "%s/%s", pattern, modifiers);
+
+ Object* res = new Object(s);
+
+ free(s);
+ return res;
+ }
+
+ Object* RegExpr(Object* this, Object* pattern)
+ {
+ return this->RegExpr(pattern->str);
+ }
+ Object* RegExpr(Object* this, Object* pattern, Object* modifiers)
+ {
+ return this->RegExpr(pattern->str, modifiers->str);
+ }
+
+ Object* substr(Object* this, int j0, int j1)
+ {
+ Object* res = new Object();
+ if (res) {
+ int len = j1 - j0;
+
+ res->str = scf__auto_malloc(len + 1);
+ if (res->str) {
+ memcpy(res->str, this->str + j0, len);
+ }
+
+ res->type = JS_String;
+ }
+ return res;
+ }
+
+ Object* match(Object* this, const char* pattern)
+ {
+ int* ovector = NULL;
+
+ int rc = abc_pcre2_match(&ovector, this->str, pattern);
+ if (rc < 0)
+ return NULL;
+
+ Object* res = new Object("matches", rc);
+ if (res) {
+ int i;
+ for (i = 0; i < rc; i++) {
+ int j0 = ovector[2 * i];
+ int j1 = ovector[2 * i + 1];
+
+ res->members[i] = this->substr(j0, j1);
+ }
+
+ res->type = JS_Array;
+ }
+
+ free(ovector);
+ return res;
+ }
+
+ Object* match(Object* this, Object* pattern)
+ {
+ return this->match(pattern->str);
+ }
};
const double Math_PI = 3.1415926;
@@ -338,6 +484,9 @@ void Object_func_arguments(Object* this, int i, Object* arg)
int Object_array_realloc(Object* this, int i)
{
+ if (JS_Object != this->type)
+ return 0;
+
if (i < this->length)
return 0;
diff --git a/js/elf/scf_elf_link.c b/js/elf/scf_elf_link.c
index 719f8d7..ba62981 100644
--- a/js/elf/scf_elf_link.c
+++ b/js/elf/scf_elf_link.c
@@ -1003,7 +1003,7 @@ static int link_relas(scf_elf_file_t* exec, char* afiles[], int nb_afiles, char*
return -1;
}
}
-
+#if 0
for (i = 0; i < exec->dyn_needs->size; i++) {
so = exec->dyn_needs->data[i];
@@ -1033,6 +1033,7 @@ static int link_relas(scf_elf_file_t* exec, char* afiles[], int nb_afiles, char*
scf_vector_add_unique(exec->dyn_needs, so2);
}
}
+#endif
return 0;
}
diff --git a/js/native/x64/scf_x64_peephole.c b/js/native/x64/scf_x64_peephole.c
index 7a1d856..57f906c 100644
--- a/js/native/x64/scf_x64_peephole.c
+++ b/js/native/x64/scf_x64_peephole.c
@@ -339,7 +339,7 @@ static int x64_inst_is_useful(scf_instruction_t* inst, scf_instruction_t* std)
if (x64_inst_data_is_reg(&inst->dst)) {
scf_register_t* r0 = inst->dst.base;
- scf_register_t* r1 = std->src.base;
+ scf_register_t* r1;
if (SCF_X64_CALL == std->OpCode->type) {
@@ -352,15 +352,25 @@ static int x64_inst_is_useful(scf_instruction_t* inst, scf_instruction_t* std)
return 1;
} else {
+ r1 = std->src.base;
if (x64_inst_data_is_reg(&std->src)) {
if (X64_COLOR_CONFLICT(r0->color, r1->color))
return 1;
}
- if (std->src.base == inst->dst.base
- || std->src.index == inst->dst.base
- || std->dst.index == inst->dst.base
- || std->dst.base == inst->dst.base)
+ if (r1 && X64_COLOR_CONFLICT(r1->color, r0->color))
+ return 1;
+
+ r1 = std->src.index;
+ if (r1 && X64_COLOR_CONFLICT(r1->color, r0->color))
+ return 1;
+
+ r1 = std->dst.index;
+ if (r1 && X64_COLOR_CONFLICT(r1->color, r0->color))
+ return 1;
+
+ r1 = std->dst.base;
+ if (r1 && X64_COLOR_CONFLICT(r1->color, r0->color))
return 1;
}
@@ -502,9 +512,6 @@ static int _x64_peephole_function(scf_vector_t* tmp_insts, scf_function_t* f)
assert(0 == scf_vector_del(c->instructions, inst));
assert(0 == scf_vector_del(tmp_insts, inst));
-// scf_logd("del: \n");
-// scf_instruction_print(inst);
-
free(inst);
inst = NULL;
}
diff --git a/js/native/x64/scf_x64_reg.c b/js/native/x64/scf_x64_reg.c
index ae6033b..36b1bd7 100644
--- a/js/native/x64/scf_x64_reg.c
+++ b/js/native/x64/scf_x64_reg.c
@@ -1221,24 +1221,25 @@ int x64_array_index_reg(x64_sib_t* sib, scf_dag_node_t* base, scf_dag_node_t* in
if (ri->bytes < ri2->bytes) {
if (scf_variable_signed(index->var)) {
- mov = x64_find_OpCode(SCF_X64_MOVSX, ri->bytes, ri2->bytes, SCF_X64_E2G);
+ mov = x64_find_OpCode(SCF_X64_MOVSX, ri->bytes, ri2->bytes, SCF_X64_E2G);
+ inst = x64_make_inst_E2G(mov, ri2, ri);
+ X64_INST_ADD_CHECK(c->instructions, inst);
} else if (ri->bytes <= 2) {
- mov = x64_find_OpCode(SCF_X64_MOVZX, ri->bytes, ri2->bytes, SCF_X64_E2G);
+ mov = x64_find_OpCode(SCF_X64_MOVZX, ri->bytes, ri2->bytes, SCF_X64_E2G);
+ inst = x64_make_inst_E2G(mov, ri2, ri);
+ X64_INST_ADD_CHECK(c->instructions, inst);
} else {
assert(4 == ri->bytes);
-
+/*
xor = x64_find_OpCode(SCF_X64_XOR, 8, 8, SCF_X64_G2E);
inst = x64_make_inst_G2E(xor, ri2, ri2);
X64_INST_ADD_CHECK(c->instructions, inst);
-
- mov = x64_find_OpCode(SCF_X64_MOV, 4, 4, SCF_X64_E2G);
+ mov = x64_find_OpCode(SCF_X64_MOV, 4, 4, SCF_X64_E2G);
+*/
}
- inst = x64_make_inst_E2G(mov, ri2, ri);
- X64_INST_ADD_CHECK(c->instructions, inst);
-
ri = ri2;
}
--
2.25.1