1 /**
2 * Copyright (C) ARM Limited 2010-2012. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 */
10 static void gator_buffer_write_packed_int(int cpu, int buftype, unsigned int x)
11 {
12 uint32_t write = per_cpu(gator_buffer_write, cpu)[buftype];
13 uint32_t mask = gator_buffer_mask[buftype];
14 char *buffer = per_cpu(gator_buffer, cpu)[buftype];
15 int write0 = (write + 0) & mask;
16 int write1 = (write + 1) & mask;
18 if ((x & 0xffffff80) == 0) {
19 buffer[write0] = x & 0x7f;
20 per_cpu(gator_buffer_write, cpu)[buftype] = write1;
21 } else if ((x & 0xffffc000) == 0) {
22 int write2 = (write + 2) & mask;
23 buffer[write0] = x | 0x80;
24 buffer[write1] = (x>>7) & 0x7f;
25 per_cpu(gator_buffer_write, cpu)[buftype] = write2;
26 } else if ((x & 0xffe00000) == 0) {
27 int write2 = (write + 2) & mask;
28 int write3 = (write + 3) & mask;
29 buffer[write0] = x | 0x80;
30 buffer[write1] = (x>>7) | 0x80;
31 buffer[write2] = (x>>14) & 0x7f;
32 per_cpu(gator_buffer_write, cpu)[buftype] = write3;
33 } else if ((x & 0xf0000000) == 0) {
34 int write2 = (write + 2) & mask;
35 int write3 = (write + 3) & mask;
36 int write4 = (write + 4) & mask;
37 buffer[write0] = x | 0x80;
38 buffer[write1] = (x>>7) | 0x80;
39 buffer[write2] = (x>>14) | 0x80;
40 buffer[write3] = (x>>21) & 0x7f;
41 per_cpu(gator_buffer_write, cpu)[buftype] = write4;
42 } else {
43 int write2 = (write + 2) & mask;
44 int write3 = (write + 3) & mask;
45 int write4 = (write + 4) & mask;
46 int write5 = (write + 5) & mask;
47 buffer[write0] = x | 0x80;
48 buffer[write1] = (x>>7) | 0x80;
49 buffer[write2] = (x>>14) | 0x80;
50 buffer[write3] = (x>>21) | 0x80;
51 buffer[write4] = (x>>28) & 0x0f;
52 per_cpu(gator_buffer_write, cpu)[buftype] = write5;
53 }
54 }
56 static void gator_buffer_write_packed_int64(int cpu, int buftype, unsigned long long x)
57 {
58 uint32_t write = per_cpu(gator_buffer_write, cpu)[buftype];
59 uint32_t mask = gator_buffer_mask[buftype];
60 char *buffer = per_cpu(gator_buffer, cpu)[buftype];
61 int write0 = (write + 0) & mask;
62 int write1 = (write + 1) & mask;
64 if ((x & 0xffffffffffffff80LL) == 0) {
65 buffer[write0] = x & 0x7f;
66 per_cpu(gator_buffer_write, cpu)[buftype] = write1;
67 } else if ((x & 0xffffffffffffc000LL) == 0) {
68 int write2 = (write + 2) & mask;
69 buffer[write0] = x | 0x80;
70 buffer[write1] = (x>>7) & 0x7f;
71 per_cpu(gator_buffer_write, cpu)[buftype] = write2;
72 } else if ((x & 0xffffffffffe00000LL) == 0) {
73 int write2 = (write + 2) & mask;
74 int write3 = (write + 3) & mask;
75 buffer[write0] = x | 0x80;
76 buffer[write1] = (x>>7) | 0x80;
77 buffer[write2] = (x>>14) & 0x7f;
78 per_cpu(gator_buffer_write, cpu)[buftype] = write3;
79 } else if ((x & 0xfffffffff0000000LL) == 0) {
80 int write2 = (write + 2) & mask;
81 int write3 = (write + 3) & mask;
82 int write4 = (write + 4) & mask;
83 buffer[write0] = x | 0x80;
84 buffer[write1] = (x>>7) | 0x80;
85 buffer[write2] = (x>>14) | 0x80;
86 buffer[write3] = (x>>21) & 0x7f;
87 per_cpu(gator_buffer_write, cpu)[buftype] = write4;
88 } else if ((x & 0xfffffff800000000LL) == 0) {
89 int write2 = (write + 2) & mask;
90 int write3 = (write + 3) & mask;
91 int write4 = (write + 4) & mask;
92 int write5 = (write + 5) & mask;
93 buffer[write0] = x | 0x80;
94 buffer[write1] = (x>>7) | 0x80;
95 buffer[write2] = (x>>14) | 0x80;
96 buffer[write3] = (x>>21) | 0x80;
97 buffer[write4] = (x>>28) & 0x7f;
98 per_cpu(gator_buffer_write, cpu)[buftype] = write5;
99 } else if ((x & 0xfffffc0000000000LL) == 0) {
100 int write2 = (write + 2) & mask;
101 int write3 = (write + 3) & mask;
102 int write4 = (write + 4) & mask;
103 int write5 = (write + 5) & mask;
104 int write6 = (write + 6) & mask;
105 buffer[write0] = x | 0x80;
106 buffer[write1] = (x>>7) | 0x80;
107 buffer[write2] = (x>>14) | 0x80;
108 buffer[write3] = (x>>21) | 0x80;
109 buffer[write4] = (x>>28) | 0x80;
110 buffer[write5] = (x>>35) & 0x7f;
111 per_cpu(gator_buffer_write, cpu)[buftype] = write6;
112 } else if ((x & 0xfffe000000000000LL) == 0) {
113 int write2 = (write + 2) & mask;
114 int write3 = (write + 3) & mask;
115 int write4 = (write + 4) & mask;
116 int write5 = (write + 5) & mask;
117 int write6 = (write + 6) & mask;
118 int write7 = (write + 7) & mask;
119 buffer[write0] = x | 0x80;
120 buffer[write1] = (x>>7) | 0x80;
121 buffer[write2] = (x>>14) | 0x80;
122 buffer[write3] = (x>>21) | 0x80;
123 buffer[write4] = (x>>28) | 0x80;
124 buffer[write5] = (x>>35) | 0x80;
125 buffer[write6] = (x>>42) & 0x7f;
126 per_cpu(gator_buffer_write, cpu)[buftype] = write7;
127 } else if ((x & 0xff00000000000000LL) == 0) {
128 int write2 = (write + 2) & mask;
129 int write3 = (write + 3) & mask;
130 int write4 = (write + 4) & mask;
131 int write5 = (write + 5) & mask;
132 int write6 = (write + 6) & mask;
133 int write7 = (write + 7) & mask;
134 int write8 = (write + 8) & mask;
135 buffer[write0] = x | 0x80;
136 buffer[write1] = (x>>7) | 0x80;
137 buffer[write2] = (x>>14) | 0x80;
138 buffer[write3] = (x>>21) | 0x80;
139 buffer[write4] = (x>>28) | 0x80;
140 buffer[write5] = (x>>35) | 0x80;
141 buffer[write6] = (x>>42) | 0x80;
142 buffer[write7] = (x>>49) & 0x7f;
143 per_cpu(gator_buffer_write, cpu)[buftype] = write8;
144 } else {
145 int write2 = (write + 2) & mask;
146 int write3 = (write + 3) & mask;
147 int write4 = (write + 4) & mask;
148 int write5 = (write + 5) & mask;
149 int write6 = (write + 6) & mask;
150 int write7 = (write + 7) & mask;
151 int write8 = (write + 8) & mask;
152 int write9 = (write + 9) & mask;
153 buffer[write0] = x | 0x80;
154 buffer[write1] = (x>>7) | 0x80;
155 buffer[write2] = (x>>14) | 0x80;
156 buffer[write3] = (x>>21) | 0x80;
157 buffer[write4] = (x>>28) | 0x80;
158 buffer[write5] = (x>>35) | 0x80;
159 buffer[write6] = (x>>42) | 0x80;
160 buffer[write7] = (x>>49) | 0x80;
161 buffer[write8] = (x>>56) & 0xff;
162 per_cpu(gator_buffer_write, cpu)[buftype] = write9;
163 }
164 }