aboutsummaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2019-04-11 17:07:24 +0200
committerDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2019-04-11 17:07:24 +0200
commitbaeed85dd8d1c7ef54a72bf2db2381d03de05cb6 (patch)
tree6d5de419eca025303e13e21d20457985fa559d85 /runtime
parent6661d3cd45b9cce948fc7feb2d4cc21da1352914 (diff)
downloadcompcert-kvx-baeed85dd8d1c7ef54a72bf2db2381d03de05cb6.tar.gz
compcert-kvx-baeed85dd8d1c7ef54a72bf2db2381d03de05cb6.zip
builtin acswapd
Diffstat (limited to 'runtime')
-rw-r--r--runtime/include/ccomp_k1c_fixes.h7
-rw-r--r--runtime/mppa_k1c/vararg.S11
2 files changed, 16 insertions, 2 deletions
diff --git a/runtime/include/ccomp_k1c_fixes.h b/runtime/include/ccomp_k1c_fixes.h
index 679ab1ac..b42323b8 100644
--- a/runtime/include/ccomp_k1c_fixes.h
+++ b/runtime/include/ccomp_k1c_fixes.h
@@ -1,11 +1,16 @@
#ifndef __CCOMP_KIC_FIXES_H
#define __CCOMP_KIC_FIXES_H
+#if ! (defined(__COMPCERT__) && defined (__K1C__))
+#error This header is solely for CompCert on K1C
+#endif
+
#undef __GNUC__
#define __thread
struct __int128_ccomp { long __int128_ccomp_low; long __int128_ccomp_high; };
#define __int128 struct __int128_ccomp
-
+#define __builtin_k1_acswapd __compcert_acswapd
+extern __int128 __compcert_acswapd(unsigned long long *address, unsigned long long new_value, unsigned long long old_value);
#endif
diff --git a/runtime/mppa_k1c/vararg.S b/runtime/mppa_k1c/vararg.S
index 8054068b..dbd7b96d 100644
--- a/runtime/mppa_k1c/vararg.S
+++ b/runtime/mppa_k1c/vararg.S
@@ -74,4 +74,13 @@ __compcert_va_composite:
addd $r12 = $r12, 16
;;
ret
-;;
+ ;;
+
+# FIXME this assumes pass-by-reference
+ .globl __compcert_acswapd
+__compcert_acswapd:
+ acswapd 0[$r1] = $r2r3
+ ;;
+ sq 0[$r0] = $r2r3
+ ret
+ ;;