#include "pcnt.h"
#include "arm_features.h"
-#ifndef __MACH__
-#define CALLER_SAVE_REGS 0x100f
-#else
-#define CALLER_SAVE_REGS 0x120f
-#endif
-
#define unused __attribute__((unused))
#ifdef DRC_DBG
output_w32(0xe0800000|rd_rn_rm(rt,rs1,rs2));
}
+static void emit_adds(int rs1,int rs2,int rt)
+{
+ assem_debug("adds %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
+ output_w32(0xe0900000|rd_rn_rm(rt,rs1,rs2));
+}
+#define emit_adds_ptr emit_adds
+
static void emit_adcs(int rs1,int rs2,int rt)
{
assem_debug("adcs %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
case CCREG: addr = (int)&cycle_count; break;
case CSREG: addr = (int)&Status; break;
case INVCP: addr = (int)&invc_ptr; break;
+ case ROREG: addr = (int)&ram_offset; break;
default: assert(r < 34); break;
}
u_int offset = addr-(u_int)&dynarec_local;
}
}
-static void emit_addimm_no_flags(u_int imm,u_int rt)
-{
- emit_addimm(rt,imm,rt);
-}
-
static void emit_addnop(u_int r)
{
assert(r<16);
assem_debug("ldr %s,%s,%s lsl #2\n",regname[rt],regname[rs1],regname[rs2]);
output_w32(0xe7900000|rd_rn_rm(rt,rs1,rs2)|0x100);
}
+#define emit_readptr_dualindexedx_ptrlen emit_readword_dualindexedx4
+
+static void emit_ldr_dualindexed(int rs1, int rs2, int rt)
+{
+ assem_debug("ldr %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
+ output_w32(0xe7900000|rd_rn_rm(rt,rs1,rs2));
+}
static void emit_ldrcc_dualindexed(int rs1, int rs2, int rt)
{
output_w32(0x37900000|rd_rn_rm(rt,rs1,rs2));
}
+static void emit_ldrb_dualindexed(int rs1, int rs2, int rt)
+{
+ assem_debug("ldrb %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
+ output_w32(0xe7d00000|rd_rn_rm(rt,rs1,rs2));
+}
+
static void emit_ldrccb_dualindexed(int rs1, int rs2, int rt)
{
assem_debug("ldrccb %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
output_w32(0x37d00000|rd_rn_rm(rt,rs1,rs2));
}
+static void emit_ldrsb_dualindexed(int rs1, int rs2, int rt)
+{
+ assem_debug("ldrsb %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
+ output_w32(0xe19000d0|rd_rn_rm(rt,rs1,rs2));
+}
+
static void emit_ldrccsb_dualindexed(int rs1, int rs2, int rt)
{
assem_debug("ldrccsb %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
output_w32(0x319000d0|rd_rn_rm(rt,rs1,rs2));
}
+static void emit_ldrh_dualindexed(int rs1, int rs2, int rt)
+{
+ assem_debug("ldrh %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
+ output_w32(0xe19000b0|rd_rn_rm(rt,rs1,rs2));
+}
+
static void emit_ldrcch_dualindexed(int rs1, int rs2, int rt)
{
assem_debug("ldrcch %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
output_w32(0x319000b0|rd_rn_rm(rt,rs1,rs2));
}
+static void emit_ldrsh_dualindexed(int rs1, int rs2, int rt)
+{
+ assem_debug("ldrsh %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
+ output_w32(0xe19000f0|rd_rn_rm(rt,rs1,rs2));
+}
+
static void emit_ldrccsh_dualindexed(int rs1, int rs2, int rt)
{
assem_debug("ldrccsh %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
output_w32(0x319000f0|rd_rn_rm(rt,rs1,rs2));
}
+static void emit_str_dualindexed(int rs1, int rs2, int rt)
+{
+ assem_debug("str %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
+ output_w32(0xe7800000|rd_rn_rm(rt,rs1,rs2));
+}
+
+static void emit_strb_dualindexed(int rs1, int rs2, int rt)
+{
+ assem_debug("strb %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
+ output_w32(0xe7c00000|rd_rn_rm(rt,rs1,rs2));
+}
+
+static void emit_strh_dualindexed(int rs1, int rs2, int rt)
+{
+ assem_debug("strh %s,%s,%s\n",regname[rt],regname[rs1],regname[rs2]);
+ output_w32(0xe18000b0|rd_rn_rm(rt,rs1,rs2));
+}
+
static void emit_movsbl_indexed(int offset, int rs, int rt)
{
assert(offset>-256&&offset<256);
assem_debug("ldr %s,fp+%d\n",regname[rt],offset);
output_w32(0xe5900000|rd_rn_rm(rt,FP,0)|offset);
}
+#define emit_readptr emit_readword
static void emit_writeword_indexed(int rt, int offset, int rs)
{