1#include "ldst.inc" 2 3#if __WORDSIZE == 64 4# define LDSTL(N, R0, R1, R2) \ 5 movi %R2 $offui \ 6 stxr_i %R2 %R0 %R1 \ 7 movi %R1 L##N \ 8 movi %R2 $offl \ 9 stxr_l %R2 %R0 %R1 10 11# define SI(C, N, x, X, R0, R1) \ 12 movi %R1 $off##x \ 13 ldxr_##x %R1 %R0 %R1 \ 14 beqi L##x##C##0 %R1 L##X##N \ 15 calli @abort \ 16L##x##C##0: \ 17 movi %R1 $off##x \ 18 ldxr_##x %R0 %R0 %R1 \ 19 beqi L##x##C##1 %R0 L##X##N \ 20 calli @abort \ 21L##x##C##1: 22 23# define LDRL(C, N, R0, R1, R2) \ 24 UI(C, N, i, I, R0, R1) \ 25 movi %R0 t0 \ 26 SI(C, N, l, L, R0, R1) 27#else 28# define LDSTL(C, R0, R1, R2) 29# define SI(C, N, x, X, R0, R1) \ 30 movi %R1 $off##x \ 31 ldxr_##x %R1 %R0 %R1 \ 32 beqi L##x##C##0 %R1 I##X##N \ 33 calli @abort \ 34L##x##C##0: \ 35 movi %R1 $off##x \ 36 ldxr_##x %R0 %R0 %R1 \ 37 beqi L##x##C##1 %R0 I##X##N \ 38 calli @abort \ 39L##x##C##1: 40 41# define LDRL(C, N, R0, R1, R2) 42 43#endif 44 45#define UI(C, N, x, X, R0, R1) \ 46 movi %R1 $offu##x \ 47 ldxr_u##x %R1 %R0 %R1 \ 48 beqi Lu##x##C##0 %R1 X##N \ 49 calli @abort \ 50Lu##x##C##0: \ 51 movi %R1 $offu##x \ 52 ldxr_u##x %R0 %R0 %R1 \ 53 beqi Lu##x##C##1 %R0 X##N \ 54 calli @abort \ 55Lu##x##C##1: 56 57#define LDST1(X, N, R0, R1, R2) \ 58 movi %R0 t0 \ 59 movi %R1 C##N \ 60 movi %R2 $offc \ 61 stxr_c %R2 %R0 %R1 \ 62 movi %R2 $offuc \ 63 stxr_c %R2 %R0 %R1 \ 64 movi %R1 S##N \ 65 movi %R2 $offs \ 66 stxr_s %R2 %R0 %R1 \ 67 movi %R2 $offus \ 68 stxr_s %R2 %R0 %R1 \ 69 movi %R1 I##N \ 70 movi %R2 $offi \ 71 stxr_i %R2 %R0 %R1 \ 72 LDSTL(N, R0, R1, R2) \ 73 SI(X, N, c, C, R0, R1) \ 74 movi %R0 t0 \ 75 UI(X, N, c, C, R0, R1) \ 76 movi %R0 t0 \ 77 SI(X, N, s, S, R0, R1) \ 78 movi %R0 t0 \ 79 UI(X, N, s, S, R0, R1) \ 80 movi %R0 t0 \ 81 SI(X, N, i, I, R0, R1) \ 82 movi %R0 t0 \ 83 LDRL(X, N, R0, R1, R2) \ 84 85#define LDST0(R0, R1, R2) \ 86 LDST1(0_##R0##_##R1##_##R2, 0, R0, R1, R2) \ 87 LDST1(1_##R0##_##R1##_##R2, 1, R0, R1, R2) \ 88 LDST1(2_##R0##_##R1##_##R2, 2, R0, R1, R2) \ 89 LDST1(3_##R0##_##R1##_##R2, 3, R0, R1, R2) 90 91#define LDST(V0, V1, V2, R0, R1, R2) \ 92 LDST0(V1, V2, V0) \ 93 LDST0(V1, R0, V0) \ 94 LDST0(V1, R1, V0) \ 95 LDST0(V1, R2, V0) \ 96 LDST0(V0, R0, V1) \ 97 LDST0(V0, R1, V1) \ 98 LDST0(V0, R2, V1) \ 99 LDST0(V0, V2, V1) \ 100 LDST0(V2, V0, V1) \ 101 LDST0(V2, R0, V1) \ 102 LDST0(V2, R1, V1) \ 103 LDST0(V2, R2, V1) \ 104 LDST0(R0, R1, V2) \ 105 LDST0(R0, R2, V2) 106 107.code 108 prolog 109 110 /* Simple test to simplify validating encodings before 111 * brute force tests */ 112 movi %r0 t0 113 movi %r1 0x81 114 movi %r2 $offc 115 stxr_c %r2 %r0 %r1 116 movi %r2 $offuc 117 stxr_c %r2 %r0 %r1 118 movi %r1 0x8001 119 movi %r2 $offs 120 stxr_s %r2 %r0 %r1 121 movi %r2 $offus 122 stxr_s %r2 %r0 %r1 123 movi %r1 0x80000001 124 movi %r2 $offi 125 stxr_i %r2 %r0 %r1 126#if __WORDSIZE == 64 127 movi %r2 $offui 128 stxr_i %r2 %r0 %r1 129 movi %r1 0x8000000000000001 130 movi %r2 $offl 131 stxr_l %r2 %r0 %r1 132#endif 133 movi %r1 $offc 134 ldxr_c %r1 %r0 %r1 135 beqi Lc0 %r1 XC 136 calli @abort 137Lc0: 138 movi %r1 $offc 139 ldxr_c %r0 %r0 %r1 140 beqi Lc1 %r0 XC 141 calli @abort 142Lc1: 143 movi %r0 t0 144 movi %r1 $offuc 145 ldxr_uc %r1 %r0 %r1 146 beqi Luc0 %r1 0x81 147 calli @abort 148Luc0: 149 movi %r1 $offuc 150 ldxr_uc %r0 %r0 %r1 151 beqi Luc1 %r0 0x81 152 calli @abort 153Luc1: 154 movi %r0 t0 155 movi %r1 $offs 156 ldxr_s %r1 %r0 %r1 157 beqi Ls0 %r1 XS 158 calli @abort 159Ls0: 160 movi %r1 $offs 161 ldxr_s %r0 %r0 %r1 162 beqi Ls1 %r0 XS 163 calli @abort 164Ls1: 165 movi %r0 t0 166 movi %r1 $offus 167 ldxr_us %r1 %r0 %r1 168 beqi Lus0 %r1 0x8001 169 calli @abort 170Lus0: 171 movi %r1 $offus 172 ldxr_us %r0 %r0 %r1 173 beqi Lus1 %r0 0x8001 174 calli @abort 175Lus1: 176 movi %r0 t0 177 movi %r1 $offi 178 ldxr_i %r1 %r0 %r1 179 beqi Li0 %r1 XI 180 calli @abort 181Li0: 182 movi %r1 $offi 183 ldxr_i %r0 %r0 %r1 184 beqi Li1 %r0 XI 185 calli @abort 186Li1: 187#if __WORDSIZE == 64 188 movi %r0 t0 189 movi %r1 $offui 190 ldxr_ui %r1 %r0 %r1 191 beqi Lui0 %r1 0x80000001 192 calli @abort 193Lui0: 194 movi %r1 $offui 195 ldxr_ui %r0 %r0 %r1 196 beqi Lui1 %r0 0x80000001 197 calli @abort 198Lui1: 199 movi %r0 t0 200 movi %r1 $offl 201 ldxr_l %r1 %r0 %r1 202 beqi Ll0 %r1 0x8000000000000001 203 calli @abort 204Ll0: 205 movi %r1 $offl 206 ldxr_l %r0 %r0 %r1 207 beqi Ll1 %r0 0x8000000000000001 208 calli @abort 209Ll1: 210#endif 211 212 LDST(v0, v1, v2, r0, r1, r2) 213 // just to know did not abort 214 prepare 215 pushargi ok 216 ellipsis 217 finishi @printf 218 ret 219 epilog 220