/*********************************************************************** * PASS 0 * * Work forwards to give each calculated value a unique number. Where * an instruction produces duplicate values (eg DP3), all are given * the same number. * * Translate away swizzling and eliminate non-saturating moves. */ void brw_wm_pass0( struct brw_wm_compile *c ) { GLuint insn; c->nr_vreg = 0; c->nr_insns = 0; pass0_init_undef(c); pass0_init_payload(c); for (insn = 0; insn < c->nr_fp_insns; insn++) { const struct prog_instruction *inst = &c->prog_instructions[insn]; /* Optimize away moves, otherwise emit translated instruction: */ switch (inst->Opcode) { case OPCODE_MOV: case OPCODE_SWZ: if (!inst->SaturateMode) { pass0_precalc_mov(c, inst); } else { translate_insn(c, inst); } break; default: translate_insn(c, inst); break; } } if (unlikely(INTEL_DEBUG & DEBUG_WM)) { brw_wm_print_program(c, "pass0"); } }
int main() { unsigned char insn[] = { 0xf7, 0xd0 }; /* Rex r; r.ToIR( insn, (unsigned int)0x8000 ); */ translate_init(); IRSB *bb = translate_insn( VexArchX86, insn, (unsigned int)0x8000000); printf("stmts_size: %d\n", bb->stmts_size); printf("stmts_used: %d\n", bb->stmts_used); IRStmt **stmts = bb->stmts; printf("stmts->tag: %08x\n", (*stmts)->tag ); printf("stmts->IMark->addr: %08x\n", (*stmts)->Ist.IMark.addr); printf("stmts->IMark->len: %d\n", (*stmts)->Ist.IMark.len); }