| 197 | } |
| 198 | |
| 199 | static inline char* EmitCopyLessThan64(char* op, size_t offset, int len) { |
| 200 | assert(len <= 64); |
| 201 | assert(len >= 4); |
| 202 | assert(offset < 65536); |
| 203 | |
| 204 | if ((len < 12) && (offset < 2048)) { |
| 205 | size_t len_minus_4 = len - 4; |
| 206 | assert(len_minus_4 < 8); // Must fit in 3 bits |
| 207 | *op++ = COPY_1_BYTE_OFFSET + ((len_minus_4) << 2) + ((offset >> 8) << 5); |
| 208 | *op++ = offset & 0xff; |
| 209 | } else { |
| 210 | *op++ = COPY_2_BYTE_OFFSET + ((len-1) << 2); |
| 211 | LittleEndian::Store16(op, offset); |
| 212 | op += 2; |
| 213 | } |
| 214 | return op; |
| 215 | } |
| 216 | |
| 217 | static inline char* EmitCopy(char* op, size_t offset, int len) { |
| 218 | // Emit 64 byte copies but make sure to keep at least four bytes reserved |