13#ifndef __xwos_lib_xwaop_h__
14#define __xwos_lib_xwaop_h__
25#include <xwos/ospl/soc/xwaop.h>
35#define xwmoaop(type, op, a, memorder, ...) \
36 xwaop__##type##__##op(a, memorder, ##__VA_ARGS__)
45#define xwaop_load(type, a, memorder) \
46 xwmoaop(type, load, (a), memorder)
56#define xwaop_store(type, a, memorder, v) \
57 xwmoaop(type, store, (a), memorder, (v))
66#define xwaop(type, op, a, ...) \
67 xwaop__##type##__##op(a, ##__VA_ARGS__)
77#define xwaop_read(type, a, ov) \
78 xwaop(type, read, (a), (type *)(ov))
91#define xwaop_write(type, a, v, ov) \
92 xwaop(type, write, (a), (v), (type *)(ov))
113#define xwaop_teq_then_write(type, a, t, v, ov) \
114 xwaop(type, teq_then_write, (a), (t), (v), (type *)(ov))
135#define xwaop_tne_then_write(type, a, t, v, ov) \
136 xwaop(type, tne_then_write, (a), (t), (v), (type *)(ov))
157#define xwaop_tgt_then_write(type, a, t, v, ov) \
158 xwaop(type, tgt_then_write, (a), (t), (v), (type *)(ov))
179#define xwaop_tge_then_write(type, a, t, v, ov) \
180 xwaop(type, tge_then_write, (a), (t), (v), (type *)(ov))
201#define xwaop_tlt_then_write(type, a, t, v, ov) \
202 xwaop(type, tlt_then_write, (a), (t), (v), (type *)(ov))
223#define xwaop_tle_then_write(type, a, t, v, ov) \
224 xwaop(type, tle_then_write, (a), (t), (v), (type *)(ov))
246#define xwaop_tgtlt_then_write(type, a, l, r, v, ov) \
247 xwaop(type, tgtlt_then_write, (a), (l), (r), (v), (type *)(ov))
269#define xwaop_tgelt_then_write(type, a, l, r, v, ov) \
270 xwaop(type, tgelt_then_write, (a), (l), (r), (v), (type *)(ov))
292#define xwaop_tgtle_then_write(type, a, l, r, v, ov) \
293 xwaop(type, tgtle_then_write, (a), (l), (r), (v), (type *)(ov))
315#define xwaop_tgele_then_write(type, a, l, r, v, ov) \
316 xwaop(type, tgele_then_write, (a), (l), (r), (v), (type *)(ov))
330#define xwaop_add(type, a, v, nv, ov) \
331 xwaop(type, add, (a), (v), (type *)(nv), (type *)(ov))
355#define xwaop_teq_then_add(type, a, t, v, nv, ov) \
356 xwaop(type, teq_then_add, (a), (t), (v), (type *)(nv), (type *)(ov))
380#define xwaop_tne_then_add(type, a, t, v, nv, ov) \
381 xwaop(type, tne_then_add, (a), (t), (v), (type *)(nv), (type *)(ov))
405#define xwaop_tgt_then_add(type, a, t, v, nv, ov) \
406 xwaop(type, tgt_then_add, (a), (t), (v), (type *)(nv), (type *)(ov))
430#define xwaop_tge_then_add(type, a, t, v, nv, ov) \
431 xwaop(type, tge_then_add, (a), (t), (v), (type *)(nv), (type *)(ov))
455#define xwaop_tlt_then_add(type, a, t, v, nv, ov) \
456 xwaop(type, tlt_then_add, (a), (t), (v), (type *)(nv), (type *)(ov))
480#define xwaop_tle_then_add(type, a, t, v, nv, ov) \
481 xwaop(type, tle_then_add, (a), (t), (v), (type *)(nv), (type *)(ov))
506#define xwaop_tgtlt_then_add(type, a, l, r, v, nv, ov) \
507 xwaop(type, tgtlt_then_add, (a), (l), (r), (v), (type *)(nv), (type *)(ov))
532#define xwaop_tgelt_then_add(type, a, l, r, v, nv, ov) \
533 xwaop(type, tgelt_then_add, (a), (l), (r), (v), (type *)(nv), (type *)(ov))
558#define xwaop_tgtle_then_add(type, a, l, r, v, nv, ov) \
559 xwaop(type, tgtle_then_add, (a), (l), (r), (v), (type *)(nv), (type *)(ov))
584#define xwaop_tgele_then_add(type, a, l, r, v, nv, ov) \
585 xwaop(type, tgele_then_add, (a), (l), (r), (v), (type *)(nv), (type *)(ov))
598#define xwaop_sub(type, a, v, nv, ov) \
599 xwaop(type, sub, (a), (v), (type *)(nv), (type *)(ov))
623#define xwaop_teq_then_sub(type, a, t, v, nv, ov) \
624 xwaop(type, teq_then_sub, (a), (t), (v), (type *)(nv), (type *)(ov))
648#define xwaop_tne_then_sub(type, a, t, v, nv, ov) \
649 xwaop(type, tne_then_sub, (a), (t), (v), (type *)(nv), (type *)(ov))
673#define xwaop_tgt_then_sub(type, a, t, v, nv, ov) \
674 xwaop(type, tgt_then_sub, (a), (t), (v), (type *)(nv), (type *)(ov))
698#define xwaop_tge_then_sub(type, a, t, v, nv, ov) \
699 xwaop(type, tge_then_sub, (a), (t), (v), (type *)(nv), (type *)(ov))
723#define xwaop_tlt_then_sub(type, a, t, v, nv, ov) \
724 xwaop(type, tlt_then_sub, (a), (t), (v), (type *)(nv), (type *)(ov))
748#define xwaop_tle_then_sub(type, a, t, v, nv, ov) \
749 xwaop(type, tle_then_sub, (a), (t), (v), (type *)(nv), (type *)(ov))
774#define xwaop_tgtlt_then_sub(type, a, l, r, v, nv, ov) \
775 xwaop(type, tgtlt_then_sub, (a), (l), (r), (v), (type *)(nv), (type *)(ov))
800#define xwaop_tgelt_then_sub(type, a, l, r, v, nv, ov) \
801 xwaop(type, tgelt_then_sub, (a), (l), (r), (v), (type *)(nv), (type *)(ov))
826#define xwaop_tgtle_then_sub(type, a, l, r, v, nv, ov) \
827 xwaop(type, tgtle_then_sub, (a), (l), (r), (v), (type *)(nv), (type *)(ov))
852#define xwaop_tgele_then_sub(type, a, l, r, v, nv, ov) \
853 xwaop(type, tgele_then_sub, (a), (l), (r), (v), (type *)(nv), (type *)(ov))
866#define xwaop_rsb(type, a, v, nv, ov) \
867 xwaop(type, rsb, (a), (v), (type *)(nv), (type *)(ov))
891#define xwaop_teq_then_rsb(type, a, t, v, nv, ov) \
892 xwaop(type, teq_then_rsb, (a), (t), (v), (type *)(nv), (type *)(ov))
916#define xwaop_tne_then_rsb(type, a, t, v, nv, ov) \
917 xwaop(type, tne_then_rsb, (a), (t), (v), (type *)(nv), (type *)(ov))
941#define xwaop_tgt_then_rsb(type, a, t, v, nv, ov) \
942 xwaop(type, tgt_then_rsb, (a), (t), (v), (type *)(nv), (type *)(ov))
966#define xwaop_tge_then_rsb(type, a, t, v, nv, ov) \
967 xwaop(type, tge_then_rsb, (a), (t), (v), (type *)(nv), (type *)(ov))
991#define xwaop_tlt_then_rsb(type, a, t, v, nv, ov) \
992 xwaop(type, tlt_then_rsb, (a), (t), (v), (type *)(nv), (type *)(ov))
1016#define xwaop_tle_then_rsb(type, a, t, v, nv, ov) \
1017 xwaop(type, tle_then_rsb, (a), (t), (v), (type *)(nv), (type *)(ov))
1042#define xwaop_tgtlt_then_rsb(type, a, l, r, v, nv, ov) \
1043 xwaop(type, tgtlt_then_rsb, (a), (l), (r), (v), (type *)(nv), (type *)(ov))
1068#define xwaop_tgelt_then_rsb(type, a, l, r, v, nv, ov) \
1069 xwaop(type, tgelt_then_rsb, (a), (l), (r), (v), (type *)(nv), (type *)(ov))
1094#define xwaop_tgtle_then_rsb(type, a, l, r, v, nv, ov) \
1095 xwaop(type, tgtle_then_rsb, (a), (l), (r), (v), (type *)(nv), (type *)(ov))
1120#define xwaop_tgele_then_rsb(type, a, l, r, v, nv, ov) \
1121 xwaop(type, tgele_then_rsb, (a), (l), (r), (v), (type *)(nv), (type *)(ov))
1134#define xwaop_and(type, a, v, nv, ov) \
1135 xwaop(type, and, (a), (v), (type *)(nv), (type *)(ov))
1148#define xwaop_or(type, a, v, nv, ov) \
1149 xwaop(type, or, (a), (v), (type *)(nv), (type *)(ov))
1162#define xwaop_xor(type, a, v, nv, ov) \
1163 xwaop(type, xor, (a), (v), (type *)(nv), (type *)(ov))
1176#define xwaop_s1m(type, a, m, nv, ov) \
1177 xwaop(type, or, (a), (m), (type *)(nv), (type *)(ov))
1190#define xwaop_c0m(type, a, m, nv, ov) \
1191 xwaop(type, c0m, (a), (m), (type *)(nv), (type *)(ov))
1204#define xwaop_x1m(type, a, m, nv, ov) \
1205 xwaop(type, xor, (a), (m), (type *)(nv), (type *)(ov))
1229#define xwaop_t1ma_then_c0m(type, a, m, nv, ov) \
1230 xwaop(type, t1ma_then_c0m, (a), (m), (type *)(nv), (type *)(ov))
1253#define xwaop_t1mo_then_c0m(type, a, m, nv, ov) \
1254 xwaop(type, t1mo_then_c0m, (a), (m), (type *)(nv), (type *)(ov))
1277#define xwaop_t0ma_then_s1m(type, a, m, nv, ov) \
1278 xwaop(type, t0ma_then_s1m, (a), (m), (type *)(nv), (type *)(ov))
1301#define xwaop_t0mo_then_s1m(type, a, m, nv, ov) \
1302 xwaop(type, t0mo_then_s1m, (a), (m), (type *)(nv), (type *)(ov))
1328#define xwaop_tst_then_op(type, a, tf, tfarg, of, ofarg, nv, ov) \
1329 xwaop(type, tst_then_op, (a), (tf), (tfarg), (of), (ofarg), \
1330 (type *)(nv), (type *)(ov))
1338#define DEFINE_XWAOP_LOAD(type, btype) \
1339static __xwlib_inline \
1340type xwaop__##type##__load(atomic_##type * a, \
1341 const enum xwaop_memory_order_em mo) \
1343 return (type)xwaop__##btype##__load((atomic_##btype *)a, mo); \
1352#define DEFINE_XWAOP_STORE(type, btype) \
1353static __xwlib_inline \
1354type xwaop__##type##__store(atomic_##type * a, \
1355 const enum xwaop_memory_order_em mo, \
1358 return (type)xwaop__##btype##__store((atomic_##btype *)a, mo, (btype)v); \
1367#define DEFINE_XWAOP_READ(type, btype) \
1368static __xwlib_inline \
1369void xwaop__##type##__read(atomic_##type * a, type * ov) \
1371 xwaop__##btype##__read((atomic_##btype *)a, \
1381#define DEFINE_XWAOP_WRITE(type, btype) \
1382static __xwlib_inline \
1383void xwaop__##type##__write(atomic_##type * a, type v, type * ov) \
1385 xwaop__##btype##__write((atomic_##btype *)a, \
1395#define DEFINE_XWAOP_TEQ_THEN_WRITE(type, btype) \
1396static __xwlib_inline \
1397xwer_t xwaop__##type##__teq_then_write(atomic_##type * a, type t, type v, type * ov) \
1399 return xwaop__##btype##__teq_then_write((atomic_##btype *)a, \
1410#define DEFINE_XWAOP_TNE_THEN_WRITE(type, btype) \
1411static __xwlib_inline \
1412xwer_t xwaop__##type##__tne_then_write(atomic_##type * a, \
1417 return xwaop__##btype##__tne_then_write((atomic_##btype *)a, \
1428#define DEFINE_XWAOP_TGT_THEN_WRITE(type, btype) \
1429static __xwlib_inline \
1430xwer_t xwaop__##type##__tgt_then_write(atomic_##type * a, \
1435 return xwaop__##btype##__tgt_then_write((atomic_##btype *)a, \
1446#define DEFINE_XWAOP_TGE_THEN_WRITE(type, btype) \
1447static __xwlib_inline \
1448xwer_t xwaop__##type##__tge_then_write(atomic_##type * a, \
1453 return xwaop__##btype##__tge_then_write((atomic_##btype *)a, \
1464#define DEFINE_XWAOP_TLT_THEN_WRITE(type, btype) \
1465static __xwlib_inline \
1466xwer_t xwaop__##type##__tlt_then_write(atomic_##type * a, \
1471 return xwaop__##btype##__tlt_then_write((atomic_##btype *)a, \
1482#define DEFINE_XWAOP_TLE_THEN_WRITE(type, btype) \
1483static __xwlib_inline \
1484xwer_t xwaop__##type##__tle_then_write(atomic_##type * a, \
1489 return xwaop__##btype##__tle_then_write((atomic_##btype *)a, \
1500#define DEFINE_XWAOP_TGTLT_THEN_WRITE(type, btype) \
1501static __xwlib_inline \
1502xwer_t xwaop__##type##__tgtlt_then_write(atomic_##type * a, \
1507 return xwaop__##btype##__tgtlt_then_write((atomic_##btype *)a, \
1508 (btype)l, (btype)r, \
1518#define DEFINE_XWAOP_TGELT_THEN_WRITE(type, btype) \
1519static __xwlib_inline \
1520xwer_t xwaop__##type##__tgelt_then_write(atomic_##type * a, \
1525 return xwaop__##btype##__tgelt_then_write((atomic_##btype *)a, \
1526 (btype)l, (btype)r, \
1536#define DEFINE_XWAOP_TGTLE_THEN_WRITE(type, btype) \
1537static __xwlib_inline \
1538xwer_t xwaop__##type##__tgtle_then_write(atomic_##type * a, \
1543 return xwaop__##btype##__tgtle_then_write((atomic_##btype *)a, \
1544 (btype)l, (btype)r, \
1554#define DEFINE_XWAOP_TGELE_THEN_WRITE(type, btype) \
1555static __xwlib_inline \
1556xwer_t xwaop__##type##__tgele_then_write(atomic_##type * a, \
1561 return xwaop__##btype##__tgele_then_write((atomic_##btype *)a, \
1562 (btype)l, (btype)r, \
1573#define DEFINE_XWAOP_ADD(type, btype) \
1574static __xwlib_inline \
1575void xwaop__##type##__add(atomic_##type * a, \
1577 type * nv, type * ov) \
1579 xwaop__##btype##__add((atomic_##btype *)a, \
1581 (btype *)nv, (btype *)ov); \
1589#define DEFINE_XWAOP_TEQ_THEN_ADD(type, btype) \
1590static __xwlib_inline \
1591xwer_t xwaop__##type##__teq_then_add(atomic_##type * a, \
1594 type * nv, type * ov) \
1596 return xwaop__##btype##__teq_then_add((atomic_##btype *)a, \
1597 (btype)t, (btype)v, \
1598 (btype *)nv, (btype *)ov); \
1606#define DEFINE_XWAOP_TNE_THEN_ADD(type, btype) \
1607static __xwlib_inline \
1608xwer_t xwaop__##type##__tne_then_add(atomic_##type * a, \
1611 type * nv, type * ov) \
1613 return xwaop__##btype##__tne_then_add((atomic_##btype *)a, \
1616 (btype *)nv, (btype *)ov); \
1624#define DEFINE_XWAOP_TGT_THEN_ADD(type, btype) \
1625static __xwlib_inline \
1626xwer_t xwaop__##type##__tgt_then_add(atomic_##type * a, \
1629 type * nv, type * ov) \
1631 return xwaop__##btype##__tgt_then_add((atomic_##btype *)a, \
1634 (btype *)nv, (btype *)ov); \
1642#define DEFINE_XWAOP_TGE_THEN_ADD(type, btype) \
1643static __xwlib_inline \
1644xwer_t xwaop__##type##__tge_then_add(atomic_##type * a, \
1647 type * nv, type * ov) \
1649 return xwaop__##btype##__tge_then_add((atomic_##btype *)a, \
1652 (btype *)nv, (btype *)ov); \
1660#define DEFINE_XWAOP_TLT_THEN_ADD(type, btype) \
1661static __xwlib_inline \
1662xwer_t xwaop__##type##__tlt_then_add(atomic_##type * a, \
1665 type * nv, type * ov) \
1667 return xwaop__##btype##__tlt_then_add((atomic_##btype *)a, \
1670 (btype *)nv, (btype *)ov); \
1678#define DEFINE_XWAOP_TLE_THEN_ADD(type, btype) \
1679static __xwlib_inline \
1680xwer_t xwaop__##type##__tle_then_add(atomic_##type * a, \
1683 type * nv, type * ov) \
1685 return xwaop__##btype##__tle_then_add((atomic_##btype *)a, \
1688 (btype *)nv, (btype *)ov); \
1696#define DEFINE_XWAOP_TGTLT_THEN_ADD(type, btype) \
1697static __xwlib_inline \
1698xwer_t xwaop__##type##__tgtlt_then_add(atomic_##type * a, \
1701 type * nv, type * ov) \
1703 return xwaop__##btype##__tgtlt_then_add((atomic_##btype *)a, \
1704 (btype)l, (btype)r, \
1706 (btype *)nv, (btype *)ov); \
1714#define DEFINE_XWAOP_TGELT_THEN_ADD(type, btype) \
1715static __xwlib_inline \
1716xwer_t xwaop__##type##__tgelt_then_add(atomic_##type * a, \
1719 type * nv, type * ov) \
1721 return xwaop__##btype##__tgelt_then_add((atomic_##btype *)a, \
1722 (btype)l, (btype)r, \
1724 (btype *)nv, (btype *)ov); \
1732#define DEFINE_XWAOP_TGTLE_THEN_ADD(type, btype) \
1733static __xwlib_inline \
1734xwer_t xwaop__##type##__tgtle_then_add(atomic_##type * a, \
1737 type * nv, type * ov) \
1739 return xwaop__##btype##__tgtle_then_add((atomic_##btype *)a, \
1740 (btype)l, (btype)r, \
1742 (btype *)nv, (btype *)ov); \
1750#define DEFINE_XWAOP_TGELE_THEN_ADD(type, btype) \
1751static __xwlib_inline \
1752xwer_t xwaop__##type##__tgele_then_add(atomic_##type * a, \
1755 type * nv, type * ov) \
1757 return xwaop__##btype##__tgele_then_add((atomic_##btype *)a, \
1758 (btype)l, (btype)r, \
1760 (btype *)nv, (btype *)ov); \
1769#define DEFINE_XWAOP_SUB(type, btype) \
1770static __xwlib_inline \
1771void xwaop__##type##__sub(atomic_##type * a, \
1773 type * nv, type * ov) \
1775 xwaop__##btype##__sub((atomic_##btype *)a, \
1777 (btype *)nv, (btype *)ov); \
1785#define DEFINE_XWAOP_TEQ_THEN_SUB(type, btype) \
1786static __xwlib_inline \
1787xwer_t xwaop__##type##__teq_then_sub(atomic_##type * a, \
1790 type * nv, type * ov) \
1792 return xwaop__##btype##__teq_then_sub((atomic_##btype *)a, \
1795 (btype *)nv, (btype *)ov); \
1803#define DEFINE_XWAOP_TNE_THEN_SUB(type, btype) \
1804static __xwlib_inline \
1805xwer_t xwaop__##type##__tne_then_sub(atomic_##type * a, \
1808 type * nv, type * ov) \
1810 return xwaop__##btype##__tne_then_sub((atomic_##btype *)a, \
1813 (btype *)nv, (btype *)ov); \
1821#define DEFINE_XWAOP_TGT_THEN_SUB(type, btype) \
1822static __xwlib_inline \
1823xwer_t xwaop__##type##__tgt_then_sub(atomic_##type * a, \
1826 type * nv, type * ov) \
1828 return xwaop__##btype##__tgt_then_sub((atomic_##btype *)a, \
1831 (btype *)nv, (btype *)ov); \
1839#define DEFINE_XWAOP_TGE_THEN_SUB(type, btype) \
1840static __xwlib_inline \
1841xwer_t xwaop__##type##__tge_then_sub(atomic_##type * a, \
1844 type * nv, type * ov) \
1846 return xwaop__##btype##__tge_then_sub((atomic_##btype *)a, \
1849 (btype *)nv, (btype *)ov); \
1857#define DEFINE_XWAOP_TLT_THEN_SUB(type, btype) \
1858static __xwlib_inline \
1859xwer_t xwaop__##type##__tlt_then_sub(atomic_##type * a, \
1862 type * nv, type * ov) \
1864 return xwaop__##btype##__tlt_then_sub((atomic_##btype *)a, \
1867 (btype *)nv, (btype *)ov); \
1875#define DEFINE_XWAOP_TLE_THEN_SUB(type, btype) \
1876static __xwlib_inline \
1877xwer_t xwaop__##type##__tle_then_sub(atomic_##type * a, \
1880 type * nv, type * ov) \
1882 return xwaop__##btype##__tle_then_sub((atomic_##btype *)a, \
1885 (btype *)nv, (btype *)ov); \
1893#define DEFINE_XWAOP_TGTLT_THEN_SUB(type, btype) \
1894static __xwlib_inline \
1895xwer_t xwaop__##type##__tgtlt_then_sub(atomic_##type * a, \
1898 type * nv, type * ov) \
1900 return xwaop__##btype##__tgtlt_then_sub((atomic_##btype *)a, \
1901 (btype)l, (btype)r, \
1903 (btype *)nv, (btype *)ov); \
1911#define DEFINE_XWAOP_TGELT_THEN_SUB(type, btype) \
1912static __xwlib_inline \
1913xwer_t xwaop__##type##__tgelt_then_sub(atomic_##type * a, \
1916 type * nv, type * ov) \
1918 return xwaop__##btype##__tgelt_then_sub((atomic_##btype *)a, \
1919 (btype)l, (btype)r, \
1921 (btype *)nv, (btype *)ov); \
1929#define DEFINE_XWAOP_TGTLE_THEN_SUB(type, btype) \
1930static __xwlib_inline \
1931xwer_t xwaop__##type##__tgtle_then_sub(atomic_##type * a, \
1934 type * nv, type * ov) \
1936 return xwaop__##btype##__tgtle_then_sub((atomic_##btype *)a, \
1937 (btype)l, (btype)r, \
1939 (btype *)nv, (btype *)ov); \
1947#define DEFINE_XWAOP_TGELE_THEN_SUB(type, btype) \
1948static __xwlib_inline \
1949xwer_t xwaop__##type##__tgele_then_sub(atomic_##type * a, \
1952 type * nv, type * ov) \
1954 return xwaop__##btype##__tgele_then_sub((atomic_##btype *)a, \
1955 (btype)l, (btype)r, \
1957 (btype *)nv, (btype *)ov); \
1966#define DEFINE_XWAOP_RSB(type, btype) \
1967static __xwlib_inline \
1968void xwaop__##type##__rsb(atomic_##type * a, \
1970 type * nv, type * ov) \
1972 xwaop__##btype##__rsb((atomic_##btype *)a, \
1974 (btype *)nv, (btype *)ov); \
1982#define DEFINE_XWAOP_TEQ_THEN_RSB(type, btype) \
1983static __xwlib_inline \
1984xwer_t xwaop__##type##__teq_then_rsb(atomic_##type * a, \
1987 type * nv, type * ov) \
1989 return xwaop__##btype##__teq_then_rsb((atomic_##btype *)a, \
1992 (btype *)nv, (btype *)ov); \
2000#define DEFINE_XWAOP_TNE_THEN_RSB(type, btype) \
2001static __xwlib_inline \
2002xwer_t xwaop__##type##__tne_then_rsb(atomic_##type * a, \
2005 type * nv, type * ov) \
2007 return xwaop__##btype##__tne_then_rsb((atomic_##btype *)a, \
2010 (btype *)nv, (btype *)ov); \
2018#define DEFINE_XWAOP_TGT_THEN_RSB(type, btype) \
2019static __xwlib_inline \
2020xwer_t xwaop__##type##__tgt_then_rsb(atomic_##type * a, \
2023 type * nv, type * ov) \
2025 return xwaop__##btype##__tgt_then_rsb((atomic_##btype *)a, \
2028 (btype *)nv, (btype *)ov); \
2036#define DEFINE_XWAOP_TGE_THEN_RSB(type, btype) \
2037static __xwlib_inline \
2038xwer_t xwaop__##type##__tge_then_rsb(atomic_##type * a, \
2041 type * nv, type * ov) \
2043 return xwaop__##btype##__tge_then_rsb((atomic_##btype *)a, \
2046 (btype *)nv, (btype *)ov); \
2054#define DEFINE_XWAOP_TLT_THEN_RSB(type, btype) \
2055static __xwlib_inline \
2056xwer_t xwaop__##type##__tlt_then_rsb(atomic_##type * a, \
2059 type * nv, type * ov) \
2061 return xwaop__##btype##__tlt_then_rsb((atomic_##btype *)a, \
2064 (btype *)nv, (btype *)ov); \
2072#define DEFINE_XWAOP_TLE_THEN_RSB(type, btype) \
2073static __xwlib_inline \
2074xwer_t xwaop__##type##__tle_then_rsb(atomic_##type * a, \
2077 type * nv, type * ov) \
2079 return xwaop__##btype##__tle_then_rsb((atomic_##btype *)a, \
2082 (btype *)nv, (btype *)ov); \
2090#define DEFINE_XWAOP_TGTLT_THEN_RSB(type, btype) \
2091static __xwlib_inline \
2092xwer_t xwaop__##type##__tgtlt_then_rsb(atomic_##type * a, \
2095 type * nv, type * ov) \
2097 return xwaop__##btype##__tgtlt_then_rsb((atomic_##btype *)a, \
2098 (btype)l, (btype)r, \
2100 (btype *)nv, (btype *)ov); \
2108#define DEFINE_XWAOP_TGELT_THEN_RSB(type, btype) \
2109static __xwlib_inline \
2110xwer_t xwaop__##type##__tgelt_then_rsb(atomic_##type * a, \
2113 type * nv, type * ov) \
2115 return xwaop__##btype##__tgelt_then_rsb((atomic_##btype *)a, \
2116 (btype)l, (btype)r, \
2118 (btype *)nv, (btype *)ov); \
2126#define DEFINE_XWAOP_TGTLE_THEN_RSB(type, btype) \
2127static __xwlib_inline \
2128xwer_t xwaop__##type##__tgtle_then_rsb(atomic_##type * a, \
2131 type * nv, type * ov) \
2133 return xwaop__##btype##__tgtle_then_rsb((atomic_##btype *)a, \
2134 (btype)l, (btype)r, \
2136 (btype *)nv, (btype *)ov); \
2144#define DEFINE_XWAOP_TGELE_THEN_RSB(type, btype) \
2145static __xwlib_inline \
2146xwer_t xwaop__##type##__tgele_then_rsb(atomic_##type * a, \
2149 type * nv, type * ov) \
2151 return xwaop__##btype##__tgele_then_rsb((atomic_##btype *)a, \
2152 (btype)l, (btype)r, \
2154 (btype *)nv, (btype *)ov); \
2163#define DEFINE_XWAOP_OR(type, btype) \
2164static __xwlib_inline \
2165void xwaop__##type##__or(atomic_##type * a, \
2167 type * nv, type * ov) \
2169 xwaop__##btype##__or((atomic_##btype *)a, \
2171 (btype *)nv, (btype *)ov); \
2179#define DEFINE_XWAOP_AND(type, btype) \
2180static __xwlib_inline \
2181void xwaop__##type##__and(atomic_##type * a, \
2183 type * nv, type * ov) \
2185 xwaop__##btype##__and((atomic_##btype *)a, \
2187 (btype *)nv, (btype *)ov); \
2195#define DEFINE_XWAOP_XOR(type, btype) \
2196static __xwlib_inline \
2197void xwaop__##type##__xor(atomic_##type * a, \
2199 type * nv, type * ov) \
2201 xwaop__##btype##__xor((atomic_##btype *)a, \
2203 (btype *)nv, (btype *)ov); \
2211#define DEFINE_XWAOP_C0M(type, btype) \
2212static __xwlib_inline \
2213void xwaop__##type##__c0m(atomic_##type * a, \
2215 type * nv, type * ov) \
2217 xwaop__##btype##__c0m((atomic_##btype *)a, \
2219 (btype *)nv, (btype *)ov); \
2227#define DEFINE_XWAOP_T1MA_THEN_C0M(type, btype) \
2228static __xwlib_inline \
2229xwer_t xwaop__##type##__t1ma_then_c0m(atomic_##type * a, \
2231 type * nv, type * ov) \
2233 return xwaop__##btype##__t1ma_then_c0m((atomic_##btype *)a, \
2235 (btype *)nv, (btype *)ov); \
2243#define DEFINE_XWAOP_T1MO_THEN_C0M(type, btype) \
2244static __xwlib_inline \
2245xwer_t xwaop__##type##__t1mo_then_c0m(atomic_##type * a, \
2247 type * nv, type * ov) \
2249 return xwaop__##btype##__t1mo_then_c0m((atomic_##btype *)a, \
2251 (btype *)nv, (btype *)ov); \
2259#define DEFINE_XWAOP_T0MA_THEN_S1M(type, btype) \
2260static __xwlib_inline \
2261xwer_t xwaop__##type##__t0ma_then_s1m(atomic_##type * a, \
2263 type * nv, type * ov) \
2265 return xwaop__##btype##__t0ma_then_s1m((atomic_##btype *)a, \
2267 (btype *)nv, (btype *)ov); \
2275#define DEFINE_XWAOP_T0MO_THEN_S1M(type, btype) \
2276static __xwlib_inline \
2277xwer_t xwaop__##type##__t0mo_then_s1m(atomic_##type * a, \
2279 type * nv, type * ov) \
2281 return xwaop__##btype##__t0mo_then_s1m((atomic_##btype *)a, \
2283 (btype *)nv, (btype *)ov); \
2292#define DEFINE_XWAOP_TST_THEN_OP(type, btype) \
2293static __xwlib_inline \
2294xwer_t xwaop__##type##__tst_then_op(atomic_##type * a, \
2295 xwaop_tst_f tst, void * tst_args, \
2296 xwaop_op_f op, void * op_args, \
2297 type * nv, type * ov) \
2299 return xwaop__##btype##__tst_then_op((atomic_##btype *)a, \
2302 (btype *)nv, (btype *)ov); \
2310#define DEFINE_XWAOP(type, btype) \
2311 DEFINE_XWAOP_LOAD(type, btype) \
2312 DEFINE_XWAOP_STORE(type, btype) \
2313 DEFINE_XWAOP_READ(type, btype) \
2314 DEFINE_XWAOP_WRITE(type, btype) \
2315 DEFINE_XWAOP_TEQ_THEN_WRITE(type, btype) \
2316 DEFINE_XWAOP_TNE_THEN_WRITE(type, btype) \
2317 DEFINE_XWAOP_TGT_THEN_WRITE(type, btype) \
2318 DEFINE_XWAOP_TGE_THEN_WRITE(type, btype) \
2319 DEFINE_XWAOP_TLT_THEN_WRITE(type, btype) \
2320 DEFINE_XWAOP_TLE_THEN_WRITE(type, btype) \
2321 DEFINE_XWAOP_TGTLT_THEN_WRITE(type, btype) \
2322 DEFINE_XWAOP_TGELT_THEN_WRITE(type, btype) \
2323 DEFINE_XWAOP_TGTLE_THEN_WRITE(type, btype) \
2324 DEFINE_XWAOP_TGELE_THEN_WRITE(type, btype) \
2325 DEFINE_XWAOP_ADD(type, btype) \
2326 DEFINE_XWAOP_TEQ_THEN_ADD(type, btype) \
2327 DEFINE_XWAOP_TNE_THEN_ADD(type, btype) \
2328 DEFINE_XWAOP_TGT_THEN_ADD(type, btype) \
2329 DEFINE_XWAOP_TGE_THEN_ADD(type, btype) \
2330 DEFINE_XWAOP_TLT_THEN_ADD(type, btype) \
2331 DEFINE_XWAOP_TLE_THEN_ADD(type, btype) \
2332 DEFINE_XWAOP_TGTLT_THEN_ADD(type, btype) \
2333 DEFINE_XWAOP_TGELT_THEN_ADD(type, btype) \
2334 DEFINE_XWAOP_TGTLE_THEN_ADD(type, btype) \
2335 DEFINE_XWAOP_TGELE_THEN_ADD(type, btype) \
2336 DEFINE_XWAOP_SUB(type, btype) \
2337 DEFINE_XWAOP_TEQ_THEN_SUB(type, btype) \
2338 DEFINE_XWAOP_TNE_THEN_SUB(type, btype) \
2339 DEFINE_XWAOP_TGT_THEN_SUB(type, btype) \
2340 DEFINE_XWAOP_TGE_THEN_SUB(type, btype) \
2341 DEFINE_XWAOP_TLT_THEN_SUB(type, btype) \
2342 DEFINE_XWAOP_TLE_THEN_SUB(type, btype) \
2343 DEFINE_XWAOP_TGTLT_THEN_SUB(type, btype) \
2344 DEFINE_XWAOP_TGELT_THEN_SUB(type, btype) \
2345 DEFINE_XWAOP_TGTLE_THEN_SUB(type, btype) \
2346 DEFINE_XWAOP_TGELE_THEN_SUB(type, btype) \
2347 DEFINE_XWAOP_RSB(type, btype) \
2348 DEFINE_XWAOP_TEQ_THEN_RSB(type, btype) \
2349 DEFINE_XWAOP_TNE_THEN_RSB(type, btype) \
2350 DEFINE_XWAOP_TGT_THEN_RSB(type, btype) \
2351 DEFINE_XWAOP_TGE_THEN_RSB(type, btype) \
2352 DEFINE_XWAOP_TLT_THEN_RSB(type, btype) \
2353 DEFINE_XWAOP_TLE_THEN_RSB(type, btype) \
2354 DEFINE_XWAOP_TGTLT_THEN_RSB(type, btype) \
2355 DEFINE_XWAOP_TGELT_THEN_RSB(type, btype) \
2356 DEFINE_XWAOP_TGTLE_THEN_RSB(type, btype) \
2357 DEFINE_XWAOP_TGELE_THEN_RSB(type, btype) \
2358 DEFINE_XWAOP_OR(type, btype) \
2359 DEFINE_XWAOP_AND(type, btype) \
2360 DEFINE_XWAOP_XOR(type, btype) \
2361 DEFINE_XWAOP_C0M(type, btype) \
2362 DEFINE_XWAOP_T1MA_THEN_C0M(type, btype) \
2363 DEFINE_XWAOP_T1MO_THEN_C0M(type, btype) \
2364 DEFINE_XWAOP_T0MA_THEN_S1M(type, btype) \
2365 DEFINE_XWAOP_T0MO_THEN_S1M(type, btype) \
2366 DEFINE_XWAOP_TST_THEN_OP(type, btype)
2369#if (16 == BITS_PER_XWSZ_T)
2371#elif (32 == BITS_PER_XWSZ_T)
2373#elif (64 == BITS_PER_XWSZ_T)
2377#if (16 == BITS_PER_XWSSZ_T)
2379#elif (32 == BITS_PER_XWSSZ_T)
2381#elif (64 == BITS_PER_XWSSZ_T)
2385#if (16 == BITS_PER_XWPTR_T)
2388#elif (32 == BITS_PER_XWPTR_T)
2391#elif (64 == BITS_PER_XWPTR_T)
2396#if (16 == BITS_PER_XWER_T)
2398#elif (32 == BITS_PER_XWER_T)
2400#elif (64 == BITS_PER_XWER_T)
2404#if (8 == BITS_PER_XWID_T)
2406#elif (16 == BITS_PER_XWID_T)
2408#elif (32 == BITS_PER_XWID_T)
2410#elif (64 == BITS_PER_XWID_T)
2414#if (8 == BITS_PER_XWSID_T)
2416#elif (16 == BITS_PER_XWSID_T)
2418#elif (32 == BITS_PER_XWSID_T)
2420#elif (64 == BITS_PER_XWSID_T)
2424#if (16 == BITS_PER_XWREG_T)
2426#elif (32 == BITS_PER_XWREG_T)
2428#elif (64 == BITS_PER_XWREG_T)
2432#if (16 == BITS_PER_XWSREG_T)
2434#elif (32 == BITS_PER_XWSREG_T)
2436#elif (64 == BITS_PER_XWSREG_T)
2440#if (16 == BITS_PER_XWSQ_T)
2442#elif (32 == BITS_PER_XWSQ_T)
2444#elif (64 == BITS_PER_XWSQ_T)
2448#if (16 == BITS_PER_XWSSQ_T)
2450#elif (32 == BITS_PER_XWSSQ_T)
2452#elif (64 == BITS_PER_XWSSQ_T)
2456#if (8 == BITS_PER_XWBMP_T)
2458#elif (16 == BITS_PER_XWBMP_T)
2460#elif (32 == BITS_PER_XWBMP_T)
2462#elif (64 == BITS_PER_XWBMP_T)
xws64_t xwtm_t
XWOS系统时间 (有符号)
xwu64_t xwtk_t
XWOS系统滴答计数 (无符号)
#define DEFINE_XWAOP(type, btype)
使用模板为某一类型定义原子操作函数集合