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);
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);
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);
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);