void ngen_CC_Param(shil_opcode* op,shil_param* par,CanonicalParamType tp) { switch(tp) { //push the contents case CPT_u32: case CPT_f32: if (par->is_reg()) { if (reg.IsAllocg(*par)) x86e->Emit(op_push32,reg.mapg(*par)); else if (reg.IsAllocf(*par)) { x86e->Emit(op_sub32,ESP,4); x86e->Emit(op_movss,x86_mrm(ESP), reg.mapf(*par)); } else { die("Must not happen !\n"); x86e->Emit(op_push32,x86_ptr(par->reg_ptr())); } } else if (par->is_imm()) x86e->Emit(op_push,par->_imm); else die("invalid combination"); ngen_CC_BytesPushed+=4; break; //push the ptr itself case CPT_ptr: verify(par->is_reg()); die("FAIL"); x86e->Emit(op_push,(unat)par->reg_ptr()); for (int ri=0;ri<(*par).count();ri++) { if (reg.IsAllocf(*par,ri)) { x86e->Emit(op_sub32,ESP,4); x86e->Emit(op_movss,x86_mrm(ESP),reg.mapfv(*par,ri)); } else { verify(!reg.IsAllocAny((Sh4RegType)(par->_reg+ri))); } } ngen_CC_BytesPushed+=4; break; //store from EAX case CPT_u64rvL: case CPT_u32rv: if (reg.IsAllocg(*par)) x86e->Emit(op_mov32,reg.mapg(*par),EAX); /*else if (reg.IsAllocf(*par)) x86e->Emit(op_movd_xmm_from_r32,reg.mapf(*par),EAX);*/ else die("Must not happen!\n"); break; case CPT_u64rvH: if (reg.IsAllocg(*par)) x86e->Emit(op_mov32,reg.mapg(*par),EDX); else die("Must not happen!\n"); break; //Store from ST(0) case CPT_f32rv: verify(reg.IsAllocf(*par)); x86e->Emit(op_fstp32f,x86_ptr(par->reg_ptr())); x86e->Emit(op_movss,reg.mapf(*par),x86_ptr(par->reg_ptr())); break; } }
/*__declspec(dllexport) */x86_mrm_t x86_mrm(x86_reg base,x86_reg index) { return x86_mrm(base,index,sib_scale_1,0); }
/*__declspec(dllexport) */x86_mrm_t x86_mrm(x86_reg index,x86_sib_scale scale,x86_ptr disp) { return x86_mrm(NO_REG,index,scale,disp); }
/*__declspec(dllexport) */x86_mrm_t x86_mrm(x86_reg base,x86_ptr disp) { return x86_mrm(base,NO_REG,sib_scale_1,disp); }
/*__declspec(dllexport) */x86_mrm_t x86_mrm(x86_reg base) { return x86_mrm(base,NO_REG,sib_scale_1,0); }
x86_mrm_t c_mrm(x86_ptr mem) { return x86_mrm(NO_REG,mem); }