From 5400b41bce4ad6a4430098a0a35e468360b8e6fd Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 13 Nov 2012 10:23:04 -0700 Subject: [PATCH] add `unsafe-cons-pair' Also, make `list?' more optimistic about checking is the "is list?" flag on a pair. --- collects/scribblings/reference/unsafe.scrbl | 6 + doc/release-notes/racket/HISTORY.txt | 3 + src/racket/include/mzwin.def | 1 + src/racket/include/mzwin3m.def | 1 + src/racket/include/racket.exp | 1 + src/racket/include/racket3m.exp | 1 + src/racket/src/cstartup.inc | 191 ++++++++++---------- src/racket/src/jit.h | 4 +- src/racket/src/jitcommon.c | 2 +- src/racket/src/jitinline.c | 95 +++++++--- src/racket/src/list.c | 62 +++++-- src/racket/src/optimize.c | 5 +- src/racket/src/schemef.h | 1 + src/racket/src/schemex.h | 1 + src/racket/src/schemex.inc | 1 + src/racket/src/schemexm.h | 1 + src/racket/src/schminc.h | 2 +- src/racket/src/schpriv.h | 1 + src/racket/src/schvers.h | 4 +- 19 files changed, 241 insertions(+), 142 deletions(-) diff --git a/collects/scribblings/reference/unsafe.scrbl b/collects/scribblings/reference/unsafe.scrbl index 29ad00ec32..165a5b8833 100644 --- a/collects/scribblings/reference/unsafe.scrbl +++ b/collects/scribblings/reference/unsafe.scrbl @@ -192,6 +192,12 @@ Unsafe variants of @racket[car], @racket[cdr], @racket[mcar], @racket[mcdr], @racket[set-mcar!], and @racket[set-mcdr!].} +@defproc[(unsafe-cons [v any/c] [rest list?]) (and/c pair? list?)]{ + +Unsafe variant of @racket[cons] that produces a pair that claims to be +a list---without checking whether @racket[rest] is a list.} + + @deftogether[( @defproc[(unsafe-list-ref [lst pair?] [pos (and/c exact-nonnegative-integer? fixnum?)]) any/c] @defproc[(unsafe-list-tail [lst any/c] [pos (and/c exact-nonnegative-integer? fixnum?)]) any/c] diff --git a/doc/release-notes/racket/HISTORY.txt b/doc/release-notes/racket/HISTORY.txt index 5cf717187d..10cd4a83e4 100644 --- a/doc/release-notes/racket/HISTORY.txt +++ b/doc/release-notes/racket/HISTORY.txt @@ -1,3 +1,6 @@ +Version 5.3.1.6 +racket/unsafe/ops: added unsafe-cons-list + Version 5.3.1.5 racket/gui: added get-current-mouse-state diff --git a/src/racket/include/mzwin.def b/src/racket/include/mzwin.def index c2ca31989d..cb266a247e 100644 --- a/src/racket/include/mzwin.def +++ b/src/racket/include/mzwin.def @@ -271,6 +271,7 @@ EXPORTS scheme_prim_is_method scheme_make_pair scheme_make_mutable_pair + scheme_make_list_pair scheme_make_raw_pair scheme_make_byte_string scheme_make_sized_byte_string diff --git a/src/racket/include/mzwin3m.def b/src/racket/include/mzwin3m.def index 14d32513ce..d91c8da937 100644 --- a/src/racket/include/mzwin3m.def +++ b/src/racket/include/mzwin3m.def @@ -286,6 +286,7 @@ EXPORTS scheme_prim_is_method scheme_make_pair scheme_make_mutable_pair + scheme_make_list_pair scheme_make_raw_pair scheme_make_byte_string scheme_make_sized_byte_string diff --git a/src/racket/include/racket.exp b/src/racket/include/racket.exp index 96a6ec3778..5afc5c6a5e 100644 --- a/src/racket/include/racket.exp +++ b/src/racket/include/racket.exp @@ -288,6 +288,7 @@ scheme_make_closed_prim_w_everything scheme_prim_is_method scheme_make_pair scheme_make_mutable_pair +scheme_make_list_pair scheme_make_raw_pair scheme_make_byte_string scheme_make_sized_byte_string diff --git a/src/racket/include/racket3m.exp b/src/racket/include/racket3m.exp index b45f182381..3a5be64751 100644 --- a/src/racket/include/racket3m.exp +++ b/src/racket/include/racket3m.exp @@ -294,6 +294,7 @@ scheme_make_closed_prim_w_everything scheme_prim_is_method scheme_make_pair scheme_make_mutable_pair +scheme_make_list_pair scheme_make_raw_pair scheme_make_byte_string scheme_make_sized_byte_string diff --git a/src/racket/src/cstartup.inc b/src/racket/src/cstartup.inc index 769f9e02b5..ef10ea5f1b 100644 --- a/src/racket/src/cstartup.inc +++ b/src/racket/src/cstartup.inc @@ -1,5 +1,5 @@ { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,49,46,53,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,49,46,54,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,51,0,0,0,1,0,0,10,0,14,0, 21,0,28,0,33,0,37,0,40,0,45,0,58,0,62,0,67,0,74,0,83, 0,87,0,93,0,107,0,121,0,124,0,130,0,134,0,136,0,147,0,149,0, @@ -27,32 +27,32 @@ 248,22,106,201,27,248,22,163,4,195,249,22,156,4,80,158,39,36,251,22,89, 2,18,248,22,104,199,249,22,79,2,19,248,22,106,201,12,27,248,22,81,248, 22,163,4,196,28,248,22,87,193,20,14,159,37,36,37,28,248,22,87,248,22, -81,194,248,22,163,17,193,249,22,156,4,80,158,39,36,251,22,89,2,18,248, -22,163,17,199,249,22,79,2,6,248,22,164,17,201,11,18,100,10,13,16,6, +81,194,248,22,164,17,193,249,22,156,4,80,158,39,36,251,22,89,2,18,248, +22,164,17,199,249,22,79,2,6,248,22,165,17,201,11,18,100,10,13,16,6, 36,2,14,2,2,11,11,11,8,32,8,31,8,30,8,29,16,4,11,11,2, 20,3,1,8,101,110,118,49,55,51,51,57,16,4,11,11,2,21,3,1,8, 101,110,118,49,55,51,52,48,27,248,22,81,248,22,163,4,196,28,248,22,87, -193,20,14,159,37,36,37,28,248,22,87,248,22,81,194,248,22,163,17,193,249, +193,20,14,159,37,36,37,28,248,22,87,248,22,81,194,248,22,164,17,193,249, 22,156,4,80,158,39,36,250,22,89,2,22,248,22,89,249,22,89,248,22,89, -2,23,248,22,163,17,201,251,22,89,2,18,2,23,2,23,249,22,79,2,7, -248,22,164,17,204,18,100,11,13,16,6,36,2,14,2,2,11,11,11,8,32, +2,23,248,22,164,17,201,251,22,89,2,18,2,23,2,23,249,22,79,2,7, +248,22,165,17,204,18,100,11,13,16,6,36,2,14,2,2,11,11,11,8,32, 8,31,8,30,8,29,16,4,11,11,2,20,3,1,8,101,110,118,49,55,51, 52,50,16,4,11,11,2,21,3,1,8,101,110,118,49,55,51,52,51,248,22, 163,4,193,27,248,22,163,4,194,249,22,79,248,22,89,248,22,80,196,248,22, -164,17,195,27,248,22,81,248,22,163,4,23,197,1,249,22,156,4,80,158,39, +165,17,195,27,248,22,81,248,22,163,4,23,197,1,249,22,156,4,80,158,39, 36,28,248,22,64,248,22,157,4,248,22,80,23,198,2,27,249,22,2,32,0, 88,163,8,36,37,43,11,9,222,33,40,248,22,163,4,248,22,104,23,200,2, -250,22,89,2,24,248,22,89,249,22,89,248,22,89,248,22,163,17,23,204,2, +250,22,89,2,24,248,22,89,249,22,89,248,22,89,248,22,164,17,23,204,2, 250,22,90,2,25,249,22,2,22,80,23,204,2,248,22,106,23,206,2,249,22, -79,248,22,163,17,23,202,1,249,22,2,22,104,23,200,1,250,22,90,2,22, +79,248,22,164,17,23,202,1,249,22,2,22,104,23,200,1,250,22,90,2,22, 249,22,2,32,0,88,163,8,36,37,47,11,9,222,33,41,248,22,163,4,248, -22,163,17,201,248,22,164,17,198,27,248,22,163,4,194,249,22,79,248,22,89, -248,22,80,196,248,22,164,17,195,27,248,22,81,248,22,163,4,23,197,1,249, +22,164,17,201,248,22,165,17,198,27,248,22,163,4,194,249,22,79,248,22,89, +248,22,80,196,248,22,165,17,195,27,248,22,81,248,22,163,4,23,197,1,249, 22,156,4,80,158,39,36,250,22,90,2,24,249,22,2,32,0,88,163,8,36, -37,47,11,9,222,33,43,248,22,163,4,248,22,80,201,248,22,164,17,198,27, +37,47,11,9,222,33,43,248,22,163,4,248,22,80,201,248,22,165,17,198,27, 248,22,81,248,22,163,4,196,27,248,22,163,4,248,22,80,195,249,22,156,4, 80,158,40,36,28,248,22,87,195,250,22,90,2,22,9,248,22,81,199,250,22, -89,2,10,248,22,89,248,22,80,199,250,22,90,2,5,248,22,164,17,201,248, +89,2,10,248,22,89,248,22,80,199,250,22,90,2,5,248,22,165,17,201,248, 22,81,202,27,248,22,81,248,22,163,4,23,197,1,27,249,22,1,22,93,249, 22,2,22,163,4,248,22,163,4,248,22,80,199,248,22,183,4,249,22,156,4, 80,158,41,36,251,22,89,1,22,119,105,116,104,45,99,111,110,116,105,110,117, @@ -65,15 +65,15 @@ 9,62,61,62,248,22,157,4,248,22,104,196,250,22,89,2,22,248,22,89,249, 22,89,21,93,2,27,248,22,80,199,250,22,90,2,11,249,22,89,2,27,249, 22,89,248,22,113,203,2,27,248,22,81,202,251,22,89,2,18,28,249,22,152, -9,248,22,157,4,248,22,80,200,64,101,108,115,101,10,248,22,163,17,197,250, -22,90,2,22,9,248,22,164,17,200,249,22,79,2,11,248,22,81,202,99,13, +9,248,22,157,4,248,22,80,200,64,101,108,115,101,10,248,22,164,17,197,250, +22,90,2,22,9,248,22,165,17,200,249,22,79,2,11,248,22,81,202,99,13, 16,6,36,2,14,2,2,11,11,11,8,32,8,31,8,30,8,29,16,4,11, 11,2,20,3,1,8,101,110,118,49,55,51,54,53,16,4,11,11,2,21,3, 1,8,101,110,118,49,55,51,54,54,18,158,94,10,64,118,111,105,100,8,48, 27,248,22,81,248,22,163,4,196,249,22,156,4,80,158,39,36,28,248,22,64, -248,22,157,4,248,22,80,197,250,22,89,2,28,248,22,89,248,22,163,17,199, -248,22,104,198,27,248,22,157,4,248,22,163,17,197,250,22,89,2,28,248,22, -89,248,22,80,197,250,22,90,2,25,248,22,164,17,199,248,22,164,17,202,159, +248,22,157,4,248,22,80,197,250,22,89,2,28,248,22,89,248,22,164,17,199, +248,22,104,198,27,248,22,157,4,248,22,164,17,197,250,22,89,2,28,248,22, +89,248,22,80,197,250,22,90,2,25,248,22,165,17,199,248,22,165,17,202,159, 36,20,113,159,36,16,1,11,16,0,20,26,149,9,2,1,2,1,2,2,9, 9,11,11,11,10,36,80,158,36,36,20,113,159,36,16,0,16,0,38,39,36, 16,0,36,16,0,36,11,11,11,16,10,2,3,2,4,2,5,2,6,2,7, @@ -100,7 +100,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 2048); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,49,46,53,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,49,46,54,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,126,0,0,0,1,0,0,8,0,21,0, 26,0,43,0,55,0,77,0,106,0,121,0,139,0,151,0,167,0,181,0,203, 0,219,0,236,0,2,1,13,1,19,1,28,1,35,1,42,1,54,1,70,1, @@ -343,7 +343,7 @@ 115,105,111,110,248,22,191,5,193,28,248,22,88,23,194,2,28,28,249,22,191, 3,38,248,22,92,23,196,2,10,249,22,191,3,39,248,22,92,23,196,2,28, 28,248,22,142,7,248,22,80,23,195,2,10,249,22,152,9,64,114,111,111,116, -248,22,163,17,23,196,2,28,27,248,22,104,194,28,248,22,184,14,23,194,2, +248,22,164,17,23,196,2,28,27,248,22,104,194,28,248,22,184,14,23,194,2, 10,28,248,22,142,7,23,194,2,28,248,22,142,15,23,194,2,10,248,22,143, 15,23,194,1,11,27,248,22,87,248,22,106,195,28,192,192,248,22,186,15,248, 22,113,195,11,11,11,11,250,22,158,2,196,197,249,22,79,197,200,28,28,248, @@ -351,7 +351,7 @@ 160,8,27,248,22,147,15,249,22,145,15,248,22,104,23,200,2,23,198,1,28, 248,22,64,248,22,80,23,198,2,86,94,23,196,1,86,94,28,250,22,160,2, 196,11,11,12,250,22,158,2,196,11,9,249,22,164,2,195,88,163,8,36,38, -50,11,9,224,3,2,33,94,27,248,22,67,248,22,163,17,23,199,1,250,22, +50,11,9,224,3,2,33,94,27,248,22,67,248,22,164,17,23,199,1,250,22, 158,2,23,198,2,23,196,2,249,22,79,248,22,131,2,23,200,1,250,22,160, 2,23,203,1,23,201,1,9,12,250,22,158,2,195,196,248,22,94,198,20,13, 159,80,159,37,58,37,88,163,36,37,54,8,240,0,144,0,0,9,225,1,0, @@ -392,11 +392,11 @@ 102,88,163,8,36,37,47,11,2,41,222,33,105,32,103,88,163,36,37,43,11, 69,116,111,45,115,116,114,105,110,103,222,33,104,28,248,22,184,14,193,248,22, 188,14,193,192,28,248,22,87,248,22,81,23,195,2,248,22,89,248,2,103,248, -22,163,17,23,196,1,250,22,90,248,2,103,248,22,163,17,23,198,2,2,50, -248,2,102,248,22,164,17,23,198,1,249,22,190,7,2,51,194,32,107,88,163, +22,164,17,23,196,1,250,22,90,248,2,103,248,22,164,17,23,198,2,2,50, +248,2,102,248,22,165,17,23,198,1,249,22,190,7,2,51,194,32,107,88,163, 36,38,48,11,66,102,105,108,116,101,114,222,33,108,28,248,22,87,23,195,2, -9,28,248,23,194,2,248,22,80,23,196,2,249,22,79,248,22,163,17,23,197, -2,249,2,107,23,197,1,248,22,164,17,23,199,1,249,2,107,194,248,22,164, +9,28,248,23,194,2,248,22,80,23,196,2,249,22,79,248,22,164,17,23,197, +2,249,2,107,23,197,1,248,22,165,17,23,199,1,249,2,107,194,248,22,165, 17,196,249,22,190,7,2,51,248,22,134,2,23,196,1,28,248,22,87,23,199, 2,86,94,23,198,1,28,23,199,2,28,196,249,22,138,15,200,198,198,27,28, 248,22,87,23,197,2,2,49,249,22,1,22,165,7,248,2,102,23,199,2,248, @@ -581,34 +581,37 @@ EVAL_ONE_SIZED_STR((char *)expr, 10019); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,49,46,53,84,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,12,0,0,0,1,0,0,15,0,40,0, -57,0,75,0,97,0,120,0,140,0,162,0,169,0,176,0,183,0,0,0,179, -1,0,0,74,35,37,112,108,97,99,101,45,115,116,114,117,99,116,1,23,115, -116,114,117,99,116,58,84,72,45,112,108,97,99,101,45,99,104,97,110,110,101, -108,76,84,72,45,112,108,97,99,101,45,99,104,97,110,110,101,108,77,84,72, -45,112,108,97,99,101,45,99,104,97,110,110,101,108,63,1,20,84,72,45,112, -108,97,99,101,45,99,104,97,110,110,101,108,45,114,101,102,1,21,84,72,45, -112,108,97,99,101,45,99,104,97,110,110,101,108,45,115,101,116,33,79,84,72, -45,112,108,97,99,101,45,99,104,97,110,110,101,108,45,105,110,1,20,84,72, -45,112,108,97,99,101,45,99,104,97,110,110,101,108,45,111,117,116,249,80,158, -38,39,195,36,249,80,158,38,39,195,36,249,80,158,38,39,195,37,159,36,20, -113,159,36,16,1,11,16,0,20,26,144,9,2,1,2,1,29,11,11,11,9, -9,11,11,11,10,45,80,158,36,36,20,113,159,36,16,7,2,2,2,3,2, -4,2,5,2,6,2,7,2,8,16,0,37,39,36,16,0,36,16,2,2,5, -2,6,38,11,11,11,16,5,2,3,2,7,2,8,2,4,2,2,16,5,11, -11,11,11,11,16,5,2,3,2,7,2,8,2,4,2,2,41,41,37,12,11, -11,16,0,16,0,16,0,36,36,11,12,11,11,16,0,16,0,16,0,36,36, -16,2,20,15,16,6,253,22,135,11,2,3,11,38,36,11,248,22,89,249,22, -79,22,186,10,88,163,36,37,45,44,9,223,9,33,9,80,159,36,36,37,80, -159,36,37,37,80,159,36,38,37,80,159,36,39,37,80,159,36,40,37,20,15, -16,3,249,22,7,88,163,36,37,45,44,9,223,2,33,10,88,163,36,37,45, -44,9,223,2,33,11,80,159,36,41,37,80,159,36,42,37,93,29,94,65,113, -117,111,116,101,68,35,37,107,101,114,110,101,108,11,9,9,9,36,0}; - EVAL_ONE_SIZED_STR((char *)expr, 501); + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,49,46,54,84,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,14,0,0,0,1,0,0,15,0,40,0, +57,0,75,0,97,0,120,0,140,0,162,0,169,0,176,0,183,0,190,0,197, +0,0,0,222,1,0,0,74,35,37,112,108,97,99,101,45,115,116,114,117,99, +116,1,23,115,116,114,117,99,116,58,84,72,45,112,108,97,99,101,45,99,104, +97,110,110,101,108,76,84,72,45,112,108,97,99,101,45,99,104,97,110,110,101, +108,77,84,72,45,112,108,97,99,101,45,99,104,97,110,110,101,108,63,1,20, +84,72,45,112,108,97,99,101,45,99,104,97,110,110,101,108,45,114,101,102,1, +21,84,72,45,112,108,97,99,101,45,99,104,97,110,110,101,108,45,115,101,116, +33,79,84,72,45,112,108,97,99,101,45,99,104,97,110,110,101,108,45,105,110, +1,20,84,72,45,112,108,97,99,101,45,99,104,97,110,110,101,108,45,111,117, +116,249,80,158,38,39,195,36,249,80,158,38,39,195,36,249,80,158,38,39,195, +36,249,80,158,38,39,195,37,249,80,158,38,39,195,37,159,36,20,113,159,36, +16,1,11,16,0,20,26,144,9,2,1,2,1,29,11,11,11,9,9,11,11, +11,10,45,80,158,36,36,20,113,159,36,16,7,2,2,2,3,2,4,2,5, +2,6,2,7,2,8,16,0,37,39,36,16,0,36,16,2,2,5,2,6,38, +11,11,11,16,5,2,3,2,7,2,8,2,4,2,2,16,5,11,11,11,11, +11,16,5,2,3,2,7,2,8,2,4,2,2,41,41,37,12,11,11,16,0, +16,0,16,0,36,36,11,12,11,11,16,0,16,0,16,0,36,36,16,3,20, +15,16,6,253,22,135,11,2,3,11,38,36,11,248,22,89,249,22,79,22,186, +10,88,163,36,37,45,44,9,223,9,33,9,80,159,36,36,37,80,159,36,37, +37,80,159,36,38,37,80,159,36,39,37,80,159,36,40,37,20,15,16,2,20, +27,158,88,163,36,37,45,44,9,223,0,33,10,88,163,36,37,45,44,9,223, +0,33,11,80,159,36,41,37,20,15,16,2,20,27,158,88,163,36,37,45,44, +9,223,0,33,12,88,163,36,37,45,44,9,223,0,33,13,80,159,36,42,37, +93,29,94,65,113,117,111,116,101,68,35,37,107,101,114,110,101,108,11,9,9, +9,36,0}; + EVAL_ONE_SIZED_STR((char *)expr, 548); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,49,46,53,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,49,46,54,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,89,0,0,0,1,0,0,7,0,18,0, 45,0,51,0,60,0,67,0,89,0,102,0,128,0,145,0,167,0,175,0,187, 0,202,0,218,0,236,0,0,1,12,1,28,1,51,1,63,1,94,1,101,1, @@ -682,7 +685,7 @@ 97,116,104,45,115,116,114,105,110,103,63,23,197,2,28,28,23,195,2,28,248, 22,64,23,196,2,10,28,248,22,88,23,196,2,28,249,22,129,4,248,22,92, 23,198,2,37,28,28,248,22,64,248,22,80,23,197,2,10,248,22,150,9,248, -22,163,17,23,197,2,249,22,4,22,64,248,22,164,17,23,198,2,11,11,11, +22,164,17,23,197,2,249,22,4,22,64,248,22,165,17,23,198,2,11,11,11, 10,12,250,22,189,9,2,26,6,71,71,40,111,114,47,99,32,35,102,32,115, 121,109,98,111,108,63,32,40,99,111,110,115,47,99,32,40,111,114,47,99,32, 35,102,32,115,121,109,98,111,108,63,41,32,40,110,111,110,45,101,109,112,116, @@ -750,7 +753,7 @@ 11,80,159,8,32,38,37,22,189,4,11,20,13,159,80,159,8,27,38,37,250, 80,159,8,30,39,37,249,22,33,11,80,159,8,32,38,37,22,172,5,28,248, 22,184,14,23,218,2,23,217,1,86,94,23,217,1,247,22,161,15,249,247,22, -170,5,248,22,163,17,195,23,31,86,94,23,193,1,27,28,23,197,1,28,23, +170,5,248,22,164,17,195,23,31,86,94,23,193,1,27,28,23,197,1,28,23, 201,1,27,249,22,5,20,20,95,88,163,36,37,48,8,128,3,9,226,31,26, 25,22,33,53,23,215,1,23,219,1,23,220,1,27,28,23,205,2,11,193,28, 192,192,28,193,28,204,28,249,22,131,4,248,22,81,196,248,22,81,23,15,193, @@ -761,9 +764,9 @@ 28,38,37,250,80,159,8,31,39,37,249,22,33,11,80,159,8,33,38,37,22, 189,4,23,217,1,20,13,159,80,159,8,28,38,37,250,80,159,8,31,39,37, 249,22,33,11,80,159,8,33,38,37,22,172,5,28,248,22,184,14,23,219,2, -23,218,1,86,94,23,218,1,247,22,161,15,249,247,22,170,5,248,22,163,17, +23,218,1,86,94,23,218,1,247,22,161,15,249,247,22,170,5,248,22,164,17, 195,23,32,86,94,23,193,1,28,28,248,22,77,23,224,32,0,0,0,2,248, -22,163,17,23,224,32,0,0,0,2,10,27,28,23,199,2,86,94,23,215,1, +22,164,17,23,224,32,0,0,0,2,10,27,28,23,199,2,86,94,23,215,1, 23,214,1,86,94,23,214,1,23,215,1,28,28,248,22,77,23,224,33,0,0, 0,2,248,22,150,9,248,22,132,15,23,195,2,11,12,20,13,159,80,159,8, 29,38,37,250,80,159,8,32,39,37,249,22,33,11,80,159,8,34,38,37,22, @@ -787,13 +790,13 @@ 193,2,86,94,23,194,1,249,22,79,248,22,104,23,196,2,248,2,59,248,22, 113,23,197,1,248,22,89,194,248,22,89,194,248,22,89,194,248,22,89,194,32, 61,88,163,36,37,55,11,2,31,222,33,62,28,248,22,87,248,22,81,23,195, -2,249,22,7,9,248,22,163,17,195,90,159,38,11,89,161,38,36,11,27,248, -22,164,17,196,28,248,22,87,248,22,81,23,195,2,249,22,7,9,248,22,163, -17,195,90,159,38,11,89,161,38,36,11,27,248,22,164,17,196,28,248,22,87, -248,22,81,23,195,2,249,22,7,9,248,22,163,17,195,90,159,38,11,89,161, -38,36,11,248,2,61,248,22,164,17,196,249,22,7,249,22,79,248,22,163,17, -199,196,195,249,22,7,249,22,79,248,22,163,17,199,196,195,249,22,7,249,22, -79,248,22,163,17,199,196,195,27,27,249,22,173,15,2,58,23,197,2,28,23, +2,249,22,7,9,248,22,164,17,195,90,159,38,11,89,161,38,36,11,27,248, +22,165,17,196,28,248,22,87,248,22,81,23,195,2,249,22,7,9,248,22,164, +17,195,90,159,38,11,89,161,38,36,11,27,248,22,165,17,196,28,248,22,87, +248,22,81,23,195,2,249,22,7,9,248,22,164,17,195,90,159,38,11,89,161, +38,36,11,248,2,61,248,22,165,17,196,249,22,7,249,22,79,248,22,164,17, +199,196,195,249,22,7,249,22,79,248,22,164,17,199,196,195,249,22,7,249,22, +79,248,22,164,17,199,196,195,27,27,249,22,173,15,2,58,23,197,2,28,23, 193,2,86,94,23,195,1,249,22,79,248,22,104,23,196,2,27,248,22,113,23, 197,1,27,249,22,173,15,2,58,23,196,2,28,23,193,2,86,94,23,194,1, 249,22,79,248,22,104,23,196,2,27,248,22,113,23,197,1,27,249,22,173,15, @@ -801,20 +804,20 @@ 196,2,27,248,22,113,23,197,1,27,249,22,173,15,2,58,23,196,2,28,23, 193,2,86,94,23,194,1,249,22,79,248,22,104,23,196,2,248,2,59,248,22, 113,23,197,1,248,22,89,194,248,22,89,194,248,22,89,194,248,22,89,195,28, -23,195,1,192,28,248,22,87,248,22,81,23,195,2,249,22,7,9,248,22,163, -17,195,27,248,22,164,17,194,90,159,38,11,89,161,38,36,11,28,248,22,87, -248,22,81,23,197,2,249,22,7,9,248,22,163,17,197,27,248,22,164,17,196, +23,195,1,192,28,248,22,87,248,22,81,23,195,2,249,22,7,9,248,22,164, +17,195,27,248,22,165,17,194,90,159,38,11,89,161,38,36,11,28,248,22,87, +248,22,81,23,197,2,249,22,7,9,248,22,164,17,197,27,248,22,165,17,196, 90,159,38,11,89,161,38,36,11,28,248,22,87,248,22,81,23,197,2,249,22, -7,9,248,22,163,17,197,90,159,38,11,89,161,38,36,11,248,2,61,248,22, -164,17,198,249,22,7,249,22,79,248,22,163,17,201,196,195,249,22,7,249,22, -79,248,22,163,17,202,196,195,249,22,7,249,22,79,248,22,163,17,200,196,195, +7,9,248,22,164,17,197,90,159,38,11,89,161,38,36,11,248,2,61,248,22, +165,17,198,249,22,7,249,22,79,248,22,164,17,201,196,195,249,22,7,249,22, +79,248,22,164,17,202,196,195,249,22,7,249,22,79,248,22,164,17,200,196,195, 28,24,194,2,12,20,13,159,80,159,36,57,37,80,158,36,55,89,161,37,37, 10,249,22,190,4,21,94,2,32,6,19,19,112,108,97,110,101,116,47,114,101, 115,111,108,118,101,114,46,114,107,116,1,27,112,108,97,110,101,116,45,109,111, 100,117,108,101,45,110,97,109,101,45,114,101,115,111,108,118,101,114,12,27,28, 23,195,2,28,249,22,152,9,23,197,2,80,158,39,52,86,94,23,195,1,80, 158,37,53,27,248,22,148,5,23,197,2,27,28,248,22,77,23,195,2,248,22, -163,17,23,195,1,23,194,1,28,248,22,184,14,23,194,2,90,159,39,11,89, +164,17,23,195,1,23,194,1,28,248,22,184,14,23,194,2,90,159,39,11,89, 161,39,36,11,248,22,141,15,23,197,1,86,95,20,18,159,11,80,158,42,52, 199,20,18,159,11,80,158,42,53,192,192,11,11,28,23,193,2,192,86,94,23, 193,1,27,247,22,172,5,28,192,192,247,22,161,15,90,159,39,11,89,161,39, @@ -834,7 +837,7 @@ 22,148,5,23,200,2,248,22,147,5,248,22,80,248,22,148,5,23,201,1,23, 198,1,27,250,22,160,2,80,159,44,41,38,248,22,134,16,23,204,1,11,28, 23,193,2,27,250,22,160,2,248,22,81,23,198,1,197,11,28,192,250,22,158, -2,248,22,164,17,199,197,195,12,12,12,251,211,197,198,199,10,32,71,88,163, +2,248,22,165,17,199,197,195,12,12,12,251,211,197,198,199,10,32,71,88,163, 36,38,47,11,76,102,108,97,116,116,101,110,45,115,117,98,45,112,97,116,104, 222,33,74,32,72,88,163,36,40,54,11,2,31,222,33,73,28,248,22,87,23, 197,2,28,248,22,87,195,192,249,22,79,194,248,22,94,197,28,249,22,154,9, @@ -843,8 +846,8 @@ 46,46,34,115,32,105,110,32,115,117,98,109,111,100,117,108,101,32,112,97,116, 104,58,32,126,46,115,250,22,90,2,34,28,249,22,154,9,23,201,2,2,36, 198,28,248,22,184,14,199,198,249,22,89,28,248,22,64,201,2,4,2,37,200, -199,251,2,72,196,197,248,22,81,199,248,22,164,17,200,251,2,72,196,197,249, -22,79,248,22,163,17,202,200,248,22,164,17,200,251,2,72,196,197,9,197,27, +199,251,2,72,196,197,248,22,81,199,248,22,165,17,200,251,2,72,196,197,249, +22,79,248,22,164,17,202,200,248,22,165,17,200,251,2,72,196,197,9,197,27, 249,22,165,7,6,31,31,115,116,97,110,100,97,114,100,45,109,111,100,117,108, 101,45,110,97,109,101,45,114,101,115,111,108,118,101,114,58,32,196,28,193,250, 22,187,9,11,195,196,248,22,185,9,193,28,249,22,148,7,194,2,36,2,28, @@ -856,7 +859,7 @@ 11,2,31,222,33,81,28,248,22,87,23,194,2,9,250,22,90,6,4,4,10, 32,32,32,248,22,188,14,248,22,105,23,198,2,248,2,80,248,22,81,23,198, 1,28,249,22,154,9,248,22,81,23,200,2,23,197,1,28,249,22,152,9,248, -22,163,17,23,200,1,23,196,1,251,22,185,9,2,22,6,41,41,99,121,99, +22,164,17,23,200,1,23,196,1,251,22,185,9,2,22,6,41,41,99,121,99, 108,101,32,105,110,32,108,111,97,100,105,110,103,10,32,32,97,116,32,112,97, 116,104,58,32,126,97,10,32,32,112,97,116,104,115,58,126,97,23,200,1,249, 22,1,22,165,7,248,2,80,248,22,94,23,201,1,12,12,247,192,20,13,159, @@ -868,47 +871,47 @@ 28,248,22,156,5,23,196,2,12,28,23,197,2,250,22,187,9,11,6,15,15, 98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,23,200,2,250,22,189, 9,2,22,2,33,23,198,2,28,28,248,22,77,23,196,2,249,22,152,9,248, -22,163,17,23,198,2,2,4,11,248,22,147,5,248,22,104,196,28,28,248,22, -77,23,196,2,28,249,22,152,9,248,22,163,17,23,198,2,2,34,28,248,22, +22,164,17,23,198,2,2,4,11,248,22,147,5,248,22,104,196,28,28,248,22, +77,23,196,2,28,249,22,152,9,248,22,164,17,23,198,2,2,34,28,248,22, 77,248,22,104,23,197,2,249,22,152,9,248,22,108,23,198,2,2,4,11,11, 11,86,97,23,198,1,23,197,1,23,196,1,23,193,1,248,22,147,5,249,2, 71,248,22,121,23,199,2,248,22,106,23,199,1,28,28,248,22,77,23,196,2, -28,249,22,152,9,248,22,163,17,23,198,2,2,34,28,28,249,22,154,9,248, +28,249,22,152,9,248,22,164,17,23,198,2,2,34,28,28,249,22,154,9,248, 22,104,23,198,2,2,36,10,249,22,154,9,248,22,104,23,198,2,2,35,28, 23,196,2,27,248,22,148,5,23,198,2,28,248,22,64,193,10,28,248,22,77, -193,248,22,64,248,22,163,17,194,11,11,11,11,11,86,96,23,198,1,23,197, +193,248,22,64,248,22,164,17,194,11,11,11,11,11,86,96,23,198,1,23,197, 1,23,193,1,27,248,22,148,5,23,198,1,248,22,147,5,249,2,71,28,248, -22,77,23,197,2,248,22,163,17,23,197,2,23,196,2,27,28,249,22,154,9, -248,22,104,23,203,2,2,35,248,22,164,17,200,248,22,106,200,28,248,22,77, -23,198,2,249,22,93,248,22,164,17,199,194,192,28,28,248,22,77,23,196,2, -249,22,152,9,248,22,163,17,23,198,2,2,38,11,86,94,248,80,159,38,8, +22,77,23,197,2,248,22,164,17,23,197,2,23,196,2,27,28,249,22,154,9, +248,22,104,23,203,2,2,35,248,22,165,17,200,248,22,106,200,28,248,22,77, +23,198,2,249,22,93,248,22,165,17,199,194,192,28,28,248,22,77,23,196,2, +249,22,152,9,248,22,164,17,23,198,2,2,38,11,86,94,248,80,159,38,8, 28,39,193,253,213,200,201,202,203,11,80,158,43,55,28,28,248,22,77,23,196, -2,28,249,22,152,9,248,22,163,17,23,198,2,2,34,28,248,22,77,248,22, +2,28,249,22,152,9,248,22,164,17,23,198,2,2,34,28,248,22,77,248,22, 104,23,197,2,249,22,152,9,248,22,108,23,198,2,2,38,11,11,11,86,94, 248,80,159,38,8,28,39,193,253,213,248,22,104,201,201,202,203,248,22,106,201, 80,158,43,55,86,94,23,193,1,27,88,163,8,36,37,47,11,79,115,104,111, 119,45,99,111,108,108,101,99,116,105,111,110,45,101,114,114,223,5,33,75,27, -28,248,22,77,23,198,2,28,249,22,152,9,2,34,248,22,163,17,23,200,2, +28,248,22,77,23,198,2,28,249,22,152,9,2,34,248,22,164,17,23,200,2, 27,248,22,104,23,199,2,28,28,249,22,154,9,23,195,2,2,36,10,249,22, 154,9,23,195,2,2,35,86,94,23,193,1,28,23,199,2,27,248,22,148,5, -23,201,2,28,248,22,77,193,248,22,163,17,193,192,250,22,185,9,2,22,6, +23,201,2,28,248,22,77,193,248,22,164,17,193,192,250,22,185,9,2,22,6, 45,45,110,111,32,98,97,115,101,32,112,97,116,104,32,102,111,114,32,114,101, 108,97,116,105,118,101,32,115,117,98,109,111,100,117,108,101,32,112,97,116,104, 58,32,126,46,115,23,201,2,192,23,197,2,23,197,2,27,28,248,22,77,23, -199,2,28,249,22,152,9,2,34,248,22,163,17,23,201,2,27,28,28,28,249, +199,2,28,249,22,152,9,2,34,248,22,164,17,23,201,2,27,28,28,28,249, 22,154,9,248,22,104,23,202,2,2,36,10,249,22,154,9,248,22,104,23,202, 2,2,35,23,200,2,11,27,248,22,148,5,23,202,2,27,28,249,22,154,9, -248,22,104,23,204,2,2,35,248,22,164,17,23,202,1,248,22,106,23,202,1, -28,248,22,77,23,195,2,249,2,71,248,22,163,17,23,197,2,249,22,93,248, -22,164,17,23,199,1,23,197,1,249,2,71,23,196,1,23,195,1,249,2,71, -2,36,28,249,22,154,9,248,22,104,23,204,2,2,35,248,22,164,17,23,202, -1,248,22,106,23,202,1,28,248,22,77,193,248,22,164,17,193,11,11,11,27, +248,22,104,23,204,2,2,35,248,22,165,17,23,202,1,248,22,106,23,202,1, +28,248,22,77,23,195,2,249,2,71,248,22,164,17,23,197,2,249,22,93,248, +22,165,17,23,199,1,23,197,1,249,2,71,23,196,1,23,195,1,249,2,71, +2,36,28,249,22,154,9,248,22,104,23,204,2,2,35,248,22,165,17,23,202, +1,248,22,106,23,202,1,28,248,22,77,193,248,22,165,17,193,11,11,11,27, 28,248,22,64,23,196,2,27,248,80,159,43,48,39,249,22,79,23,199,2,247, 22,162,15,28,23,193,2,192,86,94,23,193,1,90,159,38,11,89,161,38,36, 11,249,80,159,46,54,39,248,22,70,23,201,2,11,27,28,248,22,87,23,195, 2,2,39,249,22,165,7,23,197,2,2,40,251,80,159,49,59,39,23,204,1, 28,248,22,87,23,199,2,23,199,1,86,94,23,199,1,248,22,80,23,199,2, -28,248,22,87,23,199,2,86,94,23,198,1,9,248,22,164,17,23,199,1,23, +28,248,22,87,23,199,2,86,94,23,198,1,9,248,22,165,17,23,199,1,23, 197,1,28,248,22,142,7,23,196,2,86,94,23,196,1,27,248,80,159,43,8, 29,39,23,202,2,27,248,80,159,44,48,39,249,22,79,23,200,2,23,197,2, 28,23,193,2,192,86,94,23,193,1,90,159,38,11,89,161,38,36,11,249,80, @@ -928,7 +931,7 @@ 249,22,1,22,93,249,22,2,80,159,53,8,31,39,248,22,106,23,208,2,23, 197,1,28,248,22,87,23,196,2,86,94,23,195,1,248,22,89,23,197,1,86, 94,23,196,1,23,195,1,251,80,159,51,59,39,23,206,1,248,22,80,23,198, -2,248,22,164,17,23,198,1,23,198,1,28,249,22,152,9,248,22,163,17,23, +2,248,22,165,17,23,198,1,23,198,1,28,249,22,152,9,248,22,164,17,23, 198,2,2,37,248,80,159,42,8,30,39,248,22,147,15,249,22,145,15,248,22, 149,15,248,22,104,23,201,2,248,80,159,46,8,29,39,23,205,2,12,86,94, 28,28,248,22,184,14,23,194,2,10,248,22,167,8,23,194,2,86,94,23,201, @@ -956,7 +959,7 @@ 20,20,96,88,163,36,36,56,8,240,12,64,0,0,9,230,19,15,13,12,8, 7,5,2,33,84,23,195,1,23,198,1,23,208,1,12,28,28,248,22,167,8, 23,204,1,11,28,248,22,142,7,23,206,2,10,28,248,22,64,23,206,2,10, -28,248,22,77,23,206,2,249,22,152,9,248,22,163,17,23,208,2,2,32,11, +28,248,22,77,23,206,2,249,22,152,9,248,22,164,17,23,208,2,2,32,11, 249,80,159,53,49,39,28,248,22,142,7,23,208,2,249,22,79,23,209,1,248, 80,159,56,8,29,39,23,215,1,86,94,23,212,1,249,22,79,23,209,1,247, 22,162,15,252,22,169,8,23,209,1,23,208,1,23,206,1,23,204,1,23,203, @@ -1017,7 +1020,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 8518); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,49,46,53,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,49,46,54,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,11,0,0,0,1,0,0,10,0,16,0, 29,0,44,0,58,0,78,0,90,0,104,0,118,0,170,0,0,0,98,1,0, 0,69,35,37,98,117,105,108,116,105,110,65,113,117,111,116,101,29,94,2,2, diff --git a/src/racket/src/jit.h b/src/racket/src/jit.h index 9213036b28..8299770a8e 100644 --- a/src/racket/src/jit.h +++ b/src/racket/src/jit.h @@ -1228,7 +1228,7 @@ int scheme_generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int int dest); int scheme_generate_inlined_test(mz_jit_state *jitter, Scheme_Object *obj, int branch_short, Branch_Info *for_branch, int need_sync); -int scheme_generate_cons_alloc(mz_jit_state *jitter, int rev, int inline_retry, int dest); +int scheme_generate_cons_alloc(mz_jit_state *jitter, int rev, int inline_retry, int known_list, int dest); int scheme_generate_struct_alloc(mz_jit_state *jitter, int num_args, int inline_slow, int pop_and_jump, int is_tail, int multi_ok, int dest); @@ -1238,7 +1238,7 @@ int scheme_generate_struct_alloc(mz_jit_state *jitter, int num_args, /**********************************************************************/ #ifdef CAN_INLINE_ALLOC -int scheme_inline_alloc(mz_jit_state *jitter, int amt, Scheme_Type ty, int immut, +int scheme_inline_alloc(mz_jit_state *jitter, int amt, Scheme_Type ty, int flags, int keep_r0_r1, int keep_fpr1, int inline_retry); int scheme_generate_alloc_retry(mz_jit_state *jitter, int i); #else diff --git a/src/racket/src/jitcommon.c b/src/racket/src/jitcommon.c index 9ad26f42be..17ee2455a9 100644 --- a/src/racket/src/jitcommon.c +++ b/src/racket/src/jitcommon.c @@ -2168,7 +2168,7 @@ static int common5(mz_jit_state *jitter, void *_data) jit_ldxr_p(JIT_R1, JIT_RUNSTACK, JIT_R2); mz_set_local_p(JIT_R2, JIT_LOCAL3); - scheme_generate_cons_alloc(jitter, 1, 1, JIT_R0); + scheme_generate_cons_alloc(jitter, 1, 1, !i, JIT_R0); CHECK_LIMIT(); mz_get_local_p(JIT_R2, JIT_LOCAL3); diff --git a/src/racket/src/jitinline.c b/src/racket/src/jitinline.c index 3d46e6c331..70afb2cf5d 100644 --- a/src/racket/src/jitinline.c +++ b/src/racket/src/jitinline.c @@ -1053,7 +1053,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in scheme_generate_arith(jitter, rator, app->rand, NULL, 1, 0, CMP_ODDP, 0, for_branch, branch_short, 0, 0, NULL, dest); return 1; } else if (IS_NAMED_PRIM(rator, "list?")) { - GC_CAN_IGNORE jit_insn *ref0, *ref1, *ref3, *ref4; + GC_CAN_IGNORE jit_insn *ref0, *ref1, *ref3, *ref4, *ref6; mz_runstack_skipped(jitter, 1); @@ -1077,11 +1077,16 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in ref4 = jit_bnei_p(jit_forward(), JIT_R1, scheme_pair_type); CHECK_LIMIT(); + /* We have a pair. Optimistically check for PAIR_IS_LIST: */ + jit_ldxi_s(JIT_R2, JIT_R0, &MZ_OPT_HASH_KEY(&((Scheme_Stx *)0x0)->iso)); + ref6 = jit_bmsi_ul(jit_forward(), JIT_R2, PAIR_IS_LIST); + if (for_branch) { ref0 = jit_patchable_movi_p(JIT_V1, jit_forward()); (void)jit_calli(sjc.list_p_branch_code); mz_patch_branch(ref3); + mz_patch_branch(ref6); scheme_add_branch_false_movi(for_branch, ref0); scheme_add_branch_false(for_branch, ref1); @@ -1100,6 +1105,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in ref1 = jit_jmpi(jit_forward()); mz_patch_branch(ref3); + mz_patch_branch(ref6); (void)jit_movi_p(dest, scheme_true); mz_patch_ucbranch(ref5); @@ -1721,7 +1727,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in mz_rs_sync(); mz_runstack_unskipped(jitter, 1); (void)jit_movi_p(JIT_R1, &scheme_null); - return scheme_generate_cons_alloc(jitter, 0, 0, dest); + return scheme_generate_cons_alloc(jitter, 0, 0, 1, dest); } else if (IS_NAMED_PRIM(rator, "box")) { mz_runstack_skipped(jitter, 1); scheme_generate_non_tail(app->rand, jitter, 0, 1, 0); @@ -3023,14 +3029,28 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i return 1; } else if (IS_NAMED_PRIM(rator, "cons") || IS_NAMED_PRIM(rator, "list*")) { - int dir; + int dir, known_list; LOG_IT(("inlined cons\n")); dir = generate_two_args(app->rand1, app->rand2, jitter, 0, 2); CHECK_LIMIT(); mz_rs_sync(); + + if (scheme_is_list(app->rand2)) + known_list = 1; + else + known_list = 2; - return scheme_generate_cons_alloc(jitter, dir == -1, 0, dest); + return scheme_generate_cons_alloc(jitter, dir == -1, 0, known_list, dest); + } else if (IS_NAMED_PRIM(rator, "unsafe-cons-list")) { + int dir; + LOG_IT(("inlined unsafe-cons-list\n")); + + dir = generate_two_args(app->rand1, app->rand2, jitter, 0, 2); + CHECK_LIMIT(); + mz_rs_sync(); + + return scheme_generate_cons_alloc(jitter, dir == -1, 0, 1, dest); } else if (IS_NAMED_PRIM(rator, "mcons")) { LOG_IT(("inlined mcons\n")); @@ -3074,7 +3094,7 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i CHECK_LIMIT(); mz_rs_sync(); - scheme_generate_cons_alloc(jitter, 1, 0, JIT_R0); + scheme_generate_cons_alloc(jitter, 1, 0, 1, JIT_R0); CHECK_LIMIT(); jit_ldr_p(JIT_R1, JIT_RUNSTACK); @@ -3082,7 +3102,7 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i mz_runstack_popped(jitter, 1); CHECK_LIMIT(); - return scheme_generate_cons_alloc(jitter, 1, 0, dest); + return scheme_generate_cons_alloc(jitter, 1, 0, 1, dest); } else if (IS_NAMED_PRIM(rator, "vector-immutable") || IS_NAMED_PRIM(rator, "vector")) { return generate_vector_alloc(jitter, rator, NULL, NULL, app, dest); @@ -3780,28 +3800,50 @@ int scheme_generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int CHECK_LIMIT(); mz_rs_sync(); + if (c <= 4) { + /* fully inline a small list */ + int i, c2 = c, known_list; + if (star) { + c2--; + mz_rs_ldxi(JIT_R1, c2); + known_list = scheme_is_list(app->args[c2]); + } else { + known_list = 1; + if (c) + (void)jit_movi_p(JIT_R1, scheme_null); + else + (void)jit_movi_p(dest, scheme_null); + } + + for (i = c2; i--; ) { + mz_rs_ldxi(JIT_R0, i); + scheme_generate_cons_alloc(jitter, 0, 0, known_list, (i > 0) ? JIT_R1 : dest); + CHECK_LIMIT(); + } + } else { #ifdef CAN_INLINE_ALLOC - jit_movi_l(JIT_R2, c); - if (star) - (void)jit_calli(sjc.make_list_star_code); - else - (void)jit_calli(sjc.make_list_code); - jit_movr_p(dest, JIT_R0); -#else - JIT_UPDATE_THREAD_RSPTR_IF_NEEDED(); - jit_movi_l(JIT_R0, c); - mz_prepare(2); - jit_pusharg_l(JIT_R0); - jit_pusharg_p(JIT_RUNSTACK); - { - GC_CAN_IGNORE jit_insn *refr; + jit_movi_l(JIT_R2, c); if (star) - (void)mz_finish_lwe(ts_scheme_jit_make_list_star, refr); + (void)jit_calli(sjc.make_list_star_code); else - (void)mz_finish_lwe(ts_scheme_jit_make_list, refr); - } - jit_retval(dest); + (void)jit_calli(sjc.make_list_code); + jit_movr_p(dest, JIT_R0); +#else + JIT_UPDATE_THREAD_RSPTR_IF_NEEDED(); + jit_movi_l(JIT_R0, c); + mz_prepare(2); + jit_pusharg_l(JIT_R0); + jit_pusharg_p(JIT_RUNSTACK); + { + GC_CAN_IGNORE jit_insn *refr; + if (star) + (void)mz_finish_lwe(ts_scheme_jit_make_list_star, refr); + else + (void)mz_finish_lwe(ts_scheme_jit_make_list, refr); + } + jit_retval(dest); #endif + } if (c) { mz_rs_inc(c); /* no sync */ @@ -3877,12 +3919,13 @@ int scheme_generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int return 0; } -int scheme_generate_cons_alloc(mz_jit_state *jitter, int rev, int inline_retry, int dest) +int scheme_generate_cons_alloc(mz_jit_state *jitter, int rev, int inline_retry, int known_list, int dest) /* Args must be in R0 (car) and R1 (cdr); uses R2 and V1 as temporaries */ { #ifdef CAN_INLINE_ALLOC /* Inlined alloc */ - scheme_inline_alloc(jitter, sizeof(Scheme_Simple_Object), scheme_pair_type, 0, 1, 0, inline_retry); + scheme_inline_alloc(jitter, sizeof(Scheme_Simple_Object), scheme_pair_type, 0, 1, + known_list ? PAIR_IS_LIST : 0, inline_retry); CHECK_LIMIT(); if (rev) { diff --git a/src/racket/src/list.c b/src/racket/src/list.c index 238998cf37..b02e59c0f0 100644 --- a/src/racket/src/list.c +++ b/src/racket/src/list.c @@ -37,6 +37,7 @@ READ_ONLY Scheme_Object *scheme_list_star_proc; READ_ONLY Scheme_Object *scheme_box_proc; READ_ONLY Scheme_Object *scheme_box_p_proc; READ_ONLY Scheme_Object *scheme_hash_ref_proc; +READ_ONLY Scheme_Object *scheme_unsafe_cons_list_proc; READ_ONLY Scheme_Object *scheme_unsafe_car_proc; READ_ONLY Scheme_Object *scheme_unsafe_cdr_proc; READ_ONLY Scheme_Object *scheme_unsafe_mcar_proc; @@ -155,6 +156,7 @@ static Scheme_Object *make_hasheq_placeholder(int argc, Scheme_Object *argv[]); static Scheme_Object *make_hasheqv_placeholder(int argc, Scheme_Object *argv[]); static Scheme_Object *table_placeholder_p(int argc, Scheme_Object *argv[]); +static Scheme_Object *unsafe_cons_list (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_car (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_cdr (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_list_ref (int argc, Scheme_Object *argv[]); @@ -752,6 +754,13 @@ scheme_init_unsafe_list (Scheme_Env *env) scheme_null->type = scheme_null_type; + REGISTER_SO(scheme_unsafe_cons_list_proc); + p = scheme_make_immed_prim(unsafe_cons_list, "unsafe-cons-list", 2, 2); + SCHEME_PRIM_PROC_FLAGS(p) |= (SCHEME_PRIM_IS_BINARY_INLINED + | SCHEME_PRIM_IS_OMITABLE); + scheme_add_global_constant ("unsafe-cons-list", p, env); + scheme_unsafe_cons_list_proc = p; + REGISTER_SO(scheme_unsafe_car_proc); p = scheme_make_folding_prim(unsafe_car, "unsafe-car", 1, 1, 1); SCHEME_PRIM_PROC_FLAGS(p) |= (SCHEME_PRIM_IS_UNARY_INLINED @@ -842,6 +851,14 @@ Scheme_Object *scheme_make_pair(Scheme_Object *car, Scheme_Object *cdr) #endif } +Scheme_Object *scheme_make_list_pair(Scheme_Object *car, Scheme_Object *cdr) +{ + GC_CAN_IGNORE Scheme_Object *r; + r = scheme_make_pair(car, cdr); + SCHEME_PAIR_FLAGS(r) |= PAIR_IS_LIST; + return r; +} + Scheme_Object *scheme_make_mutable_pair(Scheme_Object *car, Scheme_Object *cdr) { Scheme_Object *cons; @@ -877,6 +894,7 @@ Scheme_Object *scheme_make_raw_pair(Scheme_Object *car, Scheme_Object *cdr) } # define cons(car, cdr) scheme_make_pair(car, cdr) +# define lcons(car, cdr) scheme_make_list_pair(car, cdr) Scheme_Object *scheme_build_list(int size, Scheme_Object **argv) { @@ -884,7 +902,7 @@ Scheme_Object *scheme_build_list(int size, Scheme_Object **argv) int i; for (i = size; i--; ) { - pair = cons(argv[i], pair); + pair = lcons(argv[i], pair); } return pair; @@ -900,12 +918,12 @@ Scheme_Object *scheme_build_list_offset(int size, Scheme_Object **argv, int delt /* clearing mode: */ size = -size; for (i = size; i-- > delta; ) { - pair = cons(argv[i], pair); + pair = lcons(argv[i], pair); argv[i] = NULL; } } else { for (i = size; i-- > delta; ) { - pair = cons(argv[i], pair); + pair = lcons(argv[i], pair); } } @@ -918,7 +936,7 @@ Scheme_Object *scheme_alloc_list(int size) int i; for (i = size; i--; ) { - pair = cons(scheme_false, pair); + pair = lcons(scheme_false, pair); } return pair; @@ -968,7 +986,7 @@ scheme_named_map_1(char *name, Scheme_Object *(*fun)(Scheme_Object*, Scheme_Obje Scheme_Object *v; v = SCHEME_STX_CAR(lst); v = fun(v, form); - pr = cons(v, scheme_null); + pr = lcons(v, scheme_null); if (last) SCHEME_CDR(last) = pr; else @@ -1168,10 +1186,18 @@ int scheme_is_list(Scheme_Object *obj1) } /* Propagate info further up the chain. */ - /* We could have a race with JIT-generated code, but the worst - should be that we lose a flag setting (dangerous in principle, - but not in practice). */ +#ifdef MZ_USE_FUTURES + { + short orig_flags = flags & (~PAIR_FLAG_MASK); + while (!mzrt_cas16(&SCHEME_PAIR_FLAGS(obj2), orig_flags, flags)) { + orig_flags = SCHEME_PAIR_FLAGS(obj2); + flags = orig_flags | (flags & PAIR_FLAG_MASK); + } + } +#else + /* no fuel check, so flags could not have changed */ SCHEME_PAIR_FLAGS(obj2) |= (flags & PAIR_FLAG_MASK); +#endif return (flags & PAIR_IS_LIST); } @@ -1187,7 +1213,7 @@ list_p_prim (int argc, Scheme_Object *argv[]) #define NORMAL_LIST_INIT() l = scheme_null #define STAR_LIST_INIT() --argc; l = argv[argc] -#define LIST_BODY(INIT) \ +#define LIST_BODY(INIT, cons) \ int i; \ GC_CAN_IGNORE Scheme_Object *l; \ INIT; \ @@ -1199,13 +1225,13 @@ list_p_prim (int argc, Scheme_Object *argv[]) static Scheme_Object * list_prim (int argc, Scheme_Object *argv[]) { - LIST_BODY(NORMAL_LIST_INIT()); + LIST_BODY(NORMAL_LIST_INIT(), lcons); } static Scheme_Object * list_star_prim (int argc, Scheme_Object *argv[]) { - LIST_BODY(STAR_LIST_INIT()); + LIST_BODY(STAR_LIST_INIT(), cons); } static Scheme_Object * @@ -1313,7 +1339,7 @@ reverse_prim (int argc, Scheme_Object *argv[]) while (!SCHEME_NULLP (lst)) { if (!SCHEME_PAIRP(lst)) scheme_wrong_contract("reverse", "list?", 0, argc, argv); - last = cons(SCHEME_CAR (lst), last); + last = lcons(SCHEME_CAR (lst), last); lst = SCHEME_CDR (lst); SCHEME_USE_FUEL(1); @@ -2498,7 +2524,7 @@ static Scheme_Object *do_map_hash_table(int argc, p[1] = v; if (keep) { v = _scheme_apply(f, 2, p); - v = cons(v, scheme_null); + v = lcons(v, scheme_null); if (last) SCHEME_CDR(last) = v; else @@ -2530,7 +2556,7 @@ static Scheme_Object *do_map_hash_table(int argc, p[1] = v; if (keep) { v = _scheme_apply(f, 2, p); - v = cons(v, scheme_null); + v = lcons(v, scheme_null); if (last) SCHEME_CDR(last) = v; else @@ -2562,7 +2588,7 @@ static Scheme_Object *do_map_hash_table(int argc, p[1] = iv; if (keep) { v = _scheme_apply(f, 2, p); - v = cons(v, scheme_null); + v = lcons(v, scheme_null); if (last) SCHEME_CDR(last) = v; else @@ -3559,6 +3585,12 @@ void scheme_init_ephemerons(void) /* unsafe */ /************************************************************/ +static Scheme_Object *unsafe_cons_list(int argc, Scheme_Object *argv[]) +{ + return lcons(argv[0], argv[1]); +} + + static Scheme_Object *unsafe_car (int argc, Scheme_Object *argv[]) { if (scheme_current_thread->constant_folding) return scheme_checked_car(argc, argv); diff --git a/src/racket/src/optimize.c b/src/racket/src/optimize.c index 4faced20d1..8355748ee3 100644 --- a/src/racket/src/optimize.c +++ b/src/racket/src/optimize.c @@ -945,6 +945,7 @@ static int is_movable_prim(Scheme_Object *rator, int n, int cross_lambda) return values that contain all arguments: */ && (SAME_OBJ(scheme_list_proc, rator) || (SAME_OBJ(scheme_cons_proc, rator) && (n == 2)) + || (SAME_OBJ(scheme_unsafe_cons_list_proc, rator) && (n == 2)) || SAME_OBJ(scheme_list_star_proc, rator) || SAME_OBJ(scheme_vector_proc, rator) || SAME_OBJ(scheme_vector_immutable_proc, rator) @@ -2410,6 +2411,7 @@ static Scheme_Object *finish_optimize_application2(Scheme_App2_Rec *app, Optimiz Scheme_App3_Rec *app3 = (Scheme_App3_Rec *)rand; if (IS_NAMED_PRIM(app->rator, "car")) { if (SAME_OBJ(scheme_cons_proc, app3->rator) + || SAME_OBJ(scheme_unsafe_cons_list_proc, app3->rator) || SAME_OBJ(scheme_list_proc, app3->rator) || SAME_OBJ(scheme_list_star_proc, app3->rator)) { /* (car ({cons|list|list*} X Y)) */ @@ -2421,7 +2423,8 @@ static Scheme_Object *finish_optimize_application2(Scheme_App2_Rec *app, Optimiz } } else if (IS_NAMED_PRIM(app->rator, "cdr")) { /* (cdr (cons X Y)) */ - if (SAME_OBJ(scheme_cons_proc, app3->rator)) { + if (SAME_OBJ(scheme_cons_proc, app3->rator) + || SAME_OBJ(scheme_unsafe_cons_list_proc, app3->rator)) { if ((scheme_omittable_expr(app3->rand2, 1, 5, 0, info, NULL, -1, 0) || single_valued_noncm_expression(app3->rand2, 5)) && scheme_omittable_expr(app3->rand1, 1, 5, 0, info, NULL, -1, 0)) { diff --git a/src/racket/src/schemef.h b/src/racket/src/schemef.h index beddc17b97..6773dd5f8d 100644 --- a/src/racket/src/schemef.h +++ b/src/racket/src/schemef.h @@ -568,6 +568,7 @@ MZ_EXTERN void scheme_prim_is_method(Scheme_Object *o); MZ_EXTERN Scheme_Object *scheme_make_pair(Scheme_Object *car, Scheme_Object *cdr); MZ_EXTERN Scheme_Object *scheme_make_mutable_pair(Scheme_Object *car, Scheme_Object *cdr); +MZ_EXTERN Scheme_Object *scheme_make_list_pair(Scheme_Object *car, Scheme_Object *cdr); MZ_EXTERN Scheme_Object *scheme_make_raw_pair(Scheme_Object *, Scheme_Object *); diff --git a/src/racket/src/schemex.h b/src/racket/src/schemex.h index 10e32c36ea..071fd9a07d 100644 --- a/src/racket/src/schemex.h +++ b/src/racket/src/schemex.h @@ -454,6 +454,7 @@ Scheme_Object *(*scheme_make_closed_prim_w_everything)(Scheme_Closed_Prim *fun, void (*scheme_prim_is_method)(Scheme_Object *o); Scheme_Object *(*scheme_make_pair)(Scheme_Object *car, Scheme_Object *cdr); Scheme_Object *(*scheme_make_mutable_pair)(Scheme_Object *car, Scheme_Object *cdr); +Scheme_Object *(*scheme_make_list_pair)(Scheme_Object *car, Scheme_Object *cdr); Scheme_Object *(*scheme_make_raw_pair)(Scheme_Object *, Scheme_Object *); Scheme_Object *(*scheme_make_byte_string)(const char *chars); Scheme_Object *(*scheme_make_sized_byte_string)(char *chars, intptr_t len, int copy); diff --git a/src/racket/src/schemex.inc b/src/racket/src/schemex.inc index 3e3e6f2cec..715e75e96c 100644 --- a/src/racket/src/schemex.inc +++ b/src/racket/src/schemex.inc @@ -319,6 +319,7 @@ scheme_extension_table->scheme_prim_is_method = scheme_prim_is_method; scheme_extension_table->scheme_make_pair = scheme_make_pair; scheme_extension_table->scheme_make_mutable_pair = scheme_make_mutable_pair; + scheme_extension_table->scheme_make_list_pair = scheme_make_list_pair; scheme_extension_table->scheme_make_raw_pair = scheme_make_raw_pair; scheme_extension_table->scheme_make_byte_string = scheme_make_byte_string; scheme_extension_table->scheme_make_sized_byte_string = scheme_make_sized_byte_string; diff --git a/src/racket/src/schemexm.h b/src/racket/src/schemexm.h index a3ef033eb5..5bdc858f34 100644 --- a/src/racket/src/schemexm.h +++ b/src/racket/src/schemexm.h @@ -319,6 +319,7 @@ #define scheme_prim_is_method (scheme_extension_table->scheme_prim_is_method) #define scheme_make_pair (scheme_extension_table->scheme_make_pair) #define scheme_make_mutable_pair (scheme_extension_table->scheme_make_mutable_pair) +#define scheme_make_list_pair (scheme_extension_table->scheme_make_list_pair) #define scheme_make_raw_pair (scheme_extension_table->scheme_make_raw_pair) #define scheme_make_byte_string (scheme_extension_table->scheme_make_byte_string) #define scheme_make_sized_byte_string (scheme_extension_table->scheme_make_sized_byte_string) diff --git a/src/racket/src/schminc.h b/src/racket/src/schminc.h index ff770ac4ed..5c130612c0 100644 --- a/src/racket/src/schminc.h +++ b/src/racket/src/schminc.h @@ -15,7 +15,7 @@ #define USE_COMPILED_STARTUP 1 #define EXPECTED_PRIM_COUNT 1073 -#define EXPECTED_UNSAFE_COUNT 79 +#define EXPECTED_UNSAFE_COUNT 80 #define EXPECTED_FLFXNUM_COUNT 69 #define EXPECTED_FUTURES_COUNT 15 diff --git a/src/racket/src/schpriv.h b/src/racket/src/schpriv.h index fb9ecc3d4d..3559f60f46 100644 --- a/src/racket/src/schpriv.h +++ b/src/racket/src/schpriv.h @@ -361,6 +361,7 @@ extern Scheme_Object *scheme_procedure_arity_includes_proc; extern Scheme_Object *scheme_void_proc; extern Scheme_Object *scheme_pair_p_proc; extern Scheme_Object *scheme_mpair_p_proc; +extern Scheme_Object *scheme_unsafe_cons_list_proc; extern Scheme_Object *scheme_unsafe_car_proc; extern Scheme_Object *scheme_unsafe_cdr_proc; extern Scheme_Object *scheme_unsafe_mcar_proc; diff --git a/src/racket/src/schvers.h b/src/racket/src/schvers.h index a094996869..c3e4dbf795 100644 --- a/src/racket/src/schvers.h +++ b/src/racket/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "5.3.1.5" +#define MZSCHEME_VERSION "5.3.1.6" #define MZSCHEME_VERSION_X 5 #define MZSCHEME_VERSION_Y 3 #define MZSCHEME_VERSION_Z 1 -#define MZSCHEME_VERSION_W 5 +#define MZSCHEME_VERSION_W 6 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)