@@ -733,6 +733,14 @@ static inline gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add)
733
733
734
734
#elif defined(__arm__ )
735
735
736
+ #ifdef __native_client__
737
+ #define MASK_REGISTER (reg , cond ) "bic" cond " " reg ", " reg ", #0xc0000000\n"
738
+ #define NACL_ALIGN () ".align 4\n"
739
+ #else
740
+ #define MASK_REGISTER (reg , cond )
741
+ #define NACL_ALIGN ()
742
+ #endif
743
+
736
744
/*
737
745
* Atomic operations on ARM doesn't contain memory barriers, and the runtime code
738
746
* depends on this, so we add them explicitly.
@@ -743,11 +751,16 @@ static inline gint32 InterlockedCompareExchange(volatile gint32 *dest, gint32 ex
743
751
#if defined(__ARM_ARCH_6__ ) || defined(__ARM_ARCH_7A__ ) || defined(__ARM_ARCH_7__ ) || defined(__ARM_ARCH_7S__ )
744
752
gint32 ret , tmp ;
745
753
__asm__ __volatile__ ( "1:\n"
754
+ NACL_ALIGN ()
746
755
"dmb\n"
747
756
"mov %0, #0\n"
757
+ NACL_ALIGN ()
758
+ MASK_REGISTER ("%2" , "al" )
748
759
"ldrex %1, [%2]\n"
749
760
"teq %1, %3\n"
750
761
"it eq\n"
762
+ NACL_ALIGN ()
763
+ MASK_REGISTER ("%2" , "eq" )
751
764
"strexeq %0, %4, [%2]\n"
752
765
"teq %0, #0\n"
753
766
"bne 1b\n"
@@ -761,12 +774,18 @@ static inline gint32 InterlockedCompareExchange(volatile gint32 *dest, gint32 ex
761
774
gint32 a , b ;
762
775
763
776
__asm__ __volatile__ ( "0:\n\t"
777
+ NACL_ALIGN ()
778
+ MASK_REGISTER ("%2" , "al" )
764
779
"ldr %1, [%2]\n\t"
765
780
"cmp %1, %4\n\t"
766
781
"mov %0, %1\n\t"
767
782
"bne 1f\n\t"
783
+ NACL_ALIGN ()
784
+ MASK_REGISTER ("%2" , "al" )
768
785
"swp %0, %3, [%2]\n\t"
769
786
"cmp %0, %1\n\t"
787
+ NACL_ALIGN ()
788
+ MASK_REGISTER ("%2" , "ne" )
770
789
"swpne %3, %0, [%2]\n\t"
771
790
"bne 0b\n\t"
772
791
"1:"
@@ -785,10 +804,15 @@ static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest
785
804
__asm__ __volatile__ (
786
805
"dmb\n"
787
806
"1:\n"
807
+ NACL_ALIGN ()
788
808
"mov %0, #0\n"
809
+ NACL_ALIGN ()
810
+ MASK_REGISTER ("%2" , "al" )
789
811
"ldrex %1, [%2]\n"
790
812
"teq %1, %3\n"
791
813
"it eq\n"
814
+ NACL_ALIGN ()
815
+ MASK_REGISTER ("%2" , "eq" )
792
816
"strexeq %0, %4, [%2]\n"
793
817
"teq %0, #0\n"
794
818
"bne 1b\n"
@@ -802,12 +826,18 @@ static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest
802
826
gpointer a , b ;
803
827
804
828
__asm__ __volatile__ ( "0:\n\t"
829
+ NACL_ALIGN ()
830
+ MASK_REGISTER ("%2" , "al" )
805
831
"ldr %1, [%2]\n\t"
806
832
"cmp %1, %4\n\t"
807
833
"mov %0, %1\n\t"
808
834
"bne 1f\n\t"
835
+ NACL_ALIGN ()
836
+ MASK_REGISTER ("%2" , "eq" )
809
837
"swpeq %0, %3, [%2]\n\t"
810
838
"cmp %0, %1\n\t"
839
+ NACL_ALIGN ()
840
+ MASK_REGISTER ("%2" , "ne" )
811
841
"swpne %3, %0, [%2]\n\t"
812
842
"bne 0b\n\t"
813
843
"1:"
@@ -826,8 +856,12 @@ static inline gint32 InterlockedIncrement(volatile gint32 *dest)
826
856
__asm__ __volatile__ (
827
857
"dmb\n"
828
858
"1:\n"
859
+ NACL_ALIGN ()
860
+ MASK_REGISTER ("%2" , "al" )
829
861
"ldrex %0, [%2]\n"
830
862
"add %0, %0, %3\n"
863
+ NACL_ALIGN ()
864
+ MASK_REGISTER ("%2" , "al" )
831
865
"strex %1, %0, [%2]\n"
832
866
"teq %1, #0\n"
833
867
"bne 1b\n"
@@ -841,10 +875,16 @@ static inline gint32 InterlockedIncrement(volatile gint32 *dest)
841
875
gint32 a , b , c ;
842
876
843
877
__asm__ __volatile__ ( "0:\n\t"
878
+ NACL_ALIGN ()
879
+ MASK_REGISTER ("%3" , "al" )
844
880
"ldr %0, [%3]\n\t"
845
881
"add %1, %0, %4\n\t"
882
+ NACL_ALIGN ()
883
+ MASK_REGISTER ("%3" , "al" )
846
884
"swp %2, %1, [%3]\n\t"
847
885
"cmp %0, %2\n\t"
886
+ NACL_ALIGN ()
887
+ MASK_REGISTER ("%3" , "ne" )
848
888
"swpne %1, %2, [%3]\n\t"
849
889
"bne 0b"
850
890
: "=&r" (a ), "=&r" (b ), "=&r" (c )
@@ -862,8 +902,12 @@ static inline gint32 InterlockedDecrement(volatile gint32 *dest)
862
902
__asm__ __volatile__ (
863
903
"dmb\n"
864
904
"1:\n"
905
+ NACL_ALIGN ()
906
+ MASK_REGISTER ("%2" , "al" )
865
907
"ldrex %0, [%2]\n"
866
908
"sub %0, %0, %3\n"
909
+ NACL_ALIGN ()
910
+ MASK_REGISTER ("%2" , "al" )
867
911
"strex %1, %0, [%2]\n"
868
912
"teq %1, #0\n"
869
913
"bne 1b\n"
@@ -877,10 +921,16 @@ static inline gint32 InterlockedDecrement(volatile gint32 *dest)
877
921
gint32 a , b , c ;
878
922
879
923
__asm__ __volatile__ ( "0:\n\t"
924
+ NACL_ALIGN ()
925
+ MASK_REGISTER ("%3" , "al" )
880
926
"ldr %0, [%3]\n\t"
881
927
"add %1, %0, %4\n\t"
928
+ NACL_ALIGN ()
929
+ MASK_REGISTER ("%3" , "al" )
882
930
"swp %2, %1, [%3]\n\t"
883
931
"cmp %0, %2\n\t"
932
+ NACL_ALIGN ()
933
+ MASK_REGISTER ("%3" , "ne" )
884
934
"swpne %1, %2, [%3]\n\t"
885
935
"bne 0b"
886
936
: "=&r" (a ), "=&r" (b ), "=&r" (c )
@@ -898,7 +948,11 @@ static inline gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch)
898
948
__asm__ __volatile__ (
899
949
"dmb\n"
900
950
"1:\n"
951
+ NACL_ALIGN ()
952
+ MASK_REGISTER ("%3" , "al" )
901
953
"ldrex %0, [%3]\n"
954
+ NACL_ALIGN ()
955
+ MASK_REGISTER ("%3" , "al" )
902
956
"strex %1, %2, [%3]\n"
903
957
"teq %1, #0\n"
904
958
"bne 1b\n"
@@ -910,7 +964,9 @@ static inline gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch)
910
964
#else
911
965
gint32 a ;
912
966
913
- __asm__ __volatile__ ( "swp %0, %2, [%1]"
967
+ __asm__ __volatile__ ( NACL_ALIGN ()
968
+ MASK_REGISTER ("%1" , "al" )
969
+ "swp %0, %2, [%1]"
914
970
: "=&r" (a )
915
971
: "r" (dest ), "r" (exch ));
916
972
@@ -925,7 +981,11 @@ static inline gpointer InterlockedExchangePointer(volatile gpointer *dest, gpoin
925
981
__asm__ __volatile__ (
926
982
"dmb\n"
927
983
"1:\n"
984
+ NACL_ALIGN ()
985
+ MASK_REGISTER ("%3" , "al" )
928
986
"ldrex %0, [%3]\n"
987
+ NACL_ALIGN ()
988
+ MASK_REGISTER ("%3" , "al" )
929
989
"strex %1, %2, [%3]\n"
930
990
"teq %1, #0\n"
931
991
"bne 1b\n"
@@ -937,7 +997,9 @@ static inline gpointer InterlockedExchangePointer(volatile gpointer *dest, gpoin
937
997
#else
938
998
gpointer a ;
939
999
940
- __asm__ __volatile__ ( "swp %0, %2, [%1]"
1000
+ __asm__ __volatile__ ( NACL_ALIGN ()
1001
+ MASK_REGISTER ("%1" , "al" )
1002
+ "swp %0, %2, [%1]"
941
1003
: "=&r" (a )
942
1004
: "r" (dest ), "r" (exch ));
943
1005
@@ -952,8 +1014,12 @@ static inline gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add)
952
1014
__asm__ __volatile__ (
953
1015
"dmb\n"
954
1016
"1:\n"
1017
+ NACL_ALIGN ()
1018
+ MASK_REGISTER ("%3" , "al" )
955
1019
"ldrex %0, [%3]\n"
956
1020
"add %1, %0, %4\n"
1021
+ NACL_ALIGN ()
1022
+ MASK_REGISTER ("%3" , "al" )
957
1023
"strex %2, %1, [%3]\n"
958
1024
"teq %2, #0\n"
959
1025
"bne 1b\n"
@@ -967,10 +1033,16 @@ static inline gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add)
967
1033
int a , b , c ;
968
1034
969
1035
__asm__ __volatile__ ( "0:\n\t"
1036
+ NACL_ALIGN ()
1037
+ MASK_REGISTER ("%3" , "al" )
970
1038
"ldr %0, [%3]\n\t"
971
1039
"add %1, %0, %4\n\t"
1040
+ NACL_ALIGN ()
1041
+ MASK_REGISTER ("%3" , "al" )
972
1042
"swp %2, %1, [%3]\n\t"
973
1043
"cmp %0, %2\n\t"
1044
+ NACL_ALIGN ()
1045
+ MASK_REGISTER ("%3" , "ne" )
974
1046
"swpne %1, %2, [%3]\n\t"
975
1047
"bne 0b"
976
1048
: "=&r" (a ), "=&r" (b ), "=&r" (c )
0 commit comments