diff --git a/go/ssa/interp/external.go b/go/ssa/interp/external.go index 03229430..65fe4ba9 100644 --- a/go/ssa/interp/external.go +++ b/go/ssa/interp/external.go @@ -102,6 +102,7 @@ func init() { "runtime.Goexit": ext۰runtime۰Goexit, "runtime.Gosched": ext۰runtime۰Gosched, "runtime.init": ext۰nop, + "runtime.KeepAlive": ext۰nop, "runtime.NumCPU": ext۰runtime۰NumCPU, "runtime.NumGoroutine": ext۰runtime۰NumGoroutine, "runtime.ReadMemStats": ext۰runtime۰ReadMemStats, @@ -121,12 +122,20 @@ func init() { "sync.runtime_registerPoolCleanup": ext۰nop, "sync/atomic.AddInt32": ext۰atomic۰AddInt32, "sync/atomic.AddUint32": ext۰atomic۰AddUint32, - "sync/atomic.AddUint64": ext۰atomic۰AddUint64, "sync/atomic.CompareAndSwapInt32": ext۰atomic۰CompareAndSwapInt32, + "sync/atomic.CompareAndSwapUint32": ext۰atomic۰CompareAndSwapUint32, "sync/atomic.LoadInt32": ext۰atomic۰LoadInt32, "sync/atomic.LoadUint32": ext۰atomic۰LoadUint32, "sync/atomic.StoreInt32": ext۰atomic۰StoreInt32, "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, "time.Sleep": ext۰time۰Sleep, "time.now": ext۰time۰now, @@ -376,6 +385,16 @@ func ext۰atomic۰CompareAndSwapInt32(fr *frame, args []value) value { 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 { // TODO(adonovan): fix: not atomic! p := args[0].(*value) @@ -392,6 +411,56 @@ func ext۰atomic۰AddUint32(fr *frame, args []value) value { 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 { // TODO(adonovan): fix: not atomic! p := args[0].(*value)