summaryrefslogtreecommitdiffstats
path: root/src/test/ui/asm/x86_64/type-check-3.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/asm/x86_64/type-check-3.rs')
-rw-r--r--src/test/ui/asm/x86_64/type-check-3.rs73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/test/ui/asm/x86_64/type-check-3.rs b/src/test/ui/asm/x86_64/type-check-3.rs
new file mode 100644
index 000000000..89c849c75
--- /dev/null
+++ b/src/test/ui/asm/x86_64/type-check-3.rs
@@ -0,0 +1,73 @@
+// only-x86_64
+// compile-flags: -C target-feature=+avx512f
+
+#![feature(asm_const)]
+
+use std::arch::{asm, global_asm};
+
+use std::arch::x86_64::{_mm256_setzero_ps, _mm_setzero_ps};
+
+fn main() {
+ unsafe {
+ // Types must be listed in the register class.
+
+ asm!("{}", in(reg) 0i128);
+ //~^ ERROR type `i128` cannot be used with this register class
+ asm!("{}", in(reg) _mm_setzero_ps());
+ //~^ ERROR type `__m128` cannot be used with this register class
+ asm!("{}", in(reg) _mm256_setzero_ps());
+ //~^ ERROR type `__m256` cannot be used with this register class
+ asm!("{}", in(xmm_reg) 0u8);
+ //~^ ERROR type `u8` cannot be used with this register class
+ asm!("{:e}", in(reg) 0i32);
+ asm!("{}", in(xmm_reg) 0i32);
+ asm!("{:e}", in(reg) 0f32);
+ asm!("{}", in(xmm_reg) 0f32);
+ asm!("{}", in(xmm_reg) _mm_setzero_ps());
+ asm!("{:x}", in(ymm_reg) _mm_setzero_ps());
+ asm!("{}", in(kreg) 0u16);
+ asm!("{}", in(kreg) 0u64);
+ //~^ ERROR `avx512bw` target feature is not enabled
+
+ // Template modifier suggestions for sub-registers
+
+ asm!("{0} {0}", in(reg) 0i16);
+ //~^ WARN formatting may not be suitable for sub-register argument
+ asm!("{0} {0:x}", in(reg) 0i16);
+ //~^ WARN formatting may not be suitable for sub-register argument
+ asm!("{}", in(reg) 0i32);
+ //~^ WARN formatting may not be suitable for sub-register argument
+ asm!("{}", in(reg) 0i64);
+ asm!("{}", in(ymm_reg) 0i64);
+ //~^ WARN formatting may not be suitable for sub-register argument
+ asm!("{}", in(ymm_reg) _mm256_setzero_ps());
+ asm!("{:l}", in(reg) 0i16);
+ asm!("{:l}", in(reg) 0i32);
+ asm!("{:l}", in(reg) 0i64);
+ asm!("{:x}", in(ymm_reg) 0i64);
+ asm!("{:x}", in(ymm_reg) _mm256_setzero_ps());
+
+ // Suggest different register class for type
+
+ asm!("{}", in(reg) 0i8);
+ //~^ ERROR type `i8` cannot be used with this register class
+ asm!("{}", in(reg_byte) 0i8);
+
+ // Split inout operands must have compatible types
+
+ let mut val_i16: i16;
+ let mut val_f32: f32;
+ let mut val_u32: u32;
+ let mut val_u64: u64;
+ let mut val_ptr: *mut u8;
+ asm!("{:r}", inout(reg) 0u16 => val_i16);
+ asm!("{:r}", inout(reg) 0u32 => val_f32);
+ //~^ ERROR incompatible types for asm inout argument
+ asm!("{:r}", inout(reg) 0u32 => val_ptr);
+ //~^ ERROR incompatible types for asm inout argument
+ asm!("{:r}", inout(reg) main => val_u32);
+ //~^ ERROR incompatible types for asm inout argument
+ asm!("{:r}", inout(reg) 0u64 => val_ptr);
+ asm!("{:r}", inout(reg) main => val_u64);
+ }
+}