2005-01-06 21:42:07 -05:00
|
|
|
! Copyright (C) 2005 Slava Pestov.
|
2005-02-14 21:58:07 -05:00
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
2005-05-09 02:34:15 -04:00
|
|
|
IN: compiler-backend
|
|
|
|
USING: alien assembler compiler inference kernel lists math
|
|
|
|
memory sequences words ;
|
2005-01-06 21:42:07 -05:00
|
|
|
|
2005-09-23 18:59:52 -04:00
|
|
|
: reg-stack ( n reg -- op ) swap cell * neg 2list ;
|
2005-09-04 17:07:59 -04:00
|
|
|
|
2005-09-23 18:41:26 -04:00
|
|
|
GENERIC: loc>operand
|
2005-09-04 17:07:59 -04:00
|
|
|
|
2005-09-23 18:59:52 -04:00
|
|
|
M: ds-loc loc>operand ds-loc-n ESI reg-stack ;
|
|
|
|
M: cs-loc loc>operand cs-loc-n EBX reg-stack ;
|
2005-09-04 17:07:59 -04:00
|
|
|
|
2005-09-23 18:41:26 -04:00
|
|
|
M: %peek generate-node ( vop -- )
|
2005-09-23 18:59:52 -04:00
|
|
|
dup 0 vop-out v>operand swap 0 vop-in loc>operand MOV ;
|
2005-09-04 17:07:59 -04:00
|
|
|
|
2005-09-23 18:41:26 -04:00
|
|
|
M: %replace generate-node ( vop -- )
|
2005-09-23 18:59:52 -04:00
|
|
|
dup 0 vop-out loc>operand swap 0 vop-in v>operand MOV ;
|
2005-01-06 21:42:07 -05:00
|
|
|
|
2005-09-24 15:21:17 -04:00
|
|
|
: (%inc) swap 0 vop-in cell * dup 0 > [ ADD ] [ neg SUB ] if ;
|
2005-01-06 21:42:07 -05:00
|
|
|
|
2005-09-04 17:07:59 -04:00
|
|
|
M: %inc-d generate-node ( vop -- ) ESI (%inc) ;
|
|
|
|
|
|
|
|
M: %inc-r generate-node ( vop -- ) EBX (%inc) ;
|
2005-01-06 21:42:07 -05:00
|
|
|
|
2005-05-06 18:33:40 -04:00
|
|
|
M: %immediate generate-node ( vop -- )
|
2005-09-08 22:23:54 -04:00
|
|
|
dup 0 vop-out v>operand swap 0 vop-in address MOV ;
|
2005-01-06 21:42:07 -05:00
|
|
|
|
2005-05-07 22:39:00 -04:00
|
|
|
: load-indirect ( dest literal -- )
|
2005-05-13 18:27:18 -04:00
|
|
|
intern-literal unit MOV 0 0 rel-address ;
|
2005-05-07 22:39:00 -04:00
|
|
|
|
2005-05-06 18:33:40 -04:00
|
|
|
M: %indirect generate-node ( vop -- )
|
|
|
|
#! indirect load of a literal through a table
|
2005-09-08 22:23:54 -04:00
|
|
|
dup 0 vop-out v>operand swap 0 vop-in load-indirect ;
|