SYMBOLS: int-reg-reps float-reg-reps ;
-: record-reg-reps ( reps -- reps )
- dup ! reps: { { reg-rep on-stack? odd-register? } ... }
- [ [ [ first int-rep? ] [ second not ] bi and ] count int-reg-reps +@ ]
- [ [ [ first int-rep? not ] [ second not ] bi and ] count float-reg-reps +@ ]
- bi ;
+: reg-reps ( reps -- int-reps float-reps )
+ [ second ] reject [ [ first int-rep? ] count ] [ length over - ] bi ;
+
+: record-reg-reps ( reps -- reps )
+ dup reg-reps [ int-reg-reps +@ ] [ float-reg-reps +@ ] bi* ;
: unrecord-reg-reps ( reps -- reps )
- dup
- [ [ [ first int-rep? ] [ second not ] bi and ] count -1 * int-reg-reps +@ ]
- [ [ [ first int-rep? not ] [ second not ] bi and ] count -1 * float-reg-reps +@ ]
- bi ;
-
+ dup reg-reps [ neg int-reg-reps +@ ] [ neg float-reg-reps +@ ] bi* ;
+
GENERIC: flatten-c-type ( c-type -- pairs )
M: c-type flatten-c-type
f f 3array
] map :> reps
int-reg-reps get float-reg-reps get and [
- reps [ first int-rep? ] count :> int-mems
- reps length int-mems - :> float-mems
+ reps reg-reps :> ( int-mems float-mems )
int-reg-reps get int-mems + 6 >
float-reg-reps get float-mems + 8 > or [
reps [ first t f 3array ] map
M: x86.64 flatten-struct-type ( c-type -- seq )
dup heap-size 16 <=
[ flatten-small-struct record-reg-reps ] [
- call-next-method [ first t f 3array ] map
- unrecord-reg-reps
+ call-next-method unrecord-reg-reps
+ [ first t f 3array ] map
] if ;
M: x86.64 return-struct-in-registers? ( c-type -- ? )