go/ssa/interp: add more intrinsics for sync/atomic and runtime
Change-Id: I4743fa32be5549b2d141595d236c653e53cc9ff4 Reviewed-on: https://go-review.googlesource.com/37712 Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
a99f4ece36
commit
767744efe2
|
@ -102,6 +102,7 @@ func init() {
|
||||||
"runtime.Goexit": ext۰runtime۰Goexit,
|
"runtime.Goexit": ext۰runtime۰Goexit,
|
||||||
"runtime.Gosched": ext۰runtime۰Gosched,
|
"runtime.Gosched": ext۰runtime۰Gosched,
|
||||||
"runtime.init": ext۰nop,
|
"runtime.init": ext۰nop,
|
||||||
|
"runtime.KeepAlive": ext۰nop,
|
||||||
"runtime.NumCPU": ext۰runtime۰NumCPU,
|
"runtime.NumCPU": ext۰runtime۰NumCPU,
|
||||||
"runtime.NumGoroutine": ext۰runtime۰NumGoroutine,
|
"runtime.NumGoroutine": ext۰runtime۰NumGoroutine,
|
||||||
"runtime.ReadMemStats": ext۰runtime۰ReadMemStats,
|
"runtime.ReadMemStats": ext۰runtime۰ReadMemStats,
|
||||||
|
@ -121,12 +122,20 @@ func init() {
|
||||||
"sync.runtime_registerPoolCleanup": ext۰nop,
|
"sync.runtime_registerPoolCleanup": ext۰nop,
|
||||||
"sync/atomic.AddInt32": ext۰atomic۰AddInt32,
|
"sync/atomic.AddInt32": ext۰atomic۰AddInt32,
|
||||||
"sync/atomic.AddUint32": ext۰atomic۰AddUint32,
|
"sync/atomic.AddUint32": ext۰atomic۰AddUint32,
|
||||||
"sync/atomic.AddUint64": ext۰atomic۰AddUint64,
|
|
||||||
"sync/atomic.CompareAndSwapInt32": ext۰atomic۰CompareAndSwapInt32,
|
"sync/atomic.CompareAndSwapInt32": ext۰atomic۰CompareAndSwapInt32,
|
||||||
|
"sync/atomic.CompareAndSwapUint32": ext۰atomic۰CompareAndSwapUint32,
|
||||||
"sync/atomic.LoadInt32": ext۰atomic۰LoadInt32,
|
"sync/atomic.LoadInt32": ext۰atomic۰LoadInt32,
|
||||||
"sync/atomic.LoadUint32": ext۰atomic۰LoadUint32,
|
"sync/atomic.LoadUint32": ext۰atomic۰LoadUint32,
|
||||||
"sync/atomic.StoreInt32": ext۰atomic۰StoreInt32,
|
"sync/atomic.StoreInt32": ext۰atomic۰StoreInt32,
|
||||||
"sync/atomic.StoreUint32": ext۰atomic۰StoreUint32,
|
"sync/atomic.StoreUint32": ext۰atomic۰StoreUint32,
|
||||||
|
"sync/atomic.AddInt64": ext۰atomic۰AddInt64,
|
||||||
|
"sync/atomic.AddUint64": ext۰atomic۰AddUint64,
|
||||||
|
"sync/atomic.CompareAndSwapInt64": ext۰atomic۰CompareAndSwapInt64,
|
||||||
|
"sync/atomic.CompareAndSwapUint64": ext۰atomic۰CompareAndSwapUint64,
|
||||||
|
"sync/atomic.LoadInt64": ext۰atomic۰LoadInt64,
|
||||||
|
"sync/atomic.LoadUint64": ext۰atomic۰LoadUint64,
|
||||||
|
"sync/atomic.StoreInt64": ext۰atomic۰StoreInt64,
|
||||||
|
"sync/atomic.StoreUint64": ext۰atomic۰StoreUint64,
|
||||||
"testing.runExample": ext۰testing۰runExample,
|
"testing.runExample": ext۰testing۰runExample,
|
||||||
"time.Sleep": ext۰time۰Sleep,
|
"time.Sleep": ext۰time۰Sleep,
|
||||||
"time.now": ext۰time۰now,
|
"time.now": ext۰time۰now,
|
||||||
|
@ -376,6 +385,16 @@ func ext۰atomic۰CompareAndSwapInt32(fr *frame, args []value) value {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ext۰atomic۰CompareAndSwapUint32(fr *frame, args []value) value {
|
||||||
|
// TODO(adonovan): fix: not atomic!
|
||||||
|
p := args[0].(*value)
|
||||||
|
if (*p).(uint32) == args[1].(uint32) {
|
||||||
|
*p = args[2].(uint32)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func ext۰atomic۰AddInt32(fr *frame, args []value) value {
|
func ext۰atomic۰AddInt32(fr *frame, args []value) value {
|
||||||
// TODO(adonovan): fix: not atomic!
|
// TODO(adonovan): fix: not atomic!
|
||||||
p := args[0].(*value)
|
p := args[0].(*value)
|
||||||
|
@ -392,6 +411,56 @@ func ext۰atomic۰AddUint32(fr *frame, args []value) value {
|
||||||
return newv
|
return newv
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ext۰atomic۰LoadUint64(fr *frame, args []value) value {
|
||||||
|
// TODO(adonovan): fix: not atomic!
|
||||||
|
return (*args[0].(*value)).(uint64)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ext۰atomic۰StoreUint64(fr *frame, args []value) value {
|
||||||
|
// TODO(adonovan): fix: not atomic!
|
||||||
|
*args[0].(*value) = args[1].(uint64)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ext۰atomic۰LoadInt64(fr *frame, args []value) value {
|
||||||
|
// TODO(adonovan): fix: not atomic!
|
||||||
|
return (*args[0].(*value)).(int64)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ext۰atomic۰StoreInt64(fr *frame, args []value) value {
|
||||||
|
// TODO(adonovan): fix: not atomic!
|
||||||
|
*args[0].(*value) = args[1].(int64)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ext۰atomic۰CompareAndSwapInt64(fr *frame, args []value) value {
|
||||||
|
// TODO(adonovan): fix: not atomic!
|
||||||
|
p := args[0].(*value)
|
||||||
|
if (*p).(int64) == args[1].(int64) {
|
||||||
|
*p = args[2].(int64)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func ext۰atomic۰CompareAndSwapUint64(fr *frame, args []value) value {
|
||||||
|
// TODO(adonovan): fix: not atomic!
|
||||||
|
p := args[0].(*value)
|
||||||
|
if (*p).(uint64) == args[1].(uint64) {
|
||||||
|
*p = args[2].(uint64)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func ext۰atomic۰AddInt64(fr *frame, args []value) value {
|
||||||
|
// TODO(adonovan): fix: not atomic!
|
||||||
|
p := args[0].(*value)
|
||||||
|
newv := (*p).(int64) + args[1].(int64)
|
||||||
|
*p = newv
|
||||||
|
return newv
|
||||||
|
}
|
||||||
|
|
||||||
func ext۰atomic۰AddUint64(fr *frame, args []value) value {
|
func ext۰atomic۰AddUint64(fr *frame, args []value) value {
|
||||||
// TODO(adonovan): fix: not atomic!
|
// TODO(adonovan): fix: not atomic!
|
||||||
p := args[0].(*value)
|
p := args[0].(*value)
|
||||||
|
|
Loading…
Reference in New Issue