Many new patterns
This commit is contained in:
parent
da2ba8e093
commit
992dc3eb65
4 changed files with 1492 additions and 144 deletions
|
@ -100,6 +100,7 @@ indirect4 = {A_REG reg;} 4 cost(0,4) "(" reg ")" .
|
|||
post_inc4 = {A_REG reg;} 4 cost(0,4) "(" reg ")+" .
|
||||
pre_dec4 = {A_REG reg;} 4 cost(0,5) "-(" reg ")" .
|
||||
dreg4 = {D_REG reg;} 4 cost(0,0) reg .
|
||||
areg = {A_REG reg;} 4 cost(0,0) reg .
|
||||
dreg2 = {D_REG reg;} 4 cost(0,0) reg .
|
||||
indirect2 = {A_REG reg;} 4 cost(0,4) "(" reg ")" .
|
||||
post_inc2 = {A_REG reg;} 4 cost(0,4) "(" reg ")+" .
|
||||
|
@ -368,6 +369,7 @@ immediate4 = consts + ext_addr .
|
|||
conreg4 = D_REG + immediate4 .
|
||||
conreg2 = dreg2 + consts + D_REG .
|
||||
conreg1 = dreg1 + consts + D_REG .
|
||||
conreg = conreg1 + conreg2 + conreg4 .
|
||||
shconreg = D_REG + small_const .
|
||||
datalt4 = data4 * alterable4 .
|
||||
datalt2 = data2 * alterable2 .
|
||||
|
@ -393,7 +395,7 @@ imm_cmp4 = any4 - immediate4 - A_REG .
|
|||
imm_cmp2 = any2 - consts .
|
||||
imm_cmp1 = any1 - consts .
|
||||
|
||||
test_set4 = data4 - immediate4 + extend2 + extend1 .
|
||||
test_set4 = any4 - immediate4 + extend2 + extend1 .
|
||||
test_set2 = data2 - consts .
|
||||
test_set1 = data1 - consts .
|
||||
|
||||
|
@ -493,12 +495,15 @@ ext_l "ext.l" extend1+extend2+D_REG+LOCAL:rw:cc cost(2,2).
|
|||
ext_w "ext.w" extend1+D_REG+LOCAL:rw:cc cost(2,2).
|
||||
jmp address+control4 cost(2,0).
|
||||
jsr address+control4 kills :cc d0 d1 d2 a0 a1 cost(2,3).
|
||||
lea address+control4:ro, A_REG:wo cost(2,0).
|
||||
lea address+control4:ro, A_REG+areg:wo cost(2,0).
|
||||
lsl_l "lsl.l" shconreg:ro, D_REG:rw:cc cost(2,4).
|
||||
lsl "lsl #1," memalt2:rw:cc cost(2,4).
|
||||
lsr_l "lsr.l" shconreg:ro, D_REG:rw:cc cost(2,4).
|
||||
lsr "lsr #1," memalt2:rw:cc cost(2,4).
|
||||
move_l "move.l" any4:ro, A_REG:wo cost(2,2).
|
||||
/* move_l does not set the condition codes if the destination is an
|
||||
address register!
|
||||
*/
|
||||
move_l "move.l" any4:ro, A_REG+areg:wo cost(2,2).
|
||||
move_l "move.l" any4:ro, alterable4+dreg4:wo:cc cost(2,2).
|
||||
move_w "move.w" any2:ro, alterable2+dreg4:wo:cc cost(2,2).
|
||||
move_b "move.b" any1:ro, alterable1+dreg4:wo:cc cost(2,2).
|
||||
|
@ -967,6 +972,10 @@ pat lol lof adp lol stf $1==$4 && $2==$5 && inreg($1)==reg_pointer
|
|||
pat loe lof adp loe stf $1==$4 && $2==$5
|
||||
kills allexceptcon
|
||||
gen add_l {const, $3}, {ABS_off4, $1, $2}
|
||||
|
||||
pat loe loi adp loe sti $1==$4 && $2==4 && $5==4
|
||||
kills allexceptcon
|
||||
gen add_l {const, $3}, {ABS_off4, $1, 0}
|
||||
#endif
|
||||
|
||||
pat lol inl $1==$2 && inreg($1)==reg_any
|
||||
|
@ -1132,6 +1141,24 @@ pat loe lof ior loe stf $1==$4 && $2==$5 && $3==4
|
|||
call lefxxxsef("or.l")
|
||||
pat loe lof xor loe stf $1==$4 && $2==$5 && $3==4
|
||||
call lefxxxsef("eor.l")
|
||||
|
||||
proc leixxxsei example loe loi and loe sti
|
||||
with conreg4-bconst
|
||||
kills allexceptcon
|
||||
gen xxx* %1, {ABS_off4, $1, 0}
|
||||
|
||||
pat loe loi adi loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("add.l")
|
||||
pat loe loi adu loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("add.l")
|
||||
pat loe loi ads loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("add.l")
|
||||
pat loe loi and loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("and.l")
|
||||
pat loe loi ior loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("or.l")
|
||||
pat loe loi xor loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("eor.l")
|
||||
#endif
|
||||
|
||||
proc lofruxxsof example lol lof inc lol stf
|
||||
|
@ -1173,6 +1200,19 @@ pat loe lof ngi loe stf $1==$4 && $2==$5 && $3==4
|
|||
call lefuxxsef("neg.l")
|
||||
pat loe lof com loe stf $1==$4 && $2==$5 && $3==4
|
||||
call lefuxxsef("not.l")
|
||||
|
||||
proc leiuxxsei example loe loi inc loe sti
|
||||
kills allexceptcon
|
||||
gen bit* {ABS_off4, $1, 0}
|
||||
|
||||
pat loe loi inc loe sti $1==$4 && $2==4 && $5==4
|
||||
call leiuxxsei("add.l #1,")
|
||||
pat loe loi dec loe sti $1==$4 && $2==4 && $5==4
|
||||
call leiuxxsei("sub.l #1,")
|
||||
pat loe loi ngi loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leiuxxsei("neg.l")
|
||||
pat loe loi com loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leiuxxsei("not.l")
|
||||
#endif
|
||||
|
||||
proc lolcxxstl example lol loc and stl
|
||||
|
@ -1439,9 +1479,93 @@ with any4
|
|||
pat dup stl $1==4 && inreg($2)==reg_pointer
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{LOCAL, $2}
|
||||
gen move_l %1,{areg, regvar($2, reg_pointer)}
|
||||
yields {LOCAL, $2}
|
||||
|
||||
pat dup lol sti lol adp stl zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==1 && $5==1
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{post_inc1, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==1 && $5==1
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{post_inc1, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==2 && $5==2
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{post_inc2, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==2 && $5==2
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{post_inc2, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==4 && $5==4
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{post_inc4, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==4 && $5==4
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{post_inc4, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==1 && $4==(0-1)
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{pre_dec1, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==1 && $4==(0-1)
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{pre_dec1, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==2 && $4==(0-2)
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{pre_dec2, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==2 && $4==(0-2)
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{pre_dec2, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==4 && $4==(0-4)
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{pre_dec4, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==4 && $4==(0-4)
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{pre_dec4, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat lil adp sil $1==$3 && inreg($1)==reg_pointer
|
||||
kills allexceptcon
|
||||
gen add_l {const, $2}, {indirect4, regvar($1, reg_pointer)}
|
||||
|
@ -1474,7 +1598,15 @@ pat lil lil dec sil $1==$2 && $1==$4 && inreg($1)==reg_pointer
|
|||
killreg %a
|
||||
yields %a
|
||||
|
||||
pat lol lof dup adp lol stf $1==$5 && $2==$6 && inreg($1)==reg_pointer
|
||||
pat lol lof dup adp lol stf sti $3==4 && $1==$5 && $2==$6 && inreg($1)==reg_pointer && $7 <= 4
|
||||
with conreg
|
||||
kills allexceptcon
|
||||
uses AA_REG = {offsetted4, regvar($1, reg_pointer), $2}
|
||||
gen add_l {const, $4}, {offsetted4, regvar($1, reg_pointer), $2}
|
||||
killreg %a
|
||||
yields %1 %a leaving sti $7
|
||||
|
||||
pat lol lof dup adp lol stf $3==4 && $1==$5 && $2==$6 && inreg($1)==reg_pointer
|
||||
kills allexceptcon
|
||||
uses AA_REG = {offsetted4, regvar($1, reg_pointer), $2}
|
||||
gen add_l {const, $4}, {offsetted4, regvar($1, reg_pointer), $2}
|
||||
|
@ -1482,14 +1614,49 @@ pat lol lof dup adp lol stf $1==$5 && $2==$6 && inreg($1)==reg_pointer
|
|||
yields %a
|
||||
|
||||
#ifdef TBL68020
|
||||
pat loe lof dup adp loe stf $1==$5 && $2==$6
|
||||
pat loe lof dup adp loe stf sti $3==4 && $1==$5 && $2==$6 && $7 <= 4
|
||||
with conreg
|
||||
kills allexceptcon
|
||||
uses AA_REG = {abs_con, $1, $2}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %1 %b leaving sti $7
|
||||
|
||||
pat loe lof dup adp loe stf $3==4 && $1==$5 && $2==$6
|
||||
kills allexceptcon
|
||||
uses AA_REG = {abs_con, $1, $2}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %b
|
||||
|
||||
pat loe loi dup adp loe sti sti $3==4 && $1==$5 && $2==4 && $6==4 && $7 <= 4
|
||||
with conreg
|
||||
kills allexceptcon
|
||||
uses AA_REG = {absolute, $1}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %1 %b leaving sti $7
|
||||
|
||||
pat loe loi dup adp loe sti $3==4 && $1==$5 && $2==4 && $6==4
|
||||
kills allexceptcon
|
||||
uses AA_REG = {absolute4, $1}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %b
|
||||
#endif
|
||||
|
||||
pat lol lol adp stl lae cmp $1==$2 && $2==$4 && inreg($1)==reg_pointer && $3 < 0
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen sub_l {const,0-$3},{LOCAL,$1}
|
||||
yields {LOCAL,$1} {ext_addr, $5+$3}
|
||||
leaving cmu 4
|
||||
|
||||
pat lol lol adp stl lae cmp $1==$2 && $2==$4 && inreg($1)==reg_pointer && $3 > 0
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen add_l {const,$3},{LOCAL,$1}
|
||||
yields {LOCAL,$1} {ext_addr, $5+$3}
|
||||
leaving cmu 4
|
||||
|
||||
pat lol lol adp stl loi $1==$2 && $1==$4 && $3==4 && $5==4 &&
|
||||
inreg($1)==reg_pointer
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
|
@ -1658,6 +1825,12 @@ pat loe adp ste $1==$3
|
|||
kills posextern
|
||||
gen add_l {const, $2}, {absolute4, $1}
|
||||
|
||||
pat loc and $1==255 && $2==4
|
||||
with exact absolute4 yields {absolute1,%1.bd+3}
|
||||
with exact offsetted4 yields {offsetted1,%1.reg,%1.bd+3}
|
||||
with exact LOCAL yields {offsetted1,lb,%1.bd+3}
|
||||
with yields {const, $1} leaving and 4
|
||||
|
||||
/************************************************
|
||||
* Group 1: load instructions *
|
||||
************************************************/
|
||||
|
@ -1684,6 +1857,24 @@ pat loe yields {absolute4, $1}
|
|||
|
||||
pat loe loe $1==$2 leaving loe $1 dup 4
|
||||
|
||||
/* replace ste loe by dup ste, but not if followed by a test ... */
|
||||
proc steloezxx example ste loe zne
|
||||
with any4-sconsts
|
||||
kills posextern
|
||||
gen move %1, {absolute4, $1}
|
||||
bxx* {llabel, $3}
|
||||
with exact STACK
|
||||
kills posextern
|
||||
gen move_l {post_inc4, sp}, {absolute4, $1}
|
||||
bxx* {llabel, $3}
|
||||
|
||||
pat ste loe zlt $1==$2 call steloezxx("blt")
|
||||
pat ste loe zle $1==$2 call steloezxx("ble")
|
||||
pat ste loe zeq $1==$2 call steloezxx("beq")
|
||||
pat ste loe zne $1==$2 call steloezxx("bne")
|
||||
pat ste loe zge $1==$2 call steloezxx("bge")
|
||||
pat ste loe zgt $1==$2 call steloezxx("bgt")
|
||||
|
||||
pat ste loe $1==$2 leaving dup 4 ste $1
|
||||
|
||||
pat lil inreg($1)==reg_pointer
|
||||
|
@ -1970,16 +2161,16 @@ with exact STACK
|
|||
pat stl inreg($1)==reg_pointer
|
||||
with any4-sconsts
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move %1, {LOCAL, $1}
|
||||
gen move_l %1, {areg, regvar($1, reg_pointer)}
|
||||
with exact ext_addr
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move %1, {LOCAL, $1}
|
||||
gen move_l %1, {areg, regvar($1, reg_pointer)}
|
||||
with exact address-ext_addr
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen lea %1, {LOCAL, $1}
|
||||
gen lea %1, {areg, regvar($1, reg_pointer)}
|
||||
with exact STACK
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move_l {post_inc4, sp}, {LOCAL, $1}
|
||||
gen move_l {post_inc4, sp}, {areg, regvar($1, reg_pointer)}
|
||||
|
||||
pat stl
|
||||
with any4-sconsts
|
||||
|
@ -2450,7 +2641,7 @@ with exact any4 STACK
|
|||
uses reusing %1,DD_REG=%1
|
||||
gen sub_l {post_inc4, sp}, %a
|
||||
neg_l %a yields %a
|
||||
with any4 AA_REG
|
||||
with any4-bconst AA_REG
|
||||
gen sub_l %1, %2 yields %2
|
||||
|
||||
pat mli $1==4
|
||||
|
@ -2621,6 +2812,96 @@ with exact absind_con yields {absind_con, %1.sc, %1.xreg, %1.bd, %1.od+$1}
|
|||
with exact ext_regX yields {ext_regX, %1.sc, %1.xreg, %1.bd+$1}
|
||||
#endif TBL68020
|
||||
|
||||
pat ads cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving cmu 4
|
||||
|
||||
pat ads bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving bne $2
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving bne $2
|
||||
|
||||
pat ads beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving beq $2
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving beq $2
|
||||
|
||||
pat ads loe bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving loe $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving loe $2 bne $3
|
||||
|
||||
pat ads loe beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving loe $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving loe $2 beq $3
|
||||
|
||||
pat ads loe cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving loe $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving loe $2 cmu 4
|
||||
|
||||
pat ads lae bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lae $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lae $2 bne $3
|
||||
|
||||
pat ads lae beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lae $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lae $2 beq $3
|
||||
|
||||
pat ads lae cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lae $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lae $2 cmu 4
|
||||
|
||||
pat ads lal bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lal $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lal $2 bne $3
|
||||
|
||||
pat ads lal beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lal $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lal $2 beq $3
|
||||
|
||||
pat ads lal cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lal $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lal $2 cmu 4
|
||||
|
||||
pat ads lol bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lol $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lol $2 bne $3
|
||||
|
||||
pat ads lol beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lol $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lol $2 beq $3
|
||||
|
||||
pat ads lol cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lol $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lol $2 cmu 4
|
||||
|
||||
pat ads $1==4
|
||||
with D_REG A_REG yields {regAregXcon, %2, %1, 1, 0}
|
||||
with D_REG regAcon + t_regAcon
|
||||
|
@ -2679,6 +2960,8 @@ with exact absolute4 ext_regX
|
|||
pat sbs $1==4 leaving sbi 4
|
||||
|
||||
#ifdef TBL68020
|
||||
pat loc slu $2==4 leaving loc $1 sli 4
|
||||
|
||||
pat loc sli ads $1==1 && $2==4 && $3==4
|
||||
with D_REG yields {regX, 2, %1}
|
||||
leaving ads 4
|
||||
|
@ -2697,12 +2980,7 @@ with D_REG yields {regX, 8, %1}
|
|||
* Group 7: increment / decrement / zero *
|
||||
************************************************/
|
||||
|
||||
pat inc
|
||||
with exact STACK
|
||||
gen add_l {const, 1}, {indirect4, sp}
|
||||
with DD_REG+AA_REG
|
||||
gen add_l {const, 1}, %1
|
||||
yields %1
|
||||
pat inc leaving loc 1 adi 4
|
||||
|
||||
pat inl inreg($1)==reg_any
|
||||
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
|
||||
|
@ -2723,12 +3001,7 @@ pat ine
|
|||
kills posextern
|
||||
gen add_l {const, 1}, {absolute4, $1}
|
||||
|
||||
pat dec
|
||||
with exact STACK
|
||||
gen sub_l {const, 1}, {indirect4, sp}
|
||||
with DD_REG+AA_REG
|
||||
gen sub_l {const, 1}, %1
|
||||
yields %1
|
||||
pat dec leaving loc 1 sbi 4
|
||||
|
||||
pat del inreg($1)==reg_any
|
||||
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
|
||||
|
@ -2755,7 +3028,7 @@ pat zrl inreg($1)==reg_any
|
|||
|
||||
pat zrl inreg($1)==reg_pointer
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move_l {const, 0}, {LOCAL, $1}
|
||||
gen move_l {const, 0}, {areg, regvar($1, reg_pointer)}
|
||||
|
||||
pat zrl
|
||||
kills all_indir, LOCAL %bd==$1
|
||||
|
@ -3122,23 +3395,31 @@ proc txx
|
|||
with test_set4
|
||||
uses reusing %1,DD_REG
|
||||
gen test %1
|
||||
sxx[1] %a
|
||||
neg_b %a
|
||||
yields {extend1, %a}
|
||||
bxx[1] {slabel, 1f}
|
||||
clr_l %a
|
||||
bra {slabel, 2f}
|
||||
1:
|
||||
move_l {const,1},%a
|
||||
2:
|
||||
yields %a
|
||||
|
||||
with test_set1 + test_set2
|
||||
uses reusing %1,DD_REG
|
||||
gen test %1
|
||||
sxx[2] %a
|
||||
neg_b %a
|
||||
yields {extend1, %a}
|
||||
bxx[2] {slabel, 1f}
|
||||
clr_l %a
|
||||
bra {slabel, 2f}
|
||||
1:
|
||||
move_l {const,1},%a
|
||||
2:
|
||||
yields %a
|
||||
|
||||
pat tlt call txx("slt", "scs")
|
||||
pat tle call txx("sle", "sls")
|
||||
pat teq call txx("seq", "seq")
|
||||
pat tne call txx("sne", "sne")
|
||||
pat tge call txx("sge", "scc")
|
||||
pat tgt call txx("sgt", "shi")
|
||||
pat tlt call txx("blt", "bcs")
|
||||
pat tle call txx("ble", "bls")
|
||||
pat teq call txx("beq", "beq")
|
||||
pat tne call txx("bne", "bne")
|
||||
pat tge call txx("bge", "bcc")
|
||||
pat tgt call txx("bgt", "bhi")
|
||||
|
||||
/*
|
||||
* Floating point
|
||||
|
@ -4013,3 +4294,59 @@ pat loc dvu $1==32 && $2==4 leaving loc 5 sru 4
|
|||
pat loc dvu $1==64 && $2==4 leaving loc 6 sru 4
|
||||
pat loc dvu $1==128 && $2==4 leaving loc 7 sru 4
|
||||
pat loc dvu $1==256 && $2==4 leaving loc 8 sru 4
|
||||
|
||||
pat loc dvi $1==2 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 1 sri 4
|
||||
|
||||
pat loc dvi $1==4 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 2 sri 4
|
||||
|
||||
pat loc dvi $1==8 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 3 sri 4
|
||||
|
||||
pat loc dvi $1==16 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 4 sri 4
|
||||
|
||||
pat loc dvi $1==32 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 5 sri 4
|
||||
|
||||
pat loc dvi $1==64 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 6 sri 4
|
||||
|
||||
pat loc dvi $1==128 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 7 sri 4
|
||||
|
||||
pat loc dvi $1==256 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 8 sri 4
|
||||
|
|
|
@ -100,6 +100,7 @@ indirect4 = {A_REG reg;} 4 cost(0,4) "(" reg ")" .
|
|||
post_inc4 = {A_REG reg;} 4 cost(0,4) "(" reg ")+" .
|
||||
pre_dec4 = {A_REG reg;} 4 cost(0,5) "-(" reg ")" .
|
||||
dreg4 = {D_REG reg;} 4 cost(0,0) reg .
|
||||
areg = {A_REG reg;} 4 cost(0,0) reg .
|
||||
dreg2 = {D_REG reg;} 4 cost(0,0) reg .
|
||||
indirect2 = {A_REG reg;} 4 cost(0,4) "(" reg ")" .
|
||||
post_inc2 = {A_REG reg;} 4 cost(0,4) "(" reg ")+" .
|
||||
|
@ -368,6 +369,7 @@ immediate4 = consts + ext_addr .
|
|||
conreg4 = D_REG + immediate4 .
|
||||
conreg2 = dreg2 + consts + D_REG .
|
||||
conreg1 = dreg1 + consts + D_REG .
|
||||
conreg = conreg1 + conreg2 + conreg4 .
|
||||
shconreg = D_REG + small_const .
|
||||
datalt4 = data4 * alterable4 .
|
||||
datalt2 = data2 * alterable2 .
|
||||
|
@ -393,7 +395,7 @@ imm_cmp4 = any4 - immediate4 - A_REG .
|
|||
imm_cmp2 = any2 - consts .
|
||||
imm_cmp1 = any1 - consts .
|
||||
|
||||
test_set4 = data4 - immediate4 + extend2 + extend1 .
|
||||
test_set4 = any4 - immediate4 + extend2 + extend1 .
|
||||
test_set2 = data2 - consts .
|
||||
test_set1 = data1 - consts .
|
||||
|
||||
|
@ -493,12 +495,15 @@ ext_l "ext.l" extend1+extend2+D_REG+LOCAL:rw:cc cost(2,2).
|
|||
ext_w "ext.w" extend1+D_REG+LOCAL:rw:cc cost(2,2).
|
||||
jmp address+control4 cost(2,0).
|
||||
jsr address+control4 kills :cc d0 d1 d2 a0 a1 cost(2,3).
|
||||
lea address+control4:ro, A_REG:wo cost(2,0).
|
||||
lea address+control4:ro, A_REG+areg:wo cost(2,0).
|
||||
lsl_l "lsl.l" shconreg:ro, D_REG:rw:cc cost(2,4).
|
||||
lsl "lsl #1," memalt2:rw:cc cost(2,4).
|
||||
lsr_l "lsr.l" shconreg:ro, D_REG:rw:cc cost(2,4).
|
||||
lsr "lsr #1," memalt2:rw:cc cost(2,4).
|
||||
move_l "move.l" any4:ro, A_REG:wo cost(2,2).
|
||||
/* move_l does not set the condition codes if the destination is an
|
||||
address register!
|
||||
*/
|
||||
move_l "move.l" any4:ro, A_REG+areg:wo cost(2,2).
|
||||
move_l "move.l" any4:ro, alterable4+dreg4:wo:cc cost(2,2).
|
||||
move_w "move.w" any2:ro, alterable2+dreg4:wo:cc cost(2,2).
|
||||
move_b "move.b" any1:ro, alterable1+dreg4:wo:cc cost(2,2).
|
||||
|
@ -967,6 +972,10 @@ pat lol lof adp lol stf $1==$4 && $2==$5 && inreg($1)==reg_pointer
|
|||
pat loe lof adp loe stf $1==$4 && $2==$5
|
||||
kills allexceptcon
|
||||
gen add_l {const, $3}, {ABS_off4, $1, $2}
|
||||
|
||||
pat loe loi adp loe sti $1==$4 && $2==4 && $5==4
|
||||
kills allexceptcon
|
||||
gen add_l {const, $3}, {ABS_off4, $1, 0}
|
||||
#endif
|
||||
|
||||
pat lol inl $1==$2 && inreg($1)==reg_any
|
||||
|
@ -1132,6 +1141,24 @@ pat loe lof ior loe stf $1==$4 && $2==$5 && $3==4
|
|||
call lefxxxsef("or.l")
|
||||
pat loe lof xor loe stf $1==$4 && $2==$5 && $3==4
|
||||
call lefxxxsef("eor.l")
|
||||
|
||||
proc leixxxsei example loe loi and loe sti
|
||||
with conreg4-bconst
|
||||
kills allexceptcon
|
||||
gen xxx* %1, {ABS_off4, $1, 0}
|
||||
|
||||
pat loe loi adi loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("add.l")
|
||||
pat loe loi adu loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("add.l")
|
||||
pat loe loi ads loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("add.l")
|
||||
pat loe loi and loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("and.l")
|
||||
pat loe loi ior loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("or.l")
|
||||
pat loe loi xor loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("eor.l")
|
||||
#endif
|
||||
|
||||
proc lofruxxsof example lol lof inc lol stf
|
||||
|
@ -1173,6 +1200,19 @@ pat loe lof ngi loe stf $1==$4 && $2==$5 && $3==4
|
|||
call lefuxxsef("neg.l")
|
||||
pat loe lof com loe stf $1==$4 && $2==$5 && $3==4
|
||||
call lefuxxsef("not.l")
|
||||
|
||||
proc leiuxxsei example loe loi inc loe sti
|
||||
kills allexceptcon
|
||||
gen bit* {ABS_off4, $1, 0}
|
||||
|
||||
pat loe loi inc loe sti $1==$4 && $2==4 && $5==4
|
||||
call leiuxxsei("add.l #1,")
|
||||
pat loe loi dec loe sti $1==$4 && $2==4 && $5==4
|
||||
call leiuxxsei("sub.l #1,")
|
||||
pat loe loi ngi loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leiuxxsei("neg.l")
|
||||
pat loe loi com loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leiuxxsei("not.l")
|
||||
#endif
|
||||
|
||||
proc lolcxxstl example lol loc and stl
|
||||
|
@ -1439,9 +1479,93 @@ with any4
|
|||
pat dup stl $1==4 && inreg($2)==reg_pointer
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{LOCAL, $2}
|
||||
gen move_l %1,{areg, regvar($2, reg_pointer)}
|
||||
yields {LOCAL, $2}
|
||||
|
||||
pat dup lol sti lol adp stl zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==1 && $5==1
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{post_inc1, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==1 && $5==1
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{post_inc1, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==2 && $5==2
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{post_inc2, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==2 && $5==2
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{post_inc2, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==4 && $5==4
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{post_inc4, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==4 && $5==4
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{post_inc4, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==1 && $4==(0-1)
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{pre_dec1, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==1 && $4==(0-1)
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{pre_dec1, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==2 && $4==(0-2)
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{pre_dec2, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==2 && $4==(0-2)
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{pre_dec2, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==4 && $4==(0-4)
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{pre_dec4, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==4 && $4==(0-4)
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{pre_dec4, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat lil adp sil $1==$3 && inreg($1)==reg_pointer
|
||||
kills allexceptcon
|
||||
gen add_l {const, $2}, {indirect4, regvar($1, reg_pointer)}
|
||||
|
@ -1474,7 +1598,15 @@ pat lil lil dec sil $1==$2 && $1==$4 && inreg($1)==reg_pointer
|
|||
killreg %a
|
||||
yields %a
|
||||
|
||||
pat lol lof dup adp lol stf $1==$5 && $2==$6 && inreg($1)==reg_pointer
|
||||
pat lol lof dup adp lol stf sti $3==4 && $1==$5 && $2==$6 && inreg($1)==reg_pointer && $7 <= 4
|
||||
with conreg
|
||||
kills allexceptcon
|
||||
uses AA_REG = {offsetted4, regvar($1, reg_pointer), $2}
|
||||
gen add_l {const, $4}, {offsetted4, regvar($1, reg_pointer), $2}
|
||||
killreg %a
|
||||
yields %1 %a leaving sti $7
|
||||
|
||||
pat lol lof dup adp lol stf $3==4 && $1==$5 && $2==$6 && inreg($1)==reg_pointer
|
||||
kills allexceptcon
|
||||
uses AA_REG = {offsetted4, regvar($1, reg_pointer), $2}
|
||||
gen add_l {const, $4}, {offsetted4, regvar($1, reg_pointer), $2}
|
||||
|
@ -1482,14 +1614,49 @@ pat lol lof dup adp lol stf $1==$5 && $2==$6 && inreg($1)==reg_pointer
|
|||
yields %a
|
||||
|
||||
#ifdef TBL68020
|
||||
pat loe lof dup adp loe stf $1==$5 && $2==$6
|
||||
pat loe lof dup adp loe stf sti $3==4 && $1==$5 && $2==$6 && $7 <= 4
|
||||
with conreg
|
||||
kills allexceptcon
|
||||
uses AA_REG = {abs_con, $1, $2}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %1 %b leaving sti $7
|
||||
|
||||
pat loe lof dup adp loe stf $3==4 && $1==$5 && $2==$6
|
||||
kills allexceptcon
|
||||
uses AA_REG = {abs_con, $1, $2}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %b
|
||||
|
||||
pat loe loi dup adp loe sti sti $3==4 && $1==$5 && $2==4 && $6==4 && $7 <= 4
|
||||
with conreg
|
||||
kills allexceptcon
|
||||
uses AA_REG = {absolute, $1}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %1 %b leaving sti $7
|
||||
|
||||
pat loe loi dup adp loe sti $3==4 && $1==$5 && $2==4 && $6==4
|
||||
kills allexceptcon
|
||||
uses AA_REG = {absolute4, $1}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %b
|
||||
#endif
|
||||
|
||||
pat lol lol adp stl lae cmp $1==$2 && $2==$4 && inreg($1)==reg_pointer && $3 < 0
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen sub_l {const,0-$3},{LOCAL,$1}
|
||||
yields {LOCAL,$1} {ext_addr, $5+$3}
|
||||
leaving cmu 4
|
||||
|
||||
pat lol lol adp stl lae cmp $1==$2 && $2==$4 && inreg($1)==reg_pointer && $3 > 0
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen add_l {const,$3},{LOCAL,$1}
|
||||
yields {LOCAL,$1} {ext_addr, $5+$3}
|
||||
leaving cmu 4
|
||||
|
||||
pat lol lol adp stl loi $1==$2 && $1==$4 && $3==4 && $5==4 &&
|
||||
inreg($1)==reg_pointer
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
|
@ -1658,6 +1825,12 @@ pat loe adp ste $1==$3
|
|||
kills posextern
|
||||
gen add_l {const, $2}, {absolute4, $1}
|
||||
|
||||
pat loc and $1==255 && $2==4
|
||||
with exact absolute4 yields {absolute1,%1.bd+3}
|
||||
with exact offsetted4 yields {offsetted1,%1.reg,%1.bd+3}
|
||||
with exact LOCAL yields {offsetted1,lb,%1.bd+3}
|
||||
with yields {const, $1} leaving and 4
|
||||
|
||||
/************************************************
|
||||
* Group 1: load instructions *
|
||||
************************************************/
|
||||
|
@ -1684,6 +1857,24 @@ pat loe yields {absolute4, $1}
|
|||
|
||||
pat loe loe $1==$2 leaving loe $1 dup 4
|
||||
|
||||
/* replace ste loe by dup ste, but not if followed by a test ... */
|
||||
proc steloezxx example ste loe zne
|
||||
with any4-sconsts
|
||||
kills posextern
|
||||
gen move %1, {absolute4, $1}
|
||||
bxx* {llabel, $3}
|
||||
with exact STACK
|
||||
kills posextern
|
||||
gen move_l {post_inc4, sp}, {absolute4, $1}
|
||||
bxx* {llabel, $3}
|
||||
|
||||
pat ste loe zlt $1==$2 call steloezxx("blt")
|
||||
pat ste loe zle $1==$2 call steloezxx("ble")
|
||||
pat ste loe zeq $1==$2 call steloezxx("beq")
|
||||
pat ste loe zne $1==$2 call steloezxx("bne")
|
||||
pat ste loe zge $1==$2 call steloezxx("bge")
|
||||
pat ste loe zgt $1==$2 call steloezxx("bgt")
|
||||
|
||||
pat ste loe $1==$2 leaving dup 4 ste $1
|
||||
|
||||
pat lil inreg($1)==reg_pointer
|
||||
|
@ -1970,16 +2161,16 @@ with exact STACK
|
|||
pat stl inreg($1)==reg_pointer
|
||||
with any4-sconsts
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move %1, {LOCAL, $1}
|
||||
gen move_l %1, {areg, regvar($1, reg_pointer)}
|
||||
with exact ext_addr
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move %1, {LOCAL, $1}
|
||||
gen move_l %1, {areg, regvar($1, reg_pointer)}
|
||||
with exact address-ext_addr
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen lea %1, {LOCAL, $1}
|
||||
gen lea %1, {areg, regvar($1, reg_pointer)}
|
||||
with exact STACK
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move_l {post_inc4, sp}, {LOCAL, $1}
|
||||
gen move_l {post_inc4, sp}, {areg, regvar($1, reg_pointer)}
|
||||
|
||||
pat stl
|
||||
with any4-sconsts
|
||||
|
@ -2450,7 +2641,7 @@ with exact any4 STACK
|
|||
uses reusing %1,DD_REG=%1
|
||||
gen sub_l {post_inc4, sp}, %a
|
||||
neg_l %a yields %a
|
||||
with any4 AA_REG
|
||||
with any4-bconst AA_REG
|
||||
gen sub_l %1, %2 yields %2
|
||||
|
||||
pat mli $1==4
|
||||
|
@ -2621,6 +2812,96 @@ with exact absind_con yields {absind_con, %1.sc, %1.xreg, %1.bd, %1.od+$1}
|
|||
with exact ext_regX yields {ext_regX, %1.sc, %1.xreg, %1.bd+$1}
|
||||
#endif TBL68020
|
||||
|
||||
pat ads cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving cmu 4
|
||||
|
||||
pat ads bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving bne $2
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving bne $2
|
||||
|
||||
pat ads beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving beq $2
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving beq $2
|
||||
|
||||
pat ads loe bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving loe $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving loe $2 bne $3
|
||||
|
||||
pat ads loe beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving loe $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving loe $2 beq $3
|
||||
|
||||
pat ads loe cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving loe $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving loe $2 cmu 4
|
||||
|
||||
pat ads lae bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lae $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lae $2 bne $3
|
||||
|
||||
pat ads lae beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lae $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lae $2 beq $3
|
||||
|
||||
pat ads lae cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lae $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lae $2 cmu 4
|
||||
|
||||
pat ads lal bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lal $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lal $2 bne $3
|
||||
|
||||
pat ads lal beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lal $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lal $2 beq $3
|
||||
|
||||
pat ads lal cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lal $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lal $2 cmu 4
|
||||
|
||||
pat ads lol bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lol $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lol $2 bne $3
|
||||
|
||||
pat ads lol beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lol $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lol $2 beq $3
|
||||
|
||||
pat ads lol cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lol $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lol $2 cmu 4
|
||||
|
||||
pat ads $1==4
|
||||
with D_REG A_REG yields {regAregXcon, %2, %1, 1, 0}
|
||||
with D_REG regAcon + t_regAcon
|
||||
|
@ -2679,6 +2960,8 @@ with exact absolute4 ext_regX
|
|||
pat sbs $1==4 leaving sbi 4
|
||||
|
||||
#ifdef TBL68020
|
||||
pat loc slu $2==4 leaving loc $1 sli 4
|
||||
|
||||
pat loc sli ads $1==1 && $2==4 && $3==4
|
||||
with D_REG yields {regX, 2, %1}
|
||||
leaving ads 4
|
||||
|
@ -2697,12 +2980,7 @@ with D_REG yields {regX, 8, %1}
|
|||
* Group 7: increment / decrement / zero *
|
||||
************************************************/
|
||||
|
||||
pat inc
|
||||
with exact STACK
|
||||
gen add_l {const, 1}, {indirect4, sp}
|
||||
with DD_REG+AA_REG
|
||||
gen add_l {const, 1}, %1
|
||||
yields %1
|
||||
pat inc leaving loc 1 adi 4
|
||||
|
||||
pat inl inreg($1)==reg_any
|
||||
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
|
||||
|
@ -2723,12 +3001,7 @@ pat ine
|
|||
kills posextern
|
||||
gen add_l {const, 1}, {absolute4, $1}
|
||||
|
||||
pat dec
|
||||
with exact STACK
|
||||
gen sub_l {const, 1}, {indirect4, sp}
|
||||
with DD_REG+AA_REG
|
||||
gen sub_l {const, 1}, %1
|
||||
yields %1
|
||||
pat dec leaving loc 1 sbi 4
|
||||
|
||||
pat del inreg($1)==reg_any
|
||||
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
|
||||
|
@ -2755,7 +3028,7 @@ pat zrl inreg($1)==reg_any
|
|||
|
||||
pat zrl inreg($1)==reg_pointer
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move_l {const, 0}, {LOCAL, $1}
|
||||
gen move_l {const, 0}, {areg, regvar($1, reg_pointer)}
|
||||
|
||||
pat zrl
|
||||
kills all_indir, LOCAL %bd==$1
|
||||
|
@ -3122,23 +3395,31 @@ proc txx
|
|||
with test_set4
|
||||
uses reusing %1,DD_REG
|
||||
gen test %1
|
||||
sxx[1] %a
|
||||
neg_b %a
|
||||
yields {extend1, %a}
|
||||
bxx[1] {slabel, 1f}
|
||||
clr_l %a
|
||||
bra {slabel, 2f}
|
||||
1:
|
||||
move_l {const,1},%a
|
||||
2:
|
||||
yields %a
|
||||
|
||||
with test_set1 + test_set2
|
||||
uses reusing %1,DD_REG
|
||||
gen test %1
|
||||
sxx[2] %a
|
||||
neg_b %a
|
||||
yields {extend1, %a}
|
||||
bxx[2] {slabel, 1f}
|
||||
clr_l %a
|
||||
bra {slabel, 2f}
|
||||
1:
|
||||
move_l {const,1},%a
|
||||
2:
|
||||
yields %a
|
||||
|
||||
pat tlt call txx("slt", "scs")
|
||||
pat tle call txx("sle", "sls")
|
||||
pat teq call txx("seq", "seq")
|
||||
pat tne call txx("sne", "sne")
|
||||
pat tge call txx("sge", "scc")
|
||||
pat tgt call txx("sgt", "shi")
|
||||
pat tlt call txx("blt", "bcs")
|
||||
pat tle call txx("ble", "bls")
|
||||
pat teq call txx("beq", "beq")
|
||||
pat tne call txx("bne", "bne")
|
||||
pat tge call txx("bge", "bcc")
|
||||
pat tgt call txx("bgt", "bhi")
|
||||
|
||||
/*
|
||||
* Floating point
|
||||
|
@ -4013,3 +4294,59 @@ pat loc dvu $1==32 && $2==4 leaving loc 5 sru 4
|
|||
pat loc dvu $1==64 && $2==4 leaving loc 6 sru 4
|
||||
pat loc dvu $1==128 && $2==4 leaving loc 7 sru 4
|
||||
pat loc dvu $1==256 && $2==4 leaving loc 8 sru 4
|
||||
|
||||
pat loc dvi $1==2 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 1 sri 4
|
||||
|
||||
pat loc dvi $1==4 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 2 sri 4
|
||||
|
||||
pat loc dvi $1==8 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 3 sri 4
|
||||
|
||||
pat loc dvi $1==16 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 4 sri 4
|
||||
|
||||
pat loc dvi $1==32 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 5 sri 4
|
||||
|
||||
pat loc dvi $1==64 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 6 sri 4
|
||||
|
||||
pat loc dvi $1==128 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 7 sri 4
|
||||
|
||||
pat loc dvi $1==256 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 8 sri 4
|
||||
|
|
|
@ -100,6 +100,7 @@ indirect4 = {A_REG reg;} 4 cost(0,4) "(" reg ")" .
|
|||
post_inc4 = {A_REG reg;} 4 cost(0,4) "(" reg ")+" .
|
||||
pre_dec4 = {A_REG reg;} 4 cost(0,5) "-(" reg ")" .
|
||||
dreg4 = {D_REG reg;} 4 cost(0,0) reg .
|
||||
areg = {A_REG reg;} 4 cost(0,0) reg .
|
||||
dreg2 = {D_REG reg;} 4 cost(0,0) reg .
|
||||
indirect2 = {A_REG reg;} 4 cost(0,4) "(" reg ")" .
|
||||
post_inc2 = {A_REG reg;} 4 cost(0,4) "(" reg ")+" .
|
||||
|
@ -368,6 +369,7 @@ immediate4 = consts + ext_addr .
|
|||
conreg4 = D_REG + immediate4 .
|
||||
conreg2 = dreg2 + consts + D_REG .
|
||||
conreg1 = dreg1 + consts + D_REG .
|
||||
conreg = conreg1 + conreg2 + conreg4 .
|
||||
shconreg = D_REG + small_const .
|
||||
datalt4 = data4 * alterable4 .
|
||||
datalt2 = data2 * alterable2 .
|
||||
|
@ -393,7 +395,7 @@ imm_cmp4 = any4 - immediate4 - A_REG .
|
|||
imm_cmp2 = any2 - consts .
|
||||
imm_cmp1 = any1 - consts .
|
||||
|
||||
test_set4 = data4 - immediate4 + extend2 + extend1 .
|
||||
test_set4 = any4 - immediate4 + extend2 + extend1 .
|
||||
test_set2 = data2 - consts .
|
||||
test_set1 = data1 - consts .
|
||||
|
||||
|
@ -493,12 +495,15 @@ ext_l "ext.l" extend1+extend2+D_REG+LOCAL:rw:cc cost(2,2).
|
|||
ext_w "ext.w" extend1+D_REG+LOCAL:rw:cc cost(2,2).
|
||||
jmp address+control4 cost(2,0).
|
||||
jsr address+control4 kills :cc d0 d1 d2 a0 a1 cost(2,3).
|
||||
lea address+control4:ro, A_REG:wo cost(2,0).
|
||||
lea address+control4:ro, A_REG+areg:wo cost(2,0).
|
||||
lsl_l "lsl.l" shconreg:ro, D_REG:rw:cc cost(2,4).
|
||||
lsl "lsl #1," memalt2:rw:cc cost(2,4).
|
||||
lsr_l "lsr.l" shconreg:ro, D_REG:rw:cc cost(2,4).
|
||||
lsr "lsr #1," memalt2:rw:cc cost(2,4).
|
||||
move_l "move.l" any4:ro, A_REG:wo cost(2,2).
|
||||
/* move_l does not set the condition codes if the destination is an
|
||||
address register!
|
||||
*/
|
||||
move_l "move.l" any4:ro, A_REG+areg:wo cost(2,2).
|
||||
move_l "move.l" any4:ro, alterable4+dreg4:wo:cc cost(2,2).
|
||||
move_w "move.w" any2:ro, alterable2+dreg4:wo:cc cost(2,2).
|
||||
move_b "move.b" any1:ro, alterable1+dreg4:wo:cc cost(2,2).
|
||||
|
@ -967,6 +972,10 @@ pat lol lof adp lol stf $1==$4 && $2==$5 && inreg($1)==reg_pointer
|
|||
pat loe lof adp loe stf $1==$4 && $2==$5
|
||||
kills allexceptcon
|
||||
gen add_l {const, $3}, {ABS_off4, $1, $2}
|
||||
|
||||
pat loe loi adp loe sti $1==$4 && $2==4 && $5==4
|
||||
kills allexceptcon
|
||||
gen add_l {const, $3}, {ABS_off4, $1, 0}
|
||||
#endif
|
||||
|
||||
pat lol inl $1==$2 && inreg($1)==reg_any
|
||||
|
@ -1132,6 +1141,24 @@ pat loe lof ior loe stf $1==$4 && $2==$5 && $3==4
|
|||
call lefxxxsef("or.l")
|
||||
pat loe lof xor loe stf $1==$4 && $2==$5 && $3==4
|
||||
call lefxxxsef("eor.l")
|
||||
|
||||
proc leixxxsei example loe loi and loe sti
|
||||
with conreg4-bconst
|
||||
kills allexceptcon
|
||||
gen xxx* %1, {ABS_off4, $1, 0}
|
||||
|
||||
pat loe loi adi loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("add.l")
|
||||
pat loe loi adu loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("add.l")
|
||||
pat loe loi ads loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("add.l")
|
||||
pat loe loi and loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("and.l")
|
||||
pat loe loi ior loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("or.l")
|
||||
pat loe loi xor loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("eor.l")
|
||||
#endif
|
||||
|
||||
proc lofruxxsof example lol lof inc lol stf
|
||||
|
@ -1173,6 +1200,19 @@ pat loe lof ngi loe stf $1==$4 && $2==$5 && $3==4
|
|||
call lefuxxsef("neg.l")
|
||||
pat loe lof com loe stf $1==$4 && $2==$5 && $3==4
|
||||
call lefuxxsef("not.l")
|
||||
|
||||
proc leiuxxsei example loe loi inc loe sti
|
||||
kills allexceptcon
|
||||
gen bit* {ABS_off4, $1, 0}
|
||||
|
||||
pat loe loi inc loe sti $1==$4 && $2==4 && $5==4
|
||||
call leiuxxsei("add.l #1,")
|
||||
pat loe loi dec loe sti $1==$4 && $2==4 && $5==4
|
||||
call leiuxxsei("sub.l #1,")
|
||||
pat loe loi ngi loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leiuxxsei("neg.l")
|
||||
pat loe loi com loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leiuxxsei("not.l")
|
||||
#endif
|
||||
|
||||
proc lolcxxstl example lol loc and stl
|
||||
|
@ -1439,9 +1479,93 @@ with any4
|
|||
pat dup stl $1==4 && inreg($2)==reg_pointer
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{LOCAL, $2}
|
||||
gen move_l %1,{areg, regvar($2, reg_pointer)}
|
||||
yields {LOCAL, $2}
|
||||
|
||||
pat dup lol sti lol adp stl zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==1 && $5==1
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{post_inc1, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==1 && $5==1
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{post_inc1, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==2 && $5==2
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{post_inc2, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==2 && $5==2
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{post_inc2, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==4 && $5==4
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{post_inc4, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==4 && $5==4
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{post_inc4, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==1 && $4==(0-1)
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{pre_dec1, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==1 && $4==(0-1)
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{pre_dec1, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==2 && $4==(0-2)
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{pre_dec2, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==2 && $4==(0-2)
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{pre_dec2, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==4 && $4==(0-4)
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{pre_dec4, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==4 && $4==(0-4)
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{pre_dec4, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat lil adp sil $1==$3 && inreg($1)==reg_pointer
|
||||
kills allexceptcon
|
||||
gen add_l {const, $2}, {indirect4, regvar($1, reg_pointer)}
|
||||
|
@ -1474,7 +1598,15 @@ pat lil lil dec sil $1==$2 && $1==$4 && inreg($1)==reg_pointer
|
|||
killreg %a
|
||||
yields %a
|
||||
|
||||
pat lol lof dup adp lol stf $1==$5 && $2==$6 && inreg($1)==reg_pointer
|
||||
pat lol lof dup adp lol stf sti $3==4 && $1==$5 && $2==$6 && inreg($1)==reg_pointer && $7 <= 4
|
||||
with conreg
|
||||
kills allexceptcon
|
||||
uses AA_REG = {offsetted4, regvar($1, reg_pointer), $2}
|
||||
gen add_l {const, $4}, {offsetted4, regvar($1, reg_pointer), $2}
|
||||
killreg %a
|
||||
yields %1 %a leaving sti $7
|
||||
|
||||
pat lol lof dup adp lol stf $3==4 && $1==$5 && $2==$6 && inreg($1)==reg_pointer
|
||||
kills allexceptcon
|
||||
uses AA_REG = {offsetted4, regvar($1, reg_pointer), $2}
|
||||
gen add_l {const, $4}, {offsetted4, regvar($1, reg_pointer), $2}
|
||||
|
@ -1482,14 +1614,49 @@ pat lol lof dup adp lol stf $1==$5 && $2==$6 && inreg($1)==reg_pointer
|
|||
yields %a
|
||||
|
||||
#ifdef TBL68020
|
||||
pat loe lof dup adp loe stf $1==$5 && $2==$6
|
||||
pat loe lof dup adp loe stf sti $3==4 && $1==$5 && $2==$6 && $7 <= 4
|
||||
with conreg
|
||||
kills allexceptcon
|
||||
uses AA_REG = {abs_con, $1, $2}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %1 %b leaving sti $7
|
||||
|
||||
pat loe lof dup adp loe stf $3==4 && $1==$5 && $2==$6
|
||||
kills allexceptcon
|
||||
uses AA_REG = {abs_con, $1, $2}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %b
|
||||
|
||||
pat loe loi dup adp loe sti sti $3==4 && $1==$5 && $2==4 && $6==4 && $7 <= 4
|
||||
with conreg
|
||||
kills allexceptcon
|
||||
uses AA_REG = {absolute, $1}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %1 %b leaving sti $7
|
||||
|
||||
pat loe loi dup adp loe sti $3==4 && $1==$5 && $2==4 && $6==4
|
||||
kills allexceptcon
|
||||
uses AA_REG = {absolute4, $1}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %b
|
||||
#endif
|
||||
|
||||
pat lol lol adp stl lae cmp $1==$2 && $2==$4 && inreg($1)==reg_pointer && $3 < 0
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen sub_l {const,0-$3},{LOCAL,$1}
|
||||
yields {LOCAL,$1} {ext_addr, $5+$3}
|
||||
leaving cmu 4
|
||||
|
||||
pat lol lol adp stl lae cmp $1==$2 && $2==$4 && inreg($1)==reg_pointer && $3 > 0
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen add_l {const,$3},{LOCAL,$1}
|
||||
yields {LOCAL,$1} {ext_addr, $5+$3}
|
||||
leaving cmu 4
|
||||
|
||||
pat lol lol adp stl loi $1==$2 && $1==$4 && $3==4 && $5==4 &&
|
||||
inreg($1)==reg_pointer
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
|
@ -1658,6 +1825,12 @@ pat loe adp ste $1==$3
|
|||
kills posextern
|
||||
gen add_l {const, $2}, {absolute4, $1}
|
||||
|
||||
pat loc and $1==255 && $2==4
|
||||
with exact absolute4 yields {absolute1,%1.bd+3}
|
||||
with exact offsetted4 yields {offsetted1,%1.reg,%1.bd+3}
|
||||
with exact LOCAL yields {offsetted1,lb,%1.bd+3}
|
||||
with yields {const, $1} leaving and 4
|
||||
|
||||
/************************************************
|
||||
* Group 1: load instructions *
|
||||
************************************************/
|
||||
|
@ -1684,6 +1857,24 @@ pat loe yields {absolute4, $1}
|
|||
|
||||
pat loe loe $1==$2 leaving loe $1 dup 4
|
||||
|
||||
/* replace ste loe by dup ste, but not if followed by a test ... */
|
||||
proc steloezxx example ste loe zne
|
||||
with any4-sconsts
|
||||
kills posextern
|
||||
gen move %1, {absolute4, $1}
|
||||
bxx* {llabel, $3}
|
||||
with exact STACK
|
||||
kills posextern
|
||||
gen move_l {post_inc4, sp}, {absolute4, $1}
|
||||
bxx* {llabel, $3}
|
||||
|
||||
pat ste loe zlt $1==$2 call steloezxx("blt")
|
||||
pat ste loe zle $1==$2 call steloezxx("ble")
|
||||
pat ste loe zeq $1==$2 call steloezxx("beq")
|
||||
pat ste loe zne $1==$2 call steloezxx("bne")
|
||||
pat ste loe zge $1==$2 call steloezxx("bge")
|
||||
pat ste loe zgt $1==$2 call steloezxx("bgt")
|
||||
|
||||
pat ste loe $1==$2 leaving dup 4 ste $1
|
||||
|
||||
pat lil inreg($1)==reg_pointer
|
||||
|
@ -1970,16 +2161,16 @@ with exact STACK
|
|||
pat stl inreg($1)==reg_pointer
|
||||
with any4-sconsts
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move %1, {LOCAL, $1}
|
||||
gen move_l %1, {areg, regvar($1, reg_pointer)}
|
||||
with exact ext_addr
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move %1, {LOCAL, $1}
|
||||
gen move_l %1, {areg, regvar($1, reg_pointer)}
|
||||
with exact address-ext_addr
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen lea %1, {LOCAL, $1}
|
||||
gen lea %1, {areg, regvar($1, reg_pointer)}
|
||||
with exact STACK
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move_l {post_inc4, sp}, {LOCAL, $1}
|
||||
gen move_l {post_inc4, sp}, {areg, regvar($1, reg_pointer)}
|
||||
|
||||
pat stl
|
||||
with any4-sconsts
|
||||
|
@ -2450,7 +2641,7 @@ with exact any4 STACK
|
|||
uses reusing %1,DD_REG=%1
|
||||
gen sub_l {post_inc4, sp}, %a
|
||||
neg_l %a yields %a
|
||||
with any4 AA_REG
|
||||
with any4-bconst AA_REG
|
||||
gen sub_l %1, %2 yields %2
|
||||
|
||||
pat mli $1==4
|
||||
|
@ -2621,6 +2812,96 @@ with exact absind_con yields {absind_con, %1.sc, %1.xreg, %1.bd, %1.od+$1}
|
|||
with exact ext_regX yields {ext_regX, %1.sc, %1.xreg, %1.bd+$1}
|
||||
#endif TBL68020
|
||||
|
||||
pat ads cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving cmu 4
|
||||
|
||||
pat ads bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving bne $2
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving bne $2
|
||||
|
||||
pat ads beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving beq $2
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving beq $2
|
||||
|
||||
pat ads loe bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving loe $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving loe $2 bne $3
|
||||
|
||||
pat ads loe beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving loe $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving loe $2 beq $3
|
||||
|
||||
pat ads loe cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving loe $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving loe $2 cmu 4
|
||||
|
||||
pat ads lae bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lae $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lae $2 bne $3
|
||||
|
||||
pat ads lae beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lae $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lae $2 beq $3
|
||||
|
||||
pat ads lae cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lae $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lae $2 cmu 4
|
||||
|
||||
pat ads lal bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lal $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lal $2 bne $3
|
||||
|
||||
pat ads lal beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lal $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lal $2 beq $3
|
||||
|
||||
pat ads lal cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lal $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lal $2 cmu 4
|
||||
|
||||
pat ads lol bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lol $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lol $2 bne $3
|
||||
|
||||
pat ads lol beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lol $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lol $2 beq $3
|
||||
|
||||
pat ads lol cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lol $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lol $2 cmu 4
|
||||
|
||||
pat ads $1==4
|
||||
with D_REG A_REG yields {regAregXcon, %2, %1, 1, 0}
|
||||
with D_REG regAcon + t_regAcon
|
||||
|
@ -2679,6 +2960,8 @@ with exact absolute4 ext_regX
|
|||
pat sbs $1==4 leaving sbi 4
|
||||
|
||||
#ifdef TBL68020
|
||||
pat loc slu $2==4 leaving loc $1 sli 4
|
||||
|
||||
pat loc sli ads $1==1 && $2==4 && $3==4
|
||||
with D_REG yields {regX, 2, %1}
|
||||
leaving ads 4
|
||||
|
@ -2697,12 +2980,7 @@ with D_REG yields {regX, 8, %1}
|
|||
* Group 7: increment / decrement / zero *
|
||||
************************************************/
|
||||
|
||||
pat inc
|
||||
with exact STACK
|
||||
gen add_l {const, 1}, {indirect4, sp}
|
||||
with DD_REG+AA_REG
|
||||
gen add_l {const, 1}, %1
|
||||
yields %1
|
||||
pat inc leaving loc 1 adi 4
|
||||
|
||||
pat inl inreg($1)==reg_any
|
||||
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
|
||||
|
@ -2723,12 +3001,7 @@ pat ine
|
|||
kills posextern
|
||||
gen add_l {const, 1}, {absolute4, $1}
|
||||
|
||||
pat dec
|
||||
with exact STACK
|
||||
gen sub_l {const, 1}, {indirect4, sp}
|
||||
with DD_REG+AA_REG
|
||||
gen sub_l {const, 1}, %1
|
||||
yields %1
|
||||
pat dec leaving loc 1 sbi 4
|
||||
|
||||
pat del inreg($1)==reg_any
|
||||
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
|
||||
|
@ -2755,7 +3028,7 @@ pat zrl inreg($1)==reg_any
|
|||
|
||||
pat zrl inreg($1)==reg_pointer
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move_l {const, 0}, {LOCAL, $1}
|
||||
gen move_l {const, 0}, {areg, regvar($1, reg_pointer)}
|
||||
|
||||
pat zrl
|
||||
kills all_indir, LOCAL %bd==$1
|
||||
|
@ -3122,23 +3395,31 @@ proc txx
|
|||
with test_set4
|
||||
uses reusing %1,DD_REG
|
||||
gen test %1
|
||||
sxx[1] %a
|
||||
neg_b %a
|
||||
yields {extend1, %a}
|
||||
bxx[1] {slabel, 1f}
|
||||
clr_l %a
|
||||
bra {slabel, 2f}
|
||||
1:
|
||||
move_l {const,1},%a
|
||||
2:
|
||||
yields %a
|
||||
|
||||
with test_set1 + test_set2
|
||||
uses reusing %1,DD_REG
|
||||
gen test %1
|
||||
sxx[2] %a
|
||||
neg_b %a
|
||||
yields {extend1, %a}
|
||||
bxx[2] {slabel, 1f}
|
||||
clr_l %a
|
||||
bra {slabel, 2f}
|
||||
1:
|
||||
move_l {const,1},%a
|
||||
2:
|
||||
yields %a
|
||||
|
||||
pat tlt call txx("slt", "scs")
|
||||
pat tle call txx("sle", "sls")
|
||||
pat teq call txx("seq", "seq")
|
||||
pat tne call txx("sne", "sne")
|
||||
pat tge call txx("sge", "scc")
|
||||
pat tgt call txx("sgt", "shi")
|
||||
pat tlt call txx("blt", "bcs")
|
||||
pat tle call txx("ble", "bls")
|
||||
pat teq call txx("beq", "beq")
|
||||
pat tne call txx("bne", "bne")
|
||||
pat tge call txx("bge", "bcc")
|
||||
pat tgt call txx("bgt", "bhi")
|
||||
|
||||
/*
|
||||
* Floating point
|
||||
|
@ -4013,3 +4294,59 @@ pat loc dvu $1==32 && $2==4 leaving loc 5 sru 4
|
|||
pat loc dvu $1==64 && $2==4 leaving loc 6 sru 4
|
||||
pat loc dvu $1==128 && $2==4 leaving loc 7 sru 4
|
||||
pat loc dvu $1==256 && $2==4 leaving loc 8 sru 4
|
||||
|
||||
pat loc dvi $1==2 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 1 sri 4
|
||||
|
||||
pat loc dvi $1==4 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 2 sri 4
|
||||
|
||||
pat loc dvi $1==8 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 3 sri 4
|
||||
|
||||
pat loc dvi $1==16 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 4 sri 4
|
||||
|
||||
pat loc dvi $1==32 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 5 sri 4
|
||||
|
||||
pat loc dvi $1==64 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 6 sri 4
|
||||
|
||||
pat loc dvi $1==128 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 7 sri 4
|
||||
|
||||
pat loc dvi $1==256 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 8 sri 4
|
||||
|
|
|
@ -100,6 +100,7 @@ indirect4 = {A_REG reg;} 4 cost(0,4) "(" reg ")" .
|
|||
post_inc4 = {A_REG reg;} 4 cost(0,4) "(" reg ")+" .
|
||||
pre_dec4 = {A_REG reg;} 4 cost(0,5) "-(" reg ")" .
|
||||
dreg4 = {D_REG reg;} 4 cost(0,0) reg .
|
||||
areg = {A_REG reg;} 4 cost(0,0) reg .
|
||||
dreg2 = {D_REG reg;} 4 cost(0,0) reg .
|
||||
indirect2 = {A_REG reg;} 4 cost(0,4) "(" reg ")" .
|
||||
post_inc2 = {A_REG reg;} 4 cost(0,4) "(" reg ")+" .
|
||||
|
@ -368,6 +369,7 @@ immediate4 = consts + ext_addr .
|
|||
conreg4 = D_REG + immediate4 .
|
||||
conreg2 = dreg2 + consts + D_REG .
|
||||
conreg1 = dreg1 + consts + D_REG .
|
||||
conreg = conreg1 + conreg2 + conreg4 .
|
||||
shconreg = D_REG + small_const .
|
||||
datalt4 = data4 * alterable4 .
|
||||
datalt2 = data2 * alterable2 .
|
||||
|
@ -393,7 +395,7 @@ imm_cmp4 = any4 - immediate4 - A_REG .
|
|||
imm_cmp2 = any2 - consts .
|
||||
imm_cmp1 = any1 - consts .
|
||||
|
||||
test_set4 = data4 - immediate4 + extend2 + extend1 .
|
||||
test_set4 = any4 - immediate4 + extend2 + extend1 .
|
||||
test_set2 = data2 - consts .
|
||||
test_set1 = data1 - consts .
|
||||
|
||||
|
@ -493,12 +495,15 @@ ext_l "ext.l" extend1+extend2+D_REG+LOCAL:rw:cc cost(2,2).
|
|||
ext_w "ext.w" extend1+D_REG+LOCAL:rw:cc cost(2,2).
|
||||
jmp address+control4 cost(2,0).
|
||||
jsr address+control4 kills :cc d0 d1 d2 a0 a1 cost(2,3).
|
||||
lea address+control4:ro, A_REG:wo cost(2,0).
|
||||
lea address+control4:ro, A_REG+areg:wo cost(2,0).
|
||||
lsl_l "lsl.l" shconreg:ro, D_REG:rw:cc cost(2,4).
|
||||
lsl "lsl #1," memalt2:rw:cc cost(2,4).
|
||||
lsr_l "lsr.l" shconreg:ro, D_REG:rw:cc cost(2,4).
|
||||
lsr "lsr #1," memalt2:rw:cc cost(2,4).
|
||||
move_l "move.l" any4:ro, A_REG:wo cost(2,2).
|
||||
/* move_l does not set the condition codes if the destination is an
|
||||
address register!
|
||||
*/
|
||||
move_l "move.l" any4:ro, A_REG+areg:wo cost(2,2).
|
||||
move_l "move.l" any4:ro, alterable4+dreg4:wo:cc cost(2,2).
|
||||
move_w "move.w" any2:ro, alterable2+dreg4:wo:cc cost(2,2).
|
||||
move_b "move.b" any1:ro, alterable1+dreg4:wo:cc cost(2,2).
|
||||
|
@ -967,6 +972,10 @@ pat lol lof adp lol stf $1==$4 && $2==$5 && inreg($1)==reg_pointer
|
|||
pat loe lof adp loe stf $1==$4 && $2==$5
|
||||
kills allexceptcon
|
||||
gen add_l {const, $3}, {ABS_off4, $1, $2}
|
||||
|
||||
pat loe loi adp loe sti $1==$4 && $2==4 && $5==4
|
||||
kills allexceptcon
|
||||
gen add_l {const, $3}, {ABS_off4, $1, 0}
|
||||
#endif
|
||||
|
||||
pat lol inl $1==$2 && inreg($1)==reg_any
|
||||
|
@ -1132,6 +1141,24 @@ pat loe lof ior loe stf $1==$4 && $2==$5 && $3==4
|
|||
call lefxxxsef("or.l")
|
||||
pat loe lof xor loe stf $1==$4 && $2==$5 && $3==4
|
||||
call lefxxxsef("eor.l")
|
||||
|
||||
proc leixxxsei example loe loi and loe sti
|
||||
with conreg4-bconst
|
||||
kills allexceptcon
|
||||
gen xxx* %1, {ABS_off4, $1, 0}
|
||||
|
||||
pat loe loi adi loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("add.l")
|
||||
pat loe loi adu loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("add.l")
|
||||
pat loe loi ads loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("add.l")
|
||||
pat loe loi and loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("and.l")
|
||||
pat loe loi ior loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("or.l")
|
||||
pat loe loi xor loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leixxxsei("eor.l")
|
||||
#endif
|
||||
|
||||
proc lofruxxsof example lol lof inc lol stf
|
||||
|
@ -1173,6 +1200,19 @@ pat loe lof ngi loe stf $1==$4 && $2==$5 && $3==4
|
|||
call lefuxxsef("neg.l")
|
||||
pat loe lof com loe stf $1==$4 && $2==$5 && $3==4
|
||||
call lefuxxsef("not.l")
|
||||
|
||||
proc leiuxxsei example loe loi inc loe sti
|
||||
kills allexceptcon
|
||||
gen bit* {ABS_off4, $1, 0}
|
||||
|
||||
pat loe loi inc loe sti $1==$4 && $2==4 && $5==4
|
||||
call leiuxxsei("add.l #1,")
|
||||
pat loe loi dec loe sti $1==$4 && $2==4 && $5==4
|
||||
call leiuxxsei("sub.l #1,")
|
||||
pat loe loi ngi loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leiuxxsei("neg.l")
|
||||
pat loe loi com loe sti $1==$4 && $2==4 && $5==4 && $3==4
|
||||
call leiuxxsei("not.l")
|
||||
#endif
|
||||
|
||||
proc lolcxxstl example lol loc and stl
|
||||
|
@ -1439,9 +1479,93 @@ with any4
|
|||
pat dup stl $1==4 && inreg($2)==reg_pointer
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{LOCAL, $2}
|
||||
gen move_l %1,{areg, regvar($2, reg_pointer)}
|
||||
yields {LOCAL, $2}
|
||||
|
||||
pat dup lol sti lol adp stl zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==1 && $5==1
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{post_inc1, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==1 && $5==1
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{post_inc1, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==2 && $5==2
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{post_inc2, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==2 && $5==2
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{post_inc2, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==4 && $5==4
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{post_inc4, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol sti lol adp stl zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $2==$6 && $3==4 && $5==4
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{post_inc4, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==1 && $4==(0-1)
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{pre_dec1, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==1 && $4==(0-1)
|
||||
with any1
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_b %1,{pre_dec1, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==2 && $4==(0-2)
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{pre_dec2, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==2 && $4==(0-2)
|
||||
with any2
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_w %1,{pre_dec2, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zne $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==4 && $4==(0-4)
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{pre_dec4, regvar($2,reg_pointer)}
|
||||
bne {llabel, $7}
|
||||
|
||||
pat dup lol adp stl lol sti zeq $1==4 && inreg($2)==reg_pointer &&
|
||||
$2==$4 && $4==$5 && $6==4 && $4==(0-4)
|
||||
with any4
|
||||
kills regvar($2, reg_pointer), all_regind %reg==regvar($2, reg_pointer)
|
||||
gen move_l %1,{pre_dec4, regvar($2,reg_pointer)}
|
||||
beq {llabel, $7}
|
||||
|
||||
pat lil adp sil $1==$3 && inreg($1)==reg_pointer
|
||||
kills allexceptcon
|
||||
gen add_l {const, $2}, {indirect4, regvar($1, reg_pointer)}
|
||||
|
@ -1474,7 +1598,15 @@ pat lil lil dec sil $1==$2 && $1==$4 && inreg($1)==reg_pointer
|
|||
killreg %a
|
||||
yields %a
|
||||
|
||||
pat lol lof dup adp lol stf $1==$5 && $2==$6 && inreg($1)==reg_pointer
|
||||
pat lol lof dup adp lol stf sti $3==4 && $1==$5 && $2==$6 && inreg($1)==reg_pointer && $7 <= 4
|
||||
with conreg
|
||||
kills allexceptcon
|
||||
uses AA_REG = {offsetted4, regvar($1, reg_pointer), $2}
|
||||
gen add_l {const, $4}, {offsetted4, regvar($1, reg_pointer), $2}
|
||||
killreg %a
|
||||
yields %1 %a leaving sti $7
|
||||
|
||||
pat lol lof dup adp lol stf $3==4 && $1==$5 && $2==$6 && inreg($1)==reg_pointer
|
||||
kills allexceptcon
|
||||
uses AA_REG = {offsetted4, regvar($1, reg_pointer), $2}
|
||||
gen add_l {const, $4}, {offsetted4, regvar($1, reg_pointer), $2}
|
||||
|
@ -1482,14 +1614,49 @@ pat lol lof dup adp lol stf $1==$5 && $2==$6 && inreg($1)==reg_pointer
|
|||
yields %a
|
||||
|
||||
#ifdef TBL68020
|
||||
pat loe lof dup adp loe stf $1==$5 && $2==$6
|
||||
pat loe lof dup adp loe stf sti $3==4 && $1==$5 && $2==$6 && $7 <= 4
|
||||
with conreg
|
||||
kills allexceptcon
|
||||
uses AA_REG = {abs_con, $1, $2}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %1 %b leaving sti $7
|
||||
|
||||
pat loe lof dup adp loe stf $3==4 && $1==$5 && $2==$6
|
||||
kills allexceptcon
|
||||
uses AA_REG = {abs_con, $1, $2}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %b
|
||||
|
||||
pat loe loi dup adp loe sti sti $3==4 && $1==$5 && $2==4 && $6==4 && $7 <= 4
|
||||
with conreg
|
||||
kills allexceptcon
|
||||
uses AA_REG = {absolute, $1}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %1 %b leaving sti $7
|
||||
|
||||
pat loe loi dup adp loe sti $3==4 && $1==$5 && $2==4 && $6==4
|
||||
kills allexceptcon
|
||||
uses AA_REG = {absolute4, $1}, AA_REG
|
||||
gen move_l {indirect4, %a}, %b
|
||||
add_l {const, $4}, {indirect4, %a}
|
||||
yields %b
|
||||
#endif
|
||||
|
||||
pat lol lol adp stl lae cmp $1==$2 && $2==$4 && inreg($1)==reg_pointer && $3 < 0
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen sub_l {const,0-$3},{LOCAL,$1}
|
||||
yields {LOCAL,$1} {ext_addr, $5+$3}
|
||||
leaving cmu 4
|
||||
|
||||
pat lol lol adp stl lae cmp $1==$2 && $2==$4 && inreg($1)==reg_pointer && $3 > 0
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen add_l {const,$3},{LOCAL,$1}
|
||||
yields {LOCAL,$1} {ext_addr, $5+$3}
|
||||
leaving cmu 4
|
||||
|
||||
pat lol lol adp stl loi $1==$2 && $1==$4 && $3==4 && $5==4 &&
|
||||
inreg($1)==reg_pointer
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
|
@ -1658,6 +1825,12 @@ pat loe adp ste $1==$3
|
|||
kills posextern
|
||||
gen add_l {const, $2}, {absolute4, $1}
|
||||
|
||||
pat loc and $1==255 && $2==4
|
||||
with exact absolute4 yields {absolute1,%1.bd+3}
|
||||
with exact offsetted4 yields {offsetted1,%1.reg,%1.bd+3}
|
||||
with exact LOCAL yields {offsetted1,lb,%1.bd+3}
|
||||
with yields {const, $1} leaving and 4
|
||||
|
||||
/************************************************
|
||||
* Group 1: load instructions *
|
||||
************************************************/
|
||||
|
@ -1684,6 +1857,24 @@ pat loe yields {absolute4, $1}
|
|||
|
||||
pat loe loe $1==$2 leaving loe $1 dup 4
|
||||
|
||||
/* replace ste loe by dup ste, but not if followed by a test ... */
|
||||
proc steloezxx example ste loe zne
|
||||
with any4-sconsts
|
||||
kills posextern
|
||||
gen move %1, {absolute4, $1}
|
||||
bxx* {llabel, $3}
|
||||
with exact STACK
|
||||
kills posextern
|
||||
gen move_l {post_inc4, sp}, {absolute4, $1}
|
||||
bxx* {llabel, $3}
|
||||
|
||||
pat ste loe zlt $1==$2 call steloezxx("blt")
|
||||
pat ste loe zle $1==$2 call steloezxx("ble")
|
||||
pat ste loe zeq $1==$2 call steloezxx("beq")
|
||||
pat ste loe zne $1==$2 call steloezxx("bne")
|
||||
pat ste loe zge $1==$2 call steloezxx("bge")
|
||||
pat ste loe zgt $1==$2 call steloezxx("bgt")
|
||||
|
||||
pat ste loe $1==$2 leaving dup 4 ste $1
|
||||
|
||||
pat lil inreg($1)==reg_pointer
|
||||
|
@ -1970,16 +2161,16 @@ with exact STACK
|
|||
pat stl inreg($1)==reg_pointer
|
||||
with any4-sconsts
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move %1, {LOCAL, $1}
|
||||
gen move_l %1, {areg, regvar($1, reg_pointer)}
|
||||
with exact ext_addr
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move %1, {LOCAL, $1}
|
||||
gen move_l %1, {areg, regvar($1, reg_pointer)}
|
||||
with exact address-ext_addr
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen lea %1, {LOCAL, $1}
|
||||
gen lea %1, {areg, regvar($1, reg_pointer)}
|
||||
with exact STACK
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move_l {post_inc4, sp}, {LOCAL, $1}
|
||||
gen move_l {post_inc4, sp}, {areg, regvar($1, reg_pointer)}
|
||||
|
||||
pat stl
|
||||
with any4-sconsts
|
||||
|
@ -2450,7 +2641,7 @@ with exact any4 STACK
|
|||
uses reusing %1,DD_REG=%1
|
||||
gen sub_l {post_inc4, sp}, %a
|
||||
neg_l %a yields %a
|
||||
with any4 AA_REG
|
||||
with any4-bconst AA_REG
|
||||
gen sub_l %1, %2 yields %2
|
||||
|
||||
pat mli $1==4
|
||||
|
@ -2621,6 +2812,96 @@ with exact absind_con yields {absind_con, %1.sc, %1.xreg, %1.bd, %1.od+$1}
|
|||
with exact ext_regX yields {ext_regX, %1.sc, %1.xreg, %1.bd+$1}
|
||||
#endif TBL68020
|
||||
|
||||
pat ads cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving cmu 4
|
||||
|
||||
pat ads bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving bne $2
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving bne $2
|
||||
|
||||
pat ads beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving beq $2
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving beq $2
|
||||
|
||||
pat ads loe bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving loe $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving loe $2 bne $3
|
||||
|
||||
pat ads loe beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving loe $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving loe $2 beq $3
|
||||
|
||||
pat ads loe cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving loe $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving loe $2 cmu 4
|
||||
|
||||
pat ads lae bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lae $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lae $2 bne $3
|
||||
|
||||
pat ads lae beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lae $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lae $2 beq $3
|
||||
|
||||
pat ads lae cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lae $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lae $2 cmu 4
|
||||
|
||||
pat ads lal bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lal $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lal $2 bne $3
|
||||
|
||||
pat ads lal beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lal $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lal $2 beq $3
|
||||
|
||||
pat ads lal cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lal $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lal $2 cmu 4
|
||||
|
||||
pat ads lol bne $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lol $2 bne $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lol $2 bne $3
|
||||
|
||||
pat ads lol beq $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lol $2 beq $3
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lol $2 beq $3
|
||||
|
||||
pat ads lol cmp $1==4
|
||||
with DD_REG any4
|
||||
gen add_l %2, %1 yields %1 leaving lol $2 cmu 4
|
||||
with any4 DD_REG
|
||||
gen add_l %1, %2 yields %2 leaving lol $2 cmu 4
|
||||
|
||||
pat ads $1==4
|
||||
with D_REG A_REG yields {regAregXcon, %2, %1, 1, 0}
|
||||
with D_REG regAcon + t_regAcon
|
||||
|
@ -2679,6 +2960,8 @@ with exact absolute4 ext_regX
|
|||
pat sbs $1==4 leaving sbi 4
|
||||
|
||||
#ifdef TBL68020
|
||||
pat loc slu $2==4 leaving loc $1 sli 4
|
||||
|
||||
pat loc sli ads $1==1 && $2==4 && $3==4
|
||||
with D_REG yields {regX, 2, %1}
|
||||
leaving ads 4
|
||||
|
@ -2697,12 +2980,7 @@ with D_REG yields {regX, 8, %1}
|
|||
* Group 7: increment / decrement / zero *
|
||||
************************************************/
|
||||
|
||||
pat inc
|
||||
with exact STACK
|
||||
gen add_l {const, 1}, {indirect4, sp}
|
||||
with DD_REG+AA_REG
|
||||
gen add_l {const, 1}, %1
|
||||
yields %1
|
||||
pat inc leaving loc 1 adi 4
|
||||
|
||||
pat inl inreg($1)==reg_any
|
||||
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
|
||||
|
@ -2723,12 +3001,7 @@ pat ine
|
|||
kills posextern
|
||||
gen add_l {const, 1}, {absolute4, $1}
|
||||
|
||||
pat dec
|
||||
with exact STACK
|
||||
gen sub_l {const, 1}, {indirect4, sp}
|
||||
with DD_REG+AA_REG
|
||||
gen sub_l {const, 1}, %1
|
||||
yields %1
|
||||
pat dec leaving loc 1 sbi 4
|
||||
|
||||
pat del inreg($1)==reg_any
|
||||
kills regvar($1, reg_any), use_index %xreg==regvar($1, reg_any)
|
||||
|
@ -2755,7 +3028,7 @@ pat zrl inreg($1)==reg_any
|
|||
|
||||
pat zrl inreg($1)==reg_pointer
|
||||
kills regvar($1, reg_pointer), all_regind %reg==regvar($1, reg_pointer)
|
||||
gen move_l {const, 0}, {LOCAL, $1}
|
||||
gen move_l {const, 0}, {areg, regvar($1, reg_pointer)}
|
||||
|
||||
pat zrl
|
||||
kills all_indir, LOCAL %bd==$1
|
||||
|
@ -3122,23 +3395,31 @@ proc txx
|
|||
with test_set4
|
||||
uses reusing %1,DD_REG
|
||||
gen test %1
|
||||
sxx[1] %a
|
||||
neg_b %a
|
||||
yields {extend1, %a}
|
||||
bxx[1] {slabel, 1f}
|
||||
clr_l %a
|
||||
bra {slabel, 2f}
|
||||
1:
|
||||
move_l {const,1},%a
|
||||
2:
|
||||
yields %a
|
||||
|
||||
with test_set1 + test_set2
|
||||
uses reusing %1,DD_REG
|
||||
gen test %1
|
||||
sxx[2] %a
|
||||
neg_b %a
|
||||
yields {extend1, %a}
|
||||
bxx[2] {slabel, 1f}
|
||||
clr_l %a
|
||||
bra {slabel, 2f}
|
||||
1:
|
||||
move_l {const,1},%a
|
||||
2:
|
||||
yields %a
|
||||
|
||||
pat tlt call txx("slt", "scs")
|
||||
pat tle call txx("sle", "sls")
|
||||
pat teq call txx("seq", "seq")
|
||||
pat tne call txx("sne", "sne")
|
||||
pat tge call txx("sge", "scc")
|
||||
pat tgt call txx("sgt", "shi")
|
||||
pat tlt call txx("blt", "bcs")
|
||||
pat tle call txx("ble", "bls")
|
||||
pat teq call txx("beq", "beq")
|
||||
pat tne call txx("bne", "bne")
|
||||
pat tge call txx("bge", "bcc")
|
||||
pat tgt call txx("bgt", "bhi")
|
||||
|
||||
/*
|
||||
* Floating point
|
||||
|
@ -4013,3 +4294,59 @@ pat loc dvu $1==32 && $2==4 leaving loc 5 sru 4
|
|||
pat loc dvu $1==64 && $2==4 leaving loc 6 sru 4
|
||||
pat loc dvu $1==128 && $2==4 leaving loc 7 sru 4
|
||||
pat loc dvu $1==256 && $2==4 leaving loc 8 sru 4
|
||||
|
||||
pat loc dvi $1==2 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 1 sri 4
|
||||
|
||||
pat loc dvi $1==4 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 2 sri 4
|
||||
|
||||
pat loc dvi $1==8 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 3 sri 4
|
||||
|
||||
pat loc dvi $1==16 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 4 sri 4
|
||||
|
||||
pat loc dvi $1==32 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 5 sri 4
|
||||
|
||||
pat loc dvi $1==64 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 6 sri 4
|
||||
|
||||
pat loc dvi $1==128 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 7 sri 4
|
||||
|
||||
pat loc dvi $1==256 && $2==4
|
||||
with DD_REG
|
||||
gen test %1
|
||||
bge {slabel,1f}
|
||||
add_l {const,$1-1},%1
|
||||
1: yields %1 leaving loc 8 sri 4
|
||||
|
|
Loading…
Reference in a new issue