Added simple support for M68881

This commit is contained in:
ceriel 1989-06-12 09:30:39 +00:00
parent 74bc0442bd
commit 43fb961091
9 changed files with 1205 additions and 224 deletions

View file

@ -56,7 +56,11 @@ static int been_here;
}
}
#else
#if TBL68881
#define OWNFLOAT
#else
#define IEEEFLOAT
#endif
con_float() {
double f;

View file

@ -14,6 +14,10 @@ rscid = "$Header$"
#include "whichone.h"
#if TBL68881 && ! TBL68020
Something very wrong here!
#endif
/*#define FANCY_MODES
/* On the M68020, there are some real fancy addressing modes.
Their use makes the code a bit shorter, but also much slower.
@ -47,6 +51,10 @@ DD_REG /* allocatable D_REG, may not be a register variable */
AA_REG /* allocatable A_REG, may not be a register variable */
RD_REG /* data register, register var */
RA_REG /* address register, register var */
#if TBL68881
FS_REG /* floating point register */
FD_REG(8) /* double floating point register */
#endif
@ -57,7 +65,12 @@ d3, d4, d5, d6, d7 :D_REG, RD_REG regvar.
a0, a1 :A_REG, AA_REG.
a2, a3, a4, a5 :A_REG, RA_REG regvar(reg_pointer).
lb ("a6"), sp :A_REG. /* localbase and stack pointer */
#if TBL68881
F0 ("fp0"), F1 ("fp1"), F2 ("fp2"), F3 ("fp3"), F4 ("fp4"), F5 ("fp5"),
F6 ("fp6"), F7 ("fp7") :FS_REG.
fp0=F0,fp1=F1,fp2=F2,fp3=F3,fp4=F4,fp5=F5,fp6=F6,fp7=F7
:FD_REG.
#endif
@ -418,6 +431,12 @@ t_address = address + t_regAregXcon + t_regAcon .
#define t_address address
#endif TBL68020
#if TBL68881
freg = FD_REG + FS_REG .
store4 = any4 + FS_REG .
#else
store4 = any4 .
#endif
dups4 = genreg .
INSTRUCTIONS
@ -444,8 +463,7 @@ INSTRUCTIONS
add_l "add.l" any4:ro, LOCAL:rw:cc cost(0,0).
lea address:ro, LOCAL:wo cost(0,0).
sub_l "sub.l" any4:ro, LOCAL:rw:cc cost(0,0).
sh "illegal" shconreg:ro, LOCAL:rw:cc cost(0,0).
sh "illegal" LOCAL:ro, LOCAL:rw:cc cost(0,0).
sh "illegal" shconreg+LOCAL:ro, LOCAL:rw:cc cost(0,0).
xxx "illegal" data4:ro, LOCAL:rw:cc cost(0,0).
xxx "illegal" LOCAL:ro, alterable4:rw:cc cost(0,0).
#ifdef TBL68020
@ -543,7 +561,6 @@ unlk A_REG cost(2,6).
bxx "illegal" label cost(2,5).
sxx "illegal" any4:wo cost(2,5).
xxx "illegal" any4:ro, any4:rw:cc cost(2,3).
/*xxx "illegal" conreg4:ro, memalt4:rw:cc cost(2,6).*/
bit "illegal" control4:rw:cc cost(2,6).
sh "illegal" shconreg:ro, D_REG:rw:cc cost(2,4).
shw "illegal" control2:rw:cc cost(2,4).
@ -568,9 +585,40 @@ pea address+control4 cost(2,4).
* it is necessary with long divides where remainders are important;
* see also: 'pat rmi' and 'pat rmu'
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
killreg "! kill" D_REG:wo cost(0,0).
killreg "! kill" A_REG:wo cost(0,0).
killreg "! kill" D_REG+A_REG:wo cost(0,0).
#if TBL68881
/* These descriptions are not very accurate, because we have no
other 8-byte objects in the table.
*/
fmove_s "fmove.s" data4:ro, freg:wo cost(4,100).
fmove_s "fmove.s" freg:ro, data4:wo cost(4,100).
fmove_d "fmove.d" freg:ro, data4:wo cost(4,100).
fmove_d "fmove.d" data4:ro, freg:ro cost(4,100).
fmove_l "fmove.l" freg:ro, D_REG:wo cost(4,100).
fmove_l "fmove.l" data4:ro, freg:wo cost(4,100).
fmove freg:ro,freg:wo cost(4,100).
fadd_s "fadd.s" data4:ro, freg:rw cost(4,100).
fadd_d "fadd.d" data4:ro, freg:rw cost(4,100).
fsub_s "fsub.s" data4:ro, freg:rw cost(4,100).
fsub_d "fsub.d" data4:ro, freg:rw cost(4,100).
fsub freg:ro, freg:rw cost(4,100).
fmul freg:ro, freg:rw cost(4,100).
fmul_s "fmul.s" data4:ro, freg:rw cost(4,100).
fmul_d "fmul.d" data4:ro, freg:rw cost(4,100).
fdiv freg:ro, freg:rw cost(4,100).
fdiv_s "fdiv.s" data4:ro, freg:rw cost(4,100).
fdiv_d "fdiv.d" data4:ro, freg:rw cost(4,100).
fcmp freg:ro, freg:ro cost(4,100).
fbeq label:ro cost(4,4).
fblt label:ro cost(4,4).
fmovecr const:ro, freg:rw cost(4,100).
fabs freg:rw cost(4,100).
fneg freg:rw cost(4,100).
fgetman freg:rw cost(4,100).
fintrz freg:ro, freg:wo cost(4,100).
fgetexp freg:ro, freg:wo cost(4,100).
fsub_l "fsub.l" const:ro, freg:rw cost(4,100).
#endif
MOVES
@ -637,6 +685,13 @@ from any1 to dreg4
gen clr_l %2
move_b %1, %2
#if TBL68881
from data4 to FS_REG
gen fmove_s %1, %2
from FS_REG to datalt4
gen fmove_s %1, %2
#endif
TESTS
@ -731,7 +786,13 @@ from regX to STACK
* stackingrule for regX, so here it is
*/
#if TBL68881
from FS_REG to STACK
gen fmove_s %1,{pre_dec4,sp}
from FD_REG to STACK
gen fmove_d %1,{pre_dec4,sp}
#endif
COERCIONS
@ -745,6 +806,17 @@ from STACK
gen move_l {post_inc4, sp}, %a
yields %a
#ifdef TBL68881
from STACK
uses FS_REG
gen fmove_s {post_inc4, sp}, %a
yields %a
from STACK
uses FD_REG
gen fmove_d {post_inc4, sp}, %a
yields %a
#endif
#ifndef TBL68020
from t_regAregXcon sfit(%bd, 8)
yields {regAregXcon, %1.reg, %1.xreg, 1, %1.bd}
@ -774,6 +846,11 @@ from any4
from any4
uses reusing %1, AA_REG = %1
yields %a
#if TBL68881
from data4
uses reusing %1, FS_REG = %1
yields %a
#endif
from memory2
uses DD_REG = {const, 0}
@ -2376,7 +2453,7 @@ with exact memory2-consts
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
gen clr_l {LOCAL, $1}
move_w %1, {dreg2, regvar($1,reg_any)}
with any4
with store4
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
gen move %1, {LOCAL, $1}
with exact STACK
@ -2398,7 +2475,7 @@ with exact STACK
gen move_l {post_inc4, sp}, {areg, regvar($1, reg_pointer)}
pat stl
with any4-sconsts
with store4-sconsts
kills all_indir, LOCAL %bd==$1
gen move %1, {LOCAL, $1}
with exact STACK
@ -2406,7 +2483,7 @@ with exact STACK
gen move_l {post_inc4,sp}, {LOCAL, $1}
pat ste
with any4-sconsts
with store4-sconsts
kills posextern
gen move %1, {absolute4, $1}
with exact STACK
@ -2414,7 +2491,7 @@ with exact STACK
gen move_l {post_inc4, sp}, {absolute4, $1}
pat sil inreg($1)==reg_pointer
with any4-sconsts
with store4-sconsts
kills allexceptcon
gen move %1, {indirect4, regvar($1, reg_pointer)}
with exact STACK
@ -2422,7 +2499,7 @@ with exact STACK
gen move_l {post_inc4, sp}, {indirect4, regvar($1, reg_pointer)}
pat sil inreg($1)==reg_any
with any4-sconsts
with store4-sconsts
kills allexceptcon
uses AA_REG = {LOCAL, $1}
gen move %1, {indirect4, %a}
@ -2433,14 +2510,14 @@ with exact STACK
pat sil
#if TBL68020
with any4-sconsts
with store4-sconsts
kills allexceptcon
gen move %1, {ILOCAL, $1}
with exact STACK
kills allexceptcon
gen move_l {post_inc4, sp}, {ILOCAL, $1}
#else
with any4-sconsts
with store4-sconsts
kills allexceptcon
uses AA_REG = {LOCAL, $1}
gen move %1, {indirect4, %a}
@ -2451,7 +2528,7 @@ with exact STACK
#endif
pat stf
with A_REG any4-sconsts
with A_REG store4-sconsts
kills allexceptcon
gen move %2, {offsetted4, %1, $1}
with exact any4 STACK
@ -2463,61 +2540,61 @@ with exact STACK
uses AA_REG
gen move_l {post_inc4, sp}, %a
move_l {post_inc4, sp}, {offsetted4, %a, $1}
with exact local_addr any4
with exact local_addr store4
kills allexceptcon
gen move %2, {LOCAL, %1.bd+$1}
with exact ext_addr any4
with exact ext_addr store4
kills allexceptcon
gen move %2, {absolute4, %1.bd+$1}
#ifndef TBL68020
with regAcon any4
with regAcon store4
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd+$1}
#else TBL68020
with exact regAcon any4
with exact regAcon store4
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd+$1}
with exact regAregXcon any4
with exact regAregXcon store4
kills allexceptcon
gen move %2, {index_off4, %1.reg, %1.xreg, %1.sc, %1.bd+$1}
#ifdef FANCY_MODES
with exact indirect4 any4
with exact indirect4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, 0, $1}
with exact offsetted4 any4
with exact offsetted4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, $1}
with exact LOCAL any4
with exact LOCAL store4
kills allexceptcon
gen move %2, {OFF_off4, lb, %1.bd, $1}
with exact off_con any4
with exact off_con store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, %1.od+$1}
with exact index_off4 any4
with exact index_off4 store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, $1}
with exact indoff_con any4
with exact indoff_con store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od+$1}
with exact off_regXcon any4
with exact off_regXcon store4
kills allexceptcon
gen move %2, {OFF_indoff4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od+$1}
with exact absolute4 any4
with exact absolute4 store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, $1}
with exact abs_con any4
with exact abs_con store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, %1.od+$1}
with exact abs_regXcon any4
with exact abs_regXcon store4
kills allexceptcon
gen move %2, {ABS_indoff4, %1.sc, %1.xreg, %1.bd, %1.od+$1}
with exact abs_index4 any4
with exact abs_index4 store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, $1}
with exact absind_con any4
with exact absind_con store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, %1.od+$1}
with exact ext_regX any4
with exact ext_regX store4
kills allexceptcon
gen move %2, {abs_index4, %1.sc, %1.xreg, %1.bd+$1}
#endif
@ -2658,7 +2735,7 @@ with exact ext_regX any2
#endif TBL68020
pat sti $1==4
with A_REG any4-sconsts
with A_REG store4-sconsts
kills allexceptcon
gen move %2, {indirect4, %1}
with exact any4 STACK
@ -2670,64 +2747,64 @@ with exact STACK
uses AA_REG
gen move_l {post_inc4, sp}, %a
move_l {post_inc4, sp}, {indirect4, %a}
with exact local_addr any4
with exact local_addr store4
kills allexceptcon
gen move %2, {LOCAL, %1.bd}
with exact ext_addr any4
with exact ext_addr store4
kills allexceptcon
gen move %2, {absolute4, %1.bd}
#ifndef TBL68020
with regAcon any4-sconsts
with regAcon store4-sconsts
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd}
with regAregXcon any4-sconsts
with regAregXcon store4-sconsts
kills allexceptcon
gen move %2, {index_off4, %1.reg, %1.xreg, %1.sc, %1.bd}
#else TBL68020
with exact regAcon any4
with exact regAcon store4
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd}
with exact regAregXcon any4
with exact regAregXcon store4
kills allexceptcon
gen move %2, {index_off4, %1.reg, %1.xreg, %1.sc, %1.bd}
with exact LOCAL any4
with exact LOCAL store4
kills allexceptcon
gen move %2, {ILOCAL, %1.bd}
#ifdef FANCY_MODES
with exact indirect4 any4
with exact indirect4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, 0, 0}
with exact offsetted4 any4
with exact offsetted4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, 0}
with exact off_con any4
with exact off_con store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, %1.od}
with exact index_off4 any4
with exact index_off4 store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, 0}
with exact indoff_con any4
with exact indoff_con store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od}
with exact off_regXcon any4
with exact off_regXcon store4
kills allexceptcon
gen move %2, {OFF_indoff4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od}
with exact absolute4 any4
with exact absolute4 store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, 0}
with exact abs_con any4
with exact abs_con store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, %1.od}
with exact abs_regXcon any4
with exact abs_regXcon store4
kills allexceptcon
gen move %2, {ABS_indoff4, %1.sc, %1.xreg, %1.bd, %1.od}
with exact abs_index4 any4
with exact abs_index4 store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, 0}
with exact absind_con any4
with exact absind_con store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, %1.od}
with exact ext_regX any4
with exact ext_regX store4
kills allexceptcon
gen move %2, {abs_index4, %1.sc, %1.xreg, %1.bd}
#endif
@ -2766,8 +2843,8 @@ with STACK
pat sdl
with any4-sconsts any4-sconsts
kills all_indir, LOCAL %bd==$1
gen move %1, {LOCAL, $1}
move %2, {LOCAL, $1+4}
gen move %1, {LOCAL, $1}
move %2, {LOCAL, $1+4}
with exact STACK
kills all_indir, LOCAL %bd==$1
gen move_l {post_inc4, sp}, {LOCAL,$1}
@ -2940,6 +3017,84 @@ with shconreg DD_REG
* Arithmetic instructions
*/
#if TBL68881
pat adf $1==4
with FS_REG STACK
gen fadd_s {indirect4,sp},%1
fmove_s %1,{indirect4,sp}
pat adf $1==8
with FD_REG STACK
gen fadd_d {indirect4,sp},%1
fmove_d %1,{indirect4,sp}
pat sbf $1==4
with FS_REG FS_REG STACK
gen fsub %1,%2
fmove_s %2,{pre_dec4,sp}
pat sbf $1==8
with FD_REG FD_REG STACK
gen fsub %1,%2
fmove_d %2,{pre_dec4,sp}
pat mlf $1==4
with FS_REG STACK
gen fmul_s {indirect4,sp},%1
fmove_s %1,{indirect4,sp}
pat mlf $1==8
with FD_REG STACK
gen fmul_d {indirect4,sp},%1
fmove_d %1,{indirect4,sp}
pat dvf $1==4
with FS_REG FS_REG STACK
gen fdiv %1,%2
fmove_s %2,{pre_dec4,sp}
pat dvf $1==8
with FD_REG FD_REG STACK
gen fdiv %1,%2
fmove_d %2,{pre_dec4,sp}
pat ngf $1==4
with FS_REG STACK
gen fneg %1
fmove_s %1,{pre_dec4,sp}
pat ngf $1==8
with FD_REG STACK
gen fneg %1
fmove_d %1,{pre_dec4,sp}
pat fif $1==4
with FS_REG FS_REG STACK
gen fmul %1,%2
fintrz %2,%1
fsub %1,%2
fmove_s %2,{pre_dec4,sp}
fmove_s %1,{pre_dec4,sp}
pat fif $1==8
with FD_REG FD_REG STACK
gen fmul %1,%2
fintrz %2,%1
fsub %1,%2
fmove_d %2,{pre_dec4,sp}
fmove_d %1,{pre_dec4,sp}
pat fef $1==4
with FS_REG STACK
uses D_REG, FS_REG
gen fgetexp %1,%b
fmove_l %b,%a
add_l {const,1},%a
fgetman %1
fmove_l {const,2},%b
fdiv %b,%1
fmove_s %1,{pre_dec4,sp}
yields %a
pat fef $1==8
with FD_REG STACK
uses D_REG, FD_REG
gen fgetexp %1,%b
fmove_l %b,%a
add_l {const,1},%a
fgetman %1
fmove_l {const,2},%b
fdiv %b,%1
fmove_d %1,{pre_dec4,sp}
yields %a
#else
pat adf $1==4 leaving cal ".adf4" asp 4
pat adf $1==8 leaving cal ".adf8" asp 8
pat sbf $1==4 leaving cal ".sbf4" asp 4
@ -2962,6 +3117,7 @@ pat fef $1==8
move_l d1, {pre_dec4, sp}
move_l d0, {pre_dec4, sp}
leaving cal ".fef8"
#endif
/************************************************
* Group 6: pointer arithmetic *
@ -3339,6 +3495,66 @@ pat ciu leaving cuu
pat cui leaving cuu
#if TBL68881
pat loc loc cif $1==4 && $2==4
with data4 STACK
uses FS_REG
gen fmove_l %1,%a
fmove_s %a,{pre_dec4,sp}
pat loc loc cif $1==4 && $2==8
with data4 STACK
uses FD_REG
gen fmove_l %1,%a
fmove_d %a,{pre_dec4,sp}
pat loc loc cuf $1==4 && $2==4
with D_REG STACK
uses FS_REG
gen fmove_l %1,%a
tst_l %1
bge {slabel, 1f}
fsub_l {const,0-2147483648},%a
fsub_l {const,0-2147483648},%a
1:
fmove_s %a,{pre_dec4,sp}
pat loc loc cuf $1==4 && $2==8
with D_REG STACK
uses FD_REG
gen fmove_l %1,%a
tst_l %1
bge {slabel, 1f}
fsub_l {const,0-2147483648},%a
fsub_l {const,0-2147483648},%a
1:
fmove_d %a,{pre_dec4,sp}
pat loc loc cfi $1==4 && $2==4
with FS_REG
uses D_REG
gen fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cfi $1==8 && $2==4
with FD_REG
uses D_REG
gen fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cfu $1==4 && $2==4
with FS_REG
uses D_REG
gen fabs %1
fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cfu $1==8 && $2==4
with FD_REG
uses D_REG
gen fabs %1
fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cff $1==4 && $2==8
with FS_REG STACK
gen fmove_d %1,{pre_dec4,sp}
pat loc loc cff $1==8 && $2==4
with FD_REG STACK
gen fmove_s %1,{pre_dec4,sp}
#else
/*
* Floating point stuff
* Conversion
@ -3352,6 +3568,7 @@ pat loc loc cfu leaving loc $1 loc $2 cal ".cfu" asp 8+($1-4)
pat loc loc cff $1==8 && $2==4 leaving cal ".cff4" asp 4
pat loc loc cff $1==4 && $2==8
leaving loc 0 exg 4 cal ".cff8"
#endif
/************************************************
* Group 9: logical instructions *
@ -3709,9 +3926,33 @@ pat tgt call txx("sgt", "shi")
* Floating point
* Comparision
*/
#if TBL68881
pat cmf $1==4
with FS_REG FS_REG
uses D_REG={const,0}
gen fcmp %1,%2
fbeq {slabel,2f}
fblt {slabel,1f}
add_l {const,1},%a
bra {slabel,2f}
1:
sub_l {const,1},%a
2: yields %a
pat cmf $1==8
with FD_REG FD_REG
uses D_REG={const,0}
gen fcmp %1,%2
fbeq {slabel,2f}
fblt {slabel,1f}
add_l {const,1},%a
bra {slabel,2f}
1:
sub_l {const,1},%a
2: yields %a
#else
pat cmf $1==4 leaving cal ".cmf4" asp 8 lfr 4
pat cmf $1==8 leaving cal ".cmf8" asp 16 lfr 4
#endif
/*
* Floating Point
* Zero Constants

View file

@ -5,3 +5,4 @@
*/
#define TBL68020 1
/*#define TBL68881 1 /* use floating point processor */

View file

@ -56,7 +56,11 @@ static int been_here;
}
}
#else
#if TBL68881
#define OWNFLOAT
#else
#define IEEEFLOAT
#endif
con_float() {
double f;

View file

@ -14,6 +14,10 @@ rscid = "$Header$"
#include "whichone.h"
#if TBL68881 && ! TBL68020
Something very wrong here!
#endif
/*#define FANCY_MODES
/* On the M68020, there are some real fancy addressing modes.
Their use makes the code a bit shorter, but also much slower.
@ -47,6 +51,10 @@ DD_REG /* allocatable D_REG, may not be a register variable */
AA_REG /* allocatable A_REG, may not be a register variable */
RD_REG /* data register, register var */
RA_REG /* address register, register var */
#if TBL68881
FS_REG /* floating point register */
FD_REG(8) /* double floating point register */
#endif
@ -57,7 +65,12 @@ d3, d4, d5, d6, d7 :D_REG, RD_REG regvar.
a0, a1 :A_REG, AA_REG.
a2, a3, a4, a5 :A_REG, RA_REG regvar(reg_pointer).
lb ("a6"), sp :A_REG. /* localbase and stack pointer */
#if TBL68881
F0 ("fp0"), F1 ("fp1"), F2 ("fp2"), F3 ("fp3"), F4 ("fp4"), F5 ("fp5"),
F6 ("fp6"), F7 ("fp7") :FS_REG.
fp0=F0,fp1=F1,fp2=F2,fp3=F3,fp4=F4,fp5=F5,fp6=F6,fp7=F7
:FD_REG.
#endif
@ -418,6 +431,12 @@ t_address = address + t_regAregXcon + t_regAcon .
#define t_address address
#endif TBL68020
#if TBL68881
freg = FD_REG + FS_REG .
store4 = any4 + FS_REG .
#else
store4 = any4 .
#endif
dups4 = genreg .
INSTRUCTIONS
@ -444,8 +463,7 @@ INSTRUCTIONS
add_l "add.l" any4:ro, LOCAL:rw:cc cost(0,0).
lea address:ro, LOCAL:wo cost(0,0).
sub_l "sub.l" any4:ro, LOCAL:rw:cc cost(0,0).
sh "illegal" shconreg:ro, LOCAL:rw:cc cost(0,0).
sh "illegal" LOCAL:ro, LOCAL:rw:cc cost(0,0).
sh "illegal" shconreg+LOCAL:ro, LOCAL:rw:cc cost(0,0).
xxx "illegal" data4:ro, LOCAL:rw:cc cost(0,0).
xxx "illegal" LOCAL:ro, alterable4:rw:cc cost(0,0).
#ifdef TBL68020
@ -543,7 +561,6 @@ unlk A_REG cost(2,6).
bxx "illegal" label cost(2,5).
sxx "illegal" any4:wo cost(2,5).
xxx "illegal" any4:ro, any4:rw:cc cost(2,3).
/*xxx "illegal" conreg4:ro, memalt4:rw:cc cost(2,6).*/
bit "illegal" control4:rw:cc cost(2,6).
sh "illegal" shconreg:ro, D_REG:rw:cc cost(2,4).
shw "illegal" control2:rw:cc cost(2,4).
@ -568,9 +585,40 @@ pea address+control4 cost(2,4).
* it is necessary with long divides where remainders are important;
* see also: 'pat rmi' and 'pat rmu'
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
killreg "! kill" D_REG:wo cost(0,0).
killreg "! kill" A_REG:wo cost(0,0).
killreg "! kill" D_REG+A_REG:wo cost(0,0).
#if TBL68881
/* These descriptions are not very accurate, because we have no
other 8-byte objects in the table.
*/
fmove_s "fmove.s" data4:ro, freg:wo cost(4,100).
fmove_s "fmove.s" freg:ro, data4:wo cost(4,100).
fmove_d "fmove.d" freg:ro, data4:wo cost(4,100).
fmove_d "fmove.d" data4:ro, freg:ro cost(4,100).
fmove_l "fmove.l" freg:ro, D_REG:wo cost(4,100).
fmove_l "fmove.l" data4:ro, freg:wo cost(4,100).
fmove freg:ro,freg:wo cost(4,100).
fadd_s "fadd.s" data4:ro, freg:rw cost(4,100).
fadd_d "fadd.d" data4:ro, freg:rw cost(4,100).
fsub_s "fsub.s" data4:ro, freg:rw cost(4,100).
fsub_d "fsub.d" data4:ro, freg:rw cost(4,100).
fsub freg:ro, freg:rw cost(4,100).
fmul freg:ro, freg:rw cost(4,100).
fmul_s "fmul.s" data4:ro, freg:rw cost(4,100).
fmul_d "fmul.d" data4:ro, freg:rw cost(4,100).
fdiv freg:ro, freg:rw cost(4,100).
fdiv_s "fdiv.s" data4:ro, freg:rw cost(4,100).
fdiv_d "fdiv.d" data4:ro, freg:rw cost(4,100).
fcmp freg:ro, freg:ro cost(4,100).
fbeq label:ro cost(4,4).
fblt label:ro cost(4,4).
fmovecr const:ro, freg:rw cost(4,100).
fabs freg:rw cost(4,100).
fneg freg:rw cost(4,100).
fgetman freg:rw cost(4,100).
fintrz freg:ro, freg:wo cost(4,100).
fgetexp freg:ro, freg:wo cost(4,100).
fsub_l "fsub.l" const:ro, freg:rw cost(4,100).
#endif
MOVES
@ -637,6 +685,13 @@ from any1 to dreg4
gen clr_l %2
move_b %1, %2
#if TBL68881
from data4 to FS_REG
gen fmove_s %1, %2
from FS_REG to datalt4
gen fmove_s %1, %2
#endif
TESTS
@ -731,7 +786,13 @@ from regX to STACK
* stackingrule for regX, so here it is
*/
#if TBL68881
from FS_REG to STACK
gen fmove_s %1,{pre_dec4,sp}
from FD_REG to STACK
gen fmove_d %1,{pre_dec4,sp}
#endif
COERCIONS
@ -745,6 +806,17 @@ from STACK
gen move_l {post_inc4, sp}, %a
yields %a
#ifdef TBL68881
from STACK
uses FS_REG
gen fmove_s {post_inc4, sp}, %a
yields %a
from STACK
uses FD_REG
gen fmove_d {post_inc4, sp}, %a
yields %a
#endif
#ifndef TBL68020
from t_regAregXcon sfit(%bd, 8)
yields {regAregXcon, %1.reg, %1.xreg, 1, %1.bd}
@ -774,6 +846,11 @@ from any4
from any4
uses reusing %1, AA_REG = %1
yields %a
#if TBL68881
from data4
uses reusing %1, FS_REG = %1
yields %a
#endif
from memory2
uses DD_REG = {const, 0}
@ -2376,7 +2453,7 @@ with exact memory2-consts
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
gen clr_l {LOCAL, $1}
move_w %1, {dreg2, regvar($1,reg_any)}
with any4
with store4
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
gen move %1, {LOCAL, $1}
with exact STACK
@ -2398,7 +2475,7 @@ with exact STACK
gen move_l {post_inc4, sp}, {areg, regvar($1, reg_pointer)}
pat stl
with any4-sconsts
with store4-sconsts
kills all_indir, LOCAL %bd==$1
gen move %1, {LOCAL, $1}
with exact STACK
@ -2406,7 +2483,7 @@ with exact STACK
gen move_l {post_inc4,sp}, {LOCAL, $1}
pat ste
with any4-sconsts
with store4-sconsts
kills posextern
gen move %1, {absolute4, $1}
with exact STACK
@ -2414,7 +2491,7 @@ with exact STACK
gen move_l {post_inc4, sp}, {absolute4, $1}
pat sil inreg($1)==reg_pointer
with any4-sconsts
with store4-sconsts
kills allexceptcon
gen move %1, {indirect4, regvar($1, reg_pointer)}
with exact STACK
@ -2422,7 +2499,7 @@ with exact STACK
gen move_l {post_inc4, sp}, {indirect4, regvar($1, reg_pointer)}
pat sil inreg($1)==reg_any
with any4-sconsts
with store4-sconsts
kills allexceptcon
uses AA_REG = {LOCAL, $1}
gen move %1, {indirect4, %a}
@ -2433,14 +2510,14 @@ with exact STACK
pat sil
#if TBL68020
with any4-sconsts
with store4-sconsts
kills allexceptcon
gen move %1, {ILOCAL, $1}
with exact STACK
kills allexceptcon
gen move_l {post_inc4, sp}, {ILOCAL, $1}
#else
with any4-sconsts
with store4-sconsts
kills allexceptcon
uses AA_REG = {LOCAL, $1}
gen move %1, {indirect4, %a}
@ -2451,7 +2528,7 @@ with exact STACK
#endif
pat stf
with A_REG any4-sconsts
with A_REG store4-sconsts
kills allexceptcon
gen move %2, {offsetted4, %1, $1}
with exact any4 STACK
@ -2463,61 +2540,61 @@ with exact STACK
uses AA_REG
gen move_l {post_inc4, sp}, %a
move_l {post_inc4, sp}, {offsetted4, %a, $1}
with exact local_addr any4
with exact local_addr store4
kills allexceptcon
gen move %2, {LOCAL, %1.bd+$1}
with exact ext_addr any4
with exact ext_addr store4
kills allexceptcon
gen move %2, {absolute4, %1.bd+$1}
#ifndef TBL68020
with regAcon any4
with regAcon store4
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd+$1}
#else TBL68020
with exact regAcon any4
with exact regAcon store4
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd+$1}
with exact regAregXcon any4
with exact regAregXcon store4
kills allexceptcon
gen move %2, {index_off4, %1.reg, %1.xreg, %1.sc, %1.bd+$1}
#ifdef FANCY_MODES
with exact indirect4 any4
with exact indirect4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, 0, $1}
with exact offsetted4 any4
with exact offsetted4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, $1}
with exact LOCAL any4
with exact LOCAL store4
kills allexceptcon
gen move %2, {OFF_off4, lb, %1.bd, $1}
with exact off_con any4
with exact off_con store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, %1.od+$1}
with exact index_off4 any4
with exact index_off4 store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, $1}
with exact indoff_con any4
with exact indoff_con store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od+$1}
with exact off_regXcon any4
with exact off_regXcon store4
kills allexceptcon
gen move %2, {OFF_indoff4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od+$1}
with exact absolute4 any4
with exact absolute4 store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, $1}
with exact abs_con any4
with exact abs_con store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, %1.od+$1}
with exact abs_regXcon any4
with exact abs_regXcon store4
kills allexceptcon
gen move %2, {ABS_indoff4, %1.sc, %1.xreg, %1.bd, %1.od+$1}
with exact abs_index4 any4
with exact abs_index4 store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, $1}
with exact absind_con any4
with exact absind_con store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, %1.od+$1}
with exact ext_regX any4
with exact ext_regX store4
kills allexceptcon
gen move %2, {abs_index4, %1.sc, %1.xreg, %1.bd+$1}
#endif
@ -2658,7 +2735,7 @@ with exact ext_regX any2
#endif TBL68020
pat sti $1==4
with A_REG any4-sconsts
with A_REG store4-sconsts
kills allexceptcon
gen move %2, {indirect4, %1}
with exact any4 STACK
@ -2670,64 +2747,64 @@ with exact STACK
uses AA_REG
gen move_l {post_inc4, sp}, %a
move_l {post_inc4, sp}, {indirect4, %a}
with exact local_addr any4
with exact local_addr store4
kills allexceptcon
gen move %2, {LOCAL, %1.bd}
with exact ext_addr any4
with exact ext_addr store4
kills allexceptcon
gen move %2, {absolute4, %1.bd}
#ifndef TBL68020
with regAcon any4-sconsts
with regAcon store4-sconsts
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd}
with regAregXcon any4-sconsts
with regAregXcon store4-sconsts
kills allexceptcon
gen move %2, {index_off4, %1.reg, %1.xreg, %1.sc, %1.bd}
#else TBL68020
with exact regAcon any4
with exact regAcon store4
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd}
with exact regAregXcon any4
with exact regAregXcon store4
kills allexceptcon
gen move %2, {index_off4, %1.reg, %1.xreg, %1.sc, %1.bd}
with exact LOCAL any4
with exact LOCAL store4
kills allexceptcon
gen move %2, {ILOCAL, %1.bd}
#ifdef FANCY_MODES
with exact indirect4 any4
with exact indirect4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, 0, 0}
with exact offsetted4 any4
with exact offsetted4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, 0}
with exact off_con any4
with exact off_con store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, %1.od}
with exact index_off4 any4
with exact index_off4 store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, 0}
with exact indoff_con any4
with exact indoff_con store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od}
with exact off_regXcon any4
with exact off_regXcon store4
kills allexceptcon
gen move %2, {OFF_indoff4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od}
with exact absolute4 any4
with exact absolute4 store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, 0}
with exact abs_con any4
with exact abs_con store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, %1.od}
with exact abs_regXcon any4
with exact abs_regXcon store4
kills allexceptcon
gen move %2, {ABS_indoff4, %1.sc, %1.xreg, %1.bd, %1.od}
with exact abs_index4 any4
with exact abs_index4 store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, 0}
with exact absind_con any4
with exact absind_con store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, %1.od}
with exact ext_regX any4
with exact ext_regX store4
kills allexceptcon
gen move %2, {abs_index4, %1.sc, %1.xreg, %1.bd}
#endif
@ -2766,8 +2843,8 @@ with STACK
pat sdl
with any4-sconsts any4-sconsts
kills all_indir, LOCAL %bd==$1
gen move %1, {LOCAL, $1}
move %2, {LOCAL, $1+4}
gen move %1, {LOCAL, $1}
move %2, {LOCAL, $1+4}
with exact STACK
kills all_indir, LOCAL %bd==$1
gen move_l {post_inc4, sp}, {LOCAL,$1}
@ -2940,6 +3017,84 @@ with shconreg DD_REG
* Arithmetic instructions
*/
#if TBL68881
pat adf $1==4
with FS_REG STACK
gen fadd_s {indirect4,sp},%1
fmove_s %1,{indirect4,sp}
pat adf $1==8
with FD_REG STACK
gen fadd_d {indirect4,sp},%1
fmove_d %1,{indirect4,sp}
pat sbf $1==4
with FS_REG FS_REG STACK
gen fsub %1,%2
fmove_s %2,{pre_dec4,sp}
pat sbf $1==8
with FD_REG FD_REG STACK
gen fsub %1,%2
fmove_d %2,{pre_dec4,sp}
pat mlf $1==4
with FS_REG STACK
gen fmul_s {indirect4,sp},%1
fmove_s %1,{indirect4,sp}
pat mlf $1==8
with FD_REG STACK
gen fmul_d {indirect4,sp},%1
fmove_d %1,{indirect4,sp}
pat dvf $1==4
with FS_REG FS_REG STACK
gen fdiv %1,%2
fmove_s %2,{pre_dec4,sp}
pat dvf $1==8
with FD_REG FD_REG STACK
gen fdiv %1,%2
fmove_d %2,{pre_dec4,sp}
pat ngf $1==4
with FS_REG STACK
gen fneg %1
fmove_s %1,{pre_dec4,sp}
pat ngf $1==8
with FD_REG STACK
gen fneg %1
fmove_d %1,{pre_dec4,sp}
pat fif $1==4
with FS_REG FS_REG STACK
gen fmul %1,%2
fintrz %2,%1
fsub %1,%2
fmove_s %2,{pre_dec4,sp}
fmove_s %1,{pre_dec4,sp}
pat fif $1==8
with FD_REG FD_REG STACK
gen fmul %1,%2
fintrz %2,%1
fsub %1,%2
fmove_d %2,{pre_dec4,sp}
fmove_d %1,{pre_dec4,sp}
pat fef $1==4
with FS_REG STACK
uses D_REG, FS_REG
gen fgetexp %1,%b
fmove_l %b,%a
add_l {const,1},%a
fgetman %1
fmove_l {const,2},%b
fdiv %b,%1
fmove_s %1,{pre_dec4,sp}
yields %a
pat fef $1==8
with FD_REG STACK
uses D_REG, FD_REG
gen fgetexp %1,%b
fmove_l %b,%a
add_l {const,1},%a
fgetman %1
fmove_l {const,2},%b
fdiv %b,%1
fmove_d %1,{pre_dec4,sp}
yields %a
#else
pat adf $1==4 leaving cal ".adf4" asp 4
pat adf $1==8 leaving cal ".adf8" asp 8
pat sbf $1==4 leaving cal ".sbf4" asp 4
@ -2962,6 +3117,7 @@ pat fef $1==8
move_l d1, {pre_dec4, sp}
move_l d0, {pre_dec4, sp}
leaving cal ".fef8"
#endif
/************************************************
* Group 6: pointer arithmetic *
@ -3339,6 +3495,66 @@ pat ciu leaving cuu
pat cui leaving cuu
#if TBL68881
pat loc loc cif $1==4 && $2==4
with data4 STACK
uses FS_REG
gen fmove_l %1,%a
fmove_s %a,{pre_dec4,sp}
pat loc loc cif $1==4 && $2==8
with data4 STACK
uses FD_REG
gen fmove_l %1,%a
fmove_d %a,{pre_dec4,sp}
pat loc loc cuf $1==4 && $2==4
with D_REG STACK
uses FS_REG
gen fmove_l %1,%a
tst_l %1
bge {slabel, 1f}
fsub_l {const,0-2147483648},%a
fsub_l {const,0-2147483648},%a
1:
fmove_s %a,{pre_dec4,sp}
pat loc loc cuf $1==4 && $2==8
with D_REG STACK
uses FD_REG
gen fmove_l %1,%a
tst_l %1
bge {slabel, 1f}
fsub_l {const,0-2147483648},%a
fsub_l {const,0-2147483648},%a
1:
fmove_d %a,{pre_dec4,sp}
pat loc loc cfi $1==4 && $2==4
with FS_REG
uses D_REG
gen fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cfi $1==8 && $2==4
with FD_REG
uses D_REG
gen fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cfu $1==4 && $2==4
with FS_REG
uses D_REG
gen fabs %1
fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cfu $1==8 && $2==4
with FD_REG
uses D_REG
gen fabs %1
fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cff $1==4 && $2==8
with FS_REG STACK
gen fmove_d %1,{pre_dec4,sp}
pat loc loc cff $1==8 && $2==4
with FD_REG STACK
gen fmove_s %1,{pre_dec4,sp}
#else
/*
* Floating point stuff
* Conversion
@ -3352,6 +3568,7 @@ pat loc loc cfu leaving loc $1 loc $2 cal ".cfu" asp 8+($1-4)
pat loc loc cff $1==8 && $2==4 leaving cal ".cff4" asp 4
pat loc loc cff $1==4 && $2==8
leaving loc 0 exg 4 cal ".cff8"
#endif
/************************************************
* Group 9: logical instructions *
@ -3709,9 +3926,33 @@ pat tgt call txx("sgt", "shi")
* Floating point
* Comparision
*/
#if TBL68881
pat cmf $1==4
with FS_REG FS_REG
uses D_REG={const,0}
gen fcmp %1,%2
fbeq {slabel,2f}
fblt {slabel,1f}
add_l {const,1},%a
bra {slabel,2f}
1:
sub_l {const,1},%a
2: yields %a
pat cmf $1==8
with FD_REG FD_REG
uses D_REG={const,0}
gen fcmp %1,%2
fbeq {slabel,2f}
fblt {slabel,1f}
add_l {const,1},%a
bra {slabel,2f}
1:
sub_l {const,1},%a
2: yields %a
#else
pat cmf $1==4 leaving cal ".cmf4" asp 8 lfr 4
pat cmf $1==8 leaving cal ".cmf8" asp 16 lfr 4
#endif
/*
* Floating Point
* Zero Constants

View file

@ -56,7 +56,11 @@ static int been_here;
}
}
#else
#if TBL68881
#define OWNFLOAT
#else
#define IEEEFLOAT
#endif
con_float() {
double f;

View file

@ -14,6 +14,10 @@ rscid = "$Header$"
#include "whichone.h"
#if TBL68881 && ! TBL68020
Something very wrong here!
#endif
/*#define FANCY_MODES
/* On the M68020, there are some real fancy addressing modes.
Their use makes the code a bit shorter, but also much slower.
@ -47,6 +51,10 @@ DD_REG /* allocatable D_REG, may not be a register variable */
AA_REG /* allocatable A_REG, may not be a register variable */
RD_REG /* data register, register var */
RA_REG /* address register, register var */
#if TBL68881
FS_REG /* floating point register */
FD_REG(8) /* double floating point register */
#endif
@ -57,7 +65,12 @@ d3, d4, d5, d6, d7 :D_REG, RD_REG regvar.
a0, a1 :A_REG, AA_REG.
a2, a3, a4, a5 :A_REG, RA_REG regvar(reg_pointer).
lb ("a6"), sp :A_REG. /* localbase and stack pointer */
#if TBL68881
F0 ("fp0"), F1 ("fp1"), F2 ("fp2"), F3 ("fp3"), F4 ("fp4"), F5 ("fp5"),
F6 ("fp6"), F7 ("fp7") :FS_REG.
fp0=F0,fp1=F1,fp2=F2,fp3=F3,fp4=F4,fp5=F5,fp6=F6,fp7=F7
:FD_REG.
#endif
@ -418,6 +431,12 @@ t_address = address + t_regAregXcon + t_regAcon .
#define t_address address
#endif TBL68020
#if TBL68881
freg = FD_REG + FS_REG .
store4 = any4 + FS_REG .
#else
store4 = any4 .
#endif
dups4 = genreg .
INSTRUCTIONS
@ -444,8 +463,7 @@ INSTRUCTIONS
add_l "add.l" any4:ro, LOCAL:rw:cc cost(0,0).
lea address:ro, LOCAL:wo cost(0,0).
sub_l "sub.l" any4:ro, LOCAL:rw:cc cost(0,0).
sh "illegal" shconreg:ro, LOCAL:rw:cc cost(0,0).
sh "illegal" LOCAL:ro, LOCAL:rw:cc cost(0,0).
sh "illegal" shconreg+LOCAL:ro, LOCAL:rw:cc cost(0,0).
xxx "illegal" data4:ro, LOCAL:rw:cc cost(0,0).
xxx "illegal" LOCAL:ro, alterable4:rw:cc cost(0,0).
#ifdef TBL68020
@ -543,7 +561,6 @@ unlk A_REG cost(2,6).
bxx "illegal" label cost(2,5).
sxx "illegal" any4:wo cost(2,5).
xxx "illegal" any4:ro, any4:rw:cc cost(2,3).
/*xxx "illegal" conreg4:ro, memalt4:rw:cc cost(2,6).*/
bit "illegal" control4:rw:cc cost(2,6).
sh "illegal" shconreg:ro, D_REG:rw:cc cost(2,4).
shw "illegal" control2:rw:cc cost(2,4).
@ -568,9 +585,40 @@ pea address+control4 cost(2,4).
* it is necessary with long divides where remainders are important;
* see also: 'pat rmi' and 'pat rmu'
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
killreg "! kill" D_REG:wo cost(0,0).
killreg "! kill" A_REG:wo cost(0,0).
killreg "! kill" D_REG+A_REG:wo cost(0,0).
#if TBL68881
/* These descriptions are not very accurate, because we have no
other 8-byte objects in the table.
*/
fmove_s "fmove.s" data4:ro, freg:wo cost(4,100).
fmove_s "fmove.s" freg:ro, data4:wo cost(4,100).
fmove_d "fmove.d" freg:ro, data4:wo cost(4,100).
fmove_d "fmove.d" data4:ro, freg:ro cost(4,100).
fmove_l "fmove.l" freg:ro, D_REG:wo cost(4,100).
fmove_l "fmove.l" data4:ro, freg:wo cost(4,100).
fmove freg:ro,freg:wo cost(4,100).
fadd_s "fadd.s" data4:ro, freg:rw cost(4,100).
fadd_d "fadd.d" data4:ro, freg:rw cost(4,100).
fsub_s "fsub.s" data4:ro, freg:rw cost(4,100).
fsub_d "fsub.d" data4:ro, freg:rw cost(4,100).
fsub freg:ro, freg:rw cost(4,100).
fmul freg:ro, freg:rw cost(4,100).
fmul_s "fmul.s" data4:ro, freg:rw cost(4,100).
fmul_d "fmul.d" data4:ro, freg:rw cost(4,100).
fdiv freg:ro, freg:rw cost(4,100).
fdiv_s "fdiv.s" data4:ro, freg:rw cost(4,100).
fdiv_d "fdiv.d" data4:ro, freg:rw cost(4,100).
fcmp freg:ro, freg:ro cost(4,100).
fbeq label:ro cost(4,4).
fblt label:ro cost(4,4).
fmovecr const:ro, freg:rw cost(4,100).
fabs freg:rw cost(4,100).
fneg freg:rw cost(4,100).
fgetman freg:rw cost(4,100).
fintrz freg:ro, freg:wo cost(4,100).
fgetexp freg:ro, freg:wo cost(4,100).
fsub_l "fsub.l" const:ro, freg:rw cost(4,100).
#endif
MOVES
@ -637,6 +685,13 @@ from any1 to dreg4
gen clr_l %2
move_b %1, %2
#if TBL68881
from data4 to FS_REG
gen fmove_s %1, %2
from FS_REG to datalt4
gen fmove_s %1, %2
#endif
TESTS
@ -731,7 +786,13 @@ from regX to STACK
* stackingrule for regX, so here it is
*/
#if TBL68881
from FS_REG to STACK
gen fmove_s %1,{pre_dec4,sp}
from FD_REG to STACK
gen fmove_d %1,{pre_dec4,sp}
#endif
COERCIONS
@ -745,6 +806,17 @@ from STACK
gen move_l {post_inc4, sp}, %a
yields %a
#ifdef TBL68881
from STACK
uses FS_REG
gen fmove_s {post_inc4, sp}, %a
yields %a
from STACK
uses FD_REG
gen fmove_d {post_inc4, sp}, %a
yields %a
#endif
#ifndef TBL68020
from t_regAregXcon sfit(%bd, 8)
yields {regAregXcon, %1.reg, %1.xreg, 1, %1.bd}
@ -774,6 +846,11 @@ from any4
from any4
uses reusing %1, AA_REG = %1
yields %a
#if TBL68881
from data4
uses reusing %1, FS_REG = %1
yields %a
#endif
from memory2
uses DD_REG = {const, 0}
@ -2376,7 +2453,7 @@ with exact memory2-consts
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
gen clr_l {LOCAL, $1}
move_w %1, {dreg2, regvar($1,reg_any)}
with any4
with store4
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
gen move %1, {LOCAL, $1}
with exact STACK
@ -2398,7 +2475,7 @@ with exact STACK
gen move_l {post_inc4, sp}, {areg, regvar($1, reg_pointer)}
pat stl
with any4-sconsts
with store4-sconsts
kills all_indir, LOCAL %bd==$1
gen move %1, {LOCAL, $1}
with exact STACK
@ -2406,7 +2483,7 @@ with exact STACK
gen move_l {post_inc4,sp}, {LOCAL, $1}
pat ste
with any4-sconsts
with store4-sconsts
kills posextern
gen move %1, {absolute4, $1}
with exact STACK
@ -2414,7 +2491,7 @@ with exact STACK
gen move_l {post_inc4, sp}, {absolute4, $1}
pat sil inreg($1)==reg_pointer
with any4-sconsts
with store4-sconsts
kills allexceptcon
gen move %1, {indirect4, regvar($1, reg_pointer)}
with exact STACK
@ -2422,7 +2499,7 @@ with exact STACK
gen move_l {post_inc4, sp}, {indirect4, regvar($1, reg_pointer)}
pat sil inreg($1)==reg_any
with any4-sconsts
with store4-sconsts
kills allexceptcon
uses AA_REG = {LOCAL, $1}
gen move %1, {indirect4, %a}
@ -2433,14 +2510,14 @@ with exact STACK
pat sil
#if TBL68020
with any4-sconsts
with store4-sconsts
kills allexceptcon
gen move %1, {ILOCAL, $1}
with exact STACK
kills allexceptcon
gen move_l {post_inc4, sp}, {ILOCAL, $1}
#else
with any4-sconsts
with store4-sconsts
kills allexceptcon
uses AA_REG = {LOCAL, $1}
gen move %1, {indirect4, %a}
@ -2451,7 +2528,7 @@ with exact STACK
#endif
pat stf
with A_REG any4-sconsts
with A_REG store4-sconsts
kills allexceptcon
gen move %2, {offsetted4, %1, $1}
with exact any4 STACK
@ -2463,61 +2540,61 @@ with exact STACK
uses AA_REG
gen move_l {post_inc4, sp}, %a
move_l {post_inc4, sp}, {offsetted4, %a, $1}
with exact local_addr any4
with exact local_addr store4
kills allexceptcon
gen move %2, {LOCAL, %1.bd+$1}
with exact ext_addr any4
with exact ext_addr store4
kills allexceptcon
gen move %2, {absolute4, %1.bd+$1}
#ifndef TBL68020
with regAcon any4
with regAcon store4
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd+$1}
#else TBL68020
with exact regAcon any4
with exact regAcon store4
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd+$1}
with exact regAregXcon any4
with exact regAregXcon store4
kills allexceptcon
gen move %2, {index_off4, %1.reg, %1.xreg, %1.sc, %1.bd+$1}
#ifdef FANCY_MODES
with exact indirect4 any4
with exact indirect4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, 0, $1}
with exact offsetted4 any4
with exact offsetted4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, $1}
with exact LOCAL any4
with exact LOCAL store4
kills allexceptcon
gen move %2, {OFF_off4, lb, %1.bd, $1}
with exact off_con any4
with exact off_con store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, %1.od+$1}
with exact index_off4 any4
with exact index_off4 store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, $1}
with exact indoff_con any4
with exact indoff_con store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od+$1}
with exact off_regXcon any4
with exact off_regXcon store4
kills allexceptcon
gen move %2, {OFF_indoff4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od+$1}
with exact absolute4 any4
with exact absolute4 store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, $1}
with exact abs_con any4
with exact abs_con store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, %1.od+$1}
with exact abs_regXcon any4
with exact abs_regXcon store4
kills allexceptcon
gen move %2, {ABS_indoff4, %1.sc, %1.xreg, %1.bd, %1.od+$1}
with exact abs_index4 any4
with exact abs_index4 store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, $1}
with exact absind_con any4
with exact absind_con store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, %1.od+$1}
with exact ext_regX any4
with exact ext_regX store4
kills allexceptcon
gen move %2, {abs_index4, %1.sc, %1.xreg, %1.bd+$1}
#endif
@ -2658,7 +2735,7 @@ with exact ext_regX any2
#endif TBL68020
pat sti $1==4
with A_REG any4-sconsts
with A_REG store4-sconsts
kills allexceptcon
gen move %2, {indirect4, %1}
with exact any4 STACK
@ -2670,64 +2747,64 @@ with exact STACK
uses AA_REG
gen move_l {post_inc4, sp}, %a
move_l {post_inc4, sp}, {indirect4, %a}
with exact local_addr any4
with exact local_addr store4
kills allexceptcon
gen move %2, {LOCAL, %1.bd}
with exact ext_addr any4
with exact ext_addr store4
kills allexceptcon
gen move %2, {absolute4, %1.bd}
#ifndef TBL68020
with regAcon any4-sconsts
with regAcon store4-sconsts
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd}
with regAregXcon any4-sconsts
with regAregXcon store4-sconsts
kills allexceptcon
gen move %2, {index_off4, %1.reg, %1.xreg, %1.sc, %1.bd}
#else TBL68020
with exact regAcon any4
with exact regAcon store4
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd}
with exact regAregXcon any4
with exact regAregXcon store4
kills allexceptcon
gen move %2, {index_off4, %1.reg, %1.xreg, %1.sc, %1.bd}
with exact LOCAL any4
with exact LOCAL store4
kills allexceptcon
gen move %2, {ILOCAL, %1.bd}
#ifdef FANCY_MODES
with exact indirect4 any4
with exact indirect4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, 0, 0}
with exact offsetted4 any4
with exact offsetted4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, 0}
with exact off_con any4
with exact off_con store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, %1.od}
with exact index_off4 any4
with exact index_off4 store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, 0}
with exact indoff_con any4
with exact indoff_con store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od}
with exact off_regXcon any4
with exact off_regXcon store4
kills allexceptcon
gen move %2, {OFF_indoff4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od}
with exact absolute4 any4
with exact absolute4 store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, 0}
with exact abs_con any4
with exact abs_con store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, %1.od}
with exact abs_regXcon any4
with exact abs_regXcon store4
kills allexceptcon
gen move %2, {ABS_indoff4, %1.sc, %1.xreg, %1.bd, %1.od}
with exact abs_index4 any4
with exact abs_index4 store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, 0}
with exact absind_con any4
with exact absind_con store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, %1.od}
with exact ext_regX any4
with exact ext_regX store4
kills allexceptcon
gen move %2, {abs_index4, %1.sc, %1.xreg, %1.bd}
#endif
@ -2766,8 +2843,8 @@ with STACK
pat sdl
with any4-sconsts any4-sconsts
kills all_indir, LOCAL %bd==$1
gen move %1, {LOCAL, $1}
move %2, {LOCAL, $1+4}
gen move %1, {LOCAL, $1}
move %2, {LOCAL, $1+4}
with exact STACK
kills all_indir, LOCAL %bd==$1
gen move_l {post_inc4, sp}, {LOCAL,$1}
@ -2940,6 +3017,84 @@ with shconreg DD_REG
* Arithmetic instructions
*/
#if TBL68881
pat adf $1==4
with FS_REG STACK
gen fadd_s {indirect4,sp},%1
fmove_s %1,{indirect4,sp}
pat adf $1==8
with FD_REG STACK
gen fadd_d {indirect4,sp},%1
fmove_d %1,{indirect4,sp}
pat sbf $1==4
with FS_REG FS_REG STACK
gen fsub %1,%2
fmove_s %2,{pre_dec4,sp}
pat sbf $1==8
with FD_REG FD_REG STACK
gen fsub %1,%2
fmove_d %2,{pre_dec4,sp}
pat mlf $1==4
with FS_REG STACK
gen fmul_s {indirect4,sp},%1
fmove_s %1,{indirect4,sp}
pat mlf $1==8
with FD_REG STACK
gen fmul_d {indirect4,sp},%1
fmove_d %1,{indirect4,sp}
pat dvf $1==4
with FS_REG FS_REG STACK
gen fdiv %1,%2
fmove_s %2,{pre_dec4,sp}
pat dvf $1==8
with FD_REG FD_REG STACK
gen fdiv %1,%2
fmove_d %2,{pre_dec4,sp}
pat ngf $1==4
with FS_REG STACK
gen fneg %1
fmove_s %1,{pre_dec4,sp}
pat ngf $1==8
with FD_REG STACK
gen fneg %1
fmove_d %1,{pre_dec4,sp}
pat fif $1==4
with FS_REG FS_REG STACK
gen fmul %1,%2
fintrz %2,%1
fsub %1,%2
fmove_s %2,{pre_dec4,sp}
fmove_s %1,{pre_dec4,sp}
pat fif $1==8
with FD_REG FD_REG STACK
gen fmul %1,%2
fintrz %2,%1
fsub %1,%2
fmove_d %2,{pre_dec4,sp}
fmove_d %1,{pre_dec4,sp}
pat fef $1==4
with FS_REG STACK
uses D_REG, FS_REG
gen fgetexp %1,%b
fmove_l %b,%a
add_l {const,1},%a
fgetman %1
fmove_l {const,2},%b
fdiv %b,%1
fmove_s %1,{pre_dec4,sp}
yields %a
pat fef $1==8
with FD_REG STACK
uses D_REG, FD_REG
gen fgetexp %1,%b
fmove_l %b,%a
add_l {const,1},%a
fgetman %1
fmove_l {const,2},%b
fdiv %b,%1
fmove_d %1,{pre_dec4,sp}
yields %a
#else
pat adf $1==4 leaving cal ".adf4" asp 4
pat adf $1==8 leaving cal ".adf8" asp 8
pat sbf $1==4 leaving cal ".sbf4" asp 4
@ -2962,6 +3117,7 @@ pat fef $1==8
move_l d1, {pre_dec4, sp}
move_l d0, {pre_dec4, sp}
leaving cal ".fef8"
#endif
/************************************************
* Group 6: pointer arithmetic *
@ -3339,6 +3495,66 @@ pat ciu leaving cuu
pat cui leaving cuu
#if TBL68881
pat loc loc cif $1==4 && $2==4
with data4 STACK
uses FS_REG
gen fmove_l %1,%a
fmove_s %a,{pre_dec4,sp}
pat loc loc cif $1==4 && $2==8
with data4 STACK
uses FD_REG
gen fmove_l %1,%a
fmove_d %a,{pre_dec4,sp}
pat loc loc cuf $1==4 && $2==4
with D_REG STACK
uses FS_REG
gen fmove_l %1,%a
tst_l %1
bge {slabel, 1f}
fsub_l {const,0-2147483648},%a
fsub_l {const,0-2147483648},%a
1:
fmove_s %a,{pre_dec4,sp}
pat loc loc cuf $1==4 && $2==8
with D_REG STACK
uses FD_REG
gen fmove_l %1,%a
tst_l %1
bge {slabel, 1f}
fsub_l {const,0-2147483648},%a
fsub_l {const,0-2147483648},%a
1:
fmove_d %a,{pre_dec4,sp}
pat loc loc cfi $1==4 && $2==4
with FS_REG
uses D_REG
gen fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cfi $1==8 && $2==4
with FD_REG
uses D_REG
gen fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cfu $1==4 && $2==4
with FS_REG
uses D_REG
gen fabs %1
fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cfu $1==8 && $2==4
with FD_REG
uses D_REG
gen fabs %1
fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cff $1==4 && $2==8
with FS_REG STACK
gen fmove_d %1,{pre_dec4,sp}
pat loc loc cff $1==8 && $2==4
with FD_REG STACK
gen fmove_s %1,{pre_dec4,sp}
#else
/*
* Floating point stuff
* Conversion
@ -3352,6 +3568,7 @@ pat loc loc cfu leaving loc $1 loc $2 cal ".cfu" asp 8+($1-4)
pat loc loc cff $1==8 && $2==4 leaving cal ".cff4" asp 4
pat loc loc cff $1==4 && $2==8
leaving loc 0 exg 4 cal ".cff8"
#endif
/************************************************
* Group 9: logical instructions *
@ -3709,9 +3926,33 @@ pat tgt call txx("sgt", "shi")
* Floating point
* Comparision
*/
#if TBL68881
pat cmf $1==4
with FS_REG FS_REG
uses D_REG={const,0}
gen fcmp %1,%2
fbeq {slabel,2f}
fblt {slabel,1f}
add_l {const,1},%a
bra {slabel,2f}
1:
sub_l {const,1},%a
2: yields %a
pat cmf $1==8
with FD_REG FD_REG
uses D_REG={const,0}
gen fcmp %1,%2
fbeq {slabel,2f}
fblt {slabel,1f}
add_l {const,1},%a
bra {slabel,2f}
1:
sub_l {const,1},%a
2: yields %a
#else
pat cmf $1==4 leaving cal ".cmf4" asp 8 lfr 4
pat cmf $1==8 leaving cal ".cmf8" asp 16 lfr 4
#endif
/*
* Floating Point
* Zero Constants

View file

@ -56,7 +56,11 @@ static int been_here;
}
}
#else
#if TBL68881
#define OWNFLOAT
#else
#define IEEEFLOAT
#endif
con_float() {
double f;

View file

@ -14,6 +14,10 @@ rscid = "$Header$"
#include "whichone.h"
#if TBL68881 && ! TBL68020
Something very wrong here!
#endif
/*#define FANCY_MODES
/* On the M68020, there are some real fancy addressing modes.
Their use makes the code a bit shorter, but also much slower.
@ -47,6 +51,10 @@ DD_REG /* allocatable D_REG, may not be a register variable */
AA_REG /* allocatable A_REG, may not be a register variable */
RD_REG /* data register, register var */
RA_REG /* address register, register var */
#if TBL68881
FS_REG /* floating point register */
FD_REG(8) /* double floating point register */
#endif
@ -57,7 +65,12 @@ d3, d4, d5, d6, d7 :D_REG, RD_REG regvar.
a0, a1 :A_REG, AA_REG.
a2, a3, a4, a5 :A_REG, RA_REG regvar(reg_pointer).
lb ("a6"), sp :A_REG. /* localbase and stack pointer */
#if TBL68881
F0 ("fp0"), F1 ("fp1"), F2 ("fp2"), F3 ("fp3"), F4 ("fp4"), F5 ("fp5"),
F6 ("fp6"), F7 ("fp7") :FS_REG.
fp0=F0,fp1=F1,fp2=F2,fp3=F3,fp4=F4,fp5=F5,fp6=F6,fp7=F7
:FD_REG.
#endif
@ -418,6 +431,12 @@ t_address = address + t_regAregXcon + t_regAcon .
#define t_address address
#endif TBL68020
#if TBL68881
freg = FD_REG + FS_REG .
store4 = any4 + FS_REG .
#else
store4 = any4 .
#endif
dups4 = genreg .
INSTRUCTIONS
@ -444,8 +463,7 @@ INSTRUCTIONS
add_l "add.l" any4:ro, LOCAL:rw:cc cost(0,0).
lea address:ro, LOCAL:wo cost(0,0).
sub_l "sub.l" any4:ro, LOCAL:rw:cc cost(0,0).
sh "illegal" shconreg:ro, LOCAL:rw:cc cost(0,0).
sh "illegal" LOCAL:ro, LOCAL:rw:cc cost(0,0).
sh "illegal" shconreg+LOCAL:ro, LOCAL:rw:cc cost(0,0).
xxx "illegal" data4:ro, LOCAL:rw:cc cost(0,0).
xxx "illegal" LOCAL:ro, alterable4:rw:cc cost(0,0).
#ifdef TBL68020
@ -543,7 +561,6 @@ unlk A_REG cost(2,6).
bxx "illegal" label cost(2,5).
sxx "illegal" any4:wo cost(2,5).
xxx "illegal" any4:ro, any4:rw:cc cost(2,3).
/*xxx "illegal" conreg4:ro, memalt4:rw:cc cost(2,6).*/
bit "illegal" control4:rw:cc cost(2,6).
sh "illegal" shconreg:ro, D_REG:rw:cc cost(2,4).
shw "illegal" control2:rw:cc cost(2,4).
@ -568,9 +585,40 @@ pea address+control4 cost(2,4).
* it is necessary with long divides where remainders are important;
* see also: 'pat rmi' and 'pat rmu'
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
killreg "! kill" D_REG:wo cost(0,0).
killreg "! kill" A_REG:wo cost(0,0).
killreg "! kill" D_REG+A_REG:wo cost(0,0).
#if TBL68881
/* These descriptions are not very accurate, because we have no
other 8-byte objects in the table.
*/
fmove_s "fmove.s" data4:ro, freg:wo cost(4,100).
fmove_s "fmove.s" freg:ro, data4:wo cost(4,100).
fmove_d "fmove.d" freg:ro, data4:wo cost(4,100).
fmove_d "fmove.d" data4:ro, freg:ro cost(4,100).
fmove_l "fmove.l" freg:ro, D_REG:wo cost(4,100).
fmove_l "fmove.l" data4:ro, freg:wo cost(4,100).
fmove freg:ro,freg:wo cost(4,100).
fadd_s "fadd.s" data4:ro, freg:rw cost(4,100).
fadd_d "fadd.d" data4:ro, freg:rw cost(4,100).
fsub_s "fsub.s" data4:ro, freg:rw cost(4,100).
fsub_d "fsub.d" data4:ro, freg:rw cost(4,100).
fsub freg:ro, freg:rw cost(4,100).
fmul freg:ro, freg:rw cost(4,100).
fmul_s "fmul.s" data4:ro, freg:rw cost(4,100).
fmul_d "fmul.d" data4:ro, freg:rw cost(4,100).
fdiv freg:ro, freg:rw cost(4,100).
fdiv_s "fdiv.s" data4:ro, freg:rw cost(4,100).
fdiv_d "fdiv.d" data4:ro, freg:rw cost(4,100).
fcmp freg:ro, freg:ro cost(4,100).
fbeq label:ro cost(4,4).
fblt label:ro cost(4,4).
fmovecr const:ro, freg:rw cost(4,100).
fabs freg:rw cost(4,100).
fneg freg:rw cost(4,100).
fgetman freg:rw cost(4,100).
fintrz freg:ro, freg:wo cost(4,100).
fgetexp freg:ro, freg:wo cost(4,100).
fsub_l "fsub.l" const:ro, freg:rw cost(4,100).
#endif
MOVES
@ -637,6 +685,13 @@ from any1 to dreg4
gen clr_l %2
move_b %1, %2
#if TBL68881
from data4 to FS_REG
gen fmove_s %1, %2
from FS_REG to datalt4
gen fmove_s %1, %2
#endif
TESTS
@ -731,7 +786,13 @@ from regX to STACK
* stackingrule for regX, so here it is
*/
#if TBL68881
from FS_REG to STACK
gen fmove_s %1,{pre_dec4,sp}
from FD_REG to STACK
gen fmove_d %1,{pre_dec4,sp}
#endif
COERCIONS
@ -745,6 +806,17 @@ from STACK
gen move_l {post_inc4, sp}, %a
yields %a
#ifdef TBL68881
from STACK
uses FS_REG
gen fmove_s {post_inc4, sp}, %a
yields %a
from STACK
uses FD_REG
gen fmove_d {post_inc4, sp}, %a
yields %a
#endif
#ifndef TBL68020
from t_regAregXcon sfit(%bd, 8)
yields {regAregXcon, %1.reg, %1.xreg, 1, %1.bd}
@ -774,6 +846,11 @@ from any4
from any4
uses reusing %1, AA_REG = %1
yields %a
#if TBL68881
from data4
uses reusing %1, FS_REG = %1
yields %a
#endif
from memory2
uses DD_REG = {const, 0}
@ -2376,7 +2453,7 @@ with exact memory2-consts
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
gen clr_l {LOCAL, $1}
move_w %1, {dreg2, regvar($1,reg_any)}
with any4
with store4
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
gen move %1, {LOCAL, $1}
with exact STACK
@ -2398,7 +2475,7 @@ with exact STACK
gen move_l {post_inc4, sp}, {areg, regvar($1, reg_pointer)}
pat stl
with any4-sconsts
with store4-sconsts
kills all_indir, LOCAL %bd==$1
gen move %1, {LOCAL, $1}
with exact STACK
@ -2406,7 +2483,7 @@ with exact STACK
gen move_l {post_inc4,sp}, {LOCAL, $1}
pat ste
with any4-sconsts
with store4-sconsts
kills posextern
gen move %1, {absolute4, $1}
with exact STACK
@ -2414,7 +2491,7 @@ with exact STACK
gen move_l {post_inc4, sp}, {absolute4, $1}
pat sil inreg($1)==reg_pointer
with any4-sconsts
with store4-sconsts
kills allexceptcon
gen move %1, {indirect4, regvar($1, reg_pointer)}
with exact STACK
@ -2422,7 +2499,7 @@ with exact STACK
gen move_l {post_inc4, sp}, {indirect4, regvar($1, reg_pointer)}
pat sil inreg($1)==reg_any
with any4-sconsts
with store4-sconsts
kills allexceptcon
uses AA_REG = {LOCAL, $1}
gen move %1, {indirect4, %a}
@ -2433,14 +2510,14 @@ with exact STACK
pat sil
#if TBL68020
with any4-sconsts
with store4-sconsts
kills allexceptcon
gen move %1, {ILOCAL, $1}
with exact STACK
kills allexceptcon
gen move_l {post_inc4, sp}, {ILOCAL, $1}
#else
with any4-sconsts
with store4-sconsts
kills allexceptcon
uses AA_REG = {LOCAL, $1}
gen move %1, {indirect4, %a}
@ -2451,7 +2528,7 @@ with exact STACK
#endif
pat stf
with A_REG any4-sconsts
with A_REG store4-sconsts
kills allexceptcon
gen move %2, {offsetted4, %1, $1}
with exact any4 STACK
@ -2463,61 +2540,61 @@ with exact STACK
uses AA_REG
gen move_l {post_inc4, sp}, %a
move_l {post_inc4, sp}, {offsetted4, %a, $1}
with exact local_addr any4
with exact local_addr store4
kills allexceptcon
gen move %2, {LOCAL, %1.bd+$1}
with exact ext_addr any4
with exact ext_addr store4
kills allexceptcon
gen move %2, {absolute4, %1.bd+$1}
#ifndef TBL68020
with regAcon any4
with regAcon store4
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd+$1}
#else TBL68020
with exact regAcon any4
with exact regAcon store4
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd+$1}
with exact regAregXcon any4
with exact regAregXcon store4
kills allexceptcon
gen move %2, {index_off4, %1.reg, %1.xreg, %1.sc, %1.bd+$1}
#ifdef FANCY_MODES
with exact indirect4 any4
with exact indirect4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, 0, $1}
with exact offsetted4 any4
with exact offsetted4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, $1}
with exact LOCAL any4
with exact LOCAL store4
kills allexceptcon
gen move %2, {OFF_off4, lb, %1.bd, $1}
with exact off_con any4
with exact off_con store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, %1.od+$1}
with exact index_off4 any4
with exact index_off4 store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, $1}
with exact indoff_con any4
with exact indoff_con store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od+$1}
with exact off_regXcon any4
with exact off_regXcon store4
kills allexceptcon
gen move %2, {OFF_indoff4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od+$1}
with exact absolute4 any4
with exact absolute4 store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, $1}
with exact abs_con any4
with exact abs_con store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, %1.od+$1}
with exact abs_regXcon any4
with exact abs_regXcon store4
kills allexceptcon
gen move %2, {ABS_indoff4, %1.sc, %1.xreg, %1.bd, %1.od+$1}
with exact abs_index4 any4
with exact abs_index4 store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, $1}
with exact absind_con any4
with exact absind_con store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, %1.od+$1}
with exact ext_regX any4
with exact ext_regX store4
kills allexceptcon
gen move %2, {abs_index4, %1.sc, %1.xreg, %1.bd+$1}
#endif
@ -2658,7 +2735,7 @@ with exact ext_regX any2
#endif TBL68020
pat sti $1==4
with A_REG any4-sconsts
with A_REG store4-sconsts
kills allexceptcon
gen move %2, {indirect4, %1}
with exact any4 STACK
@ -2670,64 +2747,64 @@ with exact STACK
uses AA_REG
gen move_l {post_inc4, sp}, %a
move_l {post_inc4, sp}, {indirect4, %a}
with exact local_addr any4
with exact local_addr store4
kills allexceptcon
gen move %2, {LOCAL, %1.bd}
with exact ext_addr any4
with exact ext_addr store4
kills allexceptcon
gen move %2, {absolute4, %1.bd}
#ifndef TBL68020
with regAcon any4-sconsts
with regAcon store4-sconsts
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd}
with regAregXcon any4-sconsts
with regAregXcon store4-sconsts
kills allexceptcon
gen move %2, {index_off4, %1.reg, %1.xreg, %1.sc, %1.bd}
#else TBL68020
with exact regAcon any4
with exact regAcon store4
kills allexceptcon
gen move %2, {offsetted4, %1.reg, %1.bd}
with exact regAregXcon any4
with exact regAregXcon store4
kills allexceptcon
gen move %2, {index_off4, %1.reg, %1.xreg, %1.sc, %1.bd}
with exact LOCAL any4
with exact LOCAL store4
kills allexceptcon
gen move %2, {ILOCAL, %1.bd}
#ifdef FANCY_MODES
with exact indirect4 any4
with exact indirect4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, 0, 0}
with exact offsetted4 any4
with exact offsetted4 store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, 0}
with exact off_con any4
with exact off_con store4
kills allexceptcon
gen move %2, {OFF_off4, %1.reg, %1.bd, %1.od}
with exact index_off4 any4
with exact index_off4 store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, 0}
with exact indoff_con any4
with exact indoff_con store4
kills allexceptcon
gen move %2, {INDOFF_off4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od}
with exact off_regXcon any4
with exact off_regXcon store4
kills allexceptcon
gen move %2, {OFF_indoff4, %1.reg, %1.xreg, %1.sc, %1.bd, %1.od}
with exact absolute4 any4
with exact absolute4 store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, 0}
with exact abs_con any4
with exact abs_con store4
kills allexceptcon
gen move %2, {ABS_off4, %1.bd, %1.od}
with exact abs_regXcon any4
with exact abs_regXcon store4
kills allexceptcon
gen move %2, {ABS_indoff4, %1.sc, %1.xreg, %1.bd, %1.od}
with exact abs_index4 any4
with exact abs_index4 store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, 0}
with exact absind_con any4
with exact absind_con store4
kills allexceptcon
gen move %2, {ABSIND_off4, %1.sc, %1.xreg, %1.bd, %1.od}
with exact ext_regX any4
with exact ext_regX store4
kills allexceptcon
gen move %2, {abs_index4, %1.sc, %1.xreg, %1.bd}
#endif
@ -2766,8 +2843,8 @@ with STACK
pat sdl
with any4-sconsts any4-sconsts
kills all_indir, LOCAL %bd==$1
gen move %1, {LOCAL, $1}
move %2, {LOCAL, $1+4}
gen move %1, {LOCAL, $1}
move %2, {LOCAL, $1+4}
with exact STACK
kills all_indir, LOCAL %bd==$1
gen move_l {post_inc4, sp}, {LOCAL,$1}
@ -2940,6 +3017,84 @@ with shconreg DD_REG
* Arithmetic instructions
*/
#if TBL68881
pat adf $1==4
with FS_REG STACK
gen fadd_s {indirect4,sp},%1
fmove_s %1,{indirect4,sp}
pat adf $1==8
with FD_REG STACK
gen fadd_d {indirect4,sp},%1
fmove_d %1,{indirect4,sp}
pat sbf $1==4
with FS_REG FS_REG STACK
gen fsub %1,%2
fmove_s %2,{pre_dec4,sp}
pat sbf $1==8
with FD_REG FD_REG STACK
gen fsub %1,%2
fmove_d %2,{pre_dec4,sp}
pat mlf $1==4
with FS_REG STACK
gen fmul_s {indirect4,sp},%1
fmove_s %1,{indirect4,sp}
pat mlf $1==8
with FD_REG STACK
gen fmul_d {indirect4,sp},%1
fmove_d %1,{indirect4,sp}
pat dvf $1==4
with FS_REG FS_REG STACK
gen fdiv %1,%2
fmove_s %2,{pre_dec4,sp}
pat dvf $1==8
with FD_REG FD_REG STACK
gen fdiv %1,%2
fmove_d %2,{pre_dec4,sp}
pat ngf $1==4
with FS_REG STACK
gen fneg %1
fmove_s %1,{pre_dec4,sp}
pat ngf $1==8
with FD_REG STACK
gen fneg %1
fmove_d %1,{pre_dec4,sp}
pat fif $1==4
with FS_REG FS_REG STACK
gen fmul %1,%2
fintrz %2,%1
fsub %1,%2
fmove_s %2,{pre_dec4,sp}
fmove_s %1,{pre_dec4,sp}
pat fif $1==8
with FD_REG FD_REG STACK
gen fmul %1,%2
fintrz %2,%1
fsub %1,%2
fmove_d %2,{pre_dec4,sp}
fmove_d %1,{pre_dec4,sp}
pat fef $1==4
with FS_REG STACK
uses D_REG, FS_REG
gen fgetexp %1,%b
fmove_l %b,%a
add_l {const,1},%a
fgetman %1
fmove_l {const,2},%b
fdiv %b,%1
fmove_s %1,{pre_dec4,sp}
yields %a
pat fef $1==8
with FD_REG STACK
uses D_REG, FD_REG
gen fgetexp %1,%b
fmove_l %b,%a
add_l {const,1},%a
fgetman %1
fmove_l {const,2},%b
fdiv %b,%1
fmove_d %1,{pre_dec4,sp}
yields %a
#else
pat adf $1==4 leaving cal ".adf4" asp 4
pat adf $1==8 leaving cal ".adf8" asp 8
pat sbf $1==4 leaving cal ".sbf4" asp 4
@ -2962,6 +3117,7 @@ pat fef $1==8
move_l d1, {pre_dec4, sp}
move_l d0, {pre_dec4, sp}
leaving cal ".fef8"
#endif
/************************************************
* Group 6: pointer arithmetic *
@ -3339,6 +3495,66 @@ pat ciu leaving cuu
pat cui leaving cuu
#if TBL68881
pat loc loc cif $1==4 && $2==4
with data4 STACK
uses FS_REG
gen fmove_l %1,%a
fmove_s %a,{pre_dec4,sp}
pat loc loc cif $1==4 && $2==8
with data4 STACK
uses FD_REG
gen fmove_l %1,%a
fmove_d %a,{pre_dec4,sp}
pat loc loc cuf $1==4 && $2==4
with D_REG STACK
uses FS_REG
gen fmove_l %1,%a
tst_l %1
bge {slabel, 1f}
fsub_l {const,0-2147483648},%a
fsub_l {const,0-2147483648},%a
1:
fmove_s %a,{pre_dec4,sp}
pat loc loc cuf $1==4 && $2==8
with D_REG STACK
uses FD_REG
gen fmove_l %1,%a
tst_l %1
bge {slabel, 1f}
fsub_l {const,0-2147483648},%a
fsub_l {const,0-2147483648},%a
1:
fmove_d %a,{pre_dec4,sp}
pat loc loc cfi $1==4 && $2==4
with FS_REG
uses D_REG
gen fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cfi $1==8 && $2==4
with FD_REG
uses D_REG
gen fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cfu $1==4 && $2==4
with FS_REG
uses D_REG
gen fabs %1
fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cfu $1==8 && $2==4
with FD_REG
uses D_REG
gen fabs %1
fintrz %1,%1
fmove_l %1,%a yields %a
pat loc loc cff $1==4 && $2==8
with FS_REG STACK
gen fmove_d %1,{pre_dec4,sp}
pat loc loc cff $1==8 && $2==4
with FD_REG STACK
gen fmove_s %1,{pre_dec4,sp}
#else
/*
* Floating point stuff
* Conversion
@ -3352,6 +3568,7 @@ pat loc loc cfu leaving loc $1 loc $2 cal ".cfu" asp 8+($1-4)
pat loc loc cff $1==8 && $2==4 leaving cal ".cff4" asp 4
pat loc loc cff $1==4 && $2==8
leaving loc 0 exg 4 cal ".cff8"
#endif
/************************************************
* Group 9: logical instructions *
@ -3709,9 +3926,33 @@ pat tgt call txx("sgt", "shi")
* Floating point
* Comparision
*/
#if TBL68881
pat cmf $1==4
with FS_REG FS_REG
uses D_REG={const,0}
gen fcmp %1,%2
fbeq {slabel,2f}
fblt {slabel,1f}
add_l {const,1},%a
bra {slabel,2f}
1:
sub_l {const,1},%a
2: yields %a
pat cmf $1==8
with FD_REG FD_REG
uses D_REG={const,0}
gen fcmp %1,%2
fbeq {slabel,2f}
fblt {slabel,1f}
add_l {const,1},%a
bra {slabel,2f}
1:
sub_l {const,1},%a
2: yields %a
#else
pat cmf $1==4 leaving cal ".cmf4" asp 8 lfr 4
pat cmf $1==8 leaving cal ".cmf8" asp 16 lfr 4
#endif
/*
* Floating Point
* Zero Constants