| 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 \ |
| 16 | L##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 \ |
| 21 | L##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 \ |
| 34 | L##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 \ |
| 39 | L##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 \ |
| 50 | Lu##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 \ |
| 55 | Lu##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 |
| 137 | Lc0: |
| 138 | movi %r1 $offc |
| 139 | ldxr_c %r0 %r0 %r1 |
| 140 | beqi Lc1 %r0 XC |
| 141 | calli @abort |
| 142 | Lc1: |
| 143 | movi %r0 t0 |
| 144 | movi %r1 $offuc |
| 145 | ldxr_uc %r1 %r0 %r1 |
| 146 | beqi Luc0 %r1 0x81 |
| 147 | calli @abort |
| 148 | Luc0: |
| 149 | movi %r1 $offuc |
| 150 | ldxr_uc %r0 %r0 %r1 |
| 151 | beqi Luc1 %r0 0x81 |
| 152 | calli @abort |
| 153 | Luc1: |
| 154 | movi %r0 t0 |
| 155 | movi %r1 $offs |
| 156 | ldxr_s %r1 %r0 %r1 |
| 157 | beqi Ls0 %r1 XS |
| 158 | calli @abort |
| 159 | Ls0: |
| 160 | movi %r1 $offs |
| 161 | ldxr_s %r0 %r0 %r1 |
| 162 | beqi Ls1 %r0 XS |
| 163 | calli @abort |
| 164 | Ls1: |
| 165 | movi %r0 t0 |
| 166 | movi %r1 $offus |
| 167 | ldxr_us %r1 %r0 %r1 |
| 168 | beqi Lus0 %r1 0x8001 |
| 169 | calli @abort |
| 170 | Lus0: |
| 171 | movi %r1 $offus |
| 172 | ldxr_us %r0 %r0 %r1 |
| 173 | beqi Lus1 %r0 0x8001 |
| 174 | calli @abort |
| 175 | Lus1: |
| 176 | movi %r0 t0 |
| 177 | movi %r1 $offi |
| 178 | ldxr_i %r1 %r0 %r1 |
| 179 | beqi Li0 %r1 XI |
| 180 | calli @abort |
| 181 | Li0: |
| 182 | movi %r1 $offi |
| 183 | ldxr_i %r0 %r0 %r1 |
| 184 | beqi Li1 %r0 XI |
| 185 | calli @abort |
| 186 | Li1: |
| 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 |
| 193 | Lui0: |
| 194 | movi %r1 $offui |
| 195 | ldxr_ui %r0 %r0 %r1 |
| 196 | beqi Lui1 %r0 0x80000001 |
| 197 | calli @abort |
| 198 | Lui1: |
| 199 | movi %r0 t0 |
| 200 | movi %r1 $offl |
| 201 | ldxr_l %r1 %r0 %r1 |
| 202 | beqi Ll0 %r1 0x8000000000000001 |
| 203 | calli @abort |
| 204 | Ll0: |
| 205 | movi %r1 $offl |
| 206 | ldxr_l %r0 %r0 %r1 |
| 207 | beqi Ll1 %r0 0x8000000000000001 |
| 208 | calli @abort |
| 209 | Ll1: |
| 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 |