summaryrefslogtreecommitdiff
path: root/sparc.c
diff options
context:
space:
mode:
authorngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-01-04 07:04:22 +0000
committerngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-01-04 07:04:22 +0000
commite87360009c1bca2e6a84b6edf7414c88eb4964c9 (patch)
treefc7d8deb05fac057f828ace509b5476d26a969a0 /sparc.c
parent94443cf5238bb0665d7f345176bd5284872dab4c (diff)
sparc.c was missing in r34199
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@34209 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'sparc.c')
-rw-r--r--sparc.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/sparc.c b/sparc.c
new file mode 100644
index 0000000000..e5f7985e19
--- /dev/null
+++ b/sparc.c
@@ -0,0 +1,30 @@
+/********************************************************************
+ Flush register windows on sparc.
+
+ This function is in a separate file to prevent inlining. The "flushw"
+ assembler instruction used on sparcv9 flushes all register windows
+ except the current one, so if it is inlined, the current register
+ window of the process executing the instruction will not be flushed
+ correctly.
+
+ See http://bugs.ruby-lang.org/issues/5244 for discussion.
+*********************************************************************/
+void rb_sparc_flush_register_windows(void)
+{
+ asm
+#ifdef __GNUC__
+ __volatile__
+#endif
+
+/* This condition should be in sync with one in configure.in */
+#if defined(__sparcv9) || defined(__sparc_v9__) || defined(__arch64__)
+# ifdef __GNUC__
+ ("flushw" : : : "%o7")
+# else
+ ("flushw")
+# endif /* __GNUC__ */
+#else
+ ("ta 0x03")
+#endif
+ ;
+}