Add CPU detection on RISC OS.
authorCameron Cawley <ccawley2011@gmail.com>
Thu, 19 Oct 2017 22:57:58 +0000 (23:57 +0100)
committerRalph Giles <giles@thaumas.net>
Mon, 23 Oct 2017 19:32:26 +0000 (12:32 -0700)
Signed-off-by: Ralph Giles <giles@thaumas.net>
lib/arm/armcpu.c

index 98b2326..f1941bd 100644 (file)
@@ -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