#define M6(x,y,z,a,b,c) (M5(x,y,z,a,b)|M1(c))
#define M10(a,b,c,d,e,f,g,h,i,j) (M5(a,b,c,d,e)|M5(f,g,h,i,j))
+// avoid a warning with clang
+static inline uintptr_t pabs(intptr_t v) { return labs(v); }
+
// sys_cacheflush always flushes whole pages, and it's rather expensive on ARMs
// hold a list of pending cache updates and merge requests to reduce cacheflush
static struct { void *base, *end; } pageflush[4];
#define EOP_C_AM3_REG(cond,u,l,rn,rd,s,h,rm) EOP_C_AM3(cond,u,0,l,rn,rd,s,h,rm)
/* ldr and str */
-#define EOP_LDR_IMM2(cond,rd,rn,offset_12) EOP_C_AM2_IMM(cond,(offset_12) >= 0,0,1,rn,rd,abs(offset_12))
-#define EOP_LDRB_IMM2(cond,rd,rn,offset_12) EOP_C_AM2_IMM(cond,(offset_12) >= 0,1,1,rn,rd,abs(offset_12))
-#define EOP_STR_IMM2(cond,rd,rn,offset_12) EOP_C_AM2_IMM(cond,(offset_12) >= 0,0,0,rn,rd,abs(offset_12))
+#define EOP_LDR_IMM2(cond,rd,rn,offset_12) EOP_C_AM2_IMM(cond,(offset_12) >= 0,0,1,rn,rd,pabs(offset_12))
+#define EOP_LDRB_IMM2(cond,rd,rn,offset_12) EOP_C_AM2_IMM(cond,(offset_12) >= 0,1,1,rn,rd,pabs(offset_12))
+#define EOP_STR_IMM2(cond,rd,rn,offset_12) EOP_C_AM2_IMM(cond,(offset_12) >= 0,0,0,rn,rd,pabs(offset_12))
-#define EOP_LDR_IMM( rd,rn,offset_12) EOP_C_AM2_IMM(A_COND_AL,(offset_12) >= 0,0,1,rn,rd,abs(offset_12))
+#define EOP_LDR_IMM( rd,rn,offset_12) EOP_C_AM2_IMM(A_COND_AL,(offset_12) >= 0,0,1,rn,rd,pabs(offset_12))
#define EOP_LDR_SIMPLE(rd,rn) EOP_C_AM2_IMM(A_COND_AL,1,0,1,rn,rd,0)
-#define EOP_STR_IMM( rd,rn,offset_12) EOP_C_AM2_IMM(A_COND_AL,(offset_12) >= 0,0,0,rn,rd,abs(offset_12))
+#define EOP_STR_IMM( rd,rn,offset_12) EOP_C_AM2_IMM(A_COND_AL,(offset_12) >= 0,0,0,rn,rd,pabs(offset_12))
#define EOP_STR_SIMPLE(rd,rn) EOP_C_AM2_IMM(A_COND_AL,1,0,0,rn,rd,0)
#define EOP_LDR_REG_LSL(cond,rd,rn,rm,shift_imm) EOP_C_AM2_REG(cond,1,0,1,rn,rd,shift_imm,A_AM1_LSL,rm)
#define EOP_LDRB_REG_LSL(cond,rd,rn,rm,shift_imm) EOP_C_AM2_REG(cond,1,1,1,rn,rd,shift_imm,A_AM1_LSL,rm)
#define EOP_STR_REG_LSL_WB(cond,rd,rn,rm,shift_imm) EOP_C_AM2_REG(cond,1,0,2,rn,rd,shift_imm,A_AM1_LSL,rm)
-#define EOP_LDRH_IMM2(cond,rd,rn,offset_8) EOP_C_AM3_IMM(cond,(offset_8) >= 0,1,rn,rd,0,1,abs(offset_8))
+#define EOP_LDRH_IMM2(cond,rd,rn,offset_8) EOP_C_AM3_IMM(cond,(offset_8) >= 0,1,rn,rd,0,1,pabs(offset_8))
#define EOP_LDRH_REG2(cond,rd,rn,rm) EOP_C_AM3_REG(cond,1,1,rn,rd,0,1,rm)
-#define EOP_LDRH_IMM( rd,rn,offset_8) EOP_C_AM3_IMM(A_COND_AL,(offset_8) >= 0,1,rn,rd,0,1,abs(offset_8))
+#define EOP_LDRH_IMM( rd,rn,offset_8) EOP_C_AM3_IMM(A_COND_AL,(offset_8) >= 0,1,rn,rd,0,1,pabs(offset_8))
#define EOP_LDRH_SIMPLE(rd,rn) EOP_C_AM3_IMM(A_COND_AL,1,1,rn,rd,0,1,0)
#define EOP_LDRH_REG( rd,rn,rm) EOP_C_AM3_REG(A_COND_AL,1,1,rn,rd,0,1,rm)
-#define EOP_STRH_IMM( rd,rn,offset_8) EOP_C_AM3_IMM(A_COND_AL,(offset_8) >= 0,0,rn,rd,0,1,abs(offset_8))
+#define EOP_STRH_IMM( rd,rn,offset_8) EOP_C_AM3_IMM(A_COND_AL,(offset_8) >= 0,0,rn,rd,0,1,pabs(offset_8))
#define EOP_STRH_SIMPLE(rd,rn) EOP_C_AM3_IMM(A_COND_AL,1,0,rn,rd,0,1,0)
#define EOP_STRH_REG( rd,rn,rm) EOP_C_AM3_REG(A_COND_AL,1,0,rn,rd,0,1,rm)
-#define EOP_LDRSB_IMM2(cond,rd,rn,offset_8) EOP_C_AM3_IMM(cond,(offset_8) >= 0,1,rn,rd,1,0,abs(offset_8))
+#define EOP_LDRSB_IMM2(cond,rd,rn,offset_8) EOP_C_AM3_IMM(cond,(offset_8) >= 0,1,rn,rd,1,0,pabs(offset_8))
#define EOP_LDRSB_REG2(cond,rd,rn,rm) EOP_C_AM3_REG(cond,1,1,rn,rd,1,0,rm)
-#define EOP_LDRSH_IMM2(cond,rd,rn,offset_8) EOP_C_AM3_IMM(cond,(offset_8) >= 0,1,rn,rd,1,1,abs(offset_8))
+#define EOP_LDRSH_IMM2(cond,rd,rn,offset_8) EOP_C_AM3_IMM(cond,(offset_8) >= 0,1,rn,rd,1,1,pabs(offset_8))
#define EOP_LDRSH_REG2(cond,rd,rn,rm) EOP_C_AM3_REG(cond,1,1,rn,rd,1,1,rm)
/* ldm and stm */
--- /dev/null
+/* autogenerated by mkoffset.sh, do not edit */
+/* target endianess: le, compiled with: x86_64-w64-mingw32-gcc */
+#define OFS_Pico_video_reg 0x0000
+#define OFS_Pico_m_rotate 0x0040
+#define OFS_Pico_m_z80Run 0x0041
+#define OFS_Pico_m_dirtyPal 0x0046
+#define OFS_Pico_m_hardware 0x0047
+#define OFS_Pico_m_z80_reset 0x004f
+#define OFS_Pico_m_sram_reg 0x0049
+#define OFS_Pico_sv 0x0090
+#define OFS_Pico_sv_data 0x0090
+#define OFS_Pico_sv_start 0x0098
+#define OFS_Pico_sv_end 0x009c
+#define OFS_Pico_sv_flags 0x00a0
+#define OFS_Pico_rom 0x0588
+#define OFS_Pico_romsize 0x0590
+#define OFS_Pico_est 0x00d8
+#define OFS_EST_DrawScanline 0x0000
+#define OFS_EST_rendstatus 0x0004
+#define OFS_EST_DrawLineDest 0x0008
+#define OFS_EST_HighCol 0x0010
+#define OFS_EST_HighPreSpr 0x0018
+#define OFS_EST_Pico 0x0020
+#define OFS_EST_PicoMem_vram 0x0028
+#define OFS_EST_PicoMem_cram 0x0030
+#define OFS_EST_PicoOpt 0x0038
+#define OFS_EST_Draw2FB 0x0040
+#define OFS_EST_HighPal 0x0048
+#define OFS_PMEM_vram 0x10000
+#define OFS_PMEM_vsram 0x22100
+#define OFS_PMEM32x_pal_native 0x90e00
+#define OFS_SH2_is_slave 0x0a18
+#define OFS_SH2_p_bios 0x0098
+#define OFS_SH2_p_da 0x00a0
+#define OFS_SH2_p_sdram 0x00a8
+#define OFS_SH2_p_rom 0x00b0
+#define OFS_SH2_p_dram 0x00b8
+#define OFS_SH2_p_drcblk_da 0x00c0
+#define OFS_SH2_p_drcblk_ram 0x00c8
+++ /dev/null
-/* autogenerated by mkoffset.sh, do not edit */
-/* target endianess: le, compiled with: mipsel-linux-gnu-gcc -mabi=n32 */
-#define OFS_Pico_video_reg 0x0000
-#define OFS_Pico_m_rotate 0x0040
-#define OFS_Pico_m_z80Run 0x0041
-#define OFS_Pico_m_dirtyPal 0x0046
-#define OFS_Pico_m_hardware 0x0047
-#define OFS_Pico_m_z80_reset 0x004f
-#define OFS_Pico_m_sram_reg 0x0049
-#define OFS_Pico_sv 0x008c
-#define OFS_Pico_sv_data 0x008c
-#define OFS_Pico_sv_start 0x0090
-#define OFS_Pico_sv_end 0x0094
-#define OFS_Pico_sv_flags 0x0098
-#define OFS_Pico_rom 0x0554
-#define OFS_Pico_romsize 0x0558
-#define OFS_Pico_est 0x00c8
-#define OFS_EST_DrawScanline 0x0000
-#define OFS_EST_rendstatus 0x0004
-#define OFS_EST_DrawLineDest 0x0008
-#define OFS_EST_HighCol 0x000c
-#define OFS_EST_HighPreSpr 0x0010
-#define OFS_EST_Pico 0x0014
-#define OFS_EST_PicoMem_vram 0x0018
-#define OFS_EST_PicoMem_cram 0x001c
-#define OFS_EST_PicoOpt 0x0020
-#define OFS_EST_Draw2FB 0x0024
-#define OFS_EST_HighPal 0x0028
-#define OFS_PMEM_vram 0x10000
-#define OFS_PMEM_vsram 0x22100
-#define OFS_PMEM32x_pal_native 0x90e00
-#define OFS_SH2_is_slave 0x055c
-#define OFS_SH2_p_bios 0x0080
-#define OFS_SH2_p_da 0x0084
-#define OFS_SH2_p_sdram 0x0088
-#define OFS_SH2_p_rom 0x008c
-#define OFS_SH2_p_dram 0x0090
-#define OFS_SH2_p_drcblk_da 0x0094
-#define OFS_SH2_p_drcblk_ram 0x0098