void orc_x86_assemble_copy (OrcCompiler *compiler) { OrcInstruction *insn; int shift = 0; insn = compiler->program->insns + 0; if (strcmp (insn->opcode->name, "copyw") == 0) { shift = 1; } else if (strcmp (insn->opcode->name, "copyl") == 0) { shift = 2; } compiler->used_regs[X86_EDI] = TRUE; compiler->used_regs[X86_ESI] = TRUE; orc_x86_emit_prologue (compiler); orc_x86_emit_mov_memoffset_reg (compiler, 4, (int)ORC_STRUCT_OFFSET(OrcExecutor,arrays[insn->dest_args[0]]), compiler->exec_reg, X86_EDI); orc_x86_emit_mov_memoffset_reg (compiler, 4, (int)ORC_STRUCT_OFFSET(OrcExecutor,arrays[insn->src_args[0]]), compiler->exec_reg, X86_ESI); orc_x86_emit_mov_memoffset_reg (compiler, 4, (int)ORC_STRUCT_OFFSET(OrcExecutor,n), compiler->exec_reg, compiler->gp_tmpreg); orc_x86_emit_sar_imm_reg (compiler, 4, 2 - shift, compiler->gp_tmpreg); orc_x86_emit_rep_movs (compiler, 4); if (shift == 0) { orc_x86_emit_mov_memoffset_reg (compiler, 4, (int)ORC_STRUCT_OFFSET(OrcExecutor,n), compiler->exec_reg, compiler->gp_tmpreg); orc_x86_emit_and_imm_reg (compiler, 4, 3, compiler->gp_tmpreg); orc_x86_emit_rep_movs (compiler, 1); } if (shift == 1) { orc_x86_emit_mov_memoffset_reg (compiler, 4, (int)ORC_STRUCT_OFFSET(OrcExecutor,n), compiler->exec_reg, compiler->gp_tmpreg); orc_x86_emit_and_imm_reg (compiler, 4, 1, compiler->gp_tmpreg); orc_x86_emit_rep_movs (compiler, 2); } orc_x86_emit_epilogue (compiler); orc_x86_do_fixups (compiler); }
void orc_sse_set_mxcsr (OrcCompiler *compiler) { orc_x86_emit_cpuinsn_load_memoffset (compiler, ORC_X86_stmxcsr, 4, 0, (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A4]), compiler->exec_reg, 0); orc_x86_emit_mov_memoffset_reg (compiler, 4, (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A4]), compiler->exec_reg, compiler->gp_tmpreg); orc_x86_emit_mov_reg_memoffset (compiler, 4, compiler->gp_tmpreg, (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_C1]), compiler->exec_reg); orc_x86_emit_cpuinsn_imm_reg (compiler, ORC_X86_or_imm32_rm, 4, 0x8040, compiler->gp_tmpreg); orc_x86_emit_mov_reg_memoffset (compiler, 4, compiler->gp_tmpreg, (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A4]), compiler->exec_reg); orc_x86_emit_cpuinsn_load_memoffset (compiler, ORC_X86_ldmxcsr, 4, 0, (int)ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A4]), compiler->exec_reg, 0); }
void orc_x86_emit_prologue (OrcCompiler *compiler) { orc_compiler_append_code(compiler,".global %s\n", compiler->program->name); orc_compiler_append_code(compiler,".p2align 4\n"); orc_compiler_append_code(compiler,"%s:\n", compiler->program->name); if (compiler->is_64bit) { int i; for(i=0;i<16;i++){ if (compiler->used_regs[ORC_GP_REG_BASE+i] && compiler->save_regs[ORC_GP_REG_BASE+i]) { orc_x86_emit_push (compiler, 8, ORC_GP_REG_BASE+i); } } } else { orc_x86_emit_push (compiler, 4, X86_EBP); if (compiler->use_frame_pointer) { orc_x86_emit_mov_reg_reg (compiler, 4, X86_ESP, X86_EBP); } orc_x86_emit_mov_memoffset_reg (compiler, 4, 8, X86_ESP, compiler->exec_reg); if (compiler->used_regs[X86_EDI]) { orc_x86_emit_push (compiler, 4, X86_EDI); } if (compiler->used_regs[X86_ESI]) { orc_x86_emit_push (compiler, 4, X86_ESI); } if (compiler->used_regs[X86_EBX]) { orc_x86_emit_push (compiler, 4, X86_EBX); } } #if 0 orc_x86_emit_rdtsc(compiler); orc_x86_emit_mov_reg_memoffset (compiler, 4, X86_EAX, ORC_STRUCT_OFFSET(OrcExecutor,params[ORC_VAR_A3]), compiler->exec_reg); #endif }