about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLzu Tao <taolzu@gmail.com>2020-10-01 04:09:59 +0000
committerLzu Tao <taolzu@gmail.com>2020-10-04 03:35:52 +0000
commit6cb062dacfed8e647361bc94694c7177beb17390 (patch)
tree11fec1779e8808e3c453dd56f9df6a85a3e33e75
parent446f86e370884df01cbbacc584d67859c6c2a10b (diff)
downloadrust-6cb062dacfed8e647361bc94694c7177beb17390.tar.gz
rust-6cb062dacfed8e647361bc94694c7177beb17390.zip
mips32: Add f64 hard-float support
co-authored-by: Amanieu <amanieu@gmail.com>
-rw-r--r--compiler/rustc_target/src/asm/mips.rs2
-rw-r--r--src/doc/unstable-book/src/library-features/asm.md2
-rw-r--r--src/test/assembly/asm/mips-types.rs24
3 files changed, 26 insertions, 2 deletions
diff --git a/compiler/rustc_target/src/asm/mips.rs b/compiler/rustc_target/src/asm/mips.rs
index 638c52d97f1..f6e3b7d1921 100644
--- a/compiler/rustc_target/src/asm/mips.rs
+++ b/compiler/rustc_target/src/asm/mips.rs
@@ -36,7 +36,7 @@ impl MipsInlineAsmRegClass {
     ) -> &'static [(InlineAsmType, Option<&'static str>)] {
         match self {
             Self::reg => types! { _: I8, I16, I32, F32; },
-            Self::freg => types! { _: F32; },
+            Self::freg => types! { _: F32, F64; },
         }
     }
 }
diff --git a/src/doc/unstable-book/src/library-features/asm.md b/src/doc/unstable-book/src/library-features/asm.md
index af39424ec6c..8df08b2ab8f 100644
--- a/src/doc/unstable-book/src/library-features/asm.md
+++ b/src/doc/unstable-book/src/library-features/asm.md
@@ -551,7 +551,7 @@ Each register class has constraints on which value types they can be used with.
 | ARM | `dreg` | `vfp2` | `i64`, `f64`, `i8x8`, `i16x4`, `i32x2`, `i64x1`, `f32x2` |
 | ARM | `qreg` | `neon` | `i8x16`, `i16x8`, `i32x4`, `i64x2`, `f32x4` |
 | MIPS32 | `reg` | None | `i8`, `i16`, `i32`, `f32` |
-| MIPS32 | `freg` | None | `f32` |
+| MIPS32 | `freg` | None | `f32`, `f64` |
 | NVPTX | `reg16` | None | `i8`, `i16` |
 | NVPTX | `reg32` | None | `i8`, `i16`, `i32`, `f32` |
 | NVPTX | `reg64` | None | `i8`, `i16`, `i32`, `f32`, `i64`, `f64` |
diff --git a/src/test/assembly/asm/mips-types.rs b/src/test/assembly/asm/mips-types.rs
index e389e064bcb..f37da849064 100644
--- a/src/test/assembly/asm/mips-types.rs
+++ b/src/test/assembly/asm/mips-types.rs
@@ -108,6 +108,30 @@ pub unsafe fn f0_f32(x: f32) -> f32 {
     y
 }
 
+// CHECK-LABEL: reg_f64:
+// CHECK: #APP
+// CHECK: mov.d $f{{[0-9]+}}, $f{{[0-9]+}}
+// CHECK: #NO_APP
+#[no_mangle]
+pub unsafe fn reg_f64(x: f64) -> f64 {
+    dont_merge("reg_f64");
+    let y;
+    asm!("mov.d {}, {}", out(freg) y, in(freg) x);
+    y
+}
+
+// CHECK-LABEL: f0_f64:
+// CHECK: #APP
+// CHECK: mov.d $f0, $f0
+// CHECK: #NO_APP
+#[no_mangle]
+pub unsafe fn f0_f64(x: f64) -> f64 {
+    dont_merge("f0_f64");
+    let y;
+    asm!("mov.d $f0, $f0", lateout("$f0") y, in("$f0") x);
+    y
+}
+
 // CHECK-LABEL: reg_ptr:
 // CHECK: #APP
 // CHECK: move ${{[0-9]+}}, ${{[0-9]+}}