diff --git a/libc-test/build.rs b/libc-test/build.rs
index f7c0129e49b59c2a1ff0ea50c2da34bbff261bf7..62d8b07f5e9706171ce081a5572aa9c1ee9c49b8 100644
--- a/libc-test/build.rs
+++ b/libc-test/build.rs
@@ -258,7 +258,7 @@ impl<'a> TestGenerator<'a> {
                 unsafe {{
                     same(mem::size_of::<{ty}>() as u64,
                          __test_size_{ty}(), "size");
-                    same(mem::align_of::<{ty}>() as u64,
+                    same(align::<{ty}>() as u64,
                          __test_align_{ty}(), "align");
                 }}
             }}
diff --git a/libc-test/tests/all.rs b/libc-test/tests/all.rs
index b717c8a59ee2fa7fbad8dcabe72e12cf78c1c91a..fe3bd246ce4b6b8b8f8795aa468d9d89528941da 100644
--- a/libc-test/tests/all.rs
+++ b/libc-test/tests/all.rs
@@ -1,6 +1,7 @@
 extern crate libc;
 extern crate libc_test;
 
+use std::any::{Any, TypeId};
 use std::mem;
 
 use libc::*;
@@ -12,6 +13,21 @@ fn same(rust: u64, c: u64, attr: &str) {
     }
 }
 
+fn align<T: Any>() -> u64 {
+    // TODO: apparently these three types have less alignment in Rust on x86
+    //       than they do in C this difference should.. probably be reconciled.
+    //
+    //       Perhaps #27195?
+    if cfg!(target_pointer_width = "32") {
+        if TypeId::of::<T>() == TypeId::of::<f64>() ||
+           TypeId::of::<T>() == TypeId::of::<i64>() ||
+           TypeId::of::<T>() == TypeId::of::<u64>() {
+            return 8
+        }
+    }
+    mem::align_of::<T>() as u64
+}
+
 macro_rules! offset_of {
     ($ty:ident, $field:ident) => (
         (&((*(0 as *const $ty)).$field)) as *const _ as u64