armv7.patch 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. From 4e457165ee019fb9002b53ffa9a5f95b99b22113 Mon Sep 17 00:00:00 2001
  2. From: Jorrit Rouwe <[email protected]>
  3. Date: Mon, 10 Apr 2023 16:46:28 +0200
  4. Subject: [PATCH] Experimental linux armv7a support (#500)
  5. ---
  6. Build/Android/build.gradle | 2 +-
  7. Jolt/Core/FPControlWord.h | 33 ++++++++++++++++++++++++++++++++-
  8. Jolt/Core/TickCounter.h | 4 +++-
  9. 3 files changed, 36 insertions(+), 3 deletions(-)
  10. diff --git a/Build/Android/build.gradle b/Build/Android/build.gradle
  11. index 04bc67d84..de0c8f88b 100644
  12. --- a/Build/Android/build.gradle
  13. +++ b/Build/Android/build.gradle
  14. @@ -5,7 +5,7 @@ buildscript {
  15. mavenCentral()
  16. }
  17. dependencies {
  18. - classpath 'com.android.tools.build:gradle:7.4.1'
  19. + classpath 'com.android.tools.build:gradle:7.4.2'
  20. // NOTE: Do not place your application dependencies here; they belong
  21. // in the individual module build.gradle files
  22. diff --git a/Jolt/Core/FPControlWord.h b/Jolt/Core/FPControlWord.h
  23. index 9c47a040a..b66344da0 100644
  24. --- a/Jolt/Core/FPControlWord.h
  25. +++ b/Jolt/Core/FPControlWord.h
  26. @@ -60,7 +60,7 @@ class FPControlWord : public NonCopyable
  27. unsigned int mPrevState;
  28. };
  29. -#elif defined(JPH_CPU_ARM)
  30. +#elif defined(JPH_CPU_ARM) && defined(JPH_USE_NEON)
  31. /// Helper class that needs to be put on the stack to update the state of the floating point control word.
  32. /// This state is kept per thread.
  33. @@ -91,6 +91,37 @@ class FPControlWord : public NonCopyable
  34. uint64 mPrevState;
  35. };
  36. +#elif defined(JPH_CPU_ARM)
  37. +
  38. +/// Helper class that needs to be put on the stack to update the state of the floating point control word.
  39. +/// This state is kept per thread.
  40. +template <uint32 Value, uint32 Mask>
  41. +class FPControlWord : public NonCopyable
  42. +{
  43. +public:
  44. + FPControlWord()
  45. + {
  46. + uint32 val;
  47. + asm volatile("vmrs %0, fpscr" : "=r" (val));
  48. + mPrevState = val;
  49. + val &= ~Mask;
  50. + val |= Value;
  51. + asm volatile("vmsr fpscr, %0" : /* no output */ : "r" (val));
  52. + }
  53. +
  54. + ~FPControlWord()
  55. + {
  56. + uint32 val;
  57. + asm volatile("vmrs %0, fpscr" : "=r" (val));
  58. + val &= ~Mask;
  59. + val |= mPrevState & Mask;
  60. + asm volatile("vmsr fpscr, %0" : /* no output */ : "r" (val));
  61. + }
  62. +
  63. +private:
  64. + uint32 mPrevState;
  65. +};
  66. +
  67. #elif defined(JPH_CPU_WASM)
  68. // Not supported
  69. diff --git a/Jolt/Core/TickCounter.h b/Jolt/Core/TickCounter.h
  70. index a9d1272a3..9a8967d31 100644
  71. --- a/Jolt/Core/TickCounter.h
  72. +++ b/Jolt/Core/TickCounter.h
  73. @@ -27,10 +27,12 @@ JPH_INLINE uint64 GetProcessorTickCount()
  74. return JPH_PLATFORM_BLUE_GET_TICKS();
  75. #elif defined(JPH_CPU_X86)
  76. return __rdtsc();
  77. -#elif defined(JPH_CPU_ARM)
  78. +#elif defined(JPH_CPU_ARM) && defined(JPH_USE_NEON)
  79. uint64 val;
  80. asm volatile("mrs %0, cntvct_el0" : "=r" (val));
  81. return val;
  82. +#elif defined(JPH_CPU_ARM)
  83. + return 0; // Not supported
  84. #elif defined(JPH_CPU_WASM)
  85. return 0; // Not supported
  86. #else