comparison m68k_to_x86.c @ 162:eba78ad49a11

Implement more movem modes src
author Mike Pavone <pavone@retrodev.com>
date Sat, 05 Jan 2013 02:18:31 -0800
parents 6748022656b7
children 62b152811bae
comparison
equal deleted inserted replaced
161:6748022656b7 162:eba78ad49a11
1148 case MODE_AREG_POSTINC: 1148 case MODE_AREG_POSTINC:
1149 if (opts->aregs[inst->src.params.regs.pri] >= 0) { 1149 if (opts->aregs[inst->src.params.regs.pri] >= 0) {
1150 dst = mov_rr(dst, opts->aregs[inst->src.params.regs.pri], SCRATCH1, SZ_D); 1150 dst = mov_rr(dst, opts->aregs[inst->src.params.regs.pri], SCRATCH1, SZ_D);
1151 } else { 1151 } else {
1152 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src)), SCRATCH1, SZ_D); 1152 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src)), SCRATCH1, SZ_D);
1153 }
1154 break;
1155 case MODE_AREG_DISPLACE:
1156 early_cycles += BUS;
1157 reg = SCRATCH2;
1158 if (opts->aregs[inst->dst.params.regs.pri] >= 0) {
1159 dst = mov_rr(dst, opts->aregs[inst->dst.params.regs.pri], SCRATCH1, SZ_D);
1160 } else {
1161 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->dst)), SCRATCH1, SZ_D);
1162 }
1163 dst = add_ir(dst, inst->dst.params.regs.displacement, SCRATCH1, SZ_D);
1164 break;
1165 case MODE_AREG_INDEX_DISP8:
1166 early_cycles += 6;
1167 if (opts->aregs[inst->dst.params.regs.pri] >= 0) {
1168 dst = mov_rr(dst, opts->aregs[inst->dst.params.regs.pri], SCRATCH1, SZ_D);
1169 } else {
1170 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->dst)), SCRATCH1, SZ_D);
1171 }
1172 sec_reg = (inst->dst.params.regs.sec >> 1) & 0x7;
1173 if (inst->dst.params.regs.sec & 1) {
1174 if (inst->dst.params.regs.sec & 0x10) {
1175 if (opts->aregs[sec_reg] >= 0) {
1176 dst = add_rr(dst, opts->aregs[sec_reg], SCRATCH1, SZ_D);
1177 } else {
1178 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D);
1179 }
1180 } else {
1181 if (opts->dregs[sec_reg] >= 0) {
1182 dst = add_rr(dst, opts->dregs[sec_reg], SCRATCH1, SZ_D);
1183 } else {
1184 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D);
1185 }
1186 }
1187 } else {
1188 if (inst->dst.params.regs.sec & 0x10) {
1189 if (opts->aregs[sec_reg] >= 0) {
1190 dst = movsx_rr(dst, opts->aregs[sec_reg], SCRATCH2, SZ_W, SZ_D);
1191 } else {
1192 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D);
1193 }
1194 } else {
1195 if (opts->dregs[sec_reg] >= 0) {
1196 dst = movsx_rr(dst, opts->dregs[sec_reg], SCRATCH2, SZ_W, SZ_D);
1197 } else {
1198 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D);
1199 }
1200 }
1201 dst = add_rr(dst, SCRATCH2, SCRATCH1, SZ_D);
1202 }
1203 if (inst->dst.params.regs.displacement) {
1204 dst = add_ir(dst, inst->dst.params.regs.displacement, SCRATCH1, SZ_D);
1205 }
1206 break;
1207 case MODE_PC_DISPLACE:
1208 early_cycles += BUS;
1209 dst = mov_ir(dst, inst->dst.params.regs.displacement + inst->address+2, SCRATCH1, SZ_D);
1210 break;
1211 case MODE_PC_INDEX_DISP8:
1212 early_cycles += 6;
1213 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D);
1214 sec_reg = (inst->dst.params.regs.sec >> 1) & 0x7;
1215 if (inst->dst.params.regs.sec & 1) {
1216 if (inst->dst.params.regs.sec & 0x10) {
1217 if (opts->aregs[sec_reg] >= 0) {
1218 dst = add_rr(dst, opts->aregs[sec_reg], SCRATCH1, SZ_D);
1219 } else {
1220 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D);
1221 }
1222 } else {
1223 if (opts->dregs[sec_reg] >= 0) {
1224 dst = add_rr(dst, opts->dregs[sec_reg], SCRATCH1, SZ_D);
1225 } else {
1226 dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH1, SZ_D);
1227 }
1228 }
1229 } else {
1230 if (inst->dst.params.regs.sec & 0x10) {
1231 if (opts->aregs[sec_reg] >= 0) {
1232 dst = movsx_rr(dst, opts->aregs[sec_reg], SCRATCH2, SZ_W, SZ_D);
1233 } else {
1234 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D);
1235 }
1236 } else {
1237 if (opts->dregs[sec_reg] >= 0) {
1238 dst = movsx_rr(dst, opts->dregs[sec_reg], SCRATCH2, SZ_W, SZ_D);
1239 } else {
1240 dst = movsx_rdisp8r(dst, CONTEXT, offsetof(m68k_context, dregs) + sizeof(uint32_t)*sec_reg, SCRATCH2, SZ_W, SZ_D);
1241 }
1242 }
1243 dst = add_rr(dst, SCRATCH2, SCRATCH1, SZ_D);
1244 }
1245 if (inst->dst.params.regs.displacement) {
1246 dst = add_ir(dst, inst->dst.params.regs.displacement, SCRATCH1, SZ_D);
1153 } 1247 }
1154 break; 1248 break;
1155 case MODE_ABSOLUTE: 1249 case MODE_ABSOLUTE:
1156 early_cycles += 4; 1250 early_cycles += 4;
1157 case MODE_ABSOLUTE_SHORT: 1251 case MODE_ABSOLUTE_SHORT: