| //@ add-core-stubs |
| //@ needs-asm-support |
| //@ revisions: s390x s390x_vector s390x_vector_stable |
| //@[s390x] compile-flags: --target s390x-unknown-linux-gnu -C target-feature=-vector |
| //@[s390x] needs-llvm-components: systemz |
| //@[s390x_vector] compile-flags: --target s390x-unknown-linux-gnu -C target-feature=+vector |
| //@[s390x_vector] needs-llvm-components: systemz |
| //@[s390x_vector_stable] compile-flags: --target s390x-unknown-linux-gnu -C target-feature=+vector |
| //@[s390x_vector_stable] needs-llvm-components: systemz |
| |
| #![crate_type = "rlib"] |
| #![feature(no_core, repr_simd)] |
| #![cfg_attr(not(s390x_vector_stable), feature(asm_experimental_reg))] |
| #![no_core] |
| #![allow(non_camel_case_types)] |
| |
| extern crate minicore; |
| use minicore::*; |
| |
| #[repr(simd)] |
| pub struct i64x2([i64; 2]); |
| |
| impl Copy for i64x2 {} |
| |
| fn f() { |
| let mut x = 0; |
| let mut b = 0u8; |
| let mut v = i64x2([0; 2]); |
| unsafe { |
| // Unsupported registers |
| asm!("", out("r11") _); |
| //~^ ERROR invalid register `r11`: The frame pointer cannot be used as an operand for inline asm |
| asm!("", out("r15") _); |
| //~^ ERROR invalid register `r15`: The stack pointer cannot be used as an operand for inline asm |
| asm!("", out("c0") _); |
| //~^ ERROR invalid register `c0`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c1") _); |
| //~^ ERROR invalid register `c1`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c2") _); |
| //~^ ERROR invalid register `c2`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c3") _); |
| //~^ ERROR invalid register `c3`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c4") _); |
| //~^ ERROR invalid register `c4`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c5") _); |
| //~^ ERROR invalid register `c5`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c6") _); |
| //~^ ERROR invalid register `c6`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c7") _); |
| //~^ ERROR invalid register `c7`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c8") _); |
| //~^ ERROR invalid register `c8`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c9") _); |
| //~^ ERROR invalid register `c9`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c10") _); |
| //~^ ERROR invalid register `c10`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c11") _); |
| //~^ ERROR invalid register `c11`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c12") _); |
| //~^ ERROR invalid register `c12`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c13") _); |
| //~^ ERROR invalid register `c13`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c14") _); |
| //~^ ERROR invalid register `c14`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("c15") _); |
| //~^ ERROR invalid register `c15`: control registers are reserved by the kernel and cannot be used as operands for inline asm |
| asm!("", out("a0") _); |
| //~^ ERROR invalid register `a0`: a0 and a1 are reserved for system use and cannot be used as operands for inline asm |
| asm!("", out("a1") _); |
| //~^ ERROR invalid register `a1`: a0 and a1 are reserved for system use and cannot be used as operands for inline asm |
| |
| // vreg |
| asm!("", out("v0") _); // always ok |
| asm!("", in("v0") v); // requires vector & asm_experimental_reg |
| //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature |
| //[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658] |
| //[s390x_vector_stable]~| ERROR type `i64x2` cannot be used with this register class in stable [E0658] |
| asm!("", out("v0") v); // requires vector & asm_experimental_reg |
| //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature |
| //[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658] |
| //[s390x_vector_stable]~| ERROR type `i64x2` cannot be used with this register class in stable [E0658] |
| asm!("", in("v0") x); // requires vector & asm_experimental_reg |
| //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature |
| //[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658] |
| //[s390x_vector_stable]~| ERROR type `i32` cannot be used with this register class in stable [E0658] |
| asm!("", out("v0") x); // requires vector & asm_experimental_reg |
| //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature |
| //[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658] |
| //[s390x_vector_stable]~| ERROR type `i32` cannot be used with this register class in stable [E0658] |
| asm!("", in("v0") b); |
| //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature |
| //[s390x_vector]~^^ ERROR type `u8` cannot be used with this register class |
| //[s390x_vector_stable]~^^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658] |
| //[s390x_vector_stable]~| ERROR type `u8` cannot be used with this register class |
| asm!("", out("v0") b); |
| //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature |
| //[s390x_vector]~^^ ERROR type `u8` cannot be used with this register class |
| //[s390x_vector_stable]~^^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658] |
| //[s390x_vector_stable]~| ERROR type `u8` cannot be used with this register class |
| asm!("/* {} */", in(vreg) v); // requires vector & asm_experimental_reg |
| //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature |
| //[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658] |
| //[s390x_vector_stable]~| ERROR type `i64x2` cannot be used with this register class in stable [E0658] |
| asm!("/* {} */", in(vreg) x); // requires vector & asm_experimental_reg |
| //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature |
| //[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658] |
| //[s390x_vector_stable]~| ERROR type `i32` cannot be used with this register class in stable [E0658] |
| asm!("/* {} */", in(vreg) b); |
| //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature |
| //[s390x_vector]~^^ ERROR type `u8` cannot be used with this register class |
| //[s390x_vector_stable]~^^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658] |
| //[s390x_vector_stable]~| ERROR type `u8` cannot be used with this register class |
| asm!("/* {} */", out(vreg) _); // requires vector & asm_experimental_reg |
| //[s390x]~^ ERROR register class `vreg` requires the `vector` target feature |
| //[s390x_vector_stable]~^^ ERROR register class `vreg` can only be used as a clobber in stable [E0658] |
| |
| // Clobber-only registers |
| // areg |
| asm!("", out("a2") _); // ok |
| asm!("", in("a2") x); |
| //~^ ERROR can only be used as a clobber |
| //~| ERROR type `i32` cannot be used with this register class |
| asm!("", out("a2") x); |
| //~^ ERROR can only be used as a clobber |
| //~| ERROR type `i32` cannot be used with this register class |
| asm!("/* {} */", in(areg) x); |
| //~^ ERROR can only be used as a clobber |
| //~| ERROR type `i32` cannot be used with this register class |
| asm!("/* {} */", out(areg) _); |
| //~^ ERROR can only be used as a clobber |
| |
| // Overlapping registers |
| // vreg/freg |
| asm!("", out("v0") _, out("f0") _); |
| //~^ ERROR register `f0` conflicts with register `v0` |
| asm!("", out("v1") _, out("f1") _); |
| //~^ ERROR register `f1` conflicts with register `v1` |
| asm!("", out("v2") _, out("f2") _); |
| //~^ ERROR register `f2` conflicts with register `v2` |
| asm!("", out("v3") _, out("f3") _); |
| //~^ ERROR register `f3` conflicts with register `v3` |
| asm!("", out("v4") _, out("f4") _); |
| //~^ ERROR register `f4` conflicts with register `v4` |
| asm!("", out("v5") _, out("f5") _); |
| //~^ ERROR register `f5` conflicts with register `v5` |
| asm!("", out("v6") _, out("f6") _); |
| //~^ ERROR register `f6` conflicts with register `v6` |
| asm!("", out("v7") _, out("f7") _); |
| //~^ ERROR register `f7` conflicts with register `v7` |
| asm!("", out("v8") _, out("f8") _); |
| //~^ ERROR register `f8` conflicts with register `v8` |
| asm!("", out("v9") _, out("f9") _); |
| //~^ ERROR register `f9` conflicts with register `v9` |
| asm!("", out("v10") _, out("f10") _); |
| //~^ ERROR register `f10` conflicts with register `v10` |
| asm!("", out("v11") _, out("f11") _); |
| //~^ ERROR register `f11` conflicts with register `v11` |
| asm!("", out("v12") _, out("f12") _); |
| //~^ ERROR register `f12` conflicts with register `v12` |
| asm!("", out("v13") _, out("f13") _); |
| //~^ ERROR register `f13` conflicts with register `v13` |
| asm!("", out("v14") _, out("f14") _); |
| //~^ ERROR register `f14` conflicts with register `v14` |
| asm!("", out("v15") _, out("f15") _); |
| //~^ ERROR register `f15` conflicts with register `v15` |
| // no %f16 |
| asm!("", out("v16") _, out("f16") _); |
| //~^ ERROR invalid register `f16`: unknown register |
| } |
| } |