mirror of
https://github.com/kanjitalk755/macemu.git
synced 2024-07-14 22:29:10 +00:00
Optimize runtime assembler with shorter equivalents when the accumulator
(%eax) is referenced along with immediates.
This commit is contained in:
parent
f2a9938685
commit
feca66d43e
@ -95,6 +95,7 @@ uae_u8 need_to_preserve[]={1,1,1,1,0,1,1,1};
|
|||||||
#define CLOBBER_BT clobber_flags()
|
#define CLOBBER_BT clobber_flags()
|
||||||
#define CLOBBER_BSF clobber_flags()
|
#define CLOBBER_BSF clobber_flags()
|
||||||
|
|
||||||
|
const bool optimize_accum = true;
|
||||||
const bool optimize_imm8 = true;
|
const bool optimize_imm8 = true;
|
||||||
const bool optimize_shift_once = true;
|
const bool optimize_shift_once = true;
|
||||||
|
|
||||||
@ -102,6 +103,11 @@ const bool optimize_shift_once = true;
|
|||||||
* Actual encoding of the instructions on the target CPU *
|
* Actual encoding of the instructions on the target CPU *
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
|
static __inline__ int isaccum(int r)
|
||||||
|
{
|
||||||
|
return (r == EAX_INDEX);
|
||||||
|
}
|
||||||
|
|
||||||
static __inline__ int isbyte(uae_s32 x)
|
static __inline__ int isbyte(uae_s32 x)
|
||||||
{
|
{
|
||||||
return (x>=-128 && x<=127);
|
return (x>=-128 && x<=127);
|
||||||
@ -201,9 +207,13 @@ LOWFUNC(WRITE,NONE,2,raw_sub_w_ri,(RW2 d, IMM i))
|
|||||||
emit_byte(0xe8+d);
|
emit_byte(0xe8+d);
|
||||||
emit_byte(i);
|
emit_byte(i);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if (optimize_accum && isaccum(d))
|
||||||
|
emit_byte(0x2d);
|
||||||
else {
|
else {
|
||||||
emit_byte(0x81);
|
emit_byte(0x81);
|
||||||
emit_byte(0xe8+d);
|
emit_byte(0xe8+d);
|
||||||
|
}
|
||||||
emit_word(i);
|
emit_word(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1371,8 +1381,12 @@ LENDFUNC(WRITE,RMW,2,raw_add_b_mi,(IMM d, IMM s))
|
|||||||
|
|
||||||
LOWFUNC(WRITE,NONE,2,raw_test_l_ri,(R4 d, IMM i))
|
LOWFUNC(WRITE,NONE,2,raw_test_l_ri,(R4 d, IMM i))
|
||||||
{
|
{
|
||||||
|
if (optimize_accum && isaccum(d))
|
||||||
|
emit_byte(0xa9);
|
||||||
|
else {
|
||||||
emit_byte(0xf7);
|
emit_byte(0xf7);
|
||||||
emit_byte(0xc0+d);
|
emit_byte(0xc0+d);
|
||||||
|
}
|
||||||
emit_long(i);
|
emit_long(i);
|
||||||
}
|
}
|
||||||
LENDFUNC(WRITE,NONE,2,raw_test_l_ri,(R4 d, IMM i))
|
LENDFUNC(WRITE,NONE,2,raw_test_l_ri,(R4 d, IMM i))
|
||||||
@ -1407,8 +1421,12 @@ LOWFUNC(WRITE,NONE,2,raw_and_l_ri,(RW4 d, IMM i))
|
|||||||
emit_byte(i);
|
emit_byte(i);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
if (optimize_accum && isaccum(d))
|
||||||
|
emit_byte(0x25);
|
||||||
|
else {
|
||||||
emit_byte(0x81);
|
emit_byte(0x81);
|
||||||
emit_byte(0xe0+d);
|
emit_byte(0xe0+d);
|
||||||
|
}
|
||||||
emit_long(i);
|
emit_long(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1417,10 +1435,21 @@ LENDFUNC(WRITE,NONE,2,raw_and_l_ri,(RW4 d, IMM i))
|
|||||||
LOWFUNC(WRITE,NONE,2,raw_and_w_ri,(RW2 d, IMM i))
|
LOWFUNC(WRITE,NONE,2,raw_and_w_ri,(RW2 d, IMM i))
|
||||||
{
|
{
|
||||||
emit_byte(0x66);
|
emit_byte(0x66);
|
||||||
|
if (optimize_imm8 && isbyte(i)) {
|
||||||
|
emit_byte(0x83);
|
||||||
|
emit_byte(0xe0+d);
|
||||||
|
emit_byte(i);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (optimize_accum && isaccum(d))
|
||||||
|
emit_byte(0x25);
|
||||||
|
else {
|
||||||
emit_byte(0x81);
|
emit_byte(0x81);
|
||||||
emit_byte(0xe0+d);
|
emit_byte(0xe0+d);
|
||||||
|
}
|
||||||
emit_word(i);
|
emit_word(i);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
LENDFUNC(WRITE,NONE,2,raw_and_w_ri,(RW2 d, IMM i))
|
LENDFUNC(WRITE,NONE,2,raw_and_w_ri,(RW2 d, IMM i))
|
||||||
|
|
||||||
LOWFUNC(WRITE,NONE,2,raw_and_l,(RW4 d, R4 s))
|
LOWFUNC(WRITE,NONE,2,raw_and_l,(RW4 d, R4 s))
|
||||||
@ -1453,8 +1482,12 @@ LOWFUNC(WRITE,NONE,2,raw_or_l_ri,(RW4 d, IMM i))
|
|||||||
emit_byte(i);
|
emit_byte(i);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
if (optimize_accum && isaccum(d))
|
||||||
|
emit_byte(0x0d);
|
||||||
|
else {
|
||||||
emit_byte(0x81);
|
emit_byte(0x81);
|
||||||
emit_byte(0xc8+d);
|
emit_byte(0xc8+d);
|
||||||
|
}
|
||||||
emit_long(i);
|
emit_long(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1533,9 +1566,13 @@ LOWFUNC(WRITE,NONE,2,raw_sub_l_ri,(RW4 d, IMM i))
|
|||||||
emit_byte(0xe8+d);
|
emit_byte(0xe8+d);
|
||||||
emit_byte(i);
|
emit_byte(i);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if (optimize_accum && isaccum(d))
|
||||||
|
emit_byte(0x2d);
|
||||||
else {
|
else {
|
||||||
emit_byte(0x81);
|
emit_byte(0x81);
|
||||||
emit_byte(0xe8+d);
|
emit_byte(0xe8+d);
|
||||||
|
}
|
||||||
emit_long(i);
|
emit_long(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1543,8 +1580,12 @@ LENDFUNC(WRITE,NONE,2,raw_sub_l_ri,(RW4 d, IMM i))
|
|||||||
|
|
||||||
LOWFUNC(WRITE,NONE,2,raw_sub_b_ri,(RW1 d, IMM i))
|
LOWFUNC(WRITE,NONE,2,raw_sub_b_ri,(RW1 d, IMM i))
|
||||||
{
|
{
|
||||||
|
if (optimize_accum && isaccum(d))
|
||||||
|
emit_byte(0x2c);
|
||||||
|
else {
|
||||||
emit_byte(0x80);
|
emit_byte(0x80);
|
||||||
emit_byte(0xe8+d);
|
emit_byte(0xe8+d);
|
||||||
|
}
|
||||||
emit_byte(i);
|
emit_byte(i);
|
||||||
}
|
}
|
||||||
LENDFUNC(WRITE,NONE,2,raw_sub_b_ri,(RW1 d, IMM i))
|
LENDFUNC(WRITE,NONE,2,raw_sub_b_ri,(RW1 d, IMM i))
|
||||||
@ -1556,9 +1597,13 @@ LOWFUNC(WRITE,NONE,2,raw_add_l_ri,(RW4 d, IMM i))
|
|||||||
emit_byte(0xc0+d);
|
emit_byte(0xc0+d);
|
||||||
emit_byte(i);
|
emit_byte(i);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if (optimize_accum && isaccum(d))
|
||||||
|
emit_byte(0x05);
|
||||||
else {
|
else {
|
||||||
emit_byte(0x81);
|
emit_byte(0x81);
|
||||||
emit_byte(0xc0+d);
|
emit_byte(0xc0+d);
|
||||||
|
}
|
||||||
emit_long(i);
|
emit_long(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1566,16 +1611,19 @@ LENDFUNC(WRITE,NONE,2,raw_add_l_ri,(RW4 d, IMM i))
|
|||||||
|
|
||||||
LOWFUNC(WRITE,NONE,2,raw_add_w_ri,(RW2 d, IMM i))
|
LOWFUNC(WRITE,NONE,2,raw_add_w_ri,(RW2 d, IMM i))
|
||||||
{
|
{
|
||||||
if (isbyte(i)) {
|
|
||||||
emit_byte(0x66);
|
emit_byte(0x66);
|
||||||
|
if (isbyte(i)) {
|
||||||
emit_byte(0x83);
|
emit_byte(0x83);
|
||||||
emit_byte(0xc0+d);
|
emit_byte(0xc0+d);
|
||||||
emit_byte(i);
|
emit_byte(i);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
emit_byte(0x66);
|
if (optimize_accum && isaccum(d))
|
||||||
|
emit_byte(0x05);
|
||||||
|
else {
|
||||||
emit_byte(0x81);
|
emit_byte(0x81);
|
||||||
emit_byte(0xc0+d);
|
emit_byte(0xc0+d);
|
||||||
|
}
|
||||||
emit_word(i);
|
emit_word(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1583,8 +1631,12 @@ LENDFUNC(WRITE,NONE,2,raw_add_w_ri,(RW2 d, IMM i))
|
|||||||
|
|
||||||
LOWFUNC(WRITE,NONE,2,raw_add_b_ri,(RW1 d, IMM i))
|
LOWFUNC(WRITE,NONE,2,raw_add_b_ri,(RW1 d, IMM i))
|
||||||
{
|
{
|
||||||
|
if (optimize_accum && isaccum(d))
|
||||||
|
emit_byte(0x04);
|
||||||
|
else {
|
||||||
emit_byte(0x80);
|
emit_byte(0x80);
|
||||||
emit_byte(0xc0+d);
|
emit_byte(0xc0+d);
|
||||||
|
}
|
||||||
emit_byte(i);
|
emit_byte(i);
|
||||||
}
|
}
|
||||||
LENDFUNC(WRITE,NONE,2,raw_add_b_ri,(RW1 d, IMM i))
|
LENDFUNC(WRITE,NONE,2,raw_add_b_ri,(RW1 d, IMM i))
|
||||||
@ -1648,8 +1700,12 @@ LOWFUNC(WRITE,NONE,2,raw_cmp_l_ri,(R4 r, IMM i))
|
|||||||
emit_byte(i);
|
emit_byte(i);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
if (optimize_accum && isaccum(r))
|
||||||
|
emit_byte(0x3d);
|
||||||
|
else {
|
||||||
emit_byte(0x81);
|
emit_byte(0x81);
|
||||||
emit_byte(0xf8+r);
|
emit_byte(0xf8+r);
|
||||||
|
}
|
||||||
emit_long(i);
|
emit_long(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1665,8 +1721,12 @@ LENDFUNC(WRITE,NONE,2,raw_cmp_w,(R2 d, R2 s))
|
|||||||
|
|
||||||
LOWFUNC(WRITE,NONE,2,raw_cmp_b_ri,(R1 d, IMM i))
|
LOWFUNC(WRITE,NONE,2,raw_cmp_b_ri,(R1 d, IMM i))
|
||||||
{
|
{
|
||||||
|
if (optimize_accum && isaccum(d))
|
||||||
|
emit_byte(0x3c);
|
||||||
|
else {
|
||||||
emit_byte(0x80);
|
emit_byte(0x80);
|
||||||
emit_byte(0xf8+d);
|
emit_byte(0xf8+d);
|
||||||
|
}
|
||||||
emit_byte(i);
|
emit_byte(i);
|
||||||
}
|
}
|
||||||
LENDFUNC(WRITE,NONE,2,raw_cmp_b_ri,(R1 d, IMM i))
|
LENDFUNC(WRITE,NONE,2,raw_cmp_b_ri,(R1 d, IMM i))
|
||||||
@ -2034,7 +2094,7 @@ static __inline__ void raw_load_flagx(uae_u32 target, uae_u32 r)
|
|||||||
|
|
||||||
static __inline__ void raw_inc_sp(int off)
|
static __inline__ void raw_inc_sp(int off)
|
||||||
{
|
{
|
||||||
raw_add_l_ri(4,off);
|
raw_add_l_ri(ESP_INDEX,off);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
Loading…
Reference in New Issue
Block a user