diff options
| author | 2014-12-30 18:50:47 -0500 | |
|---|---|---|
| committer | 2014-12-30 23:56:45 -0500 | |
| commit | 631f13e462239bbbec929bc00d042191c9ebb06f (patch) | |
| tree | da601e8a202deaad9aec76ebcfd8d38fee534afd /src/core/arm/skyeye_common | |
| parent | Merge pull request #369 from darkf/mingw_ (diff) | |
| download | yuzu-631f13e462239bbbec929bc00d042191c9ebb06f.tar.gz yuzu-631f13e462239bbbec929bc00d042191c9ebb06f.tar.xz yuzu-631f13e462239bbbec929bc00d042191c9ebb06f.zip | |
dyncom: Massive refactor
Diffstat (limited to 'src/core/arm/skyeye_common')
| -rw-r--r-- | src/core/arm/skyeye_common/vfp/vfpinstr.cpp | 170 |
1 files changed, 30 insertions, 140 deletions
diff --git a/src/core/arm/skyeye_common/vfp/vfpinstr.cpp b/src/core/arm/skyeye_common/vfp/vfpinstr.cpp index cc70fc33c..b5fcbac86 100644 --- a/src/core/arm/skyeye_common/vfp/vfpinstr.cpp +++ b/src/core/arm/skyeye_common/vfp/vfpinstr.cpp | |||
| @@ -2891,32 +2891,15 @@ VSTR_INST: | |||
| 2891 | 2891 | ||
| 2892 | unsigned int base = (inst_cream->n == 15 ? (cpu->Reg[inst_cream->n] & 0xFFFFFFFC) + 8 : cpu->Reg[inst_cream->n]); | 2892 | unsigned int base = (inst_cream->n == 15 ? (cpu->Reg[inst_cream->n] & 0xFFFFFFFC) + 8 : cpu->Reg[inst_cream->n]); |
| 2893 | addr = (inst_cream->add ? base + inst_cream->imm32 : base - inst_cream->imm32); | 2893 | addr = (inst_cream->add ? base + inst_cream->imm32 : base - inst_cream->imm32); |
| 2894 | DBG("VSTR :\n"); | 2894 | |
| 2895 | |||
| 2896 | |||
| 2897 | if (inst_cream->single) | 2895 | if (inst_cream->single) |
| 2898 | { | 2896 | { |
| 2899 | fault = check_address_validity(cpu, addr, &phys_addr, 0); | 2897 | Memory::Write32(addr, cpu->ExtReg[inst_cream->d]); |
| 2900 | if (fault) goto MMU_EXCEPTION; | ||
| 2901 | fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d], 32); | ||
| 2902 | if (fault) goto MMU_EXCEPTION; | ||
| 2903 | DBG("\taddr[%x] <= s%d=[%x]\n", addr, inst_cream->d, cpu->ExtReg[inst_cream->d]); | ||
| 2904 | } | 2898 | } |
| 2905 | else | 2899 | else |
| 2906 | { | 2900 | { |
| 2907 | fault = check_address_validity(cpu, addr, &phys_addr, 0); | 2901 | Memory::Write32(addr, cpu->ExtReg[inst_cream->d*2]); |
| 2908 | if (fault) goto MMU_EXCEPTION; | 2902 | Memory::Write32(addr + 4, cpu->ExtReg[inst_cream->d*2+1]); |
| 2909 | |||
| 2910 | /* Check endianness */ | ||
| 2911 | fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d*2], 32); | ||
| 2912 | if (fault) goto MMU_EXCEPTION; | ||
| 2913 | |||
| 2914 | fault = check_address_validity(cpu, addr + 4, &phys_addr, 0); | ||
| 2915 | if (fault) goto MMU_EXCEPTION; | ||
| 2916 | |||
| 2917 | fault = interpreter_write_memory(addr + 4, phys_addr, cpu->ExtReg[inst_cream->d*2+1], 32); | ||
| 2918 | if (fault) goto MMU_EXCEPTION; | ||
| 2919 | DBG("\taddr[%x-%x] <= s[%d-%d]=[%x-%x]\n", addr+4, addr, inst_cream->d*2+1, inst_cream->d*2, cpu->ExtReg[inst_cream->d*2+1], cpu->ExtReg[inst_cream->d*2]); | ||
| 2920 | } | 2903 | } |
| 2921 | } | 2904 | } |
| 2922 | cpu->Reg[15] += GET_INST_SIZE(cpu); | 2905 | cpu->Reg[15] += GET_INST_SIZE(cpu); |
| @@ -3027,47 +3010,27 @@ VPUSH_INST: | |||
| 3027 | { | 3010 | { |
| 3028 | if ((inst_base->cond == 0xe) || CondPassed(cpu, inst_base->cond)) { | 3011 | if ((inst_base->cond == 0xe) || CondPassed(cpu, inst_base->cond)) { |
| 3029 | CHECK_VFP_ENABLED; | 3012 | CHECK_VFP_ENABLED; |
| 3030 | |||
| 3031 | int i; | 3013 | int i; |
| 3032 | 3014 | ||
| 3033 | vpush_inst *inst_cream = (vpush_inst *)inst_base->component; | 3015 | vpush_inst *inst_cream = (vpush_inst *)inst_base->component; |
| 3034 | 3016 | ||
| 3035 | DBG("VPUSH :\n"); | ||
| 3036 | |||
| 3037 | addr = cpu->Reg[R13] - inst_cream->imm32; | 3017 | addr = cpu->Reg[R13] - inst_cream->imm32; |
| 3038 | 3018 | ||
| 3039 | |||
| 3040 | for (i = 0; i < inst_cream->regs; i++) | 3019 | for (i = 0; i < inst_cream->regs; i++) |
| 3041 | { | 3020 | { |
| 3042 | if (inst_cream->single) | 3021 | if (inst_cream->single) |
| 3043 | { | 3022 | { |
| 3044 | fault = check_address_validity(cpu, addr, &phys_addr, 0); | 3023 | Memory::Write32(addr, cpu->ExtReg[inst_cream->d+i]); |
| 3045 | if (fault) goto MMU_EXCEPTION; | ||
| 3046 | fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32); | ||
| 3047 | if (fault) goto MMU_EXCEPTION; | ||
| 3048 | DBG("\taddr[%x] <= s%d=[%x]\n", addr, inst_cream->d+i, cpu->ExtReg[inst_cream->d+i]); | ||
| 3049 | addr += 4; | 3024 | addr += 4; |
| 3050 | } | 3025 | } |
| 3051 | else | 3026 | else |
| 3052 | { | 3027 | { |
| 3053 | /* Careful of endianness, little by default */ | 3028 | Memory::Write32(addr, cpu->ExtReg[(inst_cream->d+i)*2]); |
| 3054 | fault = check_address_validity(cpu, addr, &phys_addr, 0); | 3029 | Memory::Write32(addr + 4, cpu->ExtReg[(inst_cream->d+i)*2 + 1]); |
| 3055 | if (fault) goto MMU_EXCEPTION; | ||
| 3056 | fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2], 32); | ||
| 3057 | if (fault) goto MMU_EXCEPTION; | ||
| 3058 | |||
| 3059 | fault = check_address_validity(cpu, addr + 4, &phys_addr, 0); | ||
| 3060 | if (fault) goto MMU_EXCEPTION; | ||
| 3061 | fault = interpreter_write_memory(addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32); | ||
| 3062 | if (fault) goto MMU_EXCEPTION; | ||
| 3063 | DBG("\taddr[%x-%x] <= s[%d-%d]=[%x-%x]\n", addr+4, addr, (inst_cream->d+i)*2+1, (inst_cream->d+i)*2, cpu->ExtReg[(inst_cream->d+i)*2+1], cpu->ExtReg[(inst_cream->d+i)*2]); | ||
| 3064 | addr += 8; | 3030 | addr += 8; |
| 3065 | } | 3031 | } |
| 3066 | } | 3032 | } |
| 3067 | DBG("\tsp[%x]", cpu->Reg[R13]); | ||
| 3068 | cpu->Reg[R13] = cpu->Reg[R13] - inst_cream->imm32; | 3033 | cpu->Reg[R13] = cpu->Reg[R13] - inst_cream->imm32; |
| 3069 | DBG("=>[%x]\n", cpu->Reg[R13]); | ||
| 3070 | |||
| 3071 | } | 3034 | } |
| 3072 | cpu->Reg[15] += GET_INST_SIZE(cpu); | 3035 | cpu->Reg[15] += GET_INST_SIZE(cpu); |
| 3073 | INC_PC(sizeof(vpush_inst)); | 3036 | INC_PC(sizeof(vpush_inst)); |
| @@ -3110,7 +3073,7 @@ int DYNCOM_TRANS(vpush)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc){ | |||
| 3110 | { | 3073 | { |
| 3111 | if (single) | 3074 | if (single) |
| 3112 | { | 3075 | { |
| 3113 | //fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32); | 3076 | //Memory::Write32(addr, cpu->ExtReg[inst_cream->d+i]); |
| 3114 | #if 0 | 3077 | #if 0 |
| 3115 | phys_addr = get_phys_addr(cpu, bb, Addr, 0); | 3078 | phys_addr = get_phys_addr(cpu, bb, Addr, 0); |
| 3116 | bb = cpu->dyncom_engine->bb; | 3079 | bb = cpu->dyncom_engine->bb; |
| @@ -3199,43 +3162,24 @@ VSTM_INST: /* encoding 1 */ | |||
| 3199 | vstm_inst *inst_cream = (vstm_inst *)inst_base->component; | 3162 | vstm_inst *inst_cream = (vstm_inst *)inst_base->component; |
| 3200 | 3163 | ||
| 3201 | addr = (inst_cream->add ? cpu->Reg[inst_cream->n] : cpu->Reg[inst_cream->n] - inst_cream->imm32); | 3164 | addr = (inst_cream->add ? cpu->Reg[inst_cream->n] : cpu->Reg[inst_cream->n] - inst_cream->imm32); |
| 3202 | DBG("VSTM : addr[%x]\n", addr); | 3165 | |
| 3203 | |||
| 3204 | |||
| 3205 | for (i = 0; i < inst_cream->regs; i++) | 3166 | for (i = 0; i < inst_cream->regs; i++) |
| 3206 | { | 3167 | { |
| 3207 | if (inst_cream->single) | 3168 | if (inst_cream->single) |
| 3208 | { | 3169 | { |
| 3209 | fault = check_address_validity(cpu, addr, &phys_addr, 0); | 3170 | Memory::Write32(addr, cpu->ExtReg[inst_cream->d+i]); |
| 3210 | if (fault) goto MMU_EXCEPTION; | ||
| 3211 | |||
| 3212 | fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32); | ||
| 3213 | if (fault) goto MMU_EXCEPTION; | ||
| 3214 | DBG("\taddr[%x] <= s%d=[%x]\n", addr, inst_cream->d+i, cpu->ExtReg[inst_cream->d+i]); | ||
| 3215 | addr += 4; | 3171 | addr += 4; |
| 3216 | } | 3172 | } |
| 3217 | else | 3173 | else |
| 3218 | { | 3174 | { |
| 3219 | /* Careful of endianness, little by default */ | 3175 | Memory::Write32(addr, cpu->ExtReg[(inst_cream->d+i)*2]); |
| 3220 | fault = check_address_validity(cpu, addr, &phys_addr, 0); | 3176 | Memory::Write32(addr + 4, cpu->ExtReg[(inst_cream->d+i)*2 + 1]); |
| 3221 | if (fault) goto MMU_EXCEPTION; | ||
| 3222 | |||
| 3223 | fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2], 32); | ||
| 3224 | if (fault) goto MMU_EXCEPTION; | ||
| 3225 | |||
| 3226 | fault = check_address_validity(cpu, addr + 4, &phys_addr, 0); | ||
| 3227 | if (fault) goto MMU_EXCEPTION; | ||
| 3228 | |||
| 3229 | fault = interpreter_write_memory(addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32); | ||
| 3230 | if (fault) goto MMU_EXCEPTION; | ||
| 3231 | DBG("\taddr[%x-%x] <= s[%d-%d]=[%x-%x]\n", addr+4, addr, (inst_cream->d+i)*2+1, (inst_cream->d+i)*2, cpu->ExtReg[(inst_cream->d+i)*2+1], cpu->ExtReg[(inst_cream->d+i)*2]); | ||
| 3232 | addr += 8; | 3177 | addr += 8; |
| 3233 | } | 3178 | } |
| 3234 | } | 3179 | } |
| 3235 | if (inst_cream->wback){ | 3180 | if (inst_cream->wback){ |
| 3236 | cpu->Reg[inst_cream->n] = (inst_cream->add ? cpu->Reg[inst_cream->n] + inst_cream->imm32 : | 3181 | cpu->Reg[inst_cream->n] = (inst_cream->add ? cpu->Reg[inst_cream->n] + inst_cream->imm32 : |
| 3237 | cpu->Reg[inst_cream->n] - inst_cream->imm32); | 3182 | cpu->Reg[inst_cream->n] - inst_cream->imm32); |
| 3238 | DBG("\twback r%d[%x]\n", inst_cream->n, cpu->Reg[inst_cream->n]); | ||
| 3239 | } | 3183 | } |
| 3240 | 3184 | ||
| 3241 | } | 3185 | } |
| @@ -3290,7 +3234,7 @@ int DYNCOM_TRANS(vstm)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc){ | |||
| 3290 | if (single) | 3234 | if (single) |
| 3291 | { | 3235 | { |
| 3292 | 3236 | ||
| 3293 | //fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32); | 3237 | //Memory::Write32(addr, cpu->ExtReg[inst_cream->d+i]); |
| 3294 | /* if R(i) is R15? */ | 3238 | /* if R(i) is R15? */ |
| 3295 | #if 0 | 3239 | #if 0 |
| 3296 | phys_addr = get_phys_addr(cpu, bb, Addr, 0); | 3240 | phys_addr = get_phys_addr(cpu, bb, Addr, 0); |
| @@ -3300,14 +3244,13 @@ int DYNCOM_TRANS(vstm)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc){ | |||
| 3300 | //memory_write(cpu, bb, Addr, RSPR(d + i), 32); | 3244 | //memory_write(cpu, bb, Addr, RSPR(d + i), 32); |
| 3301 | memory_write(cpu, bb, Addr, IBITCAST32(FR32(d + i)),32); | 3245 | memory_write(cpu, bb, Addr, IBITCAST32(FR32(d + i)),32); |
| 3302 | bb = cpu->dyncom_engine->bb; | 3246 | bb = cpu->dyncom_engine->bb; |
| 3303 | //if (fault) goto MMU_EXCEPTION; | ||
| 3304 | //DBG("\taddr[%x] <= s%d=[%x]\n", addr, inst_cream->d+i, cpu->ExtReg[inst_cream->d+i]); | 3247 | //DBG("\taddr[%x] <= s%d=[%x]\n", addr, inst_cream->d+i, cpu->ExtReg[inst_cream->d+i]); |
| 3305 | Addr = ADD(Addr, CONST(4)); | 3248 | Addr = ADD(Addr, CONST(4)); |
| 3306 | } | 3249 | } |
| 3307 | else | 3250 | else |
| 3308 | { | 3251 | { |
| 3309 | 3252 | ||
| 3310 | //fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2], 32); | 3253 | //Memory::Write32(addr, cpu->ExtReg[(inst_cream->d+i)*2]); |
| 3311 | #if 0 | 3254 | #if 0 |
| 3312 | phys_addr = get_phys_addr(cpu, bb, Addr, 0); | 3255 | phys_addr = get_phys_addr(cpu, bb, Addr, 0); |
| 3313 | bb = cpu->dyncom_engine->bb; | 3256 | bb = cpu->dyncom_engine->bb; |
| @@ -3316,9 +3259,8 @@ int DYNCOM_TRANS(vstm)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc){ | |||
| 3316 | //memory_write(cpu, bb, Addr, RSPR((d + i) * 2), 32); | 3259 | //memory_write(cpu, bb, Addr, RSPR((d + i) * 2), 32); |
| 3317 | memory_write(cpu, bb, Addr, IBITCAST32(FR32((d + i) * 2)),32); | 3260 | memory_write(cpu, bb, Addr, IBITCAST32(FR32((d + i) * 2)),32); |
| 3318 | bb = cpu->dyncom_engine->bb; | 3261 | bb = cpu->dyncom_engine->bb; |
| 3319 | //if (fault) goto MMU_EXCEPTION; | ||
| 3320 | 3262 | ||
| 3321 | //fault = interpreter_write_memory(addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32); | 3263 | //Memory::Write32(addr + 4, cpu->ExtReg[(inst_cream->d+i)*2 + 1]); |
| 3322 | #if 0 | 3264 | #if 0 |
| 3323 | phys_addr = get_phys_addr(cpu, bb, ADD(Addr, CONST(4)), 0); | 3265 | phys_addr = get_phys_addr(cpu, bb, ADD(Addr, CONST(4)), 0); |
| 3324 | bb = cpu->dyncom_engine->bb; | 3266 | bb = cpu->dyncom_engine->bb; |
| @@ -3327,7 +3269,6 @@ int DYNCOM_TRANS(vstm)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc){ | |||
| 3327 | //memory_write(cpu, bb, ADD(Addr, CONST(4)), RSPR((d + i) * 2 + 1), 32); | 3269 | //memory_write(cpu, bb, ADD(Addr, CONST(4)), RSPR((d + i) * 2 + 1), 32); |
| 3328 | memory_write(cpu, bb, ADD(Addr, CONST(4)), IBITCAST32(FR32((d + i) * 2 + 1)), 32); | 3270 | memory_write(cpu, bb, ADD(Addr, CONST(4)), IBITCAST32(FR32((d + i) * 2 + 1)), 32); |
| 3329 | bb = cpu->dyncom_engine->bb; | 3271 | bb = cpu->dyncom_engine->bb; |
| 3330 | //if (fault) goto MMU_EXCEPTION; | ||
| 3331 | //DBG("\taddr[%x-%x] <= s[%d-%d]=[%x-%x]\n", addr+4, addr, (inst_cream->d+i)*2+1, (inst_cream->d+i)*2, cpu->ExtReg[(inst_cream->d+i)*2+1], cpu->ExtReg[(inst_cream->d+i)*2]); | 3272 | //DBG("\taddr[%x-%x] <= s[%d-%d]=[%x-%x]\n", addr+4, addr, (inst_cream->d+i)*2+1, (inst_cream->d+i)*2, cpu->ExtReg[(inst_cream->d+i)*2+1], cpu->ExtReg[(inst_cream->d+i)*2]); |
| 3332 | //addr += 8; | 3273 | //addr += 8; |
| 3333 | Addr = ADD(Addr, CONST(8)); | 3274 | Addr = ADD(Addr, CONST(8)); |
| @@ -3385,49 +3326,27 @@ VPOP_INST: | |||
| 3385 | unsigned int value1, value2; | 3326 | unsigned int value1, value2; |
| 3386 | 3327 | ||
| 3387 | vpop_inst *inst_cream = (vpop_inst *)inst_base->component; | 3328 | vpop_inst *inst_cream = (vpop_inst *)inst_base->component; |
| 3388 | 3329 | ||
| 3389 | DBG("VPOP :\n"); | ||
| 3390 | |||
| 3391 | addr = cpu->Reg[R13]; | 3330 | addr = cpu->Reg[R13]; |
| 3392 | |||
| 3393 | 3331 | ||
| 3394 | for (i = 0; i < inst_cream->regs; i++) | 3332 | for (i = 0; i < inst_cream->regs; i++) |
| 3395 | { | 3333 | { |
| 3396 | if (inst_cream->single) | 3334 | if (inst_cream->single) |
| 3397 | { | 3335 | { |
| 3398 | fault = check_address_validity(cpu, addr, &phys_addr, 1); | 3336 | value1 = Memory::Read32(addr); |
| 3399 | if (fault) goto MMU_EXCEPTION; | ||
| 3400 | |||
| 3401 | fault = interpreter_read_memory(addr, phys_addr, value1, 32); | ||
| 3402 | if (fault) goto MMU_EXCEPTION; | ||
| 3403 | DBG("\ts%d <= [%x] addr[%x]\n", inst_cream->d+i, value1, addr); | ||
| 3404 | cpu->ExtReg[inst_cream->d+i] = value1; | 3337 | cpu->ExtReg[inst_cream->d+i] = value1; |
| 3405 | addr += 4; | 3338 | addr += 4; |
| 3406 | } | 3339 | } |
| 3407 | else | 3340 | else |
| 3408 | { | 3341 | { |
| 3409 | /* Careful of endianness, little by default */ | 3342 | value1 = Memory::Read32(addr); |
| 3410 | fault = check_address_validity(cpu, addr, &phys_addr, 1); | 3343 | value2 = Memory::Read32(addr + 4); |
| 3411 | if (fault) goto MMU_EXCEPTION; | ||
| 3412 | |||
| 3413 | fault = interpreter_read_memory(addr, phys_addr, value1, 32); | ||
| 3414 | if (fault) goto MMU_EXCEPTION; | ||
| 3415 | |||
| 3416 | fault = check_address_validity(cpu, addr + 4, &phys_addr, 1); | ||
| 3417 | if (fault) goto MMU_EXCEPTION; | ||
| 3418 | |||
| 3419 | fault = interpreter_read_memory(addr + 4, phys_addr, value2, 32); | ||
| 3420 | if (fault) goto MMU_EXCEPTION; | ||
| 3421 | DBG("\ts[%d-%d] <= [%x-%x] addr[%x-%x]\n", (inst_cream->d+i)*2+1, (inst_cream->d+i)*2, value2, value1, addr+4, addr); | ||
| 3422 | cpu->ExtReg[(inst_cream->d+i)*2] = value1; | 3344 | cpu->ExtReg[(inst_cream->d+i)*2] = value1; |
| 3423 | cpu->ExtReg[(inst_cream->d+i)*2 + 1] = value2; | 3345 | cpu->ExtReg[(inst_cream->d+i)*2 + 1] = value2; |
| 3424 | addr += 8; | 3346 | addr += 8; |
| 3425 | } | 3347 | } |
| 3426 | } | 3348 | } |
| 3427 | DBG("\tsp[%x]", cpu->Reg[R13]); | ||
| 3428 | cpu->Reg[R13] = cpu->Reg[R13] + inst_cream->imm32; | 3349 | cpu->Reg[R13] = cpu->Reg[R13] + inst_cream->imm32; |
| 3429 | DBG("=>[%x]\n", cpu->Reg[R13]); | ||
| 3430 | |||
| 3431 | } | 3350 | } |
| 3432 | cpu->Reg[15] += GET_INST_SIZE(cpu); | 3351 | cpu->Reg[15] += GET_INST_SIZE(cpu); |
| 3433 | INC_PC(sizeof(vpop_inst)); | 3352 | INC_PC(sizeof(vpop_inst)); |
| @@ -3565,33 +3484,19 @@ VLDR_INST: | |||
| 3565 | 3484 | ||
| 3566 | unsigned int base = (inst_cream->n == 15 ? (cpu->Reg[inst_cream->n] & 0xFFFFFFFC) + 8 : cpu->Reg[inst_cream->n]); | 3485 | unsigned int base = (inst_cream->n == 15 ? (cpu->Reg[inst_cream->n] & 0xFFFFFFFC) + 8 : cpu->Reg[inst_cream->n]); |
| 3567 | addr = (inst_cream->add ? base + inst_cream->imm32 : base - inst_cream->imm32); | 3486 | addr = (inst_cream->add ? base + inst_cream->imm32 : base - inst_cream->imm32); |
| 3568 | DBG("VLDR :\n", addr); | 3487 | |
| 3569 | |||
| 3570 | |||
| 3571 | if (inst_cream->single) | 3488 | if (inst_cream->single) |
| 3572 | { | 3489 | { |
| 3573 | fault = check_address_validity(cpu, addr, &phys_addr, 1); | 3490 | cpu->ExtReg[inst_cream->d] = Memory::Read32(addr); |
| 3574 | if (fault) goto MMU_EXCEPTION; | ||
| 3575 | fault = interpreter_read_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d], 32); | ||
| 3576 | if (fault) goto MMU_EXCEPTION; | ||
| 3577 | DBG("\ts%d <= [%x] addr[%x]\n", inst_cream->d, cpu->ExtReg[inst_cream->d], addr); | ||
| 3578 | } | 3491 | } |
| 3579 | else | 3492 | else |
| 3580 | { | 3493 | { |
| 3581 | unsigned int word1, word2; | 3494 | unsigned int word1, word2; |
| 3582 | fault = check_address_validity(cpu, addr, &phys_addr, 1); | 3495 | word1 = Memory::Read32(addr); |
| 3583 | if (fault) goto MMU_EXCEPTION; | 3496 | word2 = Memory::Read32(addr + 4); |
| 3584 | fault = interpreter_read_memory(addr, phys_addr, word1, 32); | 3497 | |
| 3585 | if (fault) goto MMU_EXCEPTION; | ||
| 3586 | |||
| 3587 | fault = check_address_validity(cpu, addr + 4, &phys_addr, 1); | ||
| 3588 | if (fault) goto MMU_EXCEPTION; | ||
| 3589 | fault = interpreter_read_memory(addr + 4, phys_addr, word2, 32); | ||
| 3590 | if (fault) goto MMU_EXCEPTION; | ||
| 3591 | /* Check endianness */ | ||
| 3592 | cpu->ExtReg[inst_cream->d*2] = word1; | 3498 | cpu->ExtReg[inst_cream->d*2] = word1; |
| 3593 | cpu->ExtReg[inst_cream->d*2+1] = word2; | 3499 | cpu->ExtReg[inst_cream->d*2+1] = word2; |
| 3594 | DBG("\ts[%d-%d] <= [%x-%x] addr[%x-%x]\n", inst_cream->d*2+1, inst_cream->d*2, word2, word1, addr+4, addr); | ||
| 3595 | } | 3500 | } |
| 3596 | } | 3501 | } |
| 3597 | cpu->Reg[15] += GET_INST_SIZE(cpu); | 3502 | cpu->Reg[15] += GET_INST_SIZE(cpu); |
| @@ -3729,32 +3634,18 @@ VLDM_INST: | |||
| 3729 | vldm_inst *inst_cream = (vldm_inst *)inst_base->component; | 3634 | vldm_inst *inst_cream = (vldm_inst *)inst_base->component; |
| 3730 | 3635 | ||
| 3731 | addr = (inst_cream->add ? cpu->Reg[inst_cream->n] : cpu->Reg[inst_cream->n] - inst_cream->imm32); | 3636 | addr = (inst_cream->add ? cpu->Reg[inst_cream->n] : cpu->Reg[inst_cream->n] - inst_cream->imm32); |
| 3732 | DBG("VLDM : addr[%x]\n", addr); | 3637 | |
| 3733 | |||
| 3734 | for (i = 0; i < inst_cream->regs; i++) | 3638 | for (i = 0; i < inst_cream->regs; i++) |
| 3735 | { | 3639 | { |
| 3736 | if (inst_cream->single) | 3640 | if (inst_cream->single) |
| 3737 | { | 3641 | { |
| 3738 | fault = check_address_validity(cpu, addr, &phys_addr, 1); | 3642 | cpu->ExtReg[inst_cream->d+i] = Memory::Read32(addr); |
| 3739 | if (fault) goto MMU_EXCEPTION; | ||
| 3740 | fault = interpreter_read_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32); | ||
| 3741 | if (fault) goto MMU_EXCEPTION; | ||
| 3742 | DBG("\ts%d <= [%x] addr[%x]\n", inst_cream->d+i, cpu->ExtReg[inst_cream->d+i], addr); | ||
| 3743 | addr += 4; | 3643 | addr += 4; |
| 3744 | } | 3644 | } |
| 3745 | else | 3645 | else |
| 3746 | { | 3646 | { |
| 3747 | /* Careful of endianness, little by default */ | 3647 | cpu->ExtReg[(inst_cream->d+i)*2] = Memory::Read32(addr); |
| 3748 | fault = check_address_validity(cpu, addr, &phys_addr, 1); | 3648 | cpu->ExtReg[(inst_cream->d+i)*2 + 1] = Memory::Read32(addr + 4); |
| 3749 | if (fault) goto MMU_EXCEPTION; | ||
| 3750 | fault = interpreter_read_memory(addr, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2], 32); | ||
| 3751 | if (fault) goto MMU_EXCEPTION; | ||
| 3752 | |||
| 3753 | fault = check_address_validity(cpu, addr + 4, &phys_addr, 1); | ||
| 3754 | if (fault) goto MMU_EXCEPTION; | ||
| 3755 | fault = interpreter_read_memory(addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32); | ||
| 3756 | if (fault) goto MMU_EXCEPTION; | ||
| 3757 | DBG("\ts[%d-%d] <= [%x-%x] addr[%x-%x]\n", (inst_cream->d+i)*2+1, (inst_cream->d+i)*2, cpu->ExtReg[(inst_cream->d+i)*2+1], cpu->ExtReg[(inst_cream->d+i)*2], addr+4, addr); | ||
| 3758 | addr += 8; | 3649 | addr += 8; |
| 3759 | } | 3650 | } |
| 3760 | } | 3651 | } |
| @@ -3815,7 +3706,7 @@ int DYNCOM_TRANS(vldm)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc){ | |||
| 3815 | if (single) | 3706 | if (single) |
| 3816 | { | 3707 | { |
| 3817 | 3708 | ||
| 3818 | //fault = interpreter_write_memory(addr, phys_addr, cpu->ExtReg[inst_cream->d+i], 32); | 3709 | //Memory::Write32(addr, cpu->ExtReg[inst_cream->d+i]); |
| 3819 | /* if R(i) is R15? */ | 3710 | /* if R(i) is R15? */ |
| 3820 | #if 0 | 3711 | #if 0 |
| 3821 | phys_addr = get_phys_addr(cpu, bb, Addr, 1); | 3712 | phys_addr = get_phys_addr(cpu, bb, Addr, 1); |
| @@ -3827,7 +3718,6 @@ int DYNCOM_TRANS(vldm)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc){ | |||
| 3827 | val = new LoadInst(cpu->dyncom_engine->read_value, "", false, bb); | 3718 | val = new LoadInst(cpu->dyncom_engine->read_value, "", false, bb); |
| 3828 | //LETS(d + i, val); | 3719 | //LETS(d + i, val); |
| 3829 | LETFPS(d + i, FPBITCAST32(val)); | 3720 | LETFPS(d + i, FPBITCAST32(val)); |
| 3830 | //if (fault) goto MMU_EXCEPTION; | ||
| 3831 | //DBG("\taddr[%x] <= s%d=[%x]\n", addr, inst_cream->d+i, cpu->ExtReg[inst_cream->d+i]); | 3721 | //DBG("\taddr[%x] <= s%d=[%x]\n", addr, inst_cream->d+i, cpu->ExtReg[inst_cream->d+i]); |
| 3832 | Addr = ADD(Addr, CONST(4)); | 3722 | Addr = ADD(Addr, CONST(4)); |
| 3833 | } | 3723 | } |
| @@ -3852,7 +3742,7 @@ int DYNCOM_TRANS(vldm)(cpu_t *cpu, uint32_t instr, BasicBlock *bb, addr_t pc){ | |||
| 3852 | val = new LoadInst(cpu->dyncom_engine->read_value, "", false, bb); | 3742 | val = new LoadInst(cpu->dyncom_engine->read_value, "", false, bb); |
| 3853 | LETFPS((d + i) * 2 + 1, FPBITCAST32(val)); | 3743 | LETFPS((d + i) * 2 + 1, FPBITCAST32(val)); |
| 3854 | 3744 | ||
| 3855 | //fault = interpreter_write_memory(addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32); | 3745 | //Memory::Write(addr + 4, phys_addr, cpu->ExtReg[(inst_cream->d+i)*2 + 1], 32); |
| 3856 | //DBG("\taddr[%x-%x] <= s[%d-%d]=[%x-%x]\n", addr+4, addr, (inst_cream->d+i)*2+1, (inst_cream->d+i)*2, cpu->ExtReg[(inst_cream->d+i)*2+1], cpu->ExtReg[(inst_cream->d+i)*2]); | 3746 | //DBG("\taddr[%x-%x] <= s[%d-%d]=[%x-%x]\n", addr+4, addr, (inst_cream->d+i)*2+1, (inst_cream->d+i)*2, cpu->ExtReg[(inst_cream->d+i)*2+1], cpu->ExtReg[(inst_cream->d+i)*2]); |
| 3857 | //addr += 8; | 3747 | //addr += 8; |
| 3858 | Addr = ADD(Addr, CONST(8)); | 3748 | Addr = ADD(Addr, CONST(8)); |