live.nat[r].nholds=0;
}
-#define FLAG_NREG1 0 /* Set to -1 if any register will do */
-static inline void raw_flags_to_reg(int r)
+#define FLAG_NREG1_FLAGREG 0 /* Set to -1 if any register will do */
+static inline void raw_flags_to_reg_FLAGREG(int r)
{
raw_lahf(0); /* Most flags in AH */
//raw_setcc(r,0); /* V flag in AL */
#endif
}
-#define FLAG_NREG2 0 /* Set to -1 if any register will do */
-static inline void raw_reg_to_flags(int r)
+#define FLAG_NREG2_FLAGREG 0 /* Set to -1 if any register will do */
+static inline void raw_reg_to_flags_FLAGREG(int r)
{
raw_cmp_b_ri(r,-127); /* set V */
raw_sahf(0);
}
+#define FLAG_NREG3_FLAGREG 0 /* Set to -1 if any register will do */
+static __inline__ void raw_flags_set_zero_FLAGREG(int s, int tmp)
+{
+ raw_mov_l_rr(tmp,s);
+ raw_lahf(s); /* flags into ah */
+ raw_and_l_ri(s,0xffffbfff);
+ raw_and_l_ri(tmp,0x00004000);
+ raw_xor_l_ri(tmp,0x00004000);
+ raw_or_l(s,tmp);
+ raw_sahf(s);
+}
+
+static inline void raw_flags_init_FLAGREG(void) { }
+
+#define FLAG_SUFFIX FLAGREG
+
+#define FLAG_GLUE_2(x, y) x ## _ ## y
+#define FLAG_GLUE_1(x, y) FLAG_GLUE_2(x, y)
+#define FLAG_GLUE(x) FLAG_GLUE_1(x, FLAG_SUFFIX)
+
+#define raw_flags_init FLAG_GLUE(raw_flags_init)
+#define FLAG_NREG1 FLAG_GLUE(FLAG_NREG1)
+#define raw_flags_to_reg FLAG_GLUE(raw_flags_to_reg)
+#define FLAG_NREG2 FLAG_GLUE(FLAG_NREG2)
+#define raw_reg_to_flags FLAG_GLUE(raw_reg_to_flags)
+#define FLAG_NREG3 FLAG_GLUE(FLAG_NREG3)
+#define raw_flags_set_zero FLAG_GLUE(raw_flags_set_zero)
+
/* Apparently, there are enough instructions between flag store and
flag reload to avoid the partial memory stall */
static inline void raw_load_flagreg(uae_u32 target, uae_u32 r)
"\tint one=scratchie++;\n"
"\tif (needed_flags&FLAG_Z) {\n"
"\tmov_l_ri(zero,0);\n"
- "\tmov_l_ri(one,1);\n"
+ "\tmov_l_ri(one,-1);\n"
"\tmake_flags_live();\n"
"\tcmov_l_rr(zero,one,%d);\n"
"\t}\n",NATIVE_CC_NE);
comprintf("\tlive_flags();\n");
comprintf("\tif (needed_flags&FLAG_Z) {\n"
"\tcmov_l_rr(zero,one,%d);\n"
- "\tsetzflg_l(zero);\n"
+ "\tset_zero(zero, one);\n" /* No longer need one */
"\tlive_flags();\n"
"\t}\n",NATIVE_CC_NE);
comprintf("\tend_needflags();\n");
case sz_long: ssize="l"; break;
default: abort();
}
+ (void)ssize;
switch (curi->mnemo)
{
genastore ("dst", curi->smode, "srcreg", curi->size, "src");
break;
case i_NEGX:
+ isaddx;
genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
start_brace ();
comprintf("\tint dst=scratchie++;\n");
genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
start_brace();
comprintf("\tint s=scratchie++;\n"
+ "\tint tmp=scratchie++;\n"
"\tmov_l_rr(s,src);\n");
if (curi->size == sz_byte)
comprintf("\tand_l_ri(s,7);\n");
"\tdont_care_flags();\n",op);
if (!noflags) {
comprintf("\tstart_needflags();\n"
- "\tsetzflg_l(s);\n"
+ "\tset_zero(s,tmp);\n"
"\tlive_flags();\n"
"\tend_needflags();\n");
}
genastore ("dst", curi->dmode, "dstreg", curi->size, "dst");
}
break;
- /*if (!noflags) {
- failure;
- break;
- }
- genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
- genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
- start_brace();
- comprintf("\tint s=scratchie++;\n"
- "\tmov_l_rr(s,src);\n");
- if (curi->size == sz_byte)
- comprintf("\tand_l_ri(s,7);\n");
- else
- comprintf("\tand_l_ri(s,31);\n");
- {
- char* op;
- int need_write=1;
-
- switch(curi->mnemo) {
- case i_BCHG: op="btc"; break;
- case i_BCLR: op="btr"; break;
- case i_BSET: op="bts"; break;
- case i_BTST: op="bt"; need_write=0; break;
- }
- comprintf("\t%s_l_rr(dst,s);\n" // Answer now in C
- "\tsbb_l(s,s);\n" // s is 0 if bit was 0, -1 otherwise
- "\tmake_flags_live();\n" // Get the flags back
- "\tdont_care_flags();\n"
- "\tstart_needflags();\n"
- "\tbsf_l_rr(s,s);\n"
- "\tlive_flags();\n"
- "\tend_needflags();\n",op);
- if (need_write)
- genastore ("dst", curi->dmode, "dstreg", curi->size, "dst");
- }
- break;
-*/
case i_CMPM:
case i_CMP:
genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
start_brace();
comprintf("\tint newad=scratchie++;\n"
"\treadlong(15,newad,scratchie);\n"
- "\tand_l_ri(newad,~1);\n"
"\tmov_l_mr((uintptr)®s.pc,newad);\n"
"\tget_n_addr_jmp(newad,PC_P,scratchie);\n"
"\tmov_l_mr((uintptr)®s.pc_oldp,PC_P);\n"
case i_RTS:
comprintf("\tint newad=scratchie++;\n"
"\treadlong(15,newad,scratchie);\n"
- "\tand_l_ri(newad,~1);\n"
"\tmov_l_mr((uintptr)®s.pc,newad);\n"
"\tget_n_addr_jmp(newad,PC_P,scratchie);\n"
"\tmov_l_mr((uintptr)®s.pc_oldp,PC_P);\n"
"\tmov_l_ri(ret,retadd);\n"
"\tsub_l_ri(15,4);\n"
"\twritelong_clobber(15,ret,scratchie);\n");
- comprintf("\tand_l_ri(srca,~1);\n"
- "\tmov_l_mr((uintptr)®s.pc,srca);\n"
+ comprintf("\tmov_l_mr((uintptr)®s.pc,srca);\n"
"\tget_n_addr_jmp(srca,PC_P,scratchie);\n"
"\tmov_l_mr((uintptr)®s.pc_oldp,PC_P);\n"
"\tm68k_pc_offset=0;\n");
case i_JMP:
isjump;
genamode (curi->smode, "srcreg", curi->size, "src", 0, 0);
- comprintf("\tand_l_ri(srca,~1);\n"
- "\tmov_l_mr((uintptr)®s.pc,srca);\n"
+ comprintf("\tmov_l_mr((uintptr)®s.pc,srca);\n"
"\tget_n_addr_jmp(srca,PC_P,scratchie);\n"
"\tmov_l_mr((uintptr)®s.pc_oldp,PC_P);\n"
"\tm68k_pc_offset=0;\n");
gen_update_next_handler();
break;
case i_BSR:
- if (curi->size==sz_long)
- failure;
is_const_jump;
genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
- comprintf("\tand_l_ri(src,~1);\n");
start_brace();
comprintf("\tuae_u32 retadd=start_pc+((char *)comp_pc_p-(char *)start_pc_p)+m68k_pc_offset;\n");
comprintf("\tint ret=scratchie++;\n"
case sz_word: comprintf("\tsign_extend_16_rr(src,src);\n"); break;
case sz_long: break;
}
- comprintf("\tand_l_ri(src,~1);\n");
comprintf("\tsub_l_ri(src,m68k_pc_offset-m68k_pc_offset_thisinst-2);\n");
/* Leave the following as "add" --- it will allow it to be optimized
away due to src being a constant ;-) */
break;
case i_LSL:
+ mayfail;
+ if (curi->smode==Dreg) {
+ comprintf("if ((uae_u32)srcreg==(uae_u32)dstreg) {\n"
+ " FAIL(1);\n"
+#ifdef UAE
+ " return 0;\n"
+#else
+ " return;\n"
+#endif
+ "} \n");
+ start_brace();
+ }
comprintf("\tdont_care_flags();\n");
genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
"#define PART_7 1\n"
"#define PART_8 1\n"
"#endif\n\n"
- "extern void setzflg_l(uae_u32);\n"
"extern void comp_fpp_opp();\n"
"extern void comp_fscc_opp();\n"
"extern void comp_fbcc_opp();\n\n");