mirror of https://github.com/rust-lang/rust
74 lines
2.7 KiB
Rust
74 lines
2.7 KiB
Rust
//@ 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);
|
|
}
|
|
}
|