--- tme/ic/m68k/m68k-auto.h 2018/04/24 16:38:58 1.1.1.2 +++ tme/ic/m68k/m68k-auto.h 2018/04/24 16:41:50 1.1.1.4 @@ -41,43 +41,74 @@ #define tme_m68k_ireg_pc tme_m68k_ireg_uint32(TME_M68K_IREG_PC) #define TME_M68K_IREG_PC_NEXT (17) #define tme_m68k_ireg_pc_next tme_m68k_ireg_uint32(TME_M68K_IREG_PC_NEXT) -#define tme_m68k_ireg_sr tme_m68k_ireg_uint16(18 << 1) -#define tme_m68k_ireg_ccr tme_m68k_ireg_uint8(18 << 2) -#define TME_M68K_IREG_SHADOW_SR (19 << 1) +#define TME_M68K_IREG_PC_LAST (18) +#define tme_m68k_ireg_pc_last tme_m68k_ireg_uint32(TME_M68K_IREG_PC_LAST) +#define tme_m68k_ireg_sr tme_m68k_ireg_uint16(19 << 1) +#define tme_m68k_ireg_ccr tme_m68k_ireg_uint8(19 << 2) +#define TME_M68K_IREG_SHADOW_SR (20 << 1) #define tme_m68k_ireg_shadow_sr tme_m68k_ireg_uint16(TME_M68K_IREG_SHADOW_SR) -#define TME_M68K_IREG_FORMAT_OFFSET ((19 << 1) + 1) +#define TME_M68K_IREG_FORMAT_OFFSET ((20 << 1) + 1) #define tme_m68k_ireg_format_offset tme_m68k_ireg_uint16(TME_M68K_IREG_FORMAT_OFFSET) -#define TME_M68K_IREG_MEMX32 (20) +#define TME_M68K_IREG_MEMX32 (21) #define tme_m68k_ireg_memx32 tme_m68k_ireg_uint32(TME_M68K_IREG_MEMX32) -#define TME_M68K_IREG_MEMX16 (20 << 1) +#define TME_M68K_IREG_MEMX16 (21 << 1) #define tme_m68k_ireg_memx16 tme_m68k_ireg_uint16(TME_M68K_IREG_MEMX16) -#define TME_M68K_IREG_MEMX8 (20 << 2) +#define TME_M68K_IREG_MEMX8 (21 << 2) #define tme_m68k_ireg_memx8 tme_m68k_ireg_uint8(TME_M68K_IREG_MEMX8) -#define TME_M68K_IREG_MEMY32 (21) +#define TME_M68K_IREG_MEMY32 (22) #define tme_m68k_ireg_memy32 tme_m68k_ireg_uint32(TME_M68K_IREG_MEMY32) -#define TME_M68K_IREG_MEMY16 (21 << 1) +#define TME_M68K_IREG_MEMY16 (22 << 1) #define tme_m68k_ireg_memy16 tme_m68k_ireg_uint16(TME_M68K_IREG_MEMY16) -#define TME_M68K_IREG_MEMY8 (21 << 2) +#define TME_M68K_IREG_MEMY8 (22 << 2) #define tme_m68k_ireg_memy8 tme_m68k_ireg_uint8(TME_M68K_IREG_MEMY8) -#define TME_M68K_IREG_MEMZ32 (22) +#define TME_M68K_IREG_MEMZ32 (23) #define tme_m68k_ireg_memz32 tme_m68k_ireg_uint32(TME_M68K_IREG_MEMZ32) -#define TME_M68K_IREG_MEMZ16 (22 << 1) +#define TME_M68K_IREG_MEMZ16 (23 << 1) #define tme_m68k_ireg_memz16 tme_m68k_ireg_uint16(TME_M68K_IREG_MEMZ16) -#define TME_M68K_IREG_MEMZ8 (22 << 2) +#define TME_M68K_IREG_MEMZ8 (23 << 2) #define tme_m68k_ireg_memz8 tme_m68k_ireg_uint8(TME_M68K_IREG_MEMZ8) -#define TME_M68K_IREG_USP (23) +#define TME_M68K_IREG_USP (24) #define tme_m68k_ireg_usp tme_m68k_ireg_uint32(TME_M68K_IREG_USP) -#define TME_M68K_IREG_ISP (24) +#define TME_M68K_IREG_ISP (25) #define tme_m68k_ireg_isp tme_m68k_ireg_uint32(TME_M68K_IREG_ISP) -#define TME_M68K_IREG_MSP (25) +#define TME_M68K_IREG_MSP (26) #define tme_m68k_ireg_msp tme_m68k_ireg_uint32(TME_M68K_IREG_MSP) -#define TME_M68K_IREG_SFC (26) +#define TME_M68K_IREG_SFC (27) #define tme_m68k_ireg_sfc tme_m68k_ireg_uint32(TME_M68K_IREG_SFC) -#define TME_M68K_IREG_DFC (27) +#define TME_M68K_IREG_DFC (28) #define tme_m68k_ireg_dfc tme_m68k_ireg_uint32(TME_M68K_IREG_DFC) -#define TME_M68K_IREG_VBR (28) +#define TME_M68K_IREG_VBR (29) #define tme_m68k_ireg_vbr tme_m68k_ireg_uint32(TME_M68K_IREG_VBR) -#define TME_M68K_IREG32_COUNT (29) +#define TME_M68K_IREG_CACR (30) +#define tme_m68k_ireg_cacr tme_m68k_ireg_uint32(TME_M68K_IREG_CACR) +#define TME_M68K_IREG_CAAR (31) +#define tme_m68k_ireg_caar tme_m68k_ireg_uint32(TME_M68K_IREG_CAAR) +#define TME_M68K_IREG32_COUNT (32) +#define TME_M68K_IREG_IMM32 (32) +#define tme_m68k_ireg_imm32 tme_m68k_ireg_uint32(TME_M68K_IREG_IMM32) +#define TME_M68K_IREG_EA (35) +#define tme_m68k_ireg_ea tme_m68k_ireg_uint32(TME_M68K_IREG_EA) +#define TME_M68K_IREG_ZERO (36) +#define TME_M68K_IREG_ONE (37) +#define TME_M68K_IREG_TWO (38) +#define TME_M68K_IREG_THREE (39) +#define TME_M68K_IREG_FOUR (40) +#define TME_M68K_IREG_FIVE (41) +#define TME_M68K_IREG_SIX (42) +#define TME_M68K_IREG_SEVEN (43) +#define TME_M68K_IREG_EIGHT (44) + +/* the simple signed and unsigned fetch macros: */ +#define _TME_M68K_EXECUTE_FETCH_U16(v) \ + _TME_M68K_EXECUTE_FETCH_16(tme_uint16_t, v) +#define _TME_M68K_EXECUTE_FETCH_U16_FIXED(v, field) \ + _TME_M68K_EXECUTE_FETCH_16_FIXED(tme_uint16_t, v, field) +#define _TME_M68K_EXECUTE_FETCH_S16(v) \ + _TME_M68K_EXECUTE_FETCH_16(tme_int16_t, v) +#define _TME_M68K_EXECUTE_FETCH_U32(v) \ + _TME_M68K_EXECUTE_FETCH_32(tme_uint32_t, v) +#define _TME_M68K_EXECUTE_FETCH_S32(v) \ + _TME_M68K_EXECUTE_FETCH_32(tme_int32_t, v) #endif /* _IC_M68K_MISC_H */ @@ -85,159 +116,69 @@ /* these macros are for the fast executor: */ -/* on all hosts, - this loads a 16-bit unsigned value for the fast instruction executor: */ -#undef _TME_M68K_EXECUTE_FETCH_U16 -#define _TME_M68K_EXECUTE_FETCH_U16(v) \ - if ((emulator_load + (sizeof(tme_uint16_t) - 1)) > emulator_load_last) \ +/* this fetches a 16-bit value for the fast executor: */ +#undef _TME_M68K_EXECUTE_FETCH_16 +#define _TME_M68K_EXECUTE_FETCH_16(type, v) \ + /* use the raw fetch macro to fetch the value into the variable, \ + and then save it in the instruction buffer. the save doesn't \ + need to be atomic; no one else can see the instruction buffer. \ + however, the raw fetch macro has already advanced fetch_fast_next, \ + so we need to compensate for that here: */ \ + __TME_M68K_EXECUTE_FETCH_16(type, v); \ + tme_memory_write16(((tme_uint16_t *) ((((tme_uint8_t *) &ic->_tme_m68k_insn_fetch_buffer[0]) - sizeof(tme_uint16_t)) + (fetch_fast_next - ic->_tme_m68k_insn_fetch_fast_start))), (tme_uint16_t) (v), sizeof(tme_uint16_t)) + +/* this does a raw fetch of a 16-bit value for the fast executor: */ +#undef __TME_M68K_EXECUTE_FETCH_16 +#define __TME_M68K_EXECUTE_FETCH_16(type, v) \ + /* if we can't do the fast read, we need to redispatch: */ \ + /* NB: checks in tme_m68k_go_slow(), and proper setting of \ + ic->_tme_m68k_insn_fetch_fast_last in _TME_M68K_EXECUTE_NAME(), \ + allow us to do a simple pointer comparison here, for \ + any fetch size: */ \ + if (__tme_predict_false(fetch_fast_next > ic->_tme_m68k_insn_fetch_fast_last)) \ goto _tme_m68k_fast_fetch_failed; \ - tme_memory_aligned_rdlock(tlb->tme_m68k_tlb_bus_rwlock); \ - (v) = (tme_uint16_t) tme_betoh_u16(*((tme_uint16_t *) emulator_load)); \ - tme_memory_aligned_unlock(tlb->tme_m68k_tlb_bus_rwlock); \ - insn_fetch_sizes <<= 1; \ - emulator_load += sizeof(tme_uint16_t) - -/* on all hosts, - this loads a 16-bit signed value for the fast instruction executor: */ -#undef _TME_M68K_EXECUTE_FETCH_S16 -#define _TME_M68K_EXECUTE_FETCH_S16(v) \ - if ((emulator_load + (sizeof(tme_uint16_t) - 1)) > emulator_load_last) \ - goto _tme_m68k_fast_fetch_failed; \ - tme_memory_aligned_rdlock(tlb->tme_m68k_tlb_bus_rwlock); \ - (v) = (tme_int16_t) tme_betoh_u16(*((tme_uint16_t *) emulator_load)); \ - tme_memory_aligned_unlock(tlb->tme_m68k_tlb_bus_rwlock); \ - insn_fetch_sizes <<= 1; \ - emulator_load += sizeof(tme_int16_t) - -/* on a host with any alignment, - this loads a 32-bit unsigned value for the fast instruction executor: */ -#if ALIGNOF_INT32_T <= ALIGNOF_INT16_T -#undef _TME_M68K_EXECUTE_FETCH_U32 -#define _TME_M68K_EXECUTE_FETCH_U32(v) \ - if ((emulator_load + (sizeof(tme_uint32_t) - 1)) > emulator_load_last) \ - goto _tme_m68k_fast_fetch_failed; \ - if (((unsigned long) emulator_load) & (sizeof(tme_uint32_t) - 1)) { \ - tme_memory_unaligned_rdlock(tlb->tme_m68k_tlb_bus_rwlock); \ - (v) = (tme_uint32_t) tme_betoh_u32(*((tme_uint32_t *) emulator_load)); \ - tme_memory_unaligned_unlock(tlb->tme_m68k_tlb_bus_rwlock); \ - } \ - else { \ - tme_memory_aligned_rdlock(tlb->tme_m68k_tlb_bus_rwlock); \ - (v) = (tme_uint32_t) tme_betoh_u32(*((tme_uint32_t *) emulator_load)); \ - tme_memory_aligned_unlock(tlb->tme_m68k_tlb_bus_rwlock); \ - } \ - insn_fetch_sizes = (insn_fetch_sizes << 1) | 1; \ - emulator_load += sizeof(tme_uint32_t) -#endif /* ALIGNOF_INT32_T <= ALIGNOF_INT16_T */ - -/* on a host with any alignment, - this loads a 32-bit signed value for the fast instruction executor: */ -#if ALIGNOF_INT32_T <= ALIGNOF_INT16_T -#undef _TME_M68K_EXECUTE_FETCH_S32 -#define _TME_M68K_EXECUTE_FETCH_S32(v) \ - if ((emulator_load + (sizeof(tme_uint32_t) - 1)) > emulator_load_last) \ - goto _tme_m68k_fast_fetch_failed; \ - if (((unsigned long) emulator_load) & (sizeof(tme_uint32_t) - 1)) { \ - tme_memory_unaligned_rdlock(tlb->tme_m68k_tlb_bus_rwlock); \ - (v) = (tme_int32_t) tme_betoh_u32(*((tme_uint32_t *) emulator_load)); \ - tme_memory_unaligned_unlock(tlb->tme_m68k_tlb_bus_rwlock); \ - } \ - else { \ - tme_memory_aligned_rdlock(tlb->tme_m68k_tlb_bus_rwlock); \ - (v) = (tme_int32_t) tme_betoh_u32(*((tme_uint32_t *) emulator_load)); \ - tme_memory_aligned_unlock(tlb->tme_m68k_tlb_bus_rwlock); \ - } \ - insn_fetch_sizes = (insn_fetch_sizes << 1) | 1; \ - emulator_load += sizeof(tme_int32_t) -#endif /* ALIGNOF_INT32_T <= ALIGNOF_INT16_T */ - -/* on a little-endian host with strict alignment, - this loads a 32-bit unsigned value for the fast instruction executor: */ -#if (ALIGNOF_INT32_T > ALIGNOF_INT16_T) && !defined(WORDS_BIGENDIAN) -#undef _TME_M68K_EXECUTE_FETCH_U32 -#define _TME_M68K_EXECUTE_FETCH_U32(v) \ - if ((emulator_load + (sizeof(tme_uint32_t) - 1)) > emulator_load_last) \ + (v) = ((type) \ + tme_betoh_u16(tme_memory_bus_read16((const tme_shared tme_uint16_t *) fetch_fast_next, \ + tlb->tme_m68k_tlb_bus_rwlock, \ + sizeof(tme_uint16_t), \ + sizeof(tme_uint32_t)))); \ + fetch_fast_next += sizeof(tme_uint16_t) + +/* this fetches a 16-bit value at a fixed instruction position + for the fast executor: */ +#undef _TME_M68K_EXECUTE_FETCH_16_FIXED +#define _TME_M68K_EXECUTE_FETCH_16_FIXED(type, v, field) \ + assert(&((struct tme_m68k *) 0)->field \ + == (type *) (((tme_uint8_t *) &((struct tme_m68k *) 0)->_tme_m68k_insn_fetch_buffer[0]) + (fetch_fast_next - ic->_tme_m68k_insn_fetch_fast_start))); \ + __TME_M68K_EXECUTE_FETCH_16(type, v) + +/* this fetches a 32-bit value for the fast executor: */ +#undef _TME_M68K_EXECUTE_FETCH_32 +#define _TME_M68K_EXECUTE_FETCH_32(type, v) \ + /* use the raw fetch macro to fetch the value into the variable, \ + and then save it in the instruction buffer. the save doesn't \ + need to be atomic; no one else can see the instruction buffer. \ + however, the raw fetch macro has already advanced fetch_fast_next, \ + so we need to compensate for that here: */ \ + __TME_M68K_EXECUTE_FETCH_32(type, v); \ + tme_memory_write32(((tme_uint32_t *) ((((tme_uint8_t *) &ic->_tme_m68k_insn_fetch_buffer[0]) - sizeof(tme_uint32_t)) + (fetch_fast_next - ic->_tme_m68k_insn_fetch_fast_start))), (tme_uint32_t) (v), sizeof(tme_uint16_t)) + +/* this does a raw fetch of a 32-bit value for the fast executor: */ +#undef __TME_M68K_EXECUTE_FETCH_32 +#define __TME_M68K_EXECUTE_FETCH_32(type, v) \ + /* if we can't do the fast read, we need to redispatch: */ \ + /* NB: checks in tme_m68k_go_slow(), and proper setting of \ + ic->_tme_m68k_insn_fetch_fast_last in _TME_M68K_EXECUTE_NAME(), \ + allow us to do a simple pointer comparison here, for \ + any fetch size: */ \ + if (__tme_predict_false(fetch_fast_next > ic->_tme_m68k_insn_fetch_fast_last)) \ goto _tme_m68k_fast_fetch_failed; \ - if (TME_SEQUENCE_ACCESS_NOT_COSTLIER || ((unsigned long) emulator_load) & (sizeof(tme_uint32_t) - 1)) { \ - tme_memory_sequence_rdlock(tlb->tme_m68k_bus_tlb_rwlock); \ - (v) = (tme_uint32_t) \ - tme_betoh_u32((((tme_uint32_t) ((tme_uint16_t *) emulator_load)[1]) << 16) | \ - ((tme_uint32_t) ((tme_uint16_t *) emulator_load)[0])); \ - tme_memory_sequence_unlock(tlb->tme_m68k_bus_tlb_rwlock); \ - } else { \ - tme_memory_aligned_rdlock(tlb->tme_m68k_tlb_bus_rwlock); \ - (v) = (tme_uint32_t) tme_betoh_u32(*((tme_uint32_t *) emulator_load)); \ - tme_memory_aligned_unlock(tlb->tme_m68k_tlb_bus_rwlock); \ - } \ - insn_fetch_sizes = (insn_fetch_sizes << 1) | 1; \ - emulator_load += sizeof(tme_uint32_t) -#endif /* (ALIGNOF_INT32_T > ALIGNOF_INT16_T) && !defined(WORDS_BIGENDIAN) */ - -/* on a little-endian host with strict alignment, - this loads a 32-bit signed value for the fast instruction executor: */ -#if (ALIGNOF_INT32_T > ALIGNOF_INT16_T) && !defined(WORDS_BIGENDIAN) -#undef _TME_M68K_EXECUTE_FETCH_S32 -#define _TME_M68K_EXECUTE_FETCH_S32(v) \ - if ((emulator_load + (sizeof(tme_uint32_t) - 1)) > emulator_load_last) \ - goto _tme_m68k_fast_fetch_failed; \ - if (TME_SEQUENCE_ACCESS_NOT_COSTLIER || ((unsigned long) emulator_load) & (sizeof(tme_uint32_t) - 1)) { \ - tme_memory_sequence_rdlock(tlb->tme_m68k_bus_tlb_rwlock); \ - (v) = (tme_int32_t) \ - tme_betoh_u32((((tme_uint32_t) ((tme_uint16_t *) emulator_load)[1]) << 16) | \ - ((tme_uint32_t) ((tme_uint16_t *) emulator_load)[0])); \ - tme_memory_sequence_unlock(tlb->tme_m68k_bus_tlb_rwlock); \ - } else { \ - tme_memory_aligned_rdlock(tlb->tme_m68k_tlb_bus_rwlock); \ - (v) = (tme_int32_t) tme_betoh_u32(*((tme_uint32_t *) emulator_load)); \ - tme_memory_aligned_unlock(tlb->tme_m68k_tlb_bus_rwlock); \ - } \ - insn_fetch_sizes = (insn_fetch_sizes << 1) | 1; \ - emulator_load += sizeof(tme_int32_t) -#endif /* (ALIGNOF_INT32_T > ALIGNOF_INT16_T) && !defined(WORDS_BIGENDIAN) */ - -/* on a big-endian host with strict alignment, - this loads a 32-bit unsigned value for the fast instruction executor: */ -#if (ALIGNOF_INT32_T > ALIGNOF_INT16_T) && defined(WORDS_BIGENDIAN) -#undef _TME_M68K_EXECUTE_FETCH_U32 -#define _TME_M68K_EXECUTE_FETCH_U32(v) \ - if ((emulator_load + (sizeof(tme_uint32_t) - 1)) > emulator_load_last) \ - goto _tme_m68k_fast_fetch_failed; \ - if (TME_SEQUENCE_ACCESS_NOT_COSTLIER || ((unsigned long) emulator_load) & (sizeof(tme_uint32_t) - 1)) { \ - tme_memory_sequence_rdlock(tlb->tme_m68k_bus_tlb_rwlock); \ - (v) = (tme_uint32_t) \ - ((((tme_uint32_t) ((tme_uint16_t *) emulator_load)[0]) << 16) | \ - ((tme_uint32_t) ((tme_uint16_t *) emulator_load)[1])); \ - tme_memory_sequence_unlock(tlb->tme_m68k_bus_tlb_rwlock); \ - } else { \ - tme_memory_aligned_rdlock(tlb->tme_m68k_tlb_bus_rwlock); \ - (v) = (tme_uint32_t) tme_betoh_u32(*((tme_uint32_t *) emulator_load)); \ - tme_memory_aligned_unlock(tlb->tme_m68k_tlb_bus_rwlock); \ - } \ - insn_fetch_sizes = (insn_fetch_sizes << 1) | 1; \ - emulator_load += sizeof(tme_uint32_t) -#endif /* (ALIGNOF_INT32_T > ALIGNOF_INT16_T) && defined(WORDS_BIGENDIAN) */ - -/* on a big-endian host with strict alignment, - this loads a 32-bit signed value for the fast instruction executor: */ -#if (ALIGNOF_INT32_T > ALIGNOF_INT16_T) && defined(WORDS_BIGENDIAN) -#undef _TME_M68K_EXECUTE_FETCH_S32 -#define _TME_M68K_EXECUTE_FETCH_S32(v) \ - if ((emulator_load + (sizeof(tme_uint32_t) - 1)) > emulator_load_last) \ - goto _tme_m68k_fast_fetch_failed; \ - if (TME_SEQUENCE_ACCESS_NOT_COSTLIER || ((unsigned long) emulator_load) & (sizeof(tme_uint32_t) - 1)) { \ - tme_memory_sequence_rdlock(tlb->tme_m68k_bus_tlb_rwlock); \ - (v) = (tme_int32_t) \ - ((((tme_uint32_t) ((tme_uint16_t *) emulator_load)[0]) << 16) | \ - ((tme_uint32_t) ((tme_uint16_t *) emulator_load)[1])); \ - tme_memory_sequence_unlock(tlb->tme_m68k_bus_tlb_rwlock); \ - } else { \ - tme_memory_aligned_rdlock(tlb->tme_m68k_tlb_bus_rwlock); \ - (v) = (tme_int32_t) tme_betoh_u32(*((tme_uint32_t *) emulator_load)); \ - tme_memory_aligned_unlock(tlb->tme_m68k_tlb_bus_rwlock); \ - } \ - insn_fetch_sizes = (insn_fetch_sizes << 1) | 1; \ - emulator_load += sizeof(tme_int32_t) -#endif /* (ALIGNOF_INT32_T > ALIGNOF_INT16_T) && defined(WORDS_BIGENDIAN) */ + (v) = ((type) \ + tme_betoh_u32(tme_memory_bus_read32((const tme_shared tme_uint32_t *) fetch_fast_next, \ + tlb->tme_m68k_tlb_bus_rwlock, \ + sizeof(tme_uint16_t), \ + sizeof(tme_uint32_t)))); \ + fetch_fast_next += sizeof(tme_uint32_t) #endif /* _TME_M68K_EXECUTE_FAST */ @@ -245,37 +186,39 @@ /* these macros are for the slow executor: */ -/* on all hosts, this fetches a 16-bit unsigned value for the slow executor: */ -#undef _TME_M68K_EXECUTE_FETCH_U16 -#define _TME_M68K_EXECUTE_FETCH_U16(v) \ - (v) = (tme_uint16_t) tme_m68k_fetch16(ic, linear_pc); \ - insn_fetch_sizes <<= 1; \ +/* this fetches a 16-bit value for the slow executor: */ +#undef _TME_M68K_EXECUTE_FETCH_16 +#define _TME_M68K_EXECUTE_FETCH_16(type, v) \ + /* macros for the slow executor are simple, because \ + tme_m68k_fetch16() takes care of all endianness, alignment, \ + and atomic issues, and also stores the fetched value in the \ + instruction fetch buffer (if a previous fetch before a fault \ + didn't store all or part of it there already): */ \ + (v) = (type) tme_m68k_fetch16(ic, linear_pc); \ linear_pc += sizeof(tme_uint16_t) -/* on all hosts, this fetches a 16-bit signed value for the slow executor: */ -#undef _TME_M68K_EXECUTE_FETCH_S16 -#define _TME_M68K_EXECUTE_FETCH_S16(v) \ - (v) = (tme_int16_t) tme_m68k_fetch16(ic, linear_pc); \ - insn_fetch_sizes <<= 1; \ - linear_pc += sizeof(tme_int16_t) - -/* on all hosts, this fetches a 32-bit unsigned value for the slow executor: */ -#undef _TME_M68K_EXECUTE_FETCH_U32 -#define _TME_M68K_EXECUTE_FETCH_U32(v) \ - (v) = (tme_uint32_t) tme_m68k_fetch32(ic, linear_pc); \ - insn_fetch_sizes = (insn_fetch_sizes << 1) | 1; \ +/* this fetches a 16-bit value at a fixed instruction position + for the slow executor: */ +#undef _TME_M68K_EXECUTE_FETCH_16_FIXED +#define _TME_M68K_EXECUTE_FETCH_16_FIXED(type, v, field) \ + assert(&((struct tme_m68k *) 0)->field \ + == (type *) (((tme_uint8_t *) &((struct tme_m68k *) 0)->_tme_m68k_insn_fetch_buffer[0]) + ic->_tme_m68k_insn_fetch_slow_next)); \ + _TME_M68K_EXECUTE_FETCH_16(type, v) + +/* this fetches a 32-bit value for the slow executor: */ +#undef _TME_M68K_EXECUTE_FETCH_32 +#define _TME_M68K_EXECUTE_FETCH_32(type, v) \ + /* macros for the slow executor are simple, because \ + tme_m68k_fetch32() takes care of all endianness, alignment, \ + and atomic issues, and also stores the fetched value in the \ + instruction fetch buffer (if a previous fetch before a fault \ + didn't store all or part of it there already): */ \ + (v) = (type) tme_m68k_fetch32(ic, linear_pc); \ linear_pc += sizeof(tme_uint32_t) -/* on all hosts, this fetches a 32-bit signed value for the slow executor: */ -#undef _TME_M68K_EXECUTE_FETCH_S32 -#define _TME_M68K_EXECUTE_FETCH_S32(v) \ - (v) = (tme_int32_t) tme_m68k_fetch32(ic, linear_pc); \ - insn_fetch_sizes = (insn_fetch_sizes << 1) | 1; \ - linear_pc += sizeof(tme_int32_t) - #endif /* !_TME_M68K_EXECUTE_FAST */ /* automatically generated by m68k-insns-auto.sh, do not edit! */ -_TME_RCSID("$Id: m68k-auto.h,v 1.1.1.2 2018/04/24 16:38:58 root Exp $"); +_TME_RCSID("$Id: m68k-auto.h,v 1.1.1.4 2018/04/24 16:41:50 root Exp $"); TME_M68K_INSN_DECL(tme_m68k_add8); TME_M68K_INSN_DECL(tme_m68k_sub8); @@ -322,6 +265,8 @@ TME_M68K_INSN_DECL(tme_m68k_negx16); TME_M68K_INSN_DECL(tme_m68k_addx16); TME_M68K_INSN_DECL(tme_m68k_subx16); TME_M68K_INSN_DECL(tme_m68k_cmpm16); +TME_M68K_INSN_DECL(tme_m68k_move_srpd16); +TME_M68K_INSN_DECL(tme_m68k_move_srpi16); TME_M68K_INSN_DECL(tme_m68k_suba16); TME_M68K_INSN_DECL(tme_m68k_adda16); TME_M68K_INSN_DECL(tme_m68k_movea16); @@ -357,6 +302,8 @@ TME_M68K_INSN_DECL(tme_m68k_negx32); TME_M68K_INSN_DECL(tme_m68k_addx32); TME_M68K_INSN_DECL(tme_m68k_subx32); TME_M68K_INSN_DECL(tme_m68k_cmpm32); +TME_M68K_INSN_DECL(tme_m68k_move_srpd32); +TME_M68K_INSN_DECL(tme_m68k_move_srpi32); TME_M68K_INSN_DECL(tme_m68k_suba32); TME_M68K_INSN_DECL(tme_m68k_adda32); TME_M68K_INSN_DECL(tme_m68k_movea32);