x86 alien fix and new slot intrinsics
parent
64e3e0c0d6
commit
b0f931d038
|
@ -156,7 +156,7 @@ M: x86-backend small-enough? ( n -- ? )
|
||||||
[
|
[
|
||||||
stack-frame* cell + +
|
stack-frame* cell + +
|
||||||
] [
|
] [
|
||||||
temp@
|
\ stack-frame get swap -
|
||||||
] ?if ;
|
] ?if ;
|
||||||
|
|
||||||
HOOK: %unbox-struct-1 compiler-backend ( -- )
|
HOOK: %unbox-struct-1 compiler-backend ( -- )
|
||||||
|
|
|
@ -71,29 +71,38 @@ IN: cpu.x86.intrinsics
|
||||||
} define-intrinsic
|
} define-intrinsic
|
||||||
|
|
||||||
! Slots
|
! Slots
|
||||||
|
: %slot-literal-known-tag
|
||||||
|
"obj" operand
|
||||||
|
"n" get cells
|
||||||
|
"obj" operand-tag - [+] ;
|
||||||
|
|
||||||
|
: %slot-literal-any-tag
|
||||||
|
"obj" operand %untag
|
||||||
|
"obj" operand "n" get cells [+] ;
|
||||||
|
|
||||||
|
: %slot-any
|
||||||
|
"obj" operand %untag
|
||||||
|
"n" operand fixnum>slot@
|
||||||
|
"obj" operand "n" operand [+] ;
|
||||||
|
|
||||||
\ slot {
|
\ slot {
|
||||||
|
! Slot number is literal and the tag is known
|
||||||
|
{
|
||||||
|
[ "obj" operand %slot-literal-known-tag MOV ] H{
|
||||||
|
{ +input+ { { f "obj" known-tag } { [ small-slot? ] "n" } } }
|
||||||
|
{ +output+ { "obj" } }
|
||||||
|
}
|
||||||
|
}
|
||||||
! Slot number is literal
|
! Slot number is literal
|
||||||
{
|
{
|
||||||
[
|
[ "obj" operand %slot-literal-any-tag MOV ] H{
|
||||||
"obj" operand %untag
|
|
||||||
! load slot value
|
|
||||||
"obj" operand dup "n" get cells [+] MOV
|
|
||||||
] H{
|
|
||||||
{ +input+ { { f "obj" } { [ small-slot? ] "n" } } }
|
{ +input+ { { f "obj" } { [ small-slot? ] "n" } } }
|
||||||
{ +output+ { "obj" } }
|
{ +output+ { "obj" } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
! Slot number in a register
|
! Slot number in a register
|
||||||
{
|
{
|
||||||
[
|
[ "obj" operand %slot-any MOV ] H{
|
||||||
"obj" operand %untag
|
|
||||||
! turn tagged fixnum slot # into an offset,
|
|
||||||
! multiple of 4
|
|
||||||
"n" operand fixnum>slot@
|
|
||||||
! load slot value
|
|
||||||
"obj" operand dup "n" operand [+] MOV
|
|
||||||
] H{
|
|
||||||
{ +input+ { { f "obj" } { f "n" } } }
|
{ +input+ { { f "obj" } { f "n" } } }
|
||||||
{ +output+ { "obj" } }
|
{ +output+ { "obj" } }
|
||||||
{ +clobber+ { "n" } }
|
{ +clobber+ { "n" } }
|
||||||
|
@ -105,38 +114,28 @@ IN: cpu.x86.intrinsics
|
||||||
#! Mark the card pointed to by vreg.
|
#! Mark the card pointed to by vreg.
|
||||||
"val" operand-immediate? "obj" get fresh-object? or [
|
"val" operand-immediate? "obj" get fresh-object? or [
|
||||||
"obj" operand card-bits SHR
|
"obj" operand card-bits SHR
|
||||||
"scratch" operand HEX: ffffffff MOV
|
"cards_offset" f %alien-global
|
||||||
"cards_offset" f rc-absolute-cell rel-dlsym
|
temp-reg v>operand "obj" operand [+] card-mark OR
|
||||||
"scratch" operand dup [] MOV
|
|
||||||
"scratch" operand "obj" operand [+] card-mark OR
|
|
||||||
] unless ;
|
] unless ;
|
||||||
|
|
||||||
\ set-slot {
|
\ set-slot {
|
||||||
|
! Slot number is literal and the tag is known
|
||||||
|
{
|
||||||
|
[ %slot-literal-known-tag "val" operand MOV ] H{
|
||||||
|
{ +input+ { { f "val" } { f "obj" known-tag } { [ small-slot? ] "n" } } }
|
||||||
|
{ +clobber+ { "obj" } }
|
||||||
|
}
|
||||||
|
}
|
||||||
! Slot number is literal
|
! Slot number is literal
|
||||||
{
|
{
|
||||||
[
|
[ %slot-literal-any-tag "val" operand MOV generate-write-barrier ] H{
|
||||||
"obj" operand %untag
|
|
||||||
! store new slot value
|
|
||||||
"obj" operand "n" get cells [+] "val" operand MOV
|
|
||||||
generate-write-barrier
|
|
||||||
] H{
|
|
||||||
{ +input+ { { f "val" } { f "obj" } { [ small-slot? ] "n" } } }
|
{ +input+ { { f "val" } { f "obj" } { [ small-slot? ] "n" } } }
|
||||||
{ +scratch+ { { f "scratch" } } }
|
|
||||||
{ +clobber+ { "obj" } }
|
{ +clobber+ { "obj" } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
! Slot number in a register
|
! Slot number in a register
|
||||||
{
|
{
|
||||||
[
|
[ %slot-any "val" operand MOV generate-write-barrier ] H{
|
||||||
! turn tagged fixnum slot # into an offset
|
|
||||||
"n" operand fixnum>slot@
|
|
||||||
"obj" operand %untag
|
|
||||||
! store new slot value
|
|
||||||
"obj" operand "n" operand [+] "val" operand MOV
|
|
||||||
! reuse register
|
|
||||||
"n" get "scratch" set
|
|
||||||
generate-write-barrier
|
|
||||||
] H{
|
|
||||||
{ +input+ { { f "val" } { f "obj" } { f "n" } } }
|
{ +input+ { { f "val" } { f "obj" } { f "n" } } }
|
||||||
{ +clobber+ { "obj" "n" } }
|
{ +clobber+ { "obj" "n" } }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue