memset(env,0,offsetof(CPUM68KState,breakpoints));#if!defined(CONFIG_USER_ONLY)env->sr=0x2700;#endifm68k_switch_sp(env);/* ??? FP regs should be initialized to NaN. */env->cc_op=CC_OP_FLAGS;/* TODO: We should set PC from the interrupt vector. */env->pc=0;tlb_flush(env,1);}CPUM68KState*cpu_m68k_init(constchar*cpu_model){CPUM68KState*env;
/* MMU *//* TODO: This will need fixing once the MMU is implemented. */target_phys_addr_tcpu_get_phys_page_debug(CPUState*env,target_ulongaddr){returnaddr;}
uint32_tHELPER(bitrev)(uint32_tx){x=((x>>1)&0x55555555u)|((x<<1)&0xaaaaaaaau);x=((x>>2)&0x33333333u)|((x<<2)&0xccccccccu);x=((x>>4)&0x0f0f0f0fu)|((x<<4)&0xf0f0f0f0u);returnbswap32(x);}uint32_tHELPER(ff1)(uint32_tx){intn;for(n=32;x;n--)x>>=1;returnn;}uint32_tHELPER(sats)(uint32_tval,uint32_tccr){/* The result has the opposite sign to the original value. */if(ccr&CCF_V)val=(((int32_t)val)>>31)^SIGNBIT;returnval;}uint32_tHELPER(subx_cc)(CPUState*env,uint32_top1,uint32_top2){uint32_tres;uint32_told_flags;old_flags=env->cc_dest;if(env->cc_x){env->cc_x=(op1<=op2);env->cc_op=CC_OP_SUBX;res=op1-(op2+1);}else{env->cc_x=(op1<op2);env->cc_op=CC_OP_SUB;res=op1-op2;}env->cc_dest=res;env->cc_src=op2;cpu_m68k_flush_flags(env,env->cc_op);/* !Z is sticky. */env->cc_dest&=(old_flags|~CCF_Z);returnres;}uint32_tHELPER(addx_cc)(CPUState*env,uint32_top1,uint32_top2){uint32_tres;uint32_told_flags;old_flags=env->cc_dest;if(env->cc_x){res=op1+op2+1;env->cc_x=(res<=op2);env->cc_op=CC_OP_ADDX;}else{res=op1+op2;env->cc_x=(res<op2);env->cc_op=CC_OP_ADD;}env->cc_dest=res;env->cc_src=op2;cpu_m68k_flush_flags(env,env->cc_op);/* !Z is sticky. */env->cc_dest&=(old_flags|~CCF_Z);returnres;}uint32_tHELPER(xflag_lt)(uint32_ta,uint32_tb){returna<b;}uint32_tHELPER(btest)(uint32_tx){returnx!=0;}voidHELPER(set_sr)(CPUState*env,uint32_tval){env->sr=val&0xffff;m68k_switch_sp(env);}uint32_tHELPER(shl_cc)(CPUState*env,uint32_tval,uint32_tshift){uint32_tresult;uint32_tcf;shift&=63;if(shift==0){result=val;cf=env->cc_src&CCF_C;}elseif(shift<32){result=val<<shift;cf=(val>>(32-shift))&1;}elseif(shift==32){result=0;cf=val&1;}else/* shift > 32 */{result=0;cf=0;}env->cc_src=cf;env->cc_x=(cf!=0);env->cc_dest=result;returnresult;}uint32_tHELPER(shr_cc)(CPUState*env,uint32_tval,uint32_tshift){uint32_tresult;uint32_tcf;shift&=63;if(shift==0){result=val;cf=env->cc_src&CCF_C;}elseif(shift<32){result=val>>shift;cf=(val>>(shift-1))&1;}elseif(shift==32){result=0;cf=val>>31;}else/* shift > 32 */{result=0;cf=0;}env->cc_src=cf;env->cc_x=(cf!=0);env->cc_dest=result;returnresult;}uint32_tHELPER(sar_cc)(CPUState*env,uint32_tval,uint32_tshift){uint32_tresult;uint32_tcf;shift&=63;if(shift==0){result=val;cf=(env->cc_src&CCF_C)!=0;}elseif(shift<32){result=(int32_t)val>>shift;cf=(val>>(shift-1))&1;}else/* shift >= 32 */{result=(int32_t)val>>31;cf=val>>31;}env->cc_src=cf;env->cc_x=cf;env->cc_dest=result;returnresult;}/* FPU helpers. */uint32_tHELPER(f64_to_i32)(CPUState*env,float64val){returnfloat64_to_int32(val,&env->fp_status);}float32HELPER(f64_to_f32)(CPUState*env,float64val){returnfloat64_to_float32(val,&env->fp_status);}float64HELPER(i32_to_f64)(CPUState*env,uint32_tval){returnint32_to_float64(val,&env->fp_status);}float64HELPER(f32_to_f64)(CPUState*env,float32val){returnfloat32_to_float64(val,&env->fp_status);}float64HELPER(iround_f64)(CPUState*env,float64val){returnfloat64_round_to_int(val,&env->fp_status);}float64HELPER(itrunc_f64)(CPUState*env,float64val){returnfloat64_trunc_to_int(val,&env->fp_status);}float64HELPER(sqrt_f64)(CPUState*env,float64val){returnfloat64_sqrt(val,&env->fp_status);}float64HELPER(abs_f64)(float64val){returnfloat64_abs(val);}float64HELPER(chs_f64)(float64val){returnfloat64_chs(val);}float64HELPER(add_f64)(CPUState*env,float64a,float64b){returnfloat64_add(a,b,&env->fp_status);}float64HELPER(sub_f64)(CPUState*env,float64a,float64b){returnfloat64_sub(a,b,&env->fp_status);}float64HELPER(mul_f64)(CPUState*env,float64a,float64b){returnfloat64_mul(a,b,&env->fp_status);}float64HELPER(div_f64)(CPUState*env,float64a,float64b){returnfloat64_div(a,b,&env->fp_status);}float64HELPER(sub_cmp_f64)(CPUState*env,float64a,float64b){/* ??? This may incorrectly raise exceptions. *//* ??? Should flush denormals to zero. */float64res;res=float64_sub(a,b,&env->fp_status);if(float64_is_nan(res)){/* +/-inf compares equal against itself, but sub returns nan. */if(!float64_is_nan(a)&&!float64_is_nan(b)){res=float64_zero;if(float64_lt_quiet(a,res,&env->fp_status))res=float64_chs(res);}}returnres;}uint32_tHELPER(compare_f64)(CPUState*env,float64val){returnfloat64_compare_quiet(val,float64_zero,&env->fp_status);}/* MAC unit. *//*FIXME:TheMACunitimplementationisabitofamess.Somehelperstakevalues,otherstakeregisternumbersandmanipulatethecontentsin-place.*/voidHELPER(mac_move)(CPUState*env,uint32_tdest,uint32_tsrc){uint32_tmask;env->macc[dest]=env->macc[src];mask=MACSR_PAV0<<dest;if(env->macsr&(MACSR_PAV0<<src))env->macsr|=mask;elseenv->macsr&=~mask;}uint64_tHELPER(macmuls)(CPUState*env,uint32_top1,uint32_top2){int64_tproduct;int64_tres;product=(uint64_t)op1*op2;res=(product<<24)>>24;if(res!=product){env->macsr|=MACSR_V;if(env->macsr&MACSR_OMC){/* Make sure the accumulate operation overflows. */if(product<0)res=~(1ll<<50);elseres=1ll<<50;}}returnres;}uint64_tHELPER(macmulu)(CPUState*env,uint32_top1,uint32_top2){uint64_tproduct;product=(uint64_t)op1*op2;if(product&(0xffffffull<<40)){env->macsr|=MACSR_V;if(env->macsr&MACSR_OMC){/* Make sure the accumulate operation overflows. */product=1ll<<50;}else{product&=((1ull<<40)-1);}}returnproduct;}uint64_tHELPER(macmulf)(CPUState*env,uint32_top1,uint32_top2){uint64_tproduct;uint32_tremainder;product=(uint64_t)op1*op2;if(env->macsr&MACSR_RT){remainder=product&0xffffff;product>>=24;if(remainder>0x800000)product++;elseif(remainder==0x800000)product+=(product&1);}else{product>>=24;}returnproduct;}voidHELPER(macsats)(CPUState*env,uint32_tacc){int64_ttmp;int64_tresult;tmp=env->macc[acc];result=((tmp<<16)>>16);if(result!=tmp){env->macsr|=MACSR_V;}if(env->macsr&MACSR_V){env->macsr|=MACSR_PAV0<<acc;if(env->macsr&MACSR_OMC){/*Theresultissaturatedto32bits,despiteoverflowoccuringat48bits.Seemsweird,butthat'swhatthehardwaredocssay.*/result=(result>>63)^0x7fffffff;}}env->macc[acc]=result;}voidHELPER(macsatu)(CPUState*env,uint32_tacc){uint64_tval;val=env->macc[acc];if(val&(0xffffull<<48)){env->macsr|=MACSR_V;}if(env->macsr&MACSR_V){env->macsr|=MACSR_PAV0<<acc;if(env->macsr&MACSR_OMC){if(val>(1ull<<53))val=0;elseval=(1ull<<48)-1;}else{val&=((1ull<<48)-1);}}env->macc[acc]=val;}voidHELPER(macsatf)(CPUState*env,uint32_tacc){int64_tsum;int64_tresult;sum=env->macc[acc];result=(sum<<16)>>16;if(result!=sum){env->macsr|=MACSR_V;}if(env->macsr&MACSR_V){env->macsr|=MACSR_PAV0<<acc;if(env->macsr&MACSR_OMC){result=(result>>63)^0x7fffffffffffll;}}env->macc[acc]=result;}voidHELPER(mac_set_flags)(CPUState*env,uint32_tacc){uint64_tval;val=env->macc[acc];if(val==0)env->macsr|=MACSR_Z;elseif(val&(1ull<<47));env->macsr|=MACSR_N;if(env->macsr&(MACSR_PAV0<<acc)){env->macsr|=MACSR_V;}if(env->macsr&MACSR_FI){val=((int64_t)val)>>40;if(val!=0&&val!=-1)env->macsr|=MACSR_EV;}elseif(env->macsr&MACSR_SU){val=((int64_t)val)>>32;if(val!=0&&val!=-1)env->macsr|=MACSR_EV;}else{if((val>>32)!=0)env->macsr|=MACSR_EV;}}voidHELPER(flush_flags)(CPUState*env,uint32_tcc_op){cpu_m68k_flush_flags(env,cc_op);}uint32_tHELPER(get_macf)(CPUState*env,uint64_tval){intrem;uint32_tresult;if(env->macsr&MACSR_SU){/* 16-bit rounding. */rem=val&0xffffff;val=(val>>24)&0xffffu;if(rem>0x800000)val++;elseif(rem==0x800000)val+=(val&1);}elseif(env->macsr&MACSR_RT){/* 32-bit rounding. */rem=val&0xff;val>>=8;if(rem>0x80)val++;elseif(rem==0x80)val+=(val&1);}else{/* No rounding. */val>>=8;}if(env->macsr&MACSR_OMC){/* Saturate. */if(env->macsr&MACSR_SU){if(val!=(uint16_t)val){result=((val>>63)^0x7fff)&0xffff;}else{result=val&0xffff;}}else{if(val!=(uint32_t)val){result=((uint32_t)(val>>63)&0x7fffffff);}else{result=(uint32_t)val;}}}else{/* No saturation. */if(env->macsr&MACSR_SU){result=val&0xffff;}else{result=(uint32_t)val;}}returnresult;}uint32_tHELPER(get_macs)(uint64_tval){if(val==(int32_t)val){return(int32_t)val;}else{return(val>>61)^~SIGNBIT;}}uint32_tHELPER(get_macu)(uint64_tval){if((val>>32)==0){return(uint32_t)val;}else{return0xffffffffu;}}uint32_tHELPER(get_mac_extf)(CPUState*env,uint32_tacc){uint32_tval;val=env->macc[acc]&0x00ff;val=(env->macc[acc]>>32)&0xff00;val|=(env->macc[acc+1]<<16)&0x00ff0000;val|=(env->macc[acc+1]>>16)&0xff000000;returnval;}uint32_tHELPER(get_mac_exti)(CPUState*env,uint32_tacc){uint32_tval;val=(env->macc[acc]>>32)&0xffff;val|=(env->macc[acc+1]>>16)&0xffff0000;returnval;}voidHELPER(set_mac_extf)(CPUState*env,uint32_tval,uint32_tacc){int64_tres;int32_ttmp;res=env->macc[acc]&0xffffffff00ull;tmp=(int16_t)(val&0xff00);res|=((int64_t)tmp)<<32;res|=val&0xff;env->macc[acc]=res;res=env->macc[acc+1]&0xffffffff00ull;tmp=(val&0xff000000);res|=((int64_t)tmp)<<16;res|=(val>>16)&0xff;env->macc[acc+1]=res;}voidHELPER(set_mac_exts)(CPUState*env,uint32_tval,uint32_tacc){int64_tres;int32_ttmp;res=(uint32_t)env->macc[acc];tmp=(int16_t)val;res|=((int64_t)tmp)<<32;env->macc[acc]=res;res=(uint32_t)env->macc[acc+1];tmp=val&0xffff0000;res|=(int64_t)tmp<<16;env->macc[acc+1]=res;}voidHELPER(set_mac_extu)(CPUState*env,uint32_tval,uint32_tacc){uint64_tres;res=(uint32_t)env->macc[acc];res|=((uint64_t)(val&0xffff))<<32;env->macc[acc]=res;res=(uint32_t)env->macc[acc+1];res|=(uint64_t)(val&0xffff0000)<<16;env->macc[acc+1]=res;}