compiler.cfg.value-numbering: don't use complex addressing modes unless architecture supports it
parent
fec408260e
commit
572d7f77f8
|
@ -70,7 +70,10 @@ M: ##unbox-alien rewrite rewrite-unbox-any-c-ptr ;
|
||||||
! construct a new ##load-memory or ##store-memory with the
|
! construct a new ##load-memory or ##store-memory with the
|
||||||
! ##add's operand as the displacement
|
! ##add's operand as the displacement
|
||||||
: fuse-displacement? ( insn -- ? )
|
: fuse-displacement? ( insn -- ? )
|
||||||
base>> vreg>insn ##add? ;
|
{
|
||||||
|
[ offset>> 0 = complex-addressing? or ]
|
||||||
|
[ base>> vreg>insn ##add? ]
|
||||||
|
} 1&& ;
|
||||||
|
|
||||||
GENERIC: alien-insn-value ( insn -- value )
|
GENERIC: alien-insn-value ( insn -- value )
|
||||||
|
|
||||||
|
@ -106,12 +109,14 @@ M: ##store-memory-imm new-alien-insn drop \ ##store-memory new-insn ;
|
||||||
[ >>displacement ] [ >>scale ] bi* ;
|
[ >>displacement ] [ >>scale ] bi* ;
|
||||||
|
|
||||||
: rewrite-memory-op ( insn -- insn/f )
|
: rewrite-memory-op ( insn -- insn/f )
|
||||||
{
|
complex-addressing? [
|
||||||
{ [ dup fuse-base-offset? ] [ fuse-base-offset ] }
|
{
|
||||||
{ [ dup fuse-displacement-offset? ] [ fuse-displacement-offset ] }
|
{ [ dup fuse-base-offset? ] [ fuse-base-offset ] }
|
||||||
{ [ dup fuse-scale? ] [ fuse-scale ] }
|
{ [ dup fuse-displacement-offset? ] [ fuse-displacement-offset ] }
|
||||||
[ drop f ]
|
{ [ dup fuse-scale? ] [ fuse-scale ] }
|
||||||
} cond ;
|
[ drop f ]
|
||||||
|
} cond
|
||||||
|
] [ drop f ] if ;
|
||||||
|
|
||||||
: rewrite-memory-imm-op ( insn -- insn/f )
|
: rewrite-memory-imm-op ( insn -- insn/f )
|
||||||
{
|
{
|
||||||
|
|
|
@ -2576,7 +2576,8 @@ cpu x86? [
|
||||||
} value-numbering-step
|
} value-numbering-step
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
! Base offset fusion on ##load/store-memory
|
! Base offset fusion on ##load/store-memory -- only on x86
|
||||||
|
cpu x86?
|
||||||
[
|
[
|
||||||
V{
|
V{
|
||||||
T{ ##peek f 0 D 0 }
|
T{ ##peek f 0 D 0 }
|
||||||
|
@ -2586,7 +2587,18 @@ cpu x86? [
|
||||||
T{ ##add-imm f 4 2 31337 }
|
T{ ##add-imm f 4 2 31337 }
|
||||||
T{ ##load-memory f 5 2 3 0 31337 int-rep c:uchar }
|
T{ ##load-memory f 5 2 3 0 31337 int-rep c:uchar }
|
||||||
}
|
}
|
||||||
] [
|
]
|
||||||
|
[
|
||||||
|
V{
|
||||||
|
T{ ##peek f 0 D 0 }
|
||||||
|
T{ ##peek f 1 D 1 }
|
||||||
|
T{ ##tagged>integer f 2 0 }
|
||||||
|
T{ ##tagged>integer f 3 1 }
|
||||||
|
T{ ##add-imm f 4 2 31337 }
|
||||||
|
T{ ##load-memory f 5 4 3 0 0 int-rep c:uchar }
|
||||||
|
}
|
||||||
|
] ?
|
||||||
|
[
|
||||||
V{
|
V{
|
||||||
T{ ##peek f 0 D 0 }
|
T{ ##peek f 0 D 0 }
|
||||||
T{ ##peek f 1 D 1 }
|
T{ ##peek f 1 D 1 }
|
||||||
|
@ -2597,7 +2609,8 @@ cpu x86? [
|
||||||
} value-numbering-step
|
} value-numbering-step
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
! Displacement offset fusion on ##load/store-memory
|
! Displacement offset fusion on ##load/store-memory -- only on x86
|
||||||
|
cpu x86?
|
||||||
[
|
[
|
||||||
V{
|
V{
|
||||||
T{ ##peek f 0 D 0 }
|
T{ ##peek f 0 D 0 }
|
||||||
|
@ -2607,7 +2620,18 @@ cpu x86? [
|
||||||
T{ ##add-imm f 4 3 31337 }
|
T{ ##add-imm f 4 3 31337 }
|
||||||
T{ ##load-memory f 5 2 3 0 31338 int-rep c:uchar }
|
T{ ##load-memory f 5 2 3 0 31338 int-rep c:uchar }
|
||||||
}
|
}
|
||||||
] [
|
]
|
||||||
|
[
|
||||||
|
V{
|
||||||
|
T{ ##peek f 0 D 0 }
|
||||||
|
T{ ##peek f 1 D 1 }
|
||||||
|
T{ ##tagged>integer f 2 0 }
|
||||||
|
T{ ##tagged>integer f 3 1 }
|
||||||
|
T{ ##add-imm f 4 3 31337 }
|
||||||
|
T{ ##load-memory f 5 2 4 0 1 int-rep c:uchar }
|
||||||
|
}
|
||||||
|
] ?
|
||||||
|
[
|
||||||
V{
|
V{
|
||||||
T{ ##peek f 0 D 0 }
|
T{ ##peek f 0 D 0 }
|
||||||
T{ ##peek f 1 D 1 }
|
T{ ##peek f 1 D 1 }
|
||||||
|
@ -2632,6 +2656,7 @@ cpu x86? [
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
! Scale fusion on ##load/store-memory
|
! Scale fusion on ##load/store-memory
|
||||||
|
cpu x86?
|
||||||
[
|
[
|
||||||
V{
|
V{
|
||||||
T{ ##peek f 0 D 0 }
|
T{ ##peek f 0 D 0 }
|
||||||
|
@ -2641,7 +2666,18 @@ cpu x86? [
|
||||||
T{ ##shl-imm f 4 3 2 }
|
T{ ##shl-imm f 4 3 2 }
|
||||||
T{ ##load-memory f 5 2 3 2 0 int-rep c:uchar }
|
T{ ##load-memory f 5 2 3 2 0 int-rep c:uchar }
|
||||||
}
|
}
|
||||||
] [
|
]
|
||||||
|
[
|
||||||
|
V{
|
||||||
|
T{ ##peek f 0 D 0 }
|
||||||
|
T{ ##peek f 1 D 1 }
|
||||||
|
T{ ##tagged>integer f 2 0 }
|
||||||
|
T{ ##tagged>integer f 3 1 }
|
||||||
|
T{ ##shl-imm f 4 3 2 }
|
||||||
|
T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
|
||||||
|
}
|
||||||
|
] ?
|
||||||
|
[
|
||||||
V{
|
V{
|
||||||
T{ ##peek f 0 D 0 }
|
T{ ##peek f 0 D 0 }
|
||||||
T{ ##peek f 1 D 1 }
|
T{ ##peek f 1 D 1 }
|
||||||
|
@ -2652,26 +2688,28 @@ cpu x86? [
|
||||||
} value-numbering-step
|
} value-numbering-step
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
! Don't do scale fusion if there's already a scale
|
cpu x86? [
|
||||||
[ ] [
|
! Don't do scale fusion if there's already a scale
|
||||||
V{
|
[ ] [
|
||||||
T{ ##peek f 0 D 0 }
|
V{
|
||||||
T{ ##peek f 1 D 1 }
|
T{ ##peek f 0 D 0 }
|
||||||
T{ ##tagged>integer f 2 0 }
|
T{ ##peek f 1 D 1 }
|
||||||
T{ ##tagged>integer f 3 1 }
|
T{ ##tagged>integer f 2 0 }
|
||||||
T{ ##shl-imm f 4 3 2 }
|
T{ ##tagged>integer f 3 1 }
|
||||||
T{ ##load-memory f 5 2 4 1 0 int-rep c:uchar }
|
T{ ##shl-imm f 4 3 2 }
|
||||||
} dup value-numbering-step assert=
|
T{ ##load-memory f 5 2 4 1 0 int-rep c:uchar }
|
||||||
] unit-test
|
} dup value-numbering-step assert=
|
||||||
|
] unit-test
|
||||||
|
|
||||||
! Don't do scale fusion if the scale factor is out of range
|
! Don't do scale fusion if the scale factor is out of range
|
||||||
[ ] [
|
[ ] [
|
||||||
V{
|
V{
|
||||||
T{ ##peek f 0 D 0 }
|
T{ ##peek f 0 D 0 }
|
||||||
T{ ##peek f 1 D 1 }
|
T{ ##peek f 1 D 1 }
|
||||||
T{ ##tagged>integer f 2 0 }
|
T{ ##tagged>integer f 2 0 }
|
||||||
T{ ##tagged>integer f 3 1 }
|
T{ ##tagged>integer f 3 1 }
|
||||||
T{ ##shl-imm f 4 3 4 }
|
T{ ##shl-imm f 4 3 4 }
|
||||||
T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
|
T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
|
||||||
} dup value-numbering-step assert=
|
} dup value-numbering-step assert=
|
||||||
] unit-test
|
] unit-test
|
||||||
|
] when
|
||||||
|
|
Loading…
Reference in New Issue