This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
vsc e5f4633c39 This commit was generated by cvs2svn to compensate for changes in r4,
which included commits to RCS files with non-trunk default branches.


git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@5 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
2001-04-09 19:54:03 +00:00

215 lines
4.6 KiB
Plaintext

divert(-1) # don t output this trash to C
# Preprocessor for i386 linux
# a macro to get the hd of a list
define(m4_hd,`ifelse(index(`$1',`,'),-1,`substr(`$1',1,eval(len(`$1')-2))',dnl
`substr(`$1',1,decr(index(`$1',`,')))')')
# a macro to get the tail of a list
define(m4_tl,`ifelse(index(`$1',`,'),-1,`',dnl
`(substr(`$1',incr(index(`$1',`,')))')')
#macros to split a string
define(substr_up_to,`substr($1,0,index($1,$2))')
define(substr_after,`substr($1,incr(index($1,$2)))')
# a macro to iterate over members of a list
define(`foreach',dnl
`pushdef(`$1',m4_hd(`$2'))_foreach(`$1',m4_tl(`$2'),`$3')popdef(`$1')')
define(`_foreach',`$3'`ifelse($2,`',,dnl
`define(`$1',m4_hd($2))_foreach(`$1',m4_tl(`$2'),`$3')')')
define(`m4_rev',`ifelse($#,0,,$#,1,``$1'',`m4_rev(shift($@)),`$1'')')
# same as above but backwards
define(`foreachb',`foreach(`$1',(m4_rev$2),`$3')')
# macros to process an absmi definition
define(defami, `define(`m4_i_of',m4_opcode_size)'`define(`m4_ami_args',(shift($*)))'
`$1:ifelse($2,`',`',
`foreach(`argspec',(shift($*)),`m4_arg(substr_up_to(argspec,:),substr_after(argspec,:))')')m4_redef(InstructionSize,m4_i_of)')
define(endami,
`foreach(`argspec',m4_ami_args,`m4_endami(substr_up_to(argspec,:))')'`#undef InstructionSize')
define(m4_endami,`ifelse($1,,,#undef $1
)')
define(m4_arg,`m4_redef($1,(*(($2 *) (S_P+m4_i_of))))define(`m4_i_of',eval(m4_i_of+m4_$2_size))')
define(m4_redef,`
`#define' $1 $2')
#define a multiple push operation
define(multiple_push,`define(`m4_i',eval($#-1))$1 -= m4_i foreach(`m4arg',(shift($*)),`m4_push1($1,`m4arg')')')
define(m4_push1,`define(`m4_i',eval(m4_i-1))ifelse(m4arg,dummy,,`;
$1[m4_i] = (CELL) m4arg ')')
define(m4_n_args,`define(`m4_n',$#)')
#define a multiple pop operation
define(multiple_pop,`define(`m4_i',0)foreachb(`m4arg',(shift($*)),`m4_pop1($1)')$1 += m4_i')
define(multiple_restore,`define(`m4_i',0)foreachb(`m4arg',(shift($*)),`m4_restore1($1)')')
define(multiple_shorten,`define(`m4_i',-1)foreach(`m4arg',(shift($*)),`m4_shorten1($1)')')
define(m4_pop1,`ifelse(m4arg,dummy,,`m4arg = (typeof(m4arg)) $1[m4_i];
')define(`m4_i',eval(m4_i+1))')
define(m4_restore1,`ifelse(m4arg,dummy,,`m4arg = (typeof(m4arg)) $1[m4_i];
')define(`m4_i',eval(m4_i+1))')
define(m4_shorten1,`ifelse(m4arg,dummy,,`m4arg = (typeof(m4arg)) $1[m4_i];
')define(`m4_i',eval(m4_i-1))')
# these are machine dependent
define(m4_reg_size,4)
define(m4_small_size,4)
define(m4_long_size,4)
define(m4_opcode_size,4)
define(ShadowRegister,`
define(shadow_$1)
#define LoadShadow_$1 S_$1 = (typeof(S_$1)) $1;
#define StoreShadow_$1 $1 = (typeof($1))S_$1;
')
define(ShadowRegisterDeclarations,
`ifdef(shadow_P,,` register char *S_P;
')'
`ifdef(shadow_Y,,` register CELL *S_Y;
')
')
define(DerefA, dnl (ptr,NonVarCase,VarCase)
`` {
register CELL *VarValue = (CELL *)$1, NonVarValue;
while(1) {
if(IsVarTerm(NonVarValue = *VarValue) ) {
if(NonVarValue == (CELL) VarValue) {
$3;
break;
}
VarValue = (CELL *) NonVarValue;
} else {
$2;
break;
}
}
}'')
define(DerefD, dnl (data,NonVarCase,VarCase)
``{
register CELL *VarValue, NonVarValue=(CELL) $1;
while(1) {
if(IsVarTerm(NonVarValue)) {
NonVarValue = *(VarValue = (CELL *) NonVarValue);
if(NonVarValue == (CELL) VarValue) {
$3;
break;
}
} else {
$2;
break;
}
}
}'')
define(DerefD1, dnl (data,NonVarCase,VarCase)
`` {
register CELL *VarValue1, NonVarValue1=(CELL) $1;
while(1) {
if(IsVarTerm(NonVarValue1)) {
NonVarValue1 = *(VarValue1 = (CELL *) NonVarValue1);
if(NonVarValue1 == (CELL) VarValue1) {
$3;
break;
}
} else {
$2;
break;
}
}
}'')
define(DerefI, dnl (data,NonVarCase,VarCase)
``{
register CELL *VarValue;
I_R=(CELL) $1;
while(1) {
if(IsVarTerm(I_R)) {
I_R = *(VarValue = (CELL *) I_R);
if(I_R == (CELL) VarValue) {
$3;
break;
}
}
else { $2; break; }
}
}'')
divert
#define Y YENV
ShadowRegister(P)
ShadowRegister(Y)
#define shadow_all() \
TestCount = 0; \
LoadShadow_P; \
LoadShadow_Y; \
#define unshadow_all() \
StoreShadow_P; \
StoreShadow_Y;
#ifndef LoadShadow_CP
#define S_CP CP
#endif
#ifndef LoadShadow_ENV
#define S_ENV ENV
#endif
#ifndef LoadShadow_B
#define S_B B
#endif
#ifndef LoadShadow_H
#define S_H H
#endif
#ifndef LoadShadow_TR
#define S_TR TR
#endif
#ifndef LoadShadow_N
#define S_N N
#endif
#ifndef LoadShadow_BH
#define LoadShadow_BH(X) HB = (CELL *) X
#define S_BH HB
#endif
#ifndef LoadShadow_S
#define LoadShadow_S()
#define S_S S
#endif
#define CHECK(B) if(--TestCount <= 0) { TestCount=10; B }
#define ENSURECHECK() TestCount=1
#define small long
#define reg long