Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 2 | mjames | 1 | #include "ref.h" |
| 2 | |||
| 3 | q31_t ref__QADD8(q31_t x, q31_t y) |
||
| 4 | { |
||
| 5 | q31_t sum; |
||
| 6 | q7_t r, s, t, u; |
||
| 7 | |||
| 8 | r = (q7_t) x; |
||
| 9 | s = (q7_t) y; |
||
| 10 | |||
| 11 | r = ref_sat_n((q31_t) (r + s), 8); |
||
| 12 | s = ref_sat_n(((q31_t) (((x << 16) >> 24) + ((y << 16) >> 24))), 8); |
||
| 13 | t = ref_sat_n(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8); |
||
| 14 | u = ref_sat_n(((q31_t) ((x >> 24) + (y >> 24))), 8); |
||
| 15 | |||
| 16 | sum = |
||
| 17 | (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) | |
||
| 18 | (((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF); |
||
| 19 | |||
| 20 | return sum; |
||
| 21 | |||
| 22 | } |
||
| 23 | |||
| 24 | q31_t ref__QSUB8(q31_t x, q31_t y) |
||
| 25 | { |
||
| 26 | q31_t sum; |
||
| 27 | q31_t r, s, t, u; |
||
| 28 | |||
| 29 | r = (q7_t) x; |
||
| 30 | s = (q7_t) y; |
||
| 31 | |||
| 32 | r = ref_sat_n((r - s), 8); |
||
| 33 | s = ref_sat_n(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8; |
||
| 34 | t = ref_sat_n(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16; |
||
| 35 | u = ref_sat_n(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24; |
||
| 36 | |||
| 37 | sum = (u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r & 0x000000FF); |
||
| 38 | |||
| 39 | return sum; |
||
| 40 | } |
||
| 41 | |||
| 42 | q31_t ref__QADD16(q31_t x, q31_t y) |
||
| 43 | { |
||
| 44 | q31_t sum; |
||
| 45 | q31_t r, s; |
||
| 46 | |||
| 47 | r = (q15_t) x; |
||
| 48 | s = (q15_t) y; |
||
| 49 | |||
| 50 | r = ref_sat_q15(r + s); |
||
| 51 | s = (q31_t)ref_sat_q15(((q31_t) ((x >> 16) + (y >> 16)))) << 16; |
||
| 52 | |||
| 53 | sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); |
||
| 54 | |||
| 55 | return sum; |
||
| 56 | |||
| 57 | } |
||
| 58 | |||
| 59 | q31_t ref__SHADD16(q31_t x, q31_t y) |
||
| 60 | { |
||
| 61 | q31_t sum; |
||
| 62 | q31_t r, s; |
||
| 63 | |||
| 64 | r = (q15_t) x; |
||
| 65 | s = (q15_t) y; |
||
| 66 | |||
| 67 | r = (r + s) >> 1; |
||
| 68 | s = ((q31_t) (((x >> 16) + (y >> 16)) >> 1) << 16); |
||
| 69 | |||
| 70 | sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); |
||
| 71 | |||
| 72 | return sum; |
||
| 73 | |||
| 74 | } |
||
| 75 | |||
| 76 | q31_t ref__QSUB16(q31_t x, q31_t y) |
||
| 77 | { |
||
| 78 | q31_t sum; |
||
| 79 | q31_t r, s; |
||
| 80 | |||
| 81 | r = (q15_t) x; |
||
| 82 | s = (q15_t) y; |
||
| 83 | |||
| 84 | r = ref_sat_q15(r - s); |
||
| 85 | s = (q31_t)ref_sat_q15(((q31_t) ((x >> 16) - (y >> 16)))) << 16; |
||
| 86 | |||
| 87 | sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); |
||
| 88 | |||
| 89 | return sum; |
||
| 90 | } |
||
| 91 | |||
| 92 | q31_t ref__SHSUB16(q31_t x, q31_t y) |
||
| 93 | { |
||
| 94 | q31_t diff; |
||
| 95 | q31_t r, s; |
||
| 96 | |||
| 97 | r = (q15_t) x; |
||
| 98 | s = (q15_t) y; |
||
| 99 | |||
| 100 | r = ((r >> 1) - (s >> 1)); |
||
| 101 | s = (((x >> 17) - (y >> 17)) << 16); |
||
| 102 | |||
| 103 | diff = (s & 0xFFFF0000) | (r & 0x0000FFFF); |
||
| 104 | |||
| 105 | return diff; |
||
| 106 | } |
||
| 107 | |||
| 108 | q31_t ref__QASX(q31_t x, q31_t y) |
||
| 109 | { |
||
| 110 | q31_t sum = 0; |
||
| 111 | q31_t xL, xH, yL, yH; |
||
| 112 | |||
| 113 | // extract bottom halfword and sign extend |
||
| 114 | xL = (q15_t)(x & 0xffff); |
||
| 115 | // extract bottom halfword and sign extend |
||
| 116 | yL = (q15_t)(y & 0xffff); |
||
| 117 | // extract top halfword and sign extend |
||
| 118 | xH = (q15_t)(x >> 16); |
||
| 119 | // extract top halfword and sign extend |
||
| 120 | yH = (q15_t)(y >> 16); |
||
| 121 | |||
| 122 | sum = (((q31_t)ref_sat_q15(xH + yL )) << 16) | |
||
| 123 | (((q31_t)ref_sat_q15(xL - yH )) & 0xffff); |
||
| 124 | |||
| 125 | return sum; |
||
| 126 | } |
||
| 127 | |||
| 128 | q31_t ref__SHASX(q31_t x, q31_t y) |
||
| 129 | { |
||
| 130 | q31_t sum; |
||
| 131 | q31_t r, s; |
||
| 132 | |||
| 133 | r = (q15_t) x; |
||
| 134 | s = (q15_t) y; |
||
| 135 | |||
| 136 | r = (r - (y >> 16)) / 2; |
||
| 137 | s = (((x >> 16) + s) << 15); |
||
| 138 | |||
| 139 | sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); |
||
| 140 | |||
| 141 | return sum; |
||
| 142 | } |
||
| 143 | |||
| 144 | q31_t ref__QSAX(q31_t x, q31_t y) |
||
| 145 | { |
||
| 146 | q31_t sum = 0; |
||
| 147 | q31_t xL, xH, yL, yH; |
||
| 148 | |||
| 149 | // extract bottom halfword and sign extend |
||
| 150 | xL = (q15_t)(x & 0xffff); |
||
| 151 | // extract bottom halfword and sign extend |
||
| 152 | yL = (q15_t)(y & 0xffff); |
||
| 153 | // extract top halfword and sign extend |
||
| 154 | xH = (q15_t)(x >> 16); |
||
| 155 | // extract top halfword and sign extend |
||
| 156 | yH = (q15_t)(y >> 16); |
||
| 157 | |||
| 158 | sum = (((q31_t)ref_sat_q15(xH - yL )) << 16) | |
||
| 159 | (((q31_t)ref_sat_q15(xL + yH )) & 0xffff); |
||
| 160 | |||
| 161 | return sum; |
||
| 162 | } |
||
| 163 | |||
| 164 | q31_t ref__SHSAX(q31_t x, q31_t y) |
||
| 165 | { |
||
| 166 | q31_t sum; |
||
| 167 | q31_t r, s; |
||
| 168 | |||
| 169 | r = (q15_t) x; |
||
| 170 | s = (q15_t) y; |
||
| 171 | |||
| 172 | r = (r + (y >> 16)) / 2; |
||
| 173 | s = (((x >> 16) - s) << 15); |
||
| 174 | |||
| 175 | sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); |
||
| 176 | |||
| 177 | return sum; |
||
| 178 | } |
||
| 179 | |||
| 180 | q31_t ref__SMUSDX(q31_t x, q31_t y) |
||
| 181 | { |
||
| 182 | return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) - ((q15_t) (x >> 16) * (q15_t) y))); |
||
| 183 | } |
||
| 184 | |||
| 185 | q31_t ref__SMUADX(q31_t x, q31_t y) |
||
| 186 | { |
||
| 187 | return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) + ((q15_t) (x >> 16) * (q15_t) y))); |
||
| 188 | } |
||
| 189 | |||
| 190 | q31_t ref__QADD(q31_t x, q31_t y) |
||
| 191 | { |
||
| 192 | return ref_sat_q31((q63_t) x + y); |
||
| 193 | } |
||
| 194 | |||
| 195 | q31_t ref__QSUB(q31_t x, q31_t y) |
||
| 196 | { |
||
| 197 | return ref_sat_q31((q63_t) x - y); |
||
| 198 | } |
||
| 199 | |||
| 200 | q31_t ref__SMLAD(q31_t x, q31_t y, q31_t sum) |
||
| 201 | { |
||
| 202 | return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); |
||
| 203 | } |
||
| 204 | |||
| 205 | q31_t ref__SMLADX(q31_t x, q31_t y, q31_t sum) |
||
| 206 | { |
||
| 207 | return (sum + ((q15_t) (x >> 16) * (q15_t) (y)) + ((q15_t) x * (q15_t) (y >> 16))); |
||
| 208 | } |
||
| 209 | |||
| 210 | q31_t ref__SMLSDX(q31_t x, q31_t y, q31_t sum) |
||
| 211 | { |
||
| 212 | return (sum - ((q15_t) (x >> 16) * (q15_t) (y)) + ((q15_t) x * (q15_t) (y >> 16))); |
||
| 213 | } |
||
| 214 | |||
| 215 | q63_t ref__SMLALD(q31_t x, q31_t y, q63_t sum) |
||
| 216 | { |
||
| 217 | return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); |
||
| 218 | } |
||
| 219 | |||
| 220 | q63_t ref__SMLALDX(q31_t x, q31_t y, q63_t sum) |
||
| 221 | { |
||
| 222 | return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); |
||
| 223 | } |
||
| 224 | |||
| 225 | q31_t ref__SMUAD(q31_t x, q31_t y) |
||
| 226 | { |
||
| 227 | return (((x >> 16) * (y >> 16)) + (((x << 16) >> 16) * ((y << 16) >> 16))); |
||
| 228 | } |
||
| 229 | |||
| 230 | q31_t ref__SMUSD(q31_t x, q31_t y) |
||
| 231 | { |
||
| 232 | return (-((x >> 16) * (y >> 16)) + (((x << 16) >> 16) * ((y << 16) >> 16))); |
||
| 233 | } |
||
| 234 | |||
| 235 | q31_t ref__SXTB16(q31_t x) |
||
| 236 | { |
||
| 237 | return ((((x << 24) >> 24) & 0x0000FFFF) | (((x << 8) >> 8) & 0xFFFF0000)); |
||
| 238 | } |