| // Codegen test of mandatory Cortex-R82 extensions | |
| //@ add-minicore | |
| //@ compile-flags: --target aarch64v8r-unknown-none -C target-cpu=cortex-r82 | |
| //@ needs-llvm-components: aarch64 | |
| //@ build-pass | |
| //@ ignore-backends: gcc | |
| #![deny(dead_code)] | |
| #![feature(no_core)] | |
| #![no_core] | |
| #![no_main] | |
| #![crate_type = "rlib"] | |
| extern crate minicore; | |
| use minicore::*; | |
| /* # Mandatory extensions | |
| * | |
| * A `//` comment indicates that the extension has no associated assembly instruction and cannot | |
| * be codegen tested | |
| * A `/* */` comment indicates that the extension is being tested in the ISA level codegen test | |
| * (`tests/ui/asm/aarch64v8r.rs`) | |
| * | |
| * Note that as we use the hard-float `aarch64v8r-unknown-none` target as the base, the neon | |
| * extension is present (`NEON_FPm=1`). This affects which R82-specific extensions are enabled | |
| * (see "when `NEON_FPm == 1`" note in Cortex-R82 Processor Technical Reference Manual) | |
| * | |
| * ## References: | |
| * | |
| * - Arm Cortex-R82 Processor Technical Reference Manual Revision r3p1 (102670_0301_06_en Issue 6) | |
| * section 3.2.1 has the list of mandatory extensions | |
| * - Arm Architecture Reference Manual for A-profile architecture (ARM DDI 0487) -- has the | |
| * mapping from features to instructions | |
| * - Feature names in A-profile architecture (109697_0100_02_en Version 1.0) -- overview of what | |
| * each extension mean | |
| * */ | |
| pub fn mandatory_extensions() { | |
| // FEAT_GICv3 | |
| // FEAT_GICv3p1 | |
| // FEAT_GICv3_TDIR | |
| feat_pmuv3(); | |
| // FEAT_ETMv4 | |
| // FEAT_ETMv4p1 | |
| // FEAT_ETMv4p2 | |
| // FEAT_ETMv4p3 | |
| // FEAT_ETMv4p4 | |
| // FEAT_ETMv4p5 | |
| /* FEAT_RAS */ | |
| // FEAT_PCSRv8 | |
| feat_ssbs(); | |
| feat_ssbs2(); | |
| // FEAT_CSV2 | |
| // FEAT_CSV2_1p1 | |
| // FEAT_CSV3 | |
| feat_sb(); | |
| feat_specres(); | |
| feat_dgh(); | |
| // FEAT_nTLBPA | |
| /* FEAT_CRC32 */ | |
| /* FEAT_LSE */ | |
| feat_rdm(); // mandatory given that NEON_FPm=1 | |
| /* FEAT_HPDS */ | |
| /* FEAT_PAN */ | |
| // FEAT_HAFDBS | |
| // FEAT_PMUv3p1 | |
| // FEAT_TTCNP | |
| // FEAT_XNX | |
| /* FEAT_UAO */ | |
| feat_pan2(); | |
| feat_dpb(); | |
| /* FEAT_Debugv8p2 */ | |
| /* FEAT_ASMv8p2 */ | |
| // FEAT_IESB | |
| feat_fp16(); // mandatory given that NEON_FPm=1 | |
| // FEAT_PCSRv8p2 | |
| feat_dotprod(); // mandatory given that NEON_FPm=1 | |
| feat_fhm(); // mandatory given that NEON_FPm=1 | |
| feat_dpb2(); | |
| /* FEAT_PAuth */ | |
| // FEAT_PACQARMA3 | |
| // FEAT_PAuth2 | |
| // FEAT_FPAC | |
| // FEAT_FPACCOMBINE | |
| // FEAT_CONSTPACFIELD | |
| feat_jscvt(); // mandatory given that NEON_FPm=1 | |
| /* FEAT_LRCPC */ | |
| feat_fcma(); // mandatory given that NEON_FPm=1 | |
| // FEAT_DoPD | |
| // FEAT_SEL2 | |
| /* FEAT_S2FWB */ | |
| /* FEAT_DIT */ | |
| /* FEAT_IDST */ | |
| /* FEAT_FlagM */ | |
| /* FEAT_LSE2 */ | |
| /* FEAT_LRCPC2 */ | |
| /* FEAT_TLBIOS */ | |
| /* FEAT_TLBIRANGE */ | |
| /* FEAT_TTL */ | |
| // FEAT_BBM | |
| // FEAT_CNTSC | |
| feat_rasv1p1(); | |
| // FEAT_Debugv8p4 | |
| feat_pmuv3p4(); | |
| feat_trf(); | |
| // FEAT_TTST | |
| // FEAT_E0PD | |
| } | |
| fn feat_pmuv3() { | |
| unsafe { asm!("mrs x0, PMCCFILTR_EL0") } | |
| } | |
| fn feat_ssbs() { | |
| unsafe { asm!("msr SSBS, 1") } | |
| } | |
| fn feat_ssbs2() { | |
| unsafe { asm!("mrs x0, SSBS") } | |
| } | |
| fn feat_sb() { | |
| unsafe { asm!("sb") } | |
| } | |
| fn feat_specres() { | |
| unsafe { asm!("cfp rctx, x0") } | |
| } | |
| fn feat_dgh() { | |
| unsafe { asm!("dgh") } | |
| } | |
| fn feat_rdm() { | |
| unsafe { asm!("sqrdmlah v0.4h, v1.4h, v2.4h") } | |
| } | |
| fn feat_pan2() { | |
| unsafe { asm!("AT S1E1RP, x0") } | |
| } | |
| fn feat_dpb() { | |
| unsafe { asm!("DC CVAP, x0") } | |
| } | |
| fn feat_fp16() { | |
| unsafe { asm!("fmulx h0, h1, h2") } | |
| } | |
| fn feat_dotprod() { | |
| unsafe { asm!("sdot V0.4S, V1.16B, V2.16B") } | |
| } | |
| fn feat_fhm() { | |
| unsafe { asm!("fmlal v0.2s, v1.2h, v2.2h") } | |
| } | |
| fn feat_dpb2() { | |
| unsafe { asm!("DC CVADP, x0") } | |
| } | |
| fn feat_jscvt() { | |
| unsafe { asm!("fjcvtzs w0, d1") } | |
| } | |
| fn feat_fcma() { | |
| unsafe { asm!("fcadd v0.4h, v1.4h, v2.4h, #90") } | |
| } | |
| fn feat_rasv1p1() { | |
| unsafe { asm!("mrs x0, ERXMISC2_EL1") } | |
| } | |
| fn feat_pmuv3p4() { | |
| unsafe { asm!("mrs x0, PMMIR_EL1") } | |
| } | |
| fn feat_trf() { | |
| unsafe { asm!("tsb csync") } | |
| } |