]> gitweb.factorcode.org Git - factor.git/commitdiff
unix.factor: Bug fix etc., boxing.factor: Improves record/unrecord-reps 2235/head
authorkusumotonorio <47816570+kusumotonorio@users.noreply.github.com>
Thu, 23 Jan 2020 11:02:03 +0000 (20:02 +0900)
committerkusumotonorio <47816570+kusumotonorio@users.noreply.github.com>
Thu, 23 Jan 2020 11:02:03 +0000 (20:02 +0900)
basis/compiler/cfg/builder/alien/boxing/boxing.factor
basis/cpu/x86/64/unix/unix.factor

index dd50feb4a7b46c3234d61182186f0ffe2fce5390..075a2df0847f3abc97763e8649224dcbd2bf6377 100644 (file)
@@ -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
index caef383769add90c53464719eb15ea455fa42268..f5df862848f6e3e1b013465edcc352da6fd53776 100644 (file)
@@ -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 -- ? )