--- atomic_backup.rs	2018-10-06 19:59:14.000000000 +0800
+++ atomic.rs	2018-10-26 14:34:31.000000000 +0800
@@ -125,6 +125,9 @@
 #[cfg(target_has_atomic = "8")]
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct AtomicBool {
+    #[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
+    v: UnsafeCell<u32>,
+    #[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
     v: UnsafeCell<u8>,
 }
 
@@ -265,6 +268,59 @@
 pub const ATOMIC_BOOL_INIT: AtomicBool = AtomicBool::new(false);
 
 #[cfg(target_has_atomic = "8")]
+#[cfg(any(target_arch = "riscv32", target_arch = "riscv64"))]
+impl AtomicBool {
+    ///
+    #[inline]
+    #[stable(feature = "rust1", since = "1.0.0")]
+    pub const fn new(v: bool) -> AtomicBool {
+        AtomicBool { v: UnsafeCell::new(v as u32) }
+    }
+
+    ///
+    #[inline]
+    #[stable(feature = "rust1", since = "1.0.0")]
+    pub fn load(&self, order: Ordering) -> bool {
+        unsafe { atomic_load(self.v.get(), order) != 0 }
+    }
+
+    ///
+    #[inline]
+    #[stable(feature = "rust1", since = "1.0.0")]
+    pub fn store(&self, val: bool, order: Ordering) {
+        unsafe { atomic_store(self.v.get(), val as u32, order); }
+    }
+
+    ///
+    #[inline]
+    #[stable(feature = "rust1", since = "1.0.0")]
+    pub fn compare_and_swap(&self, current: bool, new: bool, order: Ordering) -> bool {
+        match self.compare_exchange(current, new, order, strongest_failure_ordering(order)) {
+            Ok(x) => x,
+            Err(x) => x,
+        }
+    }
+
+    ///
+    #[inline]
+    #[stable(feature = "extended_compare_and_swap", since = "1.10.0")]
+    pub fn compare_exchange(&self,
+                            current: bool,
+                            new: bool,
+                            success: Ordering,
+                            failure: Ordering)
+                            -> Result<bool, bool> {
+        match unsafe {
+            atomic_compare_exchange(self.v.get(), current as u32, new as u32, success, failure)
+        } {
+            Ok(x) => Ok(x != 0),
+            Err(x) => Err(x != 0),
+        }
+    }
+}
+
+#[cfg(target_has_atomic = "8")]
+#[cfg(not(any(target_arch = "riscv32", target_arch = "riscv64")))]
 impl AtomicBool {
     /// Creates a new `AtomicBool`.
     ///
