void orc_mips_emit_conditional_branch (OrcCompiler *compiler, int condition, OrcMipsRegister rs, OrcMipsRegister rt, unsigned int label) { int offset; char *opcode_name[] = { NULL, NULL, NULL, NULL, "beq ", "bne ", "blez", "bgtz" }; switch (condition) { case ORC_MIPS_BEQ: case ORC_MIPS_BNE: ORC_ASM_CODE (compiler, " %s %s, %s, .L%s%d\n", opcode_name[condition], orc_mips_reg_name (rs), orc_mips_reg_name (rt), compiler->program->name, label); break; case ORC_MIPS_BLEZ: case ORC_MIPS_BGTZ: ORC_ASSERT (rt == ORC_MIPS_ZERO); ORC_ASM_CODE (compiler, " %s %s, .L%s%d\n", opcode_name[condition], orc_mips_reg_name (rs), compiler->program->name, label); break; default: ORC_PROGRAM_ERROR (compiler, "unknown branch type: 0x%x", condition); } if (compiler->labels[label]) { offset = (compiler->labels[label] - (compiler->codeptr+4)) >> 2; } else {
void orc_arm_load_constants_outer (OrcCompiler *compiler) { int i; for(i=0;i<ORC_N_COMPILER_VARIABLES;i++){ if (compiler->vars[i].name == NULL) continue; switch (compiler->vars[i].vartype) { case ORC_VAR_TYPE_CONST: //orc_arm_emit_load_imm (compiler, compiler->vars[i].alloc, // (int)compiler->vars[i].value); break; case ORC_VAR_TYPE_PARAM: ORC_PROGRAM_ERROR(compiler,"unimplemented"); return; /* FIXME offset is too large */ //orc_arm_loadw (compiler, compiler->vars[i].alloc, // compiler->exec_reg, // (int)ORC_STRUCT_OFFSET(OrcExecutor, params[i])); break; case ORC_VAR_TYPE_SRC: case ORC_VAR_TYPE_DEST: break; default: break; } } for(i=0;i<compiler->n_insns;i++){ OrcInstruction *insn = compiler->insns + i; OrcStaticOpcode *opcode = insn->opcode; OrcRule *rule; if (!(insn->flags & ORC_INSN_FLAG_INVARIANT)) continue; ORC_ASM_CODE(compiler,"# %d: %s\n", i, insn->opcode->name); rule = insn->rule; if (rule && rule->emit) { rule->emit (compiler, rule->emit_user, insn); } else { ORC_COMPILER_ERROR(compiler,"No rule for: %s", opcode->name); } } }