git subrepo pull --force deps/lightrec
[pcsx_rearmed.git] / deps / lightrec / lightrec-private.h
index 1f8e10b..456d7af 100644 (file)
 #define SET_DEFAULT_ELM(table, value) [0] = NULL
 #endif
 
-#define fallthrough do {} while (0) /* fall-through */
+#if __has_attribute(__fallthrough__)
+#      define fallthrough      __attribute__((__fallthrough__))
+#else
+#      define fallthrough      do {} while (0)  /* fallthrough */
+#endif
 
 #define container_of(ptr, type, member) \
        ((type *)((void *)(ptr) - offsetof(type, member)))
@@ -73,6 +77,7 @@
 #define BLOCK_IS_DEAD          BIT(3)
 #define BLOCK_IS_MEMSET                BIT(4)
 #define BLOCK_NO_OPCODE_LIST   BIT(5)
+#define BLOCK_PRELOAD_PC       BIT(6)
 
 #define RAM_SIZE       0x200000
 #define BIOS_SIZE      0x80000
@@ -144,6 +149,7 @@ struct lightrec_cstate {
 
        struct lightrec_branch local_branches[512];
        struct lightrec_branch_target targets[512];
+       u16 movi_temp[32];
        unsigned int nb_local_branches;
        unsigned int nb_targets;
        unsigned int cycles;
@@ -164,6 +170,7 @@ struct lightrec_state {
        u32 target_cycle;
        u32 exit_flags;
        u32 old_cycle_counter;
+       u32 cycles_per_op;
        struct block *dispatcher, *c_wrapper_block;
        void *c_wrappers[C_WRAPPERS_COUNT];
        void *wrappers_eps[C_WRAPPERS_COUNT];
@@ -183,9 +190,9 @@ struct lightrec_state {
        unsigned int nb_maps;
        const struct lightrec_mem_map *maps;
        uintptr_t offset_ram, offset_bios, offset_scratch, offset_io;
+       u32 opt_flags;
        _Bool with_32bit_lut;
        _Bool mirrors_mapped;
-       _Bool invalidate_from_dma_only;
        void *code_lut[];
 };
 
@@ -265,7 +272,7 @@ static inline u32 get_ds_pc(const struct block *block, u16 offset, s16 imm)
 
        offset += op_flag_no_ds(flags);
 
-       return block->pc + (offset + imm << 2);
+       return block->pc + ((offset + imm) << 2);
 }
 
 static inline u32 get_branch_pc(const struct block *block, u16 offset, s16 imm)
@@ -274,7 +281,7 @@ static inline u32 get_branch_pc(const struct block *block, u16 offset, s16 imm)
 
        offset -= op_flag_no_ds(flags);
 
-       return block->pc + (offset + imm << 2);
+       return block->pc + ((offset + imm) << 2);
 }
 
 void lightrec_mtc(struct lightrec_state *state, union code op, u8 reg, u32 data);
@@ -291,7 +298,8 @@ int lightrec_compile_block(struct lightrec_cstate *cstate, struct block *block);
 void lightrec_free_opcode_list(struct lightrec_state *state,
                               struct opcode *list);
 
-__cnst unsigned int lightrec_cycles_of_opcode(union code code);
+unsigned int lightrec_cycles_of_opcode(const struct lightrec_state *state,
+                                      union code code);
 
 static inline u8 get_mult_div_lo(union code c)
 {
@@ -347,7 +355,7 @@ static inline u8 block_clear_flags(struct block *block, u8 mask)
 
 static inline _Bool can_sign_extend(s32 value, u8 order)
 {
-      return (u32)(value >> order - 1) + 1 < 2;
+      return ((u32)(value >> (order - 1)) + 1) < 2;
 }
 
 static inline _Bool can_zero_extend(u32 value, u8 order)