aboutsummaryrefslogtreecommitdiff
path: root/driver/gator_pack.c
diff options
context:
space:
mode:
authorDrew Richardson <drew.richardson@arm.com>2013-06-17 12:00:00 -0700
committerDrew Richardson <drew.richardson@arm.com>2014-12-19 15:44:26 -0800
commitfebe35e3fa5d8ac027b914f14991c95846f49251 (patch)
treec197d0085de10108749260486198c8381bf01f81 /driver/gator_pack.c
parent1b5637426bfc10a64571c81e24019032206d651b (diff)
gator: Version 5.155.15
Signed-off-by: Drew Richardson <drew.richardson@arm.com>
Diffstat (limited to 'driver/gator_pack.c')
-rw-r--r--driver/gator_pack.c195
1 files changed, 34 insertions, 161 deletions
diff --git a/driver/gator_pack.c b/driver/gator_pack.c
index 2bddcbe..2c082f2 100644
--- a/driver/gator_pack.c
+++ b/driver/gator_pack.c
@@ -7,179 +7,52 @@
*
*/
-static void gator_buffer_write_packed_int(int cpu, int buftype, unsigned int x)
+static void gator_buffer_write_packed_int(int cpu, int buftype, int x)
{
uint32_t write = per_cpu(gator_buffer_write, cpu)[buftype];
uint32_t mask = gator_buffer_mask[buftype];
char *buffer = per_cpu(gator_buffer, cpu)[buftype];
- int write0 = (write + 0) & mask;
- int write1 = (write + 1) & mask;
+ int packedBytes = 0;
+ int more = true;
+ while (more) {
+ // low order 7 bits of x
+ char b = x & 0x7f;
+ x >>= 7;
- if ((x & 0xffffff80) == 0) {
- buffer[write0] = x & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write1;
- } else if ((x & 0xffffc000) == 0) {
- int write2 = (write + 2) & mask;
- buffer[write0] = x | 0x80;
- buffer[write1] = (x >> 7) & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write2;
- } else if ((x & 0xffe00000) == 0) {
- int write2 = (write + 2) & mask;
- int write3 = (write + 3) & mask;
- buffer[write0] = x | 0x80;
- buffer[write1] = (x >> 7) | 0x80;
- buffer[write2] = (x >> 14) & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write3;
- } else if ((x & 0xf0000000) == 0) {
- int write2 = (write + 2) & mask;
- int write3 = (write + 3) & mask;
- int write4 = (write + 4) & mask;
- buffer[write0] = x | 0x80;
- buffer[write1] = (x >> 7) | 0x80;
- buffer[write2] = (x >> 14) | 0x80;
- buffer[write3] = (x >> 21) & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write4;
- } else {
- int write2 = (write + 2) & mask;
- int write3 = (write + 3) & mask;
- int write4 = (write + 4) & mask;
- int write5 = (write + 5) & mask;
- buffer[write0] = x | 0x80;
- buffer[write1] = (x >> 7) | 0x80;
- buffer[write2] = (x >> 14) | 0x80;
- buffer[write3] = (x >> 21) | 0x80;
- buffer[write4] = (x >> 28) & 0x0f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write5;
+ if ((x == 0 && (b & 0x40) == 0) || (x == -1 && (b & 0x40) != 0)) {
+ more = false;
+ } else {
+ b |= 0x80;
+ }
+
+ buffer[(write + packedBytes) & mask] = b;
+ packedBytes++;
}
+
+ per_cpu(gator_buffer_write, cpu)[buftype] = (write + packedBytes) & mask;
}
-static void gator_buffer_write_packed_int64(int cpu, int buftype, unsigned long long x)
+static void gator_buffer_write_packed_int64(int cpu, int buftype, long long x)
{
uint32_t write = per_cpu(gator_buffer_write, cpu)[buftype];
uint32_t mask = gator_buffer_mask[buftype];
char *buffer = per_cpu(gator_buffer, cpu)[buftype];
- int write0 = (write + 0) & mask;
- int write1 = (write + 1) & mask;
+ int packedBytes = 0;
+ int more = true;
+ while (more) {
+ // low order 7 bits of x
+ char b = x & 0x7f;
+ x >>= 7;
- if ((x & 0xffffffffffffff80LL) == 0) {
- buffer[write0] = x & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write1;
- } else if ((x & 0xffffffffffffc000LL) == 0) {
- int write2 = (write + 2) & mask;
- buffer[write0] = x | 0x80;
- buffer[write1] = (x >> 7) & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write2;
- } else if ((x & 0xffffffffffe00000LL) == 0) {
- int write2 = (write + 2) & mask;
- int write3 = (write + 3) & mask;
- buffer[write0] = x | 0x80;
- buffer[write1] = (x >> 7) | 0x80;
- buffer[write2] = (x >> 14) & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write3;
- } else if ((x & 0xfffffffff0000000LL) == 0) {
- int write2 = (write + 2) & mask;
- int write3 = (write + 3) & mask;
- int write4 = (write + 4) & mask;
- buffer[write0] = x | 0x80;
- buffer[write1] = (x >> 7) | 0x80;
- buffer[write2] = (x >> 14) | 0x80;
- buffer[write3] = (x >> 21) & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write4;
- } else if ((x & 0xfffffff800000000LL) == 0) {
- int write2 = (write + 2) & mask;
- int write3 = (write + 3) & mask;
- int write4 = (write + 4) & mask;
- int write5 = (write + 5) & mask;
- buffer[write0] = x | 0x80;
- buffer[write1] = (x >> 7) | 0x80;
- buffer[write2] = (x >> 14) | 0x80;
- buffer[write3] = (x >> 21) | 0x80;
- buffer[write4] = (x >> 28) & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write5;
- } else if ((x & 0xfffffc0000000000LL) == 0) {
- int write2 = (write + 2) & mask;
- int write3 = (write + 3) & mask;
- int write4 = (write + 4) & mask;
- int write5 = (write + 5) & mask;
- int write6 = (write + 6) & mask;
- buffer[write0] = x | 0x80;
- buffer[write1] = (x >> 7) | 0x80;
- buffer[write2] = (x >> 14) | 0x80;
- buffer[write3] = (x >> 21) | 0x80;
- buffer[write4] = (x >> 28) | 0x80;
- buffer[write5] = (x >> 35) & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write6;
- } else if ((x & 0xfffe000000000000LL) == 0) {
- int write2 = (write + 2) & mask;
- int write3 = (write + 3) & mask;
- int write4 = (write + 4) & mask;
- int write5 = (write + 5) & mask;
- int write6 = (write + 6) & mask;
- int write7 = (write + 7) & mask;
- buffer[write0] = x | 0x80;
- buffer[write1] = (x >> 7) | 0x80;
- buffer[write2] = (x >> 14) | 0x80;
- buffer[write3] = (x >> 21) | 0x80;
- buffer[write4] = (x >> 28) | 0x80;
- buffer[write5] = (x >> 35) | 0x80;
- buffer[write6] = (x >> 42) & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write7;
- } else if ((x & 0xff00000000000000LL) == 0) {
- int write2 = (write + 2) & mask;
- int write3 = (write + 3) & mask;
- int write4 = (write + 4) & mask;
- int write5 = (write + 5) & mask;
- int write6 = (write + 6) & mask;
- int write7 = (write + 7) & mask;
- int write8 = (write + 8) & mask;
- buffer[write0] = x | 0x80;
- buffer[write1] = (x >> 7) | 0x80;
- buffer[write2] = (x >> 14) | 0x80;
- buffer[write3] = (x >> 21) | 0x80;
- buffer[write4] = (x >> 28) | 0x80;
- buffer[write5] = (x >> 35) | 0x80;
- buffer[write6] = (x >> 42) | 0x80;
- buffer[write7] = (x >> 49) & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write8;
- } else if ((x & 0x8000000000000000LL) == 0) {
- int write2 = (write + 2) & mask;
- int write3 = (write + 3) & mask;
- int write4 = (write + 4) & mask;
- int write5 = (write + 5) & mask;
- int write6 = (write + 6) & mask;
- int write7 = (write + 7) & mask;
- int write8 = (write + 8) & mask;
- int write9 = (write + 9) & mask;
- buffer[write0] = x | 0x80;
- buffer[write1] = (x >> 7) | 0x80;
- buffer[write2] = (x >> 14) | 0x80;
- buffer[write3] = (x >> 21) | 0x80;
- buffer[write4] = (x >> 28) | 0x80;
- buffer[write5] = (x >> 35) | 0x80;
- buffer[write6] = (x >> 42) | 0x80;
- buffer[write7] = (x >> 49) | 0x80;
- buffer[write8] = (x >> 56) & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write9;
- } else {
- int write2 = (write + 2) & mask;
- int write3 = (write + 3) & mask;
- int write4 = (write + 4) & mask;
- int write5 = (write + 5) & mask;
- int write6 = (write + 6) & mask;
- int write7 = (write + 7) & mask;
- int write8 = (write + 8) & mask;
- int write9 = (write + 9) & mask;
- int write10 = (write + 10) & mask;
- buffer[write0] = x | 0x80;
- buffer[write1] = (x >> 7) | 0x80;
- buffer[write2] = (x >> 14) | 0x80;
- buffer[write3] = (x >> 21) | 0x80;
- buffer[write4] = (x >> 28) | 0x80;
- buffer[write5] = (x >> 35) | 0x80;
- buffer[write6] = (x >> 42) | 0x80;
- buffer[write7] = (x >> 49) | 0x80;
- buffer[write8] = (x >> 56) | 0x80;
- buffer[write9] = (x >> 63) & 0x7f;
- per_cpu(gator_buffer_write, cpu)[buftype] = write10;
+ if ((x == 0 && (b & 0x40) == 0) || (x == -1 && (b & 0x40) != 0)) {
+ more = false;
+ } else {
+ b |= 0x80;
+ }
+
+ buffer[(write + packedBytes) & mask] = b;
+ packedBytes++;
}
+
+ per_cpu(gator_buffer_write, cpu)[buftype] = (write + packedBytes) & mask;
}