From: yu.dongliang <18588496441@163.com> Date: Wed, 17 Jun 2026 16:24:36 +0000 (+0800) Subject: support func_ptr var & func_ptr array[] X-Git-Url: http://baseworks.info/?a=commitdiff_plain;h=88ef1b3652496e6830862c2418d19a0af0bdc5a7;p=scf.git support func_ptr var & func_ptr array[] --- diff --git a/examples/array_func_ptr.c b/examples/array_func_ptr.c index 354a229..218c963 100644 --- a/examples/array_func_ptr.c +++ b/examples/array_func_ptr.c @@ -15,8 +15,9 @@ int sub(int a, int b) int main() { + op_pt* op = add; op_pt* ops[] = {add, sub}; - printf("ops[0](1, 2): %d\n", ops[0](1, 2)); + printf("op(1, 2): %d, ops[1](3, 4): %d\n", op(1, 2), ops[1](3, 4)); return 0; } diff --git a/native/x64/scf_x64_inst_common.c b/native/x64/scf_x64_inst_common.c index cdd4fbd..1d9eba7 100644 --- a/native/x64/scf_x64_inst_common.c +++ b/native/x64/scf_x64_inst_common.c @@ -86,18 +86,21 @@ static int _x64_inst_op2_imm(int OpCode_type, scf_dag_node_t* dst, scf_dag_node_ else X64_SELECT_REG_CHECK(&rd, dst, c, f, 1); - OpCode = x64_find_OpCode(OpCode_type, src_size, dst_size, SCF_X64_I2G); - if (OpCode) { - inst = x64_make_inst_I2G(OpCode, rd, (uint8_t*)&src->var->data, src_size); - X64_INST_ADD_CHECK(c->instructions, inst, NULL); - return 0; - } + if (scf_variable_const_integer(src->var)) { - OpCode = x64_find_OpCode(OpCode_type, src_size, dst_size, SCF_X64_I2E); - if (OpCode) { - inst = x64_make_inst_I2E(OpCode, rd, (uint8_t*)&src->var->data, src_size); - X64_INST_ADD_CHECK(c->instructions, inst, NULL); - return 0; + OpCode = x64_find_OpCode(OpCode_type, src_size, dst_size, SCF_X64_I2G); + if (OpCode) { + inst = x64_make_inst_I2G(OpCode, rd, (uint8_t*)&src->var->data, src_size); + X64_INST_ADD_CHECK(c->instructions, inst, NULL); + return 0; + } + + OpCode = x64_find_OpCode(OpCode_type, src_size, dst_size, SCF_X64_I2E); + if (OpCode) { + inst = x64_make_inst_I2E(OpCode, rd, (uint8_t*)&src->var->data, src_size); + X64_INST_ADD_CHECK(c->instructions, inst, NULL); + return 0; + } } OpCode = x64_find_OpCode(OpCode_type, src_size, dst_size, SCF_X64_G2E); @@ -120,12 +123,15 @@ static int _x64_inst_op2_imm(int OpCode_type, scf_dag_node_t* dst, scf_dag_node_ return 0; } - OpCode = x64_find_OpCode(OpCode_type, src_size, dst_size, SCF_X64_I2E); - if (OpCode) { - inst = x64_make_inst_I2M(&rela, OpCode, dst->var, NULL, (uint8_t*)&src->var->data, src_size); - X64_INST_ADD_CHECK(c->instructions, inst, rela); - X64_RELA_ADD_CHECK(f->data_relas, rela, c, dst->var, NULL); - return 0; + if (scf_variable_const_integer(src->var)) { + + OpCode = x64_find_OpCode(OpCode_type, src_size, dst_size, SCF_X64_I2E); + if (OpCode) { + inst = x64_make_inst_I2M(&rela, OpCode, dst->var, NULL, (uint8_t*)&src->var->data, src_size); + X64_INST_ADD_CHECK(c->instructions, inst, rela); + X64_RELA_ADD_CHECK(f->data_relas, rela, c, dst->var, NULL); + return 0; + } } OpCode = x64_find_OpCode(OpCode_type, src_size, dst_size, SCF_X64_G2E); @@ -149,36 +155,6 @@ static int _x64_inst_op2_imm(int OpCode_type, scf_dag_node_t* dst, scf_dag_node_ return 0; } -static int _x64_inst_op2_imm_str(int OpCode_type, scf_dag_node_t* dst, scf_dag_node_t* src, scf_3ac_code_t* c, scf_function_t* f) -{ - if (SCF_X64_MOV != OpCode_type) { - scf_loge("\n"); - return -EINVAL; - } - - scf_register_t* rd = NULL; - scf_instruction_t* inst = NULL; - scf_x64_OpCode_t* lea = x64_find_OpCode(SCF_X64_LEA, 8, 8, SCF_X64_E2G); - scf_rela_t* rela = NULL; - - int size0 = x64_variable_size(dst->var); - int size1 = x64_variable_size(src->var); - - assert(8 == size0); - assert(8 == size1); - - X64_SELECT_REG_CHECK(&rd, dst, c, f, 0); - - src->var->global_flag = 1; - src->var->local_flag = 0; - src->var->tmp_flag = 0; - - inst = x64_make_inst_M2G(&rela, lea, rd, NULL, src->var); - X64_INST_ADD_CHECK(c->instructions, inst, rela); - X64_RELA_ADD_CHECK(f->data_relas, rela, c, src->var, NULL); - return 0; -} - int x64_inst_op2(int OpCode_type, scf_dag_node_t* dst, scf_dag_node_t* src, scf_3ac_code_t* c, scf_function_t* f) { assert(0 != dst->color); @@ -190,9 +166,13 @@ int x64_inst_op2(int OpCode_type, scf_dag_node_t* dst, scf_dag_node_t* src, scf_ scf_rela_t* rela = NULL; if (0 == src->color) { + if (scf_variable_const_string(src->var)) { + if (SCF_X64_MOV != OpCode_type) + return -EINVAL; + X64_SELECT_REG_CHECK(&rd, dst, c, f, 0); - if (scf_variable_const_string(src->var)) - return _x64_inst_op2_imm_str(OpCode_type, dst, src, c, f); + return x64_load_const(rd, src, c, f); + } if (!scf_variable_float(src->var)) return _x64_inst_op2_imm(OpCode_type, dst, src, c, f);