History

stdatomic: i386/x86_64 support

Dmitry Selyutin committed 5 years ago

Commit 9ed3de91 parent 806b3f97 files · +136 −2Browse files

Unified · Split

7 files
  1. lib/Makefile +2 −2
  2. lib/atomic-gen32.c +25 −0
  3. lib/atomic-gen64.c +8 −0
  4. lib/atomic-i386.c +19 −0
  5. lib/atomic-x86.h +31 −0
  6. lib/atomic-x86_64.c +12 −0
  7. lib/atomic.h +39 −0
lib/Makefile+2−2
@@ -42,8 +42,8 @@ $(X)BT_O += tcov.o · 41 unmodified lines
42 42
43DSO_O = dsohandle.o43DSO_O = dsohandle.o
44 44
45I386_O = libtcc1.o alloca86.o alloca86-bt.o $(BT_O)45I386_O = libtcc1.o alloca86.o alloca86-bt.o $(BT_O) atomic-i386.o
46X86_64_O = libtcc1.o alloca86_64.o alloca86_64-bt.o $(BT_O)46X86_64_O = libtcc1.o alloca86_64.o alloca86_64-bt.o $(BT_O) atomic-x86_64.o
47ARM_O = libtcc1.o armeabi.o alloca-arm.o armflush.o fetch_and_add_arm.o $(BT_O)47ARM_O = libtcc1.o armeabi.o alloca-arm.o armflush.o fetch_and_add_arm.o $(BT_O)
48ARM64_O = lib-arm64.o fetch_and_add_arm64.o $(BT_O)48ARM64_O = lib-arm64.o fetch_and_add_arm64.o $(BT_O)
49RISCV64_O = lib-arm64.o fetch_and_add_riscv64.o $(BT_O)49RISCV64_O = lib-arm64.o fetch_and_add_riscv64.o $(BT_O)
lib/atomic-gen32.c+25−0
@@ -0,0 +1,25 @@
1#include "atomic.h"
2
3ATOMIC_EXCHANGE(uint8_t, 1)
4ATOMIC_EXCHANGE(uint16_t, 2)
5ATOMIC_EXCHANGE(uint32_t, 4)
6
7ATOMIC_FETCH_ADD(uint8_t, 1)
8ATOMIC_FETCH_ADD(uint16_t, 2)
9ATOMIC_FETCH_ADD(uint32_t, 4)
10
11ATOMIC_FETCH_SUB(uint8_t, 1)
12ATOMIC_FETCH_SUB(uint16_t, 2)
13ATOMIC_FETCH_SUB(uint32_t, 4)
14
15ATOMIC_FETCH_AND(uint8_t, 1)
16ATOMIC_FETCH_AND(uint16_t, 2)
17ATOMIC_FETCH_AND(uint32_t, 4)
18
19ATOMIC_FETCH_OR(uint8_t, 1)
20ATOMIC_FETCH_OR(uint16_t, 2)
21ATOMIC_FETCH_OR(uint32_t, 4)
22
23ATOMIC_FETCH_XOR(uint8_t, 1)
24ATOMIC_FETCH_XOR(uint16_t, 2)
25ATOMIC_FETCH_XOR(uint32_t, 4)
lib/atomic-gen64.c+8−0
@@ -0,0 +1,8 @@
1#include "atomic.h"
2
3ATOMIC_EXCHANGE(uint64_t, 8)
4ATOMIC_FETCH_ADD(uint64_t, 8)
5ATOMIC_FETCH_SUB(uint64_t, 8)
6ATOMIC_FETCH_AND(uint64_t, 8)
7ATOMIC_FETCH_OR(uint64_t, 8)
8ATOMIC_FETCH_XOR(uint64_t, 8)
lib/atomic-i386.c+19−0
@@ -0,0 +1,19 @@
1#pragma once
2
3#include <stdint.h>
4
5#include "atomic-x86.h"
6
7ATOMIC_X86_STORE(uint8_t, 1)
8ATOMIC_X86_STORE(uint16_t, 2)
9ATOMIC_X86_STORE(uint32_t, 4)
10
11ATOMIC_X86_LOAD(uint8_t, 1)
12ATOMIC_X86_LOAD(uint16_t, 2)
13ATOMIC_X86_LOAD(uint32_t, 4)
14
15ATOMIC_X86_COMPARE_EXCHANGE(uint8_t, 1, "b")
16ATOMIC_X86_COMPARE_EXCHANGE(uint16_t, 2, "w")
17ATOMIC_X86_COMPARE_EXCHANGE(uint32_t, 4, "l")
18
19#include "atomic-gen32.c"
lib/atomic-x86.h+31−0
@@ -0,0 +1,31 @@
1#pragma once
2
3#include <stdbool.h>
4#include <stdint.h>
5
6#define ATOMIC_X86_COMPARE_EXCHANGE(TYPE, MODE, SUFFIX) \
7 bool __atomic_compare_exchange_##MODE(_Atomic(TYPE) *atom, TYPE *ref, TYPE xchg) \
8 { \
9 TYPE rv; \
10 TYPE cmp = *ref; \
11 asm volatile( \
12 "lock cmpxchg" SUFFIX " %2,%1\n" \
13 : "=a" (rv), "+m" (*atom) \
14 : "q" (xchg), "0" (cmp) \
15 : "memory" \
16 ); \
17 *ref = rv; \
18 return (rv == cmp); \
19 }
20
21#define ATOMIC_X86_LOAD(TYPE, MODE) \
22 TYPE __atomic_load_##MODE(const _Atomic(TYPE) *atom) \
23 { \
24 return *(volatile TYPE *)atom; \
25 }
26
27#define ATOMIC_X86_STORE(TYPE, MODE) \
28 void __atomic_store_##MODE(_Atomic(TYPE) *atom, TYPE value) \
29 { \
30 *(volatile TYPE *)atom = value; \
31 }
lib/atomic-x86_64.c+12−0
@@ -0,0 +1,12 @@
1#pragma once
2
3#include <stdint.h>
4
5#include "atomic-x86.h"
6#include "atomic-i386.c"
7
8ATOMIC_X86_STORE(uint64_t, 8)
9ATOMIC_X86_LOAD(uint64_t, 8)
10ATOMIC_X86_COMPARE_EXCHANGE(uint64_t, 8, "q")
11
12#include "atomic-gen64.c"
lib/atomic.h+39−0
@@ -0,0 +1,39 @@
1#pragma once
2
3#include <stdbool.h>
4#include <stdint.h>
5
6#define ATOMIC_GEN_OP(TYPE, MODE, NAME, OP) \
7 TYPE __atomic_##NAME##_##MODE(_Atomic(TYPE) *atom, TYPE value) \
8 { \
9 TYPE xchg; \
10 TYPE cmp = __atomic_load(atom, __ATOMIC_RELAXED); \
11 do { \
12 xchg = (OP); \
13 } while (!__atomic_compare_exchange(atom, &cmp, xchg, true, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)); \
14 return cmp; \
15 }
16
17#ifndef ATOMIC_EXCHANGE
18# define ATOMIC_EXCHANGE(TYPE, MODE) ATOMIC_GEN_OP(TYPE, MODE, exchange, value)
19#endif
20
21#ifndef ATOMIC_FETCH_ADD
22# define ATOMIC_FETCH_ADD(TYPE, MODE) ATOMIC_GEN_OP(TYPE, MODE, fetch_add, (cmp + value))
23#endif
24
25#ifndef ATOMIC_FETCH_SUB
26# define ATOMIC_FETCH_SUB(TYPE, MODE) ATOMIC_GEN_OP(TYPE, MODE, fetch_sub, (cmp - value))
27#endif
28
29#ifndef ATOMIC_FETCH_AND
30# define ATOMIC_FETCH_AND(TYPE, MODE) ATOMIC_GEN_OP(TYPE, MODE, fetch_and, (cmp & value))
31#endif
32
33#ifndef ATOMIC_FETCH_OR
34# define ATOMIC_FETCH_OR(TYPE, MODE) ATOMIC_GEN_OP(TYPE, MODE, fetch_or, (cmp | value))
35#endif
36
37#ifndef ATOMIC_FETCH_XOR
38# define ATOMIC_FETCH_XOR(TYPE, MODE) ATOMIC_GEN_OP(TYPE, MODE, fetch_xor, (cmp ^ value))
39#endif

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t