mozilla-bmo1756347.patch
author Wolfgang Rosenauer <wr@rosenauer.org>
Mon, 04 Apr 2022 10:22:27 +0200
branchfirefox98
changeset 1172 7bdeb580be51
permissions -rw-r--r--
Firefox 98.0.2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1172
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     1
# HG changeset patch
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     2
# User Wolfgang Rosenauer <wr@rosenauer.org>
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     3
# Parent  f805a250257be9c3ea570b34557150450e16dfec
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     4
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     5
diff --git a/js/src/jit/GenerateAtomicOperations.py b/js/src/jit/GenerateAtomicOperations.py
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     6
--- a/js/src/jit/GenerateAtomicOperations.py
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     7
+++ b/js/src/jit/GenerateAtomicOperations.py
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     8
@@ -5,40 +5,41 @@
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     9
 # This script generates jit/AtomicOperationsGenerated.h
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    10
 #
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    11
 # See the big comment in jit/AtomicOperations.h for an explanation.
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    12
 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    13
 import buildconfig
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    14
 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    15
 is_64bit = "JS_64BIT" in buildconfig.defines
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    16
 cpu_arch = buildconfig.substs["CPU_ARCH"]
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    17
+is_gcc = buildconfig.substs["CC_TYPE"] == "gcc"
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    18
 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    19
 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    20
 def fmt_insn(s):
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    21
     return '"' + s + '\\n\\t"\n'
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    22
 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    23
 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    24
 def gen_seqcst(fun_name):
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    25
     if cpu_arch in ("x86", "x86_64"):
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    26
         return r"""
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    27
-            inline void %(fun_name)s() {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    28
+            INLINE_ATTR void %(fun_name)s() {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    29
                 asm volatile ("mfence\n\t" ::: "memory");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    30
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    31
             "fun_name": fun_name,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    32
         }
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    33
     if cpu_arch == "aarch64":
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    34
         return r"""
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    35
-            inline void %(fun_name)s() {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    36
+            INLINE_ATTR void %(fun_name)s() {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    37
                 asm volatile ("dmb ish\n\t" ::: "memory");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    38
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    39
             "fun_name": fun_name,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    40
         }
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    41
     if cpu_arch == "arm":
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    42
         return r"""
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    43
-            inline void %(fun_name)s() {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    44
+            INLINE_ATTR void %(fun_name)s() {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    45
                 asm volatile ("dmb sy\n\t" ::: "memory");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    46
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    47
             "fun_name": fun_name,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    48
         }
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    49
     raise Exception("Unexpected arch")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    50
 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    51
 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    52
 def gen_load(fun_name, cpp_type, size, barrier):
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    53
@@ -58,17 +59,17 @@ def gen_load(fun_name, cpp_type, size, b
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    54
         elif size == 32:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    55
             insns += fmt_insn("movl (%[arg]), %[res]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    56
         else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    57
             assert size == 64
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    58
             insns += fmt_insn("movq (%[arg]), %[res]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    59
         if barrier:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    60
             insns += fmt_insn("mfence")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    61
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    62
-            inline %(cpp_type)s %(fun_name)s(const %(cpp_type)s* arg) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    63
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(const %(cpp_type)s* arg) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    64
                 %(cpp_type)s res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    65
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    66
                     : [res] "=r" (res)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    67
                     : [arg] "r" (arg)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    68
                     : "memory");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    69
                 return res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    70
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    71
             "cpp_type": cpp_type,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    72
@@ -86,17 +87,17 @@ def gen_load(fun_name, cpp_type, size, b
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    73
         elif size == 32:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    74
             insns += fmt_insn("ldr %w[res], [%x[arg]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    75
         else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    76
             assert size == 64
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    77
             insns += fmt_insn("ldr %x[res], [%x[arg]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    78
         if barrier:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    79
             insns += fmt_insn("dmb ish")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    80
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    81
-            inline %(cpp_type)s %(fun_name)s(const %(cpp_type)s* arg) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    82
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(const %(cpp_type)s* arg) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    83
                 %(cpp_type)s res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    84
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    85
                     : [res] "=r" (res)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    86
                     : [arg] "r" (arg)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    87
                     : "memory");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    88
                 return res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    89
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    90
             "cpp_type": cpp_type,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    91
@@ -112,17 +113,17 @@ def gen_load(fun_name, cpp_type, size, b
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    92
         elif size == 16:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    93
             insns += fmt_insn("ldrh %[res], [%[arg]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    94
         else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    95
             assert size == 32
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    96
             insns += fmt_insn("ldr %[res], [%[arg]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    97
         if barrier:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    98
             insns += fmt_insn("dmb sy")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    99
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   100
-            inline %(cpp_type)s %(fun_name)s(const %(cpp_type)s* arg) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   101
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(const %(cpp_type)s* arg) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   102
                 %(cpp_type)s res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   103
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   104
                     : [res] "=r" (res)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   105
                     : [arg] "r" (arg)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   106
                     : "memory");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   107
                 return res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   108
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   109
             "cpp_type": cpp_type,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   110
@@ -149,17 +150,17 @@ def gen_store(fun_name, cpp_type, size, 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   111
         elif size == 32:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   112
             insns += fmt_insn("movl %[val], (%[addr])")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   113
         else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   114
             assert size == 64
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   115
             insns += fmt_insn("movq %[val], (%[addr])")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   116
         if barrier:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   117
             insns += fmt_insn("mfence")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   118
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   119
-            inline void %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   120
+            INLINE_ATTR void %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   121
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   122
                     :
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   123
                     : [addr] "r" (addr), [val] "r"(val)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   124
                     : "memory");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   125
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   126
             "cpp_type": cpp_type,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   127
             "fun_name": fun_name,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   128
             "insns": insns,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   129
@@ -175,17 +176,17 @@ def gen_store(fun_name, cpp_type, size, 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   130
         elif size == 32:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   131
             insns += fmt_insn("str %w[val], [%x[addr]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   132
         else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   133
             assert size == 64
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   134
             insns += fmt_insn("str %x[val], [%x[addr]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   135
         if barrier:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   136
             insns += fmt_insn("dmb ish")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   137
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   138
-            inline void %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   139
+            INLINE_ATTR void %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   140
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   141
                     :
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   142
                     : [addr] "r" (addr), [val] "r"(val)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   143
                     : "memory");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   144
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   145
             "cpp_type": cpp_type,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   146
             "fun_name": fun_name,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   147
             "insns": insns,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   148
@@ -199,17 +200,17 @@ def gen_store(fun_name, cpp_type, size, 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   149
         elif size == 16:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   150
             insns += fmt_insn("strh %[val], [%[addr]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   151
         else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   152
             assert size == 32
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   153
             insns += fmt_insn("str %[val], [%[addr]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   154
         if barrier:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   155
             insns += fmt_insn("dmb sy")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   156
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   157
-            inline void %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   158
+            INLINE_ATTR void %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   159
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   160
                     :
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   161
                     : [addr] "r" (addr), [val] "r"(val)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   162
                     : "memory");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   163
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   164
             "cpp_type": cpp_type,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   165
             "fun_name": fun_name,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   166
             "insns": insns,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   167
@@ -230,17 +231,17 @@ def gen_exchange(fun_name, cpp_type, siz
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   168
         elif size == 16:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   169
             insns += fmt_insn("xchgw %[val], (%[addr])")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   170
         elif size == 32:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   171
             insns += fmt_insn("xchgl %[val], (%[addr])")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   172
         else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   173
             assert size == 64
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   174
             insns += fmt_insn("xchgq %[val], (%[addr])")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   175
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   176
-            inline %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   177
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   178
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   179
                     : [val] "+r" (val)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   180
                     : [addr] "r" (addr)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   181
                     : "memory");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   182
                 return val;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   183
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   184
             "cpp_type": cpp_type,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   185
             "fun_name": fun_name,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   186
@@ -261,17 +262,17 @@ def gen_exchange(fun_name, cpp_type, siz
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   187
             insns += fmt_insn("stxr %w[scratch], %w[val], [%x[addr]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   188
         else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   189
             assert size == 64
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   190
             insns += fmt_insn("ldxr %x[res], [%x[addr]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   191
             insns += fmt_insn("stxr %w[scratch], %x[val], [%x[addr]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   192
         insns += fmt_insn("cbnz %w[scratch], 0b")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   193
         insns += fmt_insn("dmb ish")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   194
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   195
-            inline %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   196
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   197
                 %(cpp_type)s res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   198
                 uint32_t scratch;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   199
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   200
                     : [res] "=&r"(res), [scratch] "=&r"(scratch)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   201
                     : [addr] "r" (addr), [val] "r"(val)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   202
                     : "memory", "cc");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   203
                 return res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   204
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   205
@@ -292,17 +293,17 @@ def gen_exchange(fun_name, cpp_type, siz
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   206
         else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   207
             assert size == 32
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   208
             insns += fmt_insn("ldrex %[res], [%[addr]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   209
             insns += fmt_insn("strex %[scratch], %[val], [%[addr]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   210
         insns += fmt_insn("cmp %[scratch], #1")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   211
         insns += fmt_insn("beq 0b")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   212
         insns += fmt_insn("dmb sy")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   213
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   214
-            inline %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   215
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   216
                 %(cpp_type)s res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   217
                 uint32_t scratch;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   218
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   219
                     : [res] "=&r"(res), [scratch] "=&r"(scratch)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   220
                     : [addr] "r" (addr), [val] "r"(val)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   221
                     : "memory", "cc");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   222
                 return res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   223
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   224
@@ -316,33 +317,33 @@ def gen_exchange(fun_name, cpp_type, siz
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   225
 def gen_cmpxchg(fun_name, cpp_type, size):
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   226
     # NOTE: the assembly code must match the generated code in:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   227
     # - MacroAssembler::compareExchange
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   228
     # - MacroAssembler::compareExchange64
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   229
     if cpu_arch == "x86" and size == 64:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   230
         # Use a +A constraint to load `oldval` into EDX:EAX as input/output.
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   231
         # `newval` is loaded into ECX:EBX.
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   232
         return r"""
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   233
-            inline %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   234
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   235
                                              %(cpp_type)s oldval,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   236
                                              %(cpp_type)s newval) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   237
                 asm volatile ("lock; cmpxchg8b (%%[addr])\n\t"
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   238
                 : "+A" (oldval)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   239
                 : [addr] "r" (addr),
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   240
                   "b" (uint32_t(newval & 0xffff'ffff)),
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   241
                   "c" (uint32_t(newval >> 32))
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   242
                 : "memory", "cc");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   243
                 return oldval;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   244
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   245
             "cpp_type": cpp_type,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   246
             "fun_name": fun_name,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   247
         }
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   248
     if cpu_arch == "arm" and size == 64:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   249
         return r"""
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   250
-            inline %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   251
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   252
                                              %(cpp_type)s oldval,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   253
                                              %(cpp_type)s newval) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   254
                 uint32_t oldval0 = oldval & 0xffff'ffff;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   255
                 uint32_t oldval1 = oldval >> 32;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   256
                 uint32_t newval0 = newval & 0xffff'ffff;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   257
                 uint32_t newval1 = newval >> 32;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   258
                 asm volatile (
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   259
                     "dmb sy\n\t"
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   260
@@ -375,17 +376,17 @@ def gen_cmpxchg(fun_name, cpp_type, size
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   261
         elif size == 16:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   262
             insns += fmt_insn("lock; cmpxchgw %[newval], (%[addr])")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   263
         elif size == 32:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   264
             insns += fmt_insn("lock; cmpxchgl %[newval], (%[addr])")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   265
         else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   266
             assert size == 64
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   267
             insns += fmt_insn("lock; cmpxchgq %[newval], (%[addr])")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   268
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   269
-            inline %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   270
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   271
                                              %(cpp_type)s oldval,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   272
                                              %(cpp_type)s newval) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   273
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   274
                     : [oldval] "+a" (oldval)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   275
                     : [addr] "r" (addr), [newval] "r" (newval)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   276
                     : "memory", "cc");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   277
                 return oldval;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   278
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   279
@@ -420,17 +421,17 @@ def gen_cmpxchg(fun_name, cpp_type, size
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   280
             insns += fmt_insn("mov %x[scratch], %x[oldval]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   281
             insns += fmt_insn("ldxr %x[res], [%x[addr]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   282
             insns += fmt_insn("cmp %x[res], %x[scratch]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   283
             insns += fmt_insn("b.ne 1f")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   284
             insns += fmt_insn("stxr %w[scratch], %x[newval], [%x[addr]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   285
         insns += fmt_insn("cbnz %w[scratch], 0b")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   286
         insns += fmt_insn("1: dmb ish")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   287
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   288
-            inline %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   289
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   290
                                              %(cpp_type)s oldval,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   291
                                              %(cpp_type)s newval) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   292
                 %(cpp_type)s res, scratch;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   293
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   294
                     : [res] "=&r" (res), [scratch] "=&r" (scratch)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   295
                     : [addr] "r" (addr), [oldval] "r"(oldval), [newval] "r" (newval)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   296
                     : "memory", "cc");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   297
                 return res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   298
@@ -461,17 +462,17 @@ def gen_cmpxchg(fun_name, cpp_type, size
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   299
             insns += fmt_insn("ldrex %[res], [%[addr]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   300
             insns += fmt_insn("cmp %[res], %[scratch]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   301
             insns += fmt_insn("bne 1f")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   302
             insns += fmt_insn("strex %[scratch], %[newval], [%[addr]]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   303
         insns += fmt_insn("cmp %[scratch], #1")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   304
         insns += fmt_insn("beq 0b")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   305
         insns += fmt_insn("1: dmb sy")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   306
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   307
-            inline %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   308
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   309
                                              %(cpp_type)s oldval,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   310
                                              %(cpp_type)s newval) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   311
                 %(cpp_type)s res, scratch;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   312
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   313
                     : [res] "=&r" (res), [scratch] "=&r" (scratch)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   314
                     : [addr] "r" (addr), [oldval] "r"(oldval), [newval] "r" (newval)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   315
                     : "memory", "cc");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   316
                 return res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   317
@@ -496,17 +497,17 @@ def gen_fetchop(fun_name, cpp_type, size
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   318
             elif size == 16:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   319
                 insns += fmt_insn("lock; xaddw %[val], (%[addr])")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   320
             elif size == 32:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   321
                 insns += fmt_insn("lock; xaddl %[val], (%[addr])")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   322
             else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   323
                 assert size == 64
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   324
                 insns += fmt_insn("lock; xaddq %[val], (%[addr])")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   325
             return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   326
-                inline %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   327
+                INLINE_ATTR %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   328
                     asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   329
                         : [val] "+&r" (val)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   330
                         : [addr] "r" (addr)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   331
                         : "memory", "cc");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   332
                     return val;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   333
                 }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   334
                 "cpp_type": cpp_type,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   335
                 "fun_name": fun_name,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   336
@@ -534,17 +535,17 @@ def gen_fetchop(fun_name, cpp_type, size
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   337
             assert size == 64
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   338
             insns += fmt_insn("movq (%[addr]), %[res]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   339
             insns += fmt_insn("0: movq %[res], %[scratch]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   340
             insns += fmt_insn("OPq %[val], %[scratch]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   341
             insns += fmt_insn("lock; cmpxchgq %[scratch], (%[addr])")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   342
         insns = insns.replace("OP", op)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   343
         insns += fmt_insn("jnz 0b")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   344
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   345
-            inline %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   346
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   347
                 %(cpp_type)s res, scratch;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   348
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   349
                     : [res] "=&a" (res), [scratch] "=&r" (scratch)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   350
                     : [addr] "r" (addr), [val] "r"(val)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   351
                     : "memory", "cc");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   352
                 return res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   353
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   354
             "cpp_type": cpp_type,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   355
@@ -576,17 +577,17 @@ def gen_fetchop(fun_name, cpp_type, size
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   356
         if cpu_op == "or":
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   357
             cpu_op = "orr"
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   358
         if cpu_op == "xor":
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   359
             cpu_op = "eor"
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   360
         insns = insns.replace("OP", cpu_op)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   361
         insns += fmt_insn("cbnz %w[scratch2], 0b")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   362
         insns += fmt_insn("dmb ish")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   363
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   364
-            inline %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   365
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   366
                 %(cpp_type)s res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   367
                 uintptr_t scratch1, scratch2;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   368
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   369
                     : [res] "=&r" (res), [scratch1] "=&r" (scratch1), [scratch2] "=&r"(scratch2)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   370
                     : [addr] "r" (addr), [val] "r"(val)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   371
                     : "memory", "cc");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   372
                 return res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   373
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   374
@@ -616,17 +617,17 @@ def gen_fetchop(fun_name, cpp_type, size
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   375
             cpu_op = "orr"
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   376
         if cpu_op == "xor":
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   377
             cpu_op = "eor"
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   378
         insns = insns.replace("OP", cpu_op)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   379
         insns += fmt_insn("cmp %[scratch2], #1")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   380
         insns += fmt_insn("beq 0b")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   381
         insns += fmt_insn("dmb sy")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   382
         return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   383
-            inline %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   384
+            INLINE_ATTR %(cpp_type)s %(fun_name)s(%(cpp_type)s* addr, %(cpp_type)s val) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   385
                 %(cpp_type)s res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   386
                 uintptr_t scratch1, scratch2;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   387
                 asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   388
                     : [res] "=&r" (res), [scratch1] "=&r" (scratch1), [scratch2] "=&r"(scratch2)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   389
                     : [addr] "r" (addr), [val] "r"(val)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   390
                     : "memory", "cc");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   391
                 return res;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   392
             }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   393
@@ -660,33 +661,33 @@ def gen_copy(fun_name, cpp_type, size, u
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   394
                 insns += fmt_insn("ldrb %w[scratch], [%x[src], OFFSET]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   395
                 insns += fmt_insn("strb %w[scratch], [%x[dst], OFFSET]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   396
             else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   397
                 assert size == 8
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   398
                 insns += fmt_insn("ldr %x[scratch], [%x[src], OFFSET]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   399
                 insns += fmt_insn("str %x[scratch], [%x[dst], OFFSET]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   400
         elif cpu_arch == "arm":
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   401
             if size == 1:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   402
-                insns += fmt_insn("ldrb %[scratch], [%[src], OFFSET]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   403
-                insns += fmt_insn("strb %[scratch], [%[dst], OFFSET]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   404
+                insns += fmt_insn("ldrb %[scratch], [%[src], #OFFSET]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   405
+                insns += fmt_insn("strb %[scratch], [%[dst], #OFFSET]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   406
             else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   407
                 assert size == 4
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   408
-                insns += fmt_insn("ldr %[scratch], [%[src], OFFSET]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   409
-                insns += fmt_insn("str %[scratch], [%[dst], OFFSET]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   410
+                insns += fmt_insn("ldr %[scratch], [%[src], #OFFSET]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   411
+                insns += fmt_insn("str %[scratch], [%[dst], #OFFSET]")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   412
         else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   413
             raise Exception("Unexpected arch")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   414
         insns = insns.replace("OFFSET", str(offset * size))
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   415
 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   416
         if direction == "down":
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   417
             offset += 1
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   418
         else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   419
             offset -= 1
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   420
 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   421
     return """
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   422
-        inline void %(fun_name)s(uint8_t* dst, const uint8_t* src) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   423
+        INLINE_ATTR void %(fun_name)s(uint8_t* dst, const uint8_t* src) {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   424
             %(cpp_type)s* dst_ = reinterpret_cast<%(cpp_type)s*>(dst);
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   425
             const %(cpp_type)s* src_ = reinterpret_cast<const %(cpp_type)s*>(src);
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   426
             %(cpp_type)s scratch;
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   427
             asm volatile (%(insns)s
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   428
                 : [scratch] "=&r" (scratch)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   429
                 : [dst] "r" (dst_), [src] "r"(src_)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   430
                 : "memory");
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   431
         }""" % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   432
@@ -848,14 +849,21 @@ def generate_atomics_header(c_out):
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   433
             "constexpr size_t JS_GENERATED_ATOMICS_BLOCKSIZE = "
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   434
             + str(blocksize)
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   435
             + ";\n"
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   436
         )
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   437
         contents += (
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   438
             "constexpr size_t JS_GENERATED_ATOMICS_WORDSIZE = " + str(wordsize) + ";\n"
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   439
         )
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   440
 
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   441
+        # Work around a GCC issue on 32-bit x86 by adding MOZ_NEVER_INLINE.
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   442
+        # See bug 1756347.
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   443
+        if is_gcc and cpu_arch == "x86":
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   444
+            contents = contents.replace("INLINE_ATTR", "MOZ_NEVER_INLINE inline")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   445
+        else:
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   446
+            contents = contents.replace("INLINE_ATTR", "inline")
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   447
+
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   448
     c_out.write(
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   449
         HEADER_TEMPLATE
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   450
         % {
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   451
             "contents": contents,
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   452
         }
7bdeb580be51 Firefox 98.0.2
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   453
     )