support func_ptr var & func_ptr array[]
authoryu.dongliang <18588496441@163.com>
Wed, 17 Jun 2026 16:24:36 +0000 (00:24 +0800)
committeryu.dongliang <18588496441@163.com>
Wed, 17 Jun 2026 16:24:36 +0000 (00:24 +0800)
examples/array_func_ptr.c
native/x64/scf_x64_inst_common.c

index 354a229745308c30fccfd82c4617ce09de9888ef..218c963be5c834c3d0243d6550505b85e2bcb3ff 100644 (file)
@@ -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;
 }
index cdd4fbd48e4251742527a7d4e5b70a79291959b6..1d9eba7693dd8edbc046d200259ebb9fa79cb4f3 100644 (file)
@@ -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);