mirror of
https://github.com/byteworksinc/ORCA-C.git
synced 2024-12-22 07:30:54 +00:00
Add various intermediate code peephole optimizations.
These mainly cover 64-bit arithmetic and shifts, but also include a few optimizations for 16-bit and 32-bit shifts.
This commit is contained in:
parent
32f4e70826
commit
d891e672e3
54
CGC.asm
54
CGC.asm
@ -85,6 +85,60 @@ rec_cmp equ 18 disp to comp (SANE) value
|
|||||||
rtl
|
rtl
|
||||||
end
|
end
|
||||||
|
|
||||||
|
****************************************************************
|
||||||
|
*
|
||||||
|
* procedure CnvXLL (var result: longlong; val: extended);
|
||||||
|
*
|
||||||
|
* Convert floating point to long long
|
||||||
|
*
|
||||||
|
* Inputs:
|
||||||
|
* result - longlong to hold the converted value
|
||||||
|
* val - the real value
|
||||||
|
*
|
||||||
|
****************************************************************
|
||||||
|
|
||||||
|
CnvXLL start cg
|
||||||
|
|
||||||
|
subroutine (4:result,10:val),0
|
||||||
|
|
||||||
|
pei (val+8)
|
||||||
|
pei (val+6)
|
||||||
|
pei (val+4)
|
||||||
|
pei (val+2)
|
||||||
|
pei (val)
|
||||||
|
jsl ~CnvRealLongLong
|
||||||
|
pl8 [result]
|
||||||
|
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
****************************************************************
|
||||||
|
*
|
||||||
|
* procedure CnvXULL (var result: longlong; val: extended);
|
||||||
|
*
|
||||||
|
* Convert floating point to unsigned long long
|
||||||
|
*
|
||||||
|
* Inputs:
|
||||||
|
* result - longlong to hold the converted value
|
||||||
|
* val - the real value
|
||||||
|
*
|
||||||
|
****************************************************************
|
||||||
|
|
||||||
|
CnvXULL start cg
|
||||||
|
|
||||||
|
subroutine (4:result,10:val),0
|
||||||
|
|
||||||
|
pei (val+8)
|
||||||
|
pei (val+6)
|
||||||
|
pei (val+4)
|
||||||
|
pei (val+2)
|
||||||
|
pei (val)
|
||||||
|
jsl ~CnvRealULongLong
|
||||||
|
pl8 [result]
|
||||||
|
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
datachk off
|
datachk off
|
||||||
****************************************************************
|
****************************************************************
|
||||||
*
|
*
|
||||||
|
173
CGC.macros
173
CGC.macros
@ -186,3 +186,176 @@
|
|||||||
LDX #$090A
|
LDX #$090A
|
||||||
JSL $E10000
|
JSL $E10000
|
||||||
MEND
|
MEND
|
||||||
|
macro
|
||||||
|
&l pl8 &n1
|
||||||
|
lclc &c
|
||||||
|
&l anop
|
||||||
|
aif s:longa=1,.a
|
||||||
|
rep #%00100000
|
||||||
|
.a
|
||||||
|
&c amid &n1,1,1
|
||||||
|
aif "&c"<>"{",.b
|
||||||
|
&c amid &n1,l:&n1,1
|
||||||
|
aif "&c"<>"}",.f
|
||||||
|
&n1 amid &n1,2,l:&n1-2
|
||||||
|
pla
|
||||||
|
sta (&n1)
|
||||||
|
ldy #2
|
||||||
|
pla
|
||||||
|
sta (&n1),y
|
||||||
|
ldy #4
|
||||||
|
pla
|
||||||
|
sta (&n1),y
|
||||||
|
ldy #6
|
||||||
|
pla
|
||||||
|
sta (&n1),y
|
||||||
|
ago .d
|
||||||
|
.b
|
||||||
|
aif "&c"<>"[",.c
|
||||||
|
pla
|
||||||
|
sta &n1
|
||||||
|
ldy #2
|
||||||
|
pla
|
||||||
|
sta &n1,y
|
||||||
|
ldy #4
|
||||||
|
pla
|
||||||
|
sta &n1,y
|
||||||
|
ldy #6
|
||||||
|
pla
|
||||||
|
sta &n1,y
|
||||||
|
ago .d
|
||||||
|
.c
|
||||||
|
pla
|
||||||
|
sta &n1
|
||||||
|
pla
|
||||||
|
sta &n1+2
|
||||||
|
pla
|
||||||
|
sta &n1+4
|
||||||
|
pla
|
||||||
|
sta &n1+6
|
||||||
|
.d
|
||||||
|
aif s:longa=1,.e
|
||||||
|
sep #%00100000
|
||||||
|
.e
|
||||||
|
mexit
|
||||||
|
.f
|
||||||
|
mnote "Missing closing '}'",16
|
||||||
|
mend
|
||||||
|
MACRO
|
||||||
|
&lab subroutine &parms,&work
|
||||||
|
&lab anop
|
||||||
|
aif c:&work,.a
|
||||||
|
lclc &work
|
||||||
|
&work setc 0
|
||||||
|
.a
|
||||||
|
gbla &totallen
|
||||||
|
gbla &worklen
|
||||||
|
&worklen seta &work
|
||||||
|
&totallen seta 0
|
||||||
|
aif c:&parms=0,.e
|
||||||
|
lclc &len
|
||||||
|
lclc &p
|
||||||
|
lcla &i
|
||||||
|
&i seta c:&parms
|
||||||
|
.b
|
||||||
|
&p setc &parms(&i)
|
||||||
|
&len amid &p,2,1
|
||||||
|
aif "&len"=":",.c
|
||||||
|
&len amid &p,1,2
|
||||||
|
&p amid &p,4,l:&p-3
|
||||||
|
ago .d
|
||||||
|
.c
|
||||||
|
&len amid &p,1,1
|
||||||
|
&p amid &p,3,l:&p-2
|
||||||
|
.d
|
||||||
|
&p equ &totallen+3+&work
|
||||||
|
&totallen seta &totallen+&len
|
||||||
|
&i seta &i-1
|
||||||
|
aif &i,^b
|
||||||
|
.e
|
||||||
|
tsc
|
||||||
|
sec
|
||||||
|
sbc #&work
|
||||||
|
tcs
|
||||||
|
inc a
|
||||||
|
phd
|
||||||
|
tcd
|
||||||
|
mend
|
||||||
|
MACRO
|
||||||
|
&lab return &r
|
||||||
|
&lab anop
|
||||||
|
lclc &len
|
||||||
|
aif c:&r,.a
|
||||||
|
lclc &r
|
||||||
|
&r setc 0
|
||||||
|
&len setc 0
|
||||||
|
ago .h
|
||||||
|
.a
|
||||||
|
&len amid &r,2,1
|
||||||
|
aif "&len"=":",.b
|
||||||
|
&len amid &r,1,2
|
||||||
|
&r amid &r,4,l:&r-3
|
||||||
|
ago .c
|
||||||
|
.b
|
||||||
|
&len amid &r,1,1
|
||||||
|
&r amid &r,3,l:&r-2
|
||||||
|
.c
|
||||||
|
aif &len<>2,.d
|
||||||
|
ldy &r
|
||||||
|
ago .h
|
||||||
|
.d
|
||||||
|
aif &len<>4,.e
|
||||||
|
ldx &r+2
|
||||||
|
ldy &r
|
||||||
|
ago .h
|
||||||
|
.e
|
||||||
|
aif &len<>10,.g
|
||||||
|
aif &totallen=0,.f
|
||||||
|
lda &worklen+1
|
||||||
|
sta &worklen+&totallen+1
|
||||||
|
lda &worklen
|
||||||
|
sta &worklen+&totallen
|
||||||
|
.f
|
||||||
|
pld
|
||||||
|
tsc
|
||||||
|
clc
|
||||||
|
adc #&worklen+&totallen
|
||||||
|
tcs
|
||||||
|
phb
|
||||||
|
plx
|
||||||
|
ply
|
||||||
|
lda &r+8
|
||||||
|
pha
|
||||||
|
lda &r+6
|
||||||
|
pha
|
||||||
|
lda &r+4
|
||||||
|
pha
|
||||||
|
lda &r+2
|
||||||
|
pha
|
||||||
|
lda &r
|
||||||
|
pha
|
||||||
|
phy
|
||||||
|
phx
|
||||||
|
plb
|
||||||
|
rtl
|
||||||
|
mexit
|
||||||
|
.g
|
||||||
|
mnote 'Not a valid return length',16
|
||||||
|
mexit
|
||||||
|
.h
|
||||||
|
aif &totallen=0,.i
|
||||||
|
lda &worklen+1
|
||||||
|
sta &worklen+&totallen+1
|
||||||
|
lda &worklen
|
||||||
|
sta &worklen+&totallen
|
||||||
|
.i
|
||||||
|
pld
|
||||||
|
tsc
|
||||||
|
clc
|
||||||
|
adc #&worklen+&totallen
|
||||||
|
tcs
|
||||||
|
aif &len=0,.j
|
||||||
|
tya
|
||||||
|
.j
|
||||||
|
rtl
|
||||||
|
mend
|
||||||
|
18
CGC.pas
18
CGC.pas
@ -67,6 +67,24 @@ procedure CnvSX (rec: realrec); extern;
|
|||||||
{ has space for the result }
|
{ has space for the result }
|
||||||
|
|
||||||
|
|
||||||
|
procedure CnvXLL (var result: longlong; val: extended); extern;
|
||||||
|
|
||||||
|
{ convert a real number to long long }
|
||||||
|
{ }
|
||||||
|
{ parameters: }
|
||||||
|
{ result - longlong to hold the converted value }
|
||||||
|
{ val - the real value }
|
||||||
|
|
||||||
|
|
||||||
|
procedure CnvXULL (var result: longlong; val: extended); extern;
|
||||||
|
|
||||||
|
{ convert a real number to unsigned long long }
|
||||||
|
{ }
|
||||||
|
{ parameters: }
|
||||||
|
{ result - longlong to hold the converted value }
|
||||||
|
{ val - the real value }
|
||||||
|
|
||||||
|
|
||||||
procedure InitLabels; extern;
|
procedure InitLabels; extern;
|
||||||
|
|
||||||
{ initialize the labels array for a procedure }
|
{ initialize the labels array for a procedure }
|
||||||
|
298
DAG.pas
298
DAG.pas
@ -11,7 +11,7 @@ unit DAG;
|
|||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
{$segment 'CG'}
|
{$segment 'DAG'}
|
||||||
|
|
||||||
{$LibPrefix '0/obj/'}
|
{$LibPrefix '0/obj/'}
|
||||||
|
|
||||||
@ -49,6 +49,31 @@ function umod (x,y: longint): longint; extern;
|
|||||||
|
|
||||||
function umul (x,y: longint): longint; extern;
|
function umul (x,y: longint): longint; extern;
|
||||||
|
|
||||||
|
function lshr (x,y: longint): longint; extern;
|
||||||
|
|
||||||
|
{-- External 64-bit math routines; imported from Expression.pas --}
|
||||||
|
{ Procedures for arithmetic and shifts compute "x := x OP y". }
|
||||||
|
|
||||||
|
procedure umul64 (var x: longlong; y: longlong); extern;
|
||||||
|
|
||||||
|
procedure udiv64 (var x: longlong; y: longlong); extern;
|
||||||
|
|
||||||
|
procedure div64 (var x: longlong; y: longlong); extern;
|
||||||
|
|
||||||
|
procedure umod64 (var x: longlong; y: longlong); extern;
|
||||||
|
|
||||||
|
procedure rem64 (var x: longlong; y: longlong); extern;
|
||||||
|
|
||||||
|
procedure add64 (var x: longlong; y: longlong); extern;
|
||||||
|
|
||||||
|
procedure sub64 (var x: longlong; y: longlong); extern;
|
||||||
|
|
||||||
|
procedure shl64 (var x: longlong; y: integer); extern;
|
||||||
|
|
||||||
|
procedure ashr64 (var x: longlong; y: integer); extern;
|
||||||
|
|
||||||
|
procedure lshr64 (var x: longlong; y: integer); extern;
|
||||||
|
|
||||||
{---------------------------------------------------------------}
|
{---------------------------------------------------------------}
|
||||||
|
|
||||||
function CodesMatch (op1, op2: icptr; exact: boolean): boolean;
|
function CodesMatch (op1, op2: icptr; exact: boolean): boolean;
|
||||||
@ -224,8 +249,8 @@ if opt1 = cgByte then begin
|
|||||||
opt1 := cgWord;
|
opt1 := cgWord;
|
||||||
end {if}
|
end {if}
|
||||||
else if opt1 = cgUByte then begin
|
else if opt1 = cgUByte then begin
|
||||||
op1^.optype := cgUWord;
|
op1^.optype := cgWord;
|
||||||
opt1 := cgUWord;
|
opt1 := cgWord;
|
||||||
end {else if}
|
end {else if}
|
||||||
else if opt1 in [cgReal, cgDouble, cgComp] then begin
|
else if opt1 in [cgReal, cgDouble, cgComp] then begin
|
||||||
op1^.optype := cgExtended;
|
op1^.optype := cgExtended;
|
||||||
@ -236,8 +261,8 @@ if opt2 = cgByte then begin
|
|||||||
opt2 := cgWord;
|
opt2 := cgWord;
|
||||||
end {if}
|
end {if}
|
||||||
else if opt2 = cgUByte then begin
|
else if opt2 = cgUByte then begin
|
||||||
op2^.optype := cgUWord;
|
op2^.optype := cgWord;
|
||||||
opt2 := cgUWord;
|
opt2 := cgWord;
|
||||||
end {else if}
|
end {else if}
|
||||||
else if opt2 in [cgReal, cgDouble, cgComp] then begin
|
else if opt2 in [cgReal, cgDouble, cgComp] then begin
|
||||||
op2^.optype := cgExtended;
|
op2^.optype := cgExtended;
|
||||||
@ -877,12 +902,18 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
end; {case pc_adr}
|
end; {case pc_adr}
|
||||||
|
|
||||||
pc_adq: begin {pc_adq}
|
pc_adq: begin {pc_adq}
|
||||||
if op^.left^.opcode = pc_ldc then
|
if (op^.right^.opcode = pc_ldc) and (op^.left^.opcode = pc_ldc) then begin
|
||||||
ReverseChildren(op);
|
add64(op^.left^.qval, op^.right^.qval);
|
||||||
if op^.right^.opcode = pc_ldc then begin
|
opv := op^.left;
|
||||||
if (op^.right^.qval.lo = 0) and (op^.right^.qval.hi = 0) then
|
end {if}
|
||||||
opv := op^.left;
|
else begin
|
||||||
end; {if}
|
if op^.left^.opcode = pc_ldc then
|
||||||
|
ReverseChildren(op);
|
||||||
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
|
if (op^.right^.qval.lo = 0) and (op^.right^.qval.hi = 0) then
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {else}
|
||||||
end; {case pc_adq}
|
end; {case pc_adq}
|
||||||
|
|
||||||
pc_and: begin {pc_and}
|
pc_and: begin {pc_and}
|
||||||
@ -1106,6 +1137,14 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
op^.left^.q := 0;
|
op^.left^.q := 0;
|
||||||
op^.left^.lval := lval;
|
op^.left^.lval := lval;
|
||||||
end;
|
end;
|
||||||
|
cgQuad,cgUQuad: begin
|
||||||
|
op^.left^.qval.lo := op^.left^.q;
|
||||||
|
if op^.left^.qval.lo < 0 then
|
||||||
|
op^.left^.qval.hi := -1
|
||||||
|
else
|
||||||
|
op^.left^.qval.hi := 0;
|
||||||
|
op^.left^.q := 0;
|
||||||
|
end;
|
||||||
cgReal,cgDouble,cgComp,cgExtended: begin
|
cgReal,cgDouble,cgComp,cgExtended: begin
|
||||||
rval := op^.left^.q;
|
rval := op^.left^.q;
|
||||||
op^.left^.q := 0;
|
op^.left^.q := 0;
|
||||||
@ -1121,6 +1160,11 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
op^.left^.q := 0;
|
op^.left^.q := 0;
|
||||||
op^.left^.lval := lval;
|
op^.left^.lval := lval;
|
||||||
end;
|
end;
|
||||||
|
cgQuad,cgUQuad: begin
|
||||||
|
op^.left^.qval.lo := ord4(op^.left^.q) & $0000FFFF;
|
||||||
|
op^.left^.qval.hi := 0;
|
||||||
|
op^.left^.q := 0;
|
||||||
|
end;
|
||||||
cgReal,cgDouble,cgComp,cgExtended: begin
|
cgReal,cgDouble,cgComp,cgExtended: begin
|
||||||
rval := ord4(op^.left^.q) & $0000FFFF;
|
rval := ord4(op^.left^.q) & $0000FFFF;
|
||||||
op^.left^.q := 0;
|
op^.left^.q := 0;
|
||||||
@ -1136,6 +1180,13 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
op^.left^.q := q;
|
op^.left^.q := q;
|
||||||
end;
|
end;
|
||||||
cgLong, cgULong: ;
|
cgLong, cgULong: ;
|
||||||
|
cgQuad,cgUQuad: begin
|
||||||
|
op^.left^.qval.lo := op^.left^.lval;
|
||||||
|
if op^.left^.qval.lo < 0 then
|
||||||
|
op^.left^.qval.hi := -1
|
||||||
|
else
|
||||||
|
op^.left^.qval.hi := 0;
|
||||||
|
end;
|
||||||
cgReal,cgDouble,cgComp,cgExtended: begin
|
cgReal,cgDouble,cgComp,cgExtended: begin
|
||||||
rval := op^.left^.lval;
|
rval := op^.left^.lval;
|
||||||
op^.left^.lval := 0;
|
op^.left^.lval := 0;
|
||||||
@ -1151,6 +1202,10 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
op^.left^.q := q;
|
op^.left^.q := q;
|
||||||
end;
|
end;
|
||||||
cgLong, cgULong: ;
|
cgLong, cgULong: ;
|
||||||
|
cgQuad,cgUQuad: begin
|
||||||
|
op^.left^.qval.lo := op^.left^.lval;
|
||||||
|
op^.left^.qval.hi := 0;
|
||||||
|
end;
|
||||||
cgReal,cgDouble,cgComp,cgExtended: begin
|
cgReal,cgDouble,cgComp,cgExtended: begin
|
||||||
lval := op^.left^.lval;
|
lval := op^.left^.lval;
|
||||||
op^.left^.lval := 0;
|
op^.left^.lval := 0;
|
||||||
@ -1229,6 +1284,10 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
op^.left^.rval := 0.0;
|
op^.left^.rval := 0.0;
|
||||||
op^.left^.lval := lval;
|
op^.left^.lval := lval;
|
||||||
end;
|
end;
|
||||||
|
cgQuad:
|
||||||
|
CnvXLL(op^.left^.qval, rval);
|
||||||
|
cgUQuad:
|
||||||
|
CnvXULL(op^.left^.qval, rval);
|
||||||
cgReal,cgDouble,cgComp,cgExtended: ;
|
cgReal,cgDouble,cgComp,cgExtended: ;
|
||||||
otherwise: ;
|
otherwise: ;
|
||||||
end;
|
end;
|
||||||
@ -1239,8 +1298,8 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
[cgByte,cgUByte,cgWord,cgUWord,cgLong,cgULong,cgReal,cgDouble,
|
[cgByte,cgUByte,cgWord,cgUWord,cgLong,cgULong,cgReal,cgDouble,
|
||||||
cgComp,cgExtended] then
|
cgComp,cgExtended] then
|
||||||
if totype.optype in
|
if totype.optype in
|
||||||
[cgByte,cgUByte,cgWord,cgUWord,cgLong,cgULong,cgReal,cgDouble,
|
[cgByte,cgUByte,cgWord,cgUWord,cgLong,cgULong,cgQuad,cgUQuad,
|
||||||
cgComp,cgExtended] then begin
|
cgReal,cgDouble,cgComp,cgExtended] then begin
|
||||||
op^.left^.optype := totype.optype;
|
op^.left^.optype := totype.optype;
|
||||||
opv := op^.left;
|
opv := op^.left;
|
||||||
end; {if}
|
end; {if}
|
||||||
@ -1286,6 +1345,13 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
op^.left^.optype := totype.optype;
|
op^.left^.optype := totype.optype;
|
||||||
opv := op^.left;
|
opv := op^.left;
|
||||||
end; {if}
|
end; {if}
|
||||||
|
if fromtype.optype in [cgQuad,cgUQuad] then
|
||||||
|
if totype.optype in
|
||||||
|
[cgByte,cgUByte,cgWord,cgUWord,cgLong,cgULong,cgQuad,cgUQuad]
|
||||||
|
then begin
|
||||||
|
op^.left^.optype := totype.optype;
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
end {else if}
|
end {else if}
|
||||||
else if op^.q in [$40,$41,$50,$51] then begin
|
else if op^.q in [$40,$41,$50,$51] then begin
|
||||||
{any long type to byte type}
|
{any long type to byte type}
|
||||||
@ -1372,6 +1438,19 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
end; {if}
|
end; {if}
|
||||||
end; {case pc_dvl}
|
end; {case pc_dvl}
|
||||||
|
|
||||||
|
pc_dvq: begin {pc_dvq}
|
||||||
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
|
if (op^.right^.qval.lo <> 0) or (op^.right^.qval.hi <> 0) then begin
|
||||||
|
div64(op^.left^.qval, op^.right^.qval);
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end {if}
|
||||||
|
else if (op^.right^.qval.lo = 1) and (op^.right^.qval.hi = 0) then
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {case pc_dvq}
|
||||||
|
|
||||||
pc_dvr: begin {pc_dvr}
|
pc_dvr: begin {pc_dvr}
|
||||||
if op^.right^.opcode = pc_ldc then begin
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
if op^.left^.opcode = pc_ldc then begin
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
@ -1734,6 +1813,21 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
end; {if}
|
end; {if}
|
||||||
end; {case pc_mdl}
|
end; {case pc_mdl}
|
||||||
|
|
||||||
|
pc_mdq: begin {pc_mdq}
|
||||||
|
if op^.right^.opcode = pc_ldc then
|
||||||
|
if (op^.right^.qval.lo = 1) and (op^.right^.qval.hi = 0) then begin
|
||||||
|
if not SideEffects(op^.left) then begin
|
||||||
|
op^.right^.qval := longlong0;
|
||||||
|
opv := op^.right;
|
||||||
|
end; {if}
|
||||||
|
end {if}
|
||||||
|
else if op^.left^.opcode = pc_ldc then
|
||||||
|
if (op^.right^.qval.lo <> 0) or (op^.right^.qval.hi <> 0) then begin
|
||||||
|
rem64(op^.left^.qval, op^.right^.qval);
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {case pc_mdq}
|
||||||
|
|
||||||
pc_mod: begin {pc_mod}
|
pc_mod: begin {pc_mod}
|
||||||
if op^.right^.opcode = pc_ldc then
|
if op^.right^.opcode = pc_ldc then
|
||||||
if op^.right^.q = 1 then begin
|
if op^.right^.q = 1 then begin
|
||||||
@ -1814,6 +1908,31 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
end; {else}
|
end; {else}
|
||||||
end; {case pc_mpl, pc_uml}
|
end; {case pc_mpl, pc_uml}
|
||||||
|
|
||||||
|
pc_mpq, pc_umq: begin {pc_mpq, pc_umq}
|
||||||
|
if (op^.right^.opcode = pc_ldc) and (op^.left^.opcode = pc_ldc) then begin
|
||||||
|
umul64(op^.left^.qval, op^.right^.qval);
|
||||||
|
opv := op^.left;
|
||||||
|
end {if}
|
||||||
|
else begin
|
||||||
|
if op^.left^.opcode = pc_ldc then
|
||||||
|
ReverseChildren(op);
|
||||||
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
|
if (op^.right^.qval.lo = 1) and (op^.right^.qval.hi = 0) then
|
||||||
|
opv := op^.left
|
||||||
|
else if (op^.right^.qval.lo = 0) and (op^.right^.qval.hi = 0) then
|
||||||
|
begin
|
||||||
|
if not SideEffects(op^.left) then
|
||||||
|
opv := op^.right;
|
||||||
|
end {else if}
|
||||||
|
else if (op^.right^.qval.lo = -1) and (op^.right^.qval.hi = -1) then
|
||||||
|
if op^.opcode = pc_mpq then begin
|
||||||
|
op^.opcode := pc_ngq;
|
||||||
|
op^.right := nil;
|
||||||
|
end; {if}
|
||||||
|
end; {if}
|
||||||
|
end; {else}
|
||||||
|
end; {case pc_mpq, pc_umq}
|
||||||
|
|
||||||
pc_mpr: begin {pc_mpr}
|
pc_mpr: begin {pc_mpr}
|
||||||
if (op^.right^.opcode = pc_ldc) and (op^.left^.opcode = pc_ldc) then begin
|
if (op^.right^.opcode = pc_ldc) and (op^.left^.opcode = pc_ldc) then begin
|
||||||
op^.left^.rval := op^.left^.rval*op^.right^.rval;
|
op^.left^.rval := op^.left^.rval*op^.right^.rval;
|
||||||
@ -1909,6 +2028,19 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
end; {if}
|
end; {if}
|
||||||
end; {case pc_ngl}
|
end; {case pc_ngl}
|
||||||
|
|
||||||
|
pc_ngq: begin {pc_ngq}
|
||||||
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
|
with op^.left^.qval do begin
|
||||||
|
lo := ~lo;
|
||||||
|
hi := ~hi;
|
||||||
|
lo := lo + 1;
|
||||||
|
if lo = 0 then
|
||||||
|
hi := hi + 1;
|
||||||
|
end; {with}
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {case pc_ngq}
|
||||||
|
|
||||||
pc_ngr: begin {pc_ngr}
|
pc_ngr: begin {pc_ngr}
|
||||||
if op^.left^.opcode = pc_ldc then begin
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
op^.left^.rval := -op^.left^.rval;
|
op^.left^.rval := -op^.left^.rval;
|
||||||
@ -1925,7 +2057,12 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
end {if}
|
end {if}
|
||||||
else if op^.left^.optype in [cgLong,cgULong] then begin
|
else if op^.left^.optype in [cgLong,cgULong] then begin
|
||||||
q := ord(op^.left^.lval = 0);
|
q := ord(op^.left^.lval = 0);
|
||||||
lval := 0;
|
op^.left^.q := q;
|
||||||
|
op^.left^.optype := cgWord;
|
||||||
|
opv := op^.left;
|
||||||
|
end {else if}
|
||||||
|
else if op^.left^.optype in [cgQuad,cgUQuad] then begin
|
||||||
|
q := ord((op^.left^.qval.lo = 0) and (op^.left^.qval.hi = 0));
|
||||||
op^.left^.q := q;
|
op^.left^.q := q;
|
||||||
op^.left^.optype := cgWord;
|
op^.left^.optype := cgWord;
|
||||||
opv := op^.left;
|
opv := op^.left;
|
||||||
@ -2100,7 +2237,11 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
|
|
||||||
pc_sbq: begin {pc_sbq}
|
pc_sbq: begin {pc_sbq}
|
||||||
if op^.left^.opcode = pc_ldc then begin
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
if (op^.left^.qval.lo = 0) and (op^.left^.qval.hi = 0) then begin
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
|
sub64(op^.left^.qval, op^.right^.qval);
|
||||||
|
opv := op^.left;
|
||||||
|
end {if}
|
||||||
|
else if (op^.left^.qval.lo = 0) and (op^.left^.qval.hi = 0) then begin
|
||||||
op^.opcode := pc_ngq;
|
op^.opcode := pc_ngq;
|
||||||
op^.left := op^.right;
|
op^.left := op^.right;
|
||||||
op^.right := nil;
|
op^.right := nil;
|
||||||
@ -2115,7 +2256,11 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
pc_shl: begin {pc_shl}
|
pc_shl: begin {pc_shl}
|
||||||
if op^.right^.opcode = pc_ldc then begin
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
opcode := op^.left^.opcode;
|
opcode := op^.left^.opcode;
|
||||||
if opcode = pc_shl then begin
|
if opcode = pc_ldc then begin
|
||||||
|
op^.left^.q := op^.left^.q << op^.right^.q;
|
||||||
|
opv := op^.left;
|
||||||
|
end {if}
|
||||||
|
else if opcode = pc_shl then begin
|
||||||
if op^.left^.right^.opcode = pc_ldc then begin
|
if op^.left^.right^.opcode = pc_ldc then begin
|
||||||
op^.right^.q := op^.right^.q + op^.left^.right^.q;
|
op^.right^.q := op^.right^.q + op^.left^.right^.q;
|
||||||
op^.left := op^.left^.left;
|
op^.left := op^.left^.left;
|
||||||
@ -2128,10 +2273,56 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
op2^.left := op;
|
op2^.left := op;
|
||||||
opv := op2;
|
opv := op2;
|
||||||
PeepHoleOptimization(op2^.left);
|
PeepHoleOptimization(op2^.left);
|
||||||
end; {else if}
|
end {else if}
|
||||||
|
else if op^.right^.q = 0 then
|
||||||
|
opv := op^.left;
|
||||||
end; {if}
|
end; {if}
|
||||||
end; {case pc_shl}
|
end; {case pc_shl}
|
||||||
|
|
||||||
|
pc_shr: begin {pc_shr}
|
||||||
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
|
op^.left^.q := op^.left^.q >> op^.right^.q;
|
||||||
|
opv := op^.left;
|
||||||
|
end {if}
|
||||||
|
else if op^.right^.q = 0 then
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {case pc_shr}
|
||||||
|
|
||||||
|
pc_sll: begin {pc_sll}
|
||||||
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
|
op^.left^.lval := op^.left^.lval << op^.right^.lval;
|
||||||
|
opv := op^.left;
|
||||||
|
end {if}
|
||||||
|
else if op^.right^.lval = 0 then
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {case pc_sll}
|
||||||
|
|
||||||
|
pc_slr: begin {pc_slr}
|
||||||
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
|
op^.left^.lval := op^.left^.lval >> op^.right^.lval;
|
||||||
|
opv := op^.left;
|
||||||
|
end {if}
|
||||||
|
else if op^.right^.lval = 0 then
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {case pc_slr}
|
||||||
|
|
||||||
|
pc_slq: begin {pc_slq}
|
||||||
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
|
shl64(op^.left^.qval, op^.right^.q);
|
||||||
|
opv := op^.left;
|
||||||
|
end {if}
|
||||||
|
else if op^.right^.q = 0 then
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {case pc_slq}
|
||||||
|
|
||||||
pc_sro, pc_str: begin {pc_sro, pc_str}
|
pc_sro, pc_str: begin {pc_sro, pc_str}
|
||||||
if op^.optype in [cgReal,cgDouble,cgExtended] then
|
if op^.optype in [cgReal,cgDouble,cgExtended] then
|
||||||
RealStoreOptimizations(op, op^.left);
|
RealStoreOptimizations(op, op^.left);
|
||||||
@ -2156,6 +2347,17 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
end; {if}
|
end; {if}
|
||||||
end; {case pc_sto}
|
end; {case pc_sto}
|
||||||
|
|
||||||
|
pc_sqr: begin {pc_sqr}
|
||||||
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
|
ashr64(op^.left^.qval, op^.right^.q);
|
||||||
|
opv := op^.left;
|
||||||
|
end {if}
|
||||||
|
else if op^.right^.q = 0 then
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {case pc_sqr}
|
||||||
|
|
||||||
pc_tjp: begin {pc_tjp}
|
pc_tjp: begin {pc_tjp}
|
||||||
opcode := op^.left^.opcode;
|
opcode := op^.left^.opcode;
|
||||||
if opcode = pc_ldc then begin
|
if opcode = pc_ldc then begin
|
||||||
@ -2259,6 +2461,19 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
end; {if}
|
end; {if}
|
||||||
end; {case pc_udl}
|
end; {case pc_udl}
|
||||||
|
|
||||||
|
pc_udq: begin {pc_udq}
|
||||||
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
|
if (op^.right^.qval.lo <> 0) or (op^.right^.qval.hi <> 0) then begin
|
||||||
|
udiv64(op^.left^.qval, op^.right^.qval);
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end {if}
|
||||||
|
else if (op^.right^.qval.lo = 1) and (op^.right^.qval.hi = 0) then
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {case pc_udq}
|
||||||
|
|
||||||
pc_uim: begin {pc_uim}
|
pc_uim: begin {pc_uim}
|
||||||
if op^.right^.opcode = pc_ldc then
|
if op^.right^.opcode = pc_ldc then
|
||||||
if op^.right^.q = 1 then begin
|
if op^.right^.q = 1 then begin
|
||||||
@ -2305,6 +2520,55 @@ case op^.opcode of {check for optimizations of this node}
|
|||||||
end; {if}
|
end; {if}
|
||||||
end; {case pc_ulm}
|
end; {case pc_ulm}
|
||||||
|
|
||||||
|
pc_uqm: begin {pc_uqm}
|
||||||
|
if op^.right^.opcode = pc_ldc then
|
||||||
|
if (op^.right^.qval.lo = 1) and (op^.right^.qval.hi = 0) then begin
|
||||||
|
if not SideEffects(op^.left) then begin
|
||||||
|
op^.right^.qval := longlong0;
|
||||||
|
opv := op^.right;
|
||||||
|
end; {if}
|
||||||
|
end {if}
|
||||||
|
else if op^.left^.opcode = pc_ldc then
|
||||||
|
if (op^.right^.qval.lo <> 0) or (op^.right^.qval.hi <> 0) then begin
|
||||||
|
umod64(op^.left^.qval, op^.right^.qval);
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {case pc_uqm}
|
||||||
|
|
||||||
|
pc_usr: begin {pc_usr}
|
||||||
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
|
lval := lshr(op^.left^.q & $0000FFFF, op^.right^.q);
|
||||||
|
op^.left^.q := long(lval).lsw;
|
||||||
|
opv := op^.left;
|
||||||
|
end {if}
|
||||||
|
else if op^.right^.q = 0 then
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {case pc_usr}
|
||||||
|
|
||||||
|
pc_vsr: begin {pc_vsr}
|
||||||
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
|
op^.left^.lval := lshr(op^.left^.lval, op^.right^.lval);
|
||||||
|
opv := op^.left;
|
||||||
|
end {if}
|
||||||
|
else if op^.right^.lval = 0 then
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {case pc_vsr}
|
||||||
|
|
||||||
|
pc_wsr: begin {pc_wsr}
|
||||||
|
if op^.right^.opcode = pc_ldc then begin
|
||||||
|
if op^.left^.opcode = pc_ldc then begin
|
||||||
|
lshr64(op^.left^.qval, op^.right^.q);
|
||||||
|
opv := op^.left;
|
||||||
|
end {if}
|
||||||
|
else if op^.right^.q = 0 then
|
||||||
|
opv := op^.left;
|
||||||
|
end; {if}
|
||||||
|
end; {case pc_wsr}
|
||||||
|
|
||||||
otherwise: ;
|
otherwise: ;
|
||||||
end; {case}
|
end; {case}
|
||||||
end; {PeepHoleOptimization}
|
end; {PeepHoleOptimization}
|
||||||
|
Loading…
Reference in New Issue
Block a user