diff --git a/lib/arm/armcpu.c b/lib/arm/armcpu.c index 98b2326b0b28a22fc951097c7f5e08bd5fea8ef0..f1941bdc15577a888103583373c25dc5ba8f893b 100644 --- a/lib/arm/armcpu.c +++ b/lib/arm/armcpu.c @@ -107,6 +107,44 @@ ogg_uint32_t oc_cpu_flags_get(void){ return flags; } +#elif defined(__riscos__) +#include <kernel.h> +#include <swis.h> + +ogg_uint32_t oc_cpu_flags_get(void) { + ogg_uint32_t flags = 0; + +#if defined(OC_ARM_ASM_EDSP) || defined(OC_ARM_ASM_MEDIA) + + if (_swi(OS_Byte,_IN(0)|_IN(2)|_RETURN(1), 129, 0xFF) <= 0xA9) + _swix(OS_Module, _INR(0,1), 1, "System:Modules.CallASWI"); + + ogg_uint32_t features; + _kernel_oserror* test = _swix(OS_PlatformFeatures, _IN(0)|_OUT(0), 0, &features); + if (test == NULL) { +#if defined(OC_ARM_ASM_EDSP) + if((features>>10 & 1) == 1)flags|=OC_CPU_ARM_EDSP; +#endif + +#if defined(OC_ARM_ASM_MEDIA) + if ((features>>31 & 1) == 1) { + ogg_uint32_t shadd = 0; + test =_swix(OS_PlatformFeatures, _INR(0,1)|_OUT(0), 34, 29, &shadd); + if (test==NULL && shadd==1)flags|=OC_CPU_ARM_MEDIA; + } +#endif + } +#endif + +#if defined(OC_ARM_ASM_NEON) + ogg_uint32_t mvfr1; + test = _swix(VFPSupport_Features, _IN(0)|_OUT(2), 0, &mvfr1); + if (test==NULL && (mvfr1 & 0xFFF00)==0x11100)flags|=OC_CPU_ARM_NEON; +#endif + + return flags; +} + #else /*The feature registers which can tell us what the processor supports are accessible in priveleged modes only, so we can't have a general user-space