]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: add type algorithms for zero-sized types
authorDmitriy Vyukov <dvyukov@google.com>
Fri, 20 Jan 2012 06:32:55 +0000 (10:32 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Fri, 20 Jan 2012 06:32:55 +0000 (10:32 +0400)
BenchmarkChanSem old=127ns new=78.6ns

R=golang-dev, bradfitz, sameer, rsc
CC=golang-dev
https://golang.org/cl/5558049

src/cmd/gc/go.h
src/cmd/gc/subr.c
src/pkg/runtime/alg.c
src/pkg/runtime/chan_test.go
src/pkg/runtime/runtime.h

index 57cc94cccb2f10ff9541a2dba1832e344f5b10cc..37bf806e36ab2f20c085788a00af0bdbd6fb4489 100644 (file)
@@ -40,12 +40,14 @@ enum
        // These values are known by runtime.
        // The MEMx and NOEQx values must run in parallel.  See algtype.
        AMEM            = 0,
+       AMEM0,
        AMEM8,
        AMEM16,
        AMEM32,
        AMEM64,
        AMEM128,
        ANOEQ,
+       ANOEQ0,
        ANOEQ8,
        ANOEQ16,
        ANOEQ32,
index 96616d88ee1d9862d95b30c7eb70817246131d2f..3b53b97adc2c390e67e3fdd0c90043fcdf404b41 100644 (file)
@@ -586,6 +586,8 @@ algtype(Type *t)
                if(isslice(t))
                        return ASLICE;
                switch(t->width) {
+               case 0:
+                       return a + AMEM0 - AMEM;
                case 1:
                        return a + AMEM8 - AMEM;
                case 2:
index 8d6fffcfaa9a40b713d97689d4ed256a7e55bc57..033f5b462a4dc536caf0300921ab0c7e2fd62928 100644 (file)
@@ -88,6 +88,23 @@ runtime·memcopy(uintptr s, void *a, void *b)
        runtime·memmove(a, b, s);
 }
 
+void
+runtime·memequal0(bool *eq, uintptr s, void *a, void *b)
+{
+       USED(s);
+       USED(a);
+       USED(b);
+       *eq = true;
+}
+
+void
+runtime·memcopy0(uintptr s, void *a, void *b)
+{
+       USED(s);
+       USED(a);
+       USED(b);
+}
+
 void
 runtime·memequal8(bool *eq, uintptr s, void *a, void *b)
 {
@@ -332,11 +349,13 @@ runtime·algarray[] =
 [AINTER]       { runtime·interhash, runtime·interequal, runtime·interprint, runtime·intercopy },
 [ANILINTER]    { runtime·nilinterhash, runtime·nilinterequal, runtime·nilinterprint, runtime·nilintercopy },
 [ASLICE]       { runtime·nohash, runtime·noequal, runtime·memprint, runtime·slicecopy },
+[AMEM0]                { runtime·memhash, runtime·memequal0, runtime·memprint, runtime·memcopy0 },
 [AMEM8]                { runtime·memhash, runtime·memequal8, runtime·memprint, runtime·memcopy8 },
 [AMEM16]       { runtime·memhash, runtime·memequal16, runtime·memprint, runtime·memcopy16 },
 [AMEM32]       { runtime·memhash, runtime·memequal32, runtime·memprint, runtime·memcopy32 },
 [AMEM64]       { runtime·memhash, runtime·memequal64, runtime·memprint, runtime·memcopy64 },
 [AMEM128]      { runtime·memhash, runtime·memequal128, runtime·memprint, runtime·memcopy128 },
+[ANOEQ0]       { runtime·nohash, runtime·noequal, runtime·memprint, runtime·memcopy0 },
 [ANOEQ8]       { runtime·nohash, runtime·noequal, runtime·memprint, runtime·memcopy8 },
 [ANOEQ16]      { runtime·nohash, runtime·noequal, runtime·memprint, runtime·memcopy16 },
 [ANOEQ32]      { runtime·nohash, runtime·noequal, runtime·memprint, runtime·memcopy32 },
index 7cea906ceae6971b9b93d2fbc03a99e7d16eecfa..eb2c7c60d0cdc0bdeeee8924fa2296b27268d0eb 100644 (file)
@@ -371,3 +371,12 @@ func BenchmarkChanCreation(b *testing.B) {
                <-c
        }
 }
+
+func BenchmarkChanSem(b *testing.B) {
+       type Empty struct{}
+       c := make(chan Empty, 1)
+       for i := 0; i < b.N; i++ {
+               c <- Empty{}
+               <-c
+       }
+}
index dc54285c72a422ed5af62a090697e2f59229bfa0..a30a16cf7e84baaf31593743dca76c6b48002319 100644 (file)
@@ -358,12 +358,14 @@ enum {
 enum
 {
        AMEM,
+       AMEM0,
        AMEM8,
        AMEM16,
        AMEM32,
        AMEM64,
        AMEM128,
        ANOEQ,
+       ANOEQ0,
        ANOEQ8,
        ANOEQ16,
        ANOEQ32,