diff --git a/basis/compiler/cfg/builder/alien/boxing/boxing.factor b/basis/compiler/cfg/builder/alien/boxing/boxing.factor index dd50feb4a7..075a2df084 100644 --- a/basis/compiler/cfg/builder/alien/boxing/boxing.factor +++ b/basis/compiler/cfg/builder/alien/boxing/boxing.factor @@ -12,18 +12,15 @@ SYMBOL: struct-return-area 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 diff --git a/basis/cpu/x86/64/unix/unix.factor b/basis/cpu/x86/64/unix/unix.factor index caef383769..f5df862848 100644 --- a/basis/cpu/x86/64/unix/unix.factor +++ b/basis/cpu/x86/64/unix/unix.factor @@ -31,8 +31,7 @@ M: x86.64 reserved-stack-space 0 ; 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 @@ -42,8 +41,8 @@ M: x86.64 reserved-stack-space 0 ; 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 -- ? )