]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
spu_mfcio.h (mfc_begin_critical_section): New function.
authorUlrich Weigand <uweigand@de.ibm.com>
Mon, 25 Aug 2008 18:54:38 +0000 (18:54 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Mon, 25 Aug 2008 18:54:38 +0000 (18:54 +0000)
* config/spu/spu_mfcio.h (mfc_begin_critical_section): New function.
(mfc_end_critical_section): Likewise.

From-SVN: r139570

gcc/ChangeLog
gcc/config/spu/spu_mfcio.h

index bd4b67bfa231fc17f1b5cfdd32faa9d3ea272138..f38c298043d9eb0115a73e0bfcdaab7166a72bb8 100644 (file)
@@ -1,3 +1,8 @@
+2008-08-25  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+       * config/spu/spu_mfcio.h (mfc_begin_critical_section): New function.
+       (mfc_end_critical_section): Likewise.
+
 2008-08-25  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
 
        * config/rs6000/rs6000.c (rs6000_handle_altivec_attribute): Propagate
index 8423b9e8d5dc576356f127b150a1f8e016fb1182..b0d3cd540f9c85a80a167dfa73e2da6a16bffcf8 100644 (file)
@@ -289,6 +289,34 @@ typedef struct mfc_list_element {
 #define spu_write_srr0(srr0)          spu_writech(SPU_WrSRR0,srr0)
 #define spu_read_srr0()               spu_readch(SPU_RdSRR0)
 
+/* Interrupt-Safe Critical Sections */
+
+static __inline__ unsigned int mfc_begin_critical_section (void)
+  __attribute__ ((__always_inline__));
+
+static __inline__ unsigned int
+mfc_begin_critical_section (void)
+{
+#ifdef SPU_MFCIO_INTERRUPT_SAFE
+  unsigned int __status = spu_read_machine_status ();
+  spu_idisable ();
+  return __status;
+#else
+  return 0;
+#endif
+}
+
+static __inline__ void mfc_end_critical_section (unsigned int)
+  __attribute__ ((__always_inline__));
+
+static __inline__ void
+mfc_end_critical_section (unsigned int __status __attribute__ ((__unused__)))
+{
+#ifdef SPU_MFCIO_INTERRUPT_SAFE
+  if (__status & 1)
+    spu_ienable ();
+#endif
+}
 
 /* MFC Tag Manager */