comparison m68k_to_x86.c @ 169:c07713463c91

Fix a bunch of addressing modes in movem when a register list is the destination
author Mike Pavone <pavone@retrodev.com>
date Sun, 06 Jan 2013 13:42:13 -0800
parents 7b099f2b382b
children 7d1b04537377
comparison
equal deleted inserted replaced
168:7b099f2b382b 169:c07713463c91
1153 } 1153 }
1154 break; 1154 break;
1155 case MODE_AREG_DISPLACE: 1155 case MODE_AREG_DISPLACE:
1156 early_cycles += BUS; 1156 early_cycles += BUS;
1157 reg = SCRATCH2; 1157 reg = SCRATCH2;
1158 if (opts->aregs[inst->dst.params.regs.pri] >= 0) { 1158 if (opts->aregs[inst->src.params.regs.pri] >= 0) {
1159 dst = mov_rr(dst, opts->aregs[inst->dst.params.regs.pri], SCRATCH1, SZ_D); 1159 dst = mov_rr(dst, opts->aregs[inst->src.params.regs.pri], SCRATCH1, SZ_D);
1160 } else { 1160 } else {
1161 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->dst)), SCRATCH1, SZ_D); 1161 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src)), SCRATCH1, SZ_D);
1162 } 1162 }
1163 dst = add_ir(dst, inst->dst.params.regs.displacement, SCRATCH1, SZ_D); 1163 dst = add_ir(dst, inst->src.params.regs.displacement, SCRATCH1, SZ_D);
1164 break; 1164 break;
1165 case MODE_AREG_INDEX_DISP8: 1165 case MODE_AREG_INDEX_DISP8:
1166 early_cycles += 6; 1166 early_cycles += 6;
1167 if (opts->aregs[inst->dst.params.regs.pri] >= 0) { 1167 if (opts->aregs[inst->src.params.regs.pri] >= 0) {
1168 dst = mov_rr(dst, opts->aregs[inst->dst.params.regs.pri], SCRATCH1, SZ_D); 1168 dst = mov_rr(dst, opts->aregs[inst->src.params.regs.pri], SCRATCH1, SZ_D);
1169 } else { 1169 } else {
1170 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->dst)), SCRATCH1, SZ_D); 1170 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src)), SCRATCH1, SZ_D);
1171 } 1171 }
1172 sec_reg = (inst->dst.params.regs.sec >> 1) & 0x7; 1172 sec_reg = (inst->src.params.regs.sec >> 1) & 0x7;
1173 if (inst->dst.params.regs.sec & 1) { 1173 if (inst->src.params.regs.sec & 1) {
1174 if (inst->dst.params.regs.sec & 0x10) { 1174 if (inst->src.params.regs.sec & 0x10) {
1175 if (opts->aregs[sec_reg] >= 0) { 1175 if (opts->aregs[sec_reg] >= 0) {
1176 dst = add_rr(dst, opts->aregs[sec_reg], SCRATCH1, SZ_D); 1176 dst = add_rr(dst, opts->aregs[sec_reg], SCRATCH1, SZ_D);
1177 } else { 1177 } else {
1178 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D); 1178 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D);
1179 } 1179 }
1183 } else { 1183 } else {
1184 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D); 1184 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D);
1185 } 1185 }
1186 } 1186 }
1187 } else { 1187 } else {
1188 if (inst->dst.params.regs.sec & 0x10) { 1188 if (inst->src.params.regs.sec & 0x10) {
1189 if (opts->aregs[sec_reg] >= 0) { 1189 if (opts->aregs[sec_reg] >= 0) {
1190 dst = movsx_rr(dst, opts->aregs[sec_reg], SCRATCH2, SZ_W, SZ_D); 1190 dst = movsx_rr(dst, opts->aregs[sec_reg], SCRATCH2, SZ_W, SZ_D);
1191 } else { 1191 } else {
1192 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D); 1192 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D);
1193 } 1193 }
1198 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D); 1198 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D);
1199 } 1199 }
1200 } 1200 }
1201 dst = add_rr(dst, SCRATCH2, SCRATCH1, SZ_D); 1201 dst = add_rr(dst, SCRATCH2, SCRATCH1, SZ_D);
1202 } 1202 }
1203 if (inst->dst.params.regs.displacement) { 1203 if (inst->src.params.regs.displacement) {
1204 dst = add_ir(dst, inst->dst.params.regs.displacement, SCRATCH1, SZ_D); 1204 dst = add_ir(dst, inst->src.params.regs.displacement, SCRATCH1, SZ_D);
1205 } 1205 }
1206 break; 1206 break;
1207 case MODE_PC_DISPLACE: 1207 case MODE_PC_DISPLACE:
1208 early_cycles += BUS; 1208 early_cycles += BUS;
1209 dst = mov_ir(dst, inst->dst.params.regs.displacement + inst->address+2, SCRATCH1, SZ_D); 1209 dst = mov_ir(dst, inst->src.params.regs.displacement + inst->address+2, SCRATCH1, SZ_D);
1210 break; 1210 break;
1211 case MODE_PC_INDEX_DISP8: 1211 case MODE_PC_INDEX_DISP8:
1212 early_cycles += 6; 1212 early_cycles += 6;
1213 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); 1213 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D);
1214 sec_reg = (inst->dst.params.regs.sec >> 1) & 0x7; 1214 sec_reg = (inst->src.params.regs.sec >> 1) & 0x7;
1215 if (inst->dst.params.regs.sec & 1) { 1215 if (inst->src.params.regs.sec & 1) {
1216 if (inst->dst.params.regs.sec & 0x10) { 1216 if (inst->src.params.regs.sec & 0x10) {
1217 if (opts->aregs[sec_reg] >= 0) { 1217 if (opts->aregs[sec_reg] >= 0) {
1218 dst = add_rr(dst, opts->aregs[sec_reg], SCRATCH1, SZ_D); 1218 dst = add_rr(dst, opts->aregs[sec_reg], SCRATCH1, SZ_D);
1219 } else { 1219 } else {
1220 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D); 1220 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D);
1221 } 1221 }
1225 } else { 1225 } else {
1226 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D); 1226 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D);
1227 } 1227 }
1228 } 1228 }
1229 } else { 1229 } else {
1230 if (inst->dst.params.regs.sec & 0x10) { 1230 if (inst->src.params.regs.sec & 0x10) {
1231 if (opts->aregs[sec_reg] >= 0) { 1231 if (opts->aregs[sec_reg] >= 0) {
1232 dst = movsx_rr(dst, opts->aregs[sec_reg], SCRATCH2, SZ_W, SZ_D); 1232 dst = movsx_rr(dst, opts->aregs[sec_reg], SCRATCH2, SZ_W, SZ_D);
1233 } else { 1233 } else {
1234 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D); 1234 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D);
1235 } 1235 }
1240 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D); 1240 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D);
1241 } 1241 }
1242 } 1242 }
1243 dst = add_rr(dst, SCRATCH2, SCRATCH1, SZ_D); 1243 dst = add_rr(dst, SCRATCH2, SCRATCH1, SZ_D);
1244 } 1244 }
1245 if (inst->dst.params.regs.displacement) { 1245 if (inst->src.params.regs.displacement) {
1246 dst = add_ir(dst, inst->dst.params.regs.displacement, SCRATCH1, SZ_D); 1246 dst = add_ir(dst, inst->src.params.regs.displacement, SCRATCH1, SZ_D);
1247 } 1247 }
1248 break; 1248 break;
1249 case MODE_ABSOLUTE: 1249 case MODE_ABSOLUTE:
1250 early_cycles += 4; 1250 early_cycles += 4;
1251 case MODE_ABSOLUTE_SHORT: 1251 case MODE_ABSOLUTE_SHORT: