psl1ght
A free SDK for Sony's PS3 console
Loading...
Searching...
No Matches
spu_atomic.h
Go to the documentation of this file.
1#ifndef __SPU_ATOMIC_H__
2#define __SPU_ATOMIC_H__
3
4#include <stdint.h>
5#include <spu_mfcio.h>
6#include <spu_intrinsics.h>
7
8#ifdef __cplusplus
9extern "C" {
10#endif
11
12uint32_t spu_atomic_nop32(uint32_t *ls, uint64_t ea);
13uint64_t spu_atomic_nop64(uint64_t *ls, uint64_t ea);
14uint32_t spu_atomic_incr32(uint32_t *ls, uint64_t ea);
15uint64_t spu_atomic_incr64(uint64_t *ls, uint64_t ea);
16uint32_t spu_atomic_decr32(uint32_t *ls, uint64_t ea);
17uint64_t spu_atomic_decr64(uint64_t *ls, uint64_t ea);
18uint32_t spu_atomic_test_and_decr32(uint32_t *ls, uint64_t ea);
19uint64_t spu_atomic_test_and_decr64(uint64_t *ls, uint64_t ea);
20uint32_t spu_atomic_or32(uint32_t *ls, uint64_t ea, uint32_t value);
21uint64_t spu_atomic_or64(uint64_t *ls, uint64_t ea, uint64_t value);
22uint32_t spu_atomic_add32(uint32_t *ls, uint64_t ea, uint32_t value);
23uint64_t spu_atomic_add64(uint64_t *ls, uint64_t ea, uint64_t value);
24uint32_t spu_atomic_and32(uint32_t *ls, uint64_t ea, uint32_t value);
25uint64_t spu_atomic_and64(uint64_t *ls, uint64_t ea, uint64_t value);
26uint32_t spu_atomic_sub32(uint32_t *ls, uint64_t ea, uint32_t value);
27uint64_t spu_atomic_sub64(uint64_t *ls, uint64_t ea, uint64_t value);
28uint32_t spu_atomic_store32(uint32_t *ls, uint64_t ea, uint32_t value);
29uint64_t spu_atomic_store64(uint64_t *ls, uint64_t ea, uint64_t value);
30uint32_t spu_atomic_compare_and_swap32(uint32_t *ls, uint64_t ea, uint32_t compare, uint32_t value);
31uint64_t spu_atomic_compare_and_swap64(uint64_t *ls, uint64_t ea, uint64_t compare, uint64_t value);
32
33__attribute__ ((__always_inline__))
34static inline uint32_t spu_atomic_lock_line32(uint32_t *ls, uint64_t ea)
35{
36 unsigned int i = ((uint32_t)ea & 0x7f) >> 2;
37
38 ea &= ~0x7f;
39 mfc_getllar(ls, ea, 0, 0);
42 return ls[i];
43}
44
45__attribute__ ((__always_inline__))
46static inline uint64_t spu_atomic_lock_line64(uint64_t *ls, uint64_t ea)
47{
48 unsigned int i = ((uint32_t)ea & 0x7f) >> 3;
49
50 ea &= ~0x7f;
51 mfc_getllar(ls, ea, 0, 0);
53 spu_dsync();
54 return ls[i];
55}
56
57__attribute__ ((__always_inline__))
58static inline int spu_atomic_store_conditional32(uint32_t *ls, uint64_t ea, uint32_t value)
59{
60 unsigned int i = ((uint32_t)ea & 0x7f) >> 2;
61
62 ls[i] = value;
63 ea &= ~0x7f;
64 spu_dsync();
65 mfc_putllc(ls, ea, 0, 0);
67}
68
69__attribute__ ((__always_inline__))
70static inline int spu_atomic_store_conditional64(uint64_t *ls, uint64_t ea, uint64_t value)
71{
72 unsigned int i = ((uint32_t)ea & 0x7f) >> 3;
73
74 ls[i] = value;
75 ea &= ~0x7f;
76 spu_dsync();
77 mfc_putllc(ls, ea, 0, 0);
79}
80
81#ifdef __cplusplus
82 }
83#endif
84
85#endif
struct _heap_cntrl_t __attribute__
uint64_t ea
Definition spu_atomic.h:35
uint32_t spu_atomic_incr32(uint32_t *ls, uint64_t ea)
uint64_t spu_atomic_and64(uint64_t *ls, uint64_t ea, uint64_t value)
uint64_t uint32_t value
Definition spu_atomic.h:59
uint64_t spu_atomic_test_and_decr64(uint64_t *ls, uint64_t ea)
uint32_t spu_atomic_test_and_decr32(uint32_t *ls, uint64_t ea)
uint64_t spu_atomic_compare_and_swap64(uint64_t *ls, uint64_t ea, uint64_t compare, uint64_t value)
uint64_t spu_atomic_decr64(uint64_t *ls, uint64_t ea)
uint64_t spu_atomic_store64(uint64_t *ls, uint64_t ea, uint64_t value)
return ls[i]
Definition spu_atomic.h:42
uint64_t spu_atomic_or64(uint64_t *ls, uint64_t ea, uint64_t value)
uint64_t spu_atomic_nop64(uint64_t *ls, uint64_t ea)
uint32_t spu_atomic_and32(uint32_t *ls, uint64_t ea, uint32_t value)
uint32_t spu_atomic_sub32(uint32_t *ls, uint64_t ea, uint32_t value)
uint32_t spu_atomic_or32(uint32_t *ls, uint64_t ea, uint32_t value)
uint64_t spu_atomic_incr64(uint64_t *ls, uint64_t ea)
uint64_t spu_atomic_sub64(uint64_t *ls, uint64_t ea, uint64_t value)
uint32_t spu_atomic_decr32(uint32_t *ls, uint64_t ea)
mfc_read_atomic_status()
uint64_t spu_atomic_add64(uint64_t *ls, uint64_t ea, uint64_t value)
uint32_t spu_atomic_add32(uint32_t *ls, uint64_t ea, uint32_t value)
ea & mfc_getllar(ls, ea, 0, 0)
uint32_t spu_atomic_store32(uint32_t *ls, uint64_t ea, uint32_t value)
spu_dsync()
mfc_putllc(ls, ea, 0, 0)
uint32_t spu_atomic_nop32(uint32_t *ls, uint64_t ea)
uint32_t spu_atomic_compare_and_swap32(uint32_t *ls, uint64_t ea, uint32_t compare, uint32_t value)