summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJeff Ciesielski <jeffciesielski@gmail.com>2017-01-25 14:02:19 -0500
committerAndreas Rumpf <rumpf_a@web.de>2017-01-25 20:02:19 +0100
commit74ae66ddbc0bbfcff00175f87044372d4bdae07c (patch)
tree39dffa07a58d82e3274e69173a492405ef5c08a4
parent1fa3a9dac25e982624164898d98f22565c16d566 (diff)
downloadNim-74ae66ddbc0bbfcff00175f87044372d4bdae07c.tar.gz
Add volatile load/store (#5263)
Adds volatile load/store capability to the impure part of the standard
library.  Note that this currently only supports numerical types.

Should resolve https://github.com/nim-lang/Nim/issues/3382
-rw-r--r--lib/pure/volatile.nim30
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/pure/volatile.nim b/lib/pure/volatile.nim
new file mode 100644
index 000000000..b3705a199
--- /dev/null
+++ b/lib/pure/volatile.nim
@@ -0,0 +1,30 @@
+#
+#
+#            Nim's Runtime Library
+#        (c) Copyright 2017 Jeff Ciesielski
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+## This module contains code for generating volatile loads and stores,
+## which are useful in embedded and systems programming.
+
+template volatileLoad*[T](src: ptr T): T =
+  ## Generates a volatile load of the value stored in the container `src`.
+  ## Note that this only effects code generation on `C` like backends
+  when defined(js):
+    src[]
+  else:
+    var res: T
+    {.emit: [res, " = (*(", type(src[]), " volatile*)", src, ");"].}
+    res
+
+template volatileStore*[T](dest: ptr T, val: T) =
+  ## Generates a volatile store into the container `dest` of the value
+  ## `val`. Note that this only effects code generation on `C` like
+  ## backends
+  when defined(js):
+    dest[] = val
+  else:
+    {.emit: ["*((", type(dest[]), " volatile*)(", dest, ")) = ", val, ";"].}