mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			123 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //@ add-core-stubs
 | |
| //@ assembly-output: emit-asm
 | |
| //@ compile-flags: -Copt-level=3 -C panic=abort
 | |
| //@ compile-flags: --target armv7-unknown-linux-gnueabihf
 | |
| //@ compile-flags: -C target-feature=+neon
 | |
| //@ compile-flags: -Zmerge-functions=disabled
 | |
| //@ needs-llvm-components: arm
 | |
| 
 | |
| #![feature(no_core, repr_simd)]
 | |
| #![crate_type = "rlib"]
 | |
| #![no_core]
 | |
| #![allow(asm_sub_register, non_camel_case_types)]
 | |
| 
 | |
| extern crate minicore;
 | |
| use minicore::*;
 | |
| 
 | |
| #[repr(simd)]
 | |
| pub struct f32x4([f32; 4]);
 | |
| 
 | |
| impl Copy for f32x4 {}
 | |
| 
 | |
| macro_rules! check {
 | |
|     ($func:ident $modifier:literal $reg:ident $ty:ident $mov:literal) => {
 | |
|         // -Copt-level=3 and extern "C" guarantee that the selected register is always r0/s0/d0/q0
 | |
|         #[no_mangle]
 | |
|         pub unsafe extern "C" fn $func() -> $ty {
 | |
|             let y;
 | |
|             asm!(concat!($mov, " {0:", $modifier, "}, {0:", $modifier, "}"), out($reg) y);
 | |
|             y
 | |
|         }
 | |
|     };
 | |
| }
 | |
| 
 | |
| // CHECK-LABEL: reg:
 | |
| // CHECK: @APP
 | |
| // CHECK: mov r0, r0
 | |
| // CHECK: @NO_APP
 | |
| check!(reg "" reg i32 "mov");
 | |
| 
 | |
| // CHECK-LABEL: sreg:
 | |
| // CHECK: @APP
 | |
| // CHECK: vmov.f32 s0, s0
 | |
| // CHECK: @NO_APP
 | |
| check!(sreg "" sreg f32 "vmov.f32");
 | |
| 
 | |
| // CHECK-LABEL: sreg_low16:
 | |
| // CHECK: @APP
 | |
| // CHECK: vmov.f32 s0, s0
 | |
| // CHECK: @NO_APP
 | |
| check!(sreg_low16 "" sreg_low16 f32 "vmov.f32");
 | |
| 
 | |
| // CHECK-LABEL: dreg:
 | |
| // CHECK: @APP
 | |
| // CHECK: vmov.f64 d0, d0
 | |
| // CHECK: @NO_APP
 | |
| check!(dreg "" dreg f64 "vmov.f64");
 | |
| 
 | |
| // CHECK-LABEL: dreg_low16:
 | |
| // CHECK: @APP
 | |
| // CHECK: vmov.f64 d0, d0
 | |
| // CHECK: @NO_APP
 | |
| check!(dreg_low16 "" dreg_low16 f64 "vmov.f64");
 | |
| 
 | |
| // CHECK-LABEL: dreg_low8:
 | |
| // CHECK: @APP
 | |
| // CHECK: vmov.f64 d0, d0
 | |
| // CHECK: @NO_APP
 | |
| check!(dreg_low8 "" dreg_low8 f64 "vmov.f64");
 | |
| 
 | |
| // CHECK-LABEL: qreg:
 | |
| // CHECK: @APP
 | |
| // CHECK: vorr q0, q0, q0
 | |
| // CHECK: @NO_APP
 | |
| check!(qreg "" qreg f32x4 "vmov");
 | |
| 
 | |
| // CHECK-LABEL: qreg_e:
 | |
| // CHECK: @APP
 | |
| // CHECK: vmov.f64 d0, d0
 | |
| // CHECK: @NO_APP
 | |
| check!(qreg_e "e" qreg f32x4 "vmov.f64");
 | |
| 
 | |
| // CHECK-LABEL: qreg_f:
 | |
| // CHECK: @APP
 | |
| // CHECK: vmov.f64 d1, d1
 | |
| // CHECK: @NO_APP
 | |
| check!(qreg_f "f" qreg f32x4 "vmov.f64");
 | |
| 
 | |
| // CHECK-LABEL: qreg_low8:
 | |
| // CHECK: @APP
 | |
| // CHECK: vorr q0, q0, q0
 | |
| // CHECK: @NO_APP
 | |
| check!(qreg_low8 "" qreg_low8 f32x4 "vmov");
 | |
| 
 | |
| // CHECK-LABEL: qreg_low8_e:
 | |
| // CHECK: @APP
 | |
| // CHECK: vmov.f64 d0, d0
 | |
| // CHECK: @NO_APP
 | |
| check!(qreg_low8_e "e" qreg_low8 f32x4 "vmov.f64");
 | |
| 
 | |
| // CHECK-LABEL: qreg_low8_f:
 | |
| // CHECK: @APP
 | |
| // CHECK: vmov.f64 d1, d1
 | |
| // CHECK: @NO_APP
 | |
| check!(qreg_low8_f "f" qreg_low8 f32x4 "vmov.f64");
 | |
| 
 | |
| // CHECK-LABEL: qreg_low4:
 | |
| // CHECK: @APP
 | |
| // CHECK: vorr q0, q0, q0
 | |
| // CHECK: @NO_APP
 | |
| check!(qreg_low4 "" qreg_low4 f32x4 "vmov");
 | |
| 
 | |
| // CHECK-LABEL: qreg_low4_e:
 | |
| // CHECK: @APP
 | |
| // CHECK: vmov.f64 d0, d0
 | |
| // CHECK: @NO_APP
 | |
| check!(qreg_low4_e "e" qreg_low4 f32x4 "vmov.f64");
 | |
| 
 | |
| // CHECK-LABEL: qreg_low4_f:
 | |
| // CHECK: @APP
 | |
| // CHECK: vmov.f64 d1, d1
 | |
| // CHECK: @NO_APP
 | |
| check!(qreg_low4_f "f" qreg_low4 f32x4 "vmov.f64");
 | 
