Commit 644ad8066d171f5e0ce58912f72e1f13d55f4a93
1 parent
69397542
Fix VFP fixed point conversion routines.
Signed-off-by: Paul Brook <paul@codesourcery.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6103 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
13 additions
and
9 deletions
target-arm/helper.c
| ... | ... | @@ -2522,7 +2522,7 @@ ftype VFP_HELPER(name##to, p)(ftype x, uint32_t shift, CPUState *env) \ |
| 2522 | 2522 | ftype tmp; \ |
| 2523 | 2523 | tmp = sign##int32_to_##ftype ((itype)vfp_##p##toi(x), \ |
| 2524 | 2524 | &env->vfp.fp_status); \ |
| 2525 | - return ftype##_scalbn(tmp, shift, &env->vfp.fp_status); \ | |
| 2525 | + return ftype##_scalbn(tmp, -(int)shift, &env->vfp.fp_status); \ | |
| 2526 | 2526 | } \ |
| 2527 | 2527 | ftype VFP_HELPER(to##name, p)(ftype x, uint32_t shift, CPUState *env) \ |
| 2528 | 2528 | { \ | ... | ... |
target-arm/translate.c
| ... | ... | @@ -3001,6 +3001,10 @@ static int disas_vfp_insn(CPUState * env, DisasContext *s, uint32_t insn) |
| 3001 | 3001 | case 21: |
| 3002 | 3002 | case 22: |
| 3003 | 3003 | case 23: |
| 3004 | + case 28: | |
| 3005 | + case 29: | |
| 3006 | + case 30: | |
| 3007 | + case 31: | |
| 3004 | 3008 | /* Source and destination the same. */ |
| 3005 | 3009 | gen_mov_F0_vreg(dp, rd); |
| 3006 | 3010 | break; |
| ... | ... | @@ -3120,22 +3124,22 @@ static int disas_vfp_insn(CPUState * env, DisasContext *s, uint32_t insn) |
| 3120 | 3124 | case 20: /* fshto */ |
| 3121 | 3125 | if (!arm_feature(env, ARM_FEATURE_VFP3)) |
| 3122 | 3126 | return 1; |
| 3123 | - gen_vfp_shto(dp, rm); | |
| 3127 | + gen_vfp_shto(dp, 16 - rm); | |
| 3124 | 3128 | break; |
| 3125 | 3129 | case 21: /* fslto */ |
| 3126 | 3130 | if (!arm_feature(env, ARM_FEATURE_VFP3)) |
| 3127 | 3131 | return 1; |
| 3128 | - gen_vfp_slto(dp, rm); | |
| 3132 | + gen_vfp_slto(dp, 32 - rm); | |
| 3129 | 3133 | break; |
| 3130 | 3134 | case 22: /* fuhto */ |
| 3131 | 3135 | if (!arm_feature(env, ARM_FEATURE_VFP3)) |
| 3132 | 3136 | return 1; |
| 3133 | - gen_vfp_uhto(dp, rm); | |
| 3137 | + gen_vfp_uhto(dp, 16 - rm); | |
| 3134 | 3138 | break; |
| 3135 | 3139 | case 23: /* fulto */ |
| 3136 | 3140 | if (!arm_feature(env, ARM_FEATURE_VFP3)) |
| 3137 | 3141 | return 1; |
| 3138 | - gen_vfp_ulto(dp, rm); | |
| 3142 | + gen_vfp_ulto(dp, 32 - rm); | |
| 3139 | 3143 | break; |
| 3140 | 3144 | case 24: /* ftoui */ |
| 3141 | 3145 | gen_vfp_toui(dp); |
| ... | ... | @@ -3152,22 +3156,22 @@ static int disas_vfp_insn(CPUState * env, DisasContext *s, uint32_t insn) |
| 3152 | 3156 | case 28: /* ftosh */ |
| 3153 | 3157 | if (!arm_feature(env, ARM_FEATURE_VFP3)) |
| 3154 | 3158 | return 1; |
| 3155 | - gen_vfp_tosh(dp, rm); | |
| 3159 | + gen_vfp_tosh(dp, 16 - rm); | |
| 3156 | 3160 | break; |
| 3157 | 3161 | case 29: /* ftosl */ |
| 3158 | 3162 | if (!arm_feature(env, ARM_FEATURE_VFP3)) |
| 3159 | 3163 | return 1; |
| 3160 | - gen_vfp_tosl(dp, rm); | |
| 3164 | + gen_vfp_tosl(dp, 32 - rm); | |
| 3161 | 3165 | break; |
| 3162 | 3166 | case 30: /* ftouh */ |
| 3163 | 3167 | if (!arm_feature(env, ARM_FEATURE_VFP3)) |
| 3164 | 3168 | return 1; |
| 3165 | - gen_vfp_touh(dp, rm); | |
| 3169 | + gen_vfp_touh(dp, 16 - rm); | |
| 3166 | 3170 | break; |
| 3167 | 3171 | case 31: /* ftoul */ |
| 3168 | 3172 | if (!arm_feature(env, ARM_FEATURE_VFP3)) |
| 3169 | 3173 | return 1; |
| 3170 | - gen_vfp_toul(dp, rm); | |
| 3174 | + gen_vfp_toul(dp, 32 - rm); | |
| 3171 | 3175 | break; |
| 3172 | 3176 | default: /* undefined */ |
| 3173 | 3177 | printf ("rn:%d\n", rn); | ... | ... |