| author | Scott Ehlert <ds@alliedmods.net> |
| Sun Jul 15 08:00:26 2007 +0000 (2007-07-15) | |
| changeset 1116 | 40cc5e9f0f1b |
| parent 1009 | 06fd81fdedfb |
| child 1230 | fb651202cb8c |
| permissions | -rw-r--r-- |
| dvander@706 | 1 |
/** |
| dvander@706 | 2 |
* vim: set ts=4 : |
| dvander@706 | 3 |
* ================================================================ |
| dvander@706 | 4 |
* SourcePawn (C)2004-2007 AlliedModders LLC. All rights reserved. |
| dvander@706 | 5 |
* ================================================================ |
| dvander@706 | 6 |
* |
| dvander@706 | 7 |
* This file is not open source and may not be copied without explicit |
| dvander@706 | 8 |
* written permission of AlliedModders LLC. This file may not be redistributed |
| dvander@706 | 9 |
* in whole or significant part. |
| dvander@706 | 10 |
* For information, see LICENSE.txt or http://www.sourcemod.net/license.php |
| dvander@706 | 11 |
* |
| dvander@706 | 12 |
* Version: $Id$ |
| dvander@706 | 13 |
*/ |
| dvander@706 | 14 |
|
| dvander@706 | 15 |
#ifndef _INCLUDE_SOURCEPAWN_JIT_HELPERS_H_ |
| dvander@706 | 16 |
#define _INCLUDE_SOURCEPAWN_JIT_HELPERS_H_ |
| dvander@706 | 17 |
|
| dvander@706 | 18 |
#include <sp_vm_types.h> |
| dvander@706 | 19 |
#include <sp_vm_api.h> |
| dvander@706 | 20 |
|
| dvander@706 | 21 |
#if defined HAVE_STDINT_H && !defined WIN32 |
| dvander@706 | 22 |
#include <stdint.h> |
| dvander@706 | 23 |
typedef int8_t jit_int8_t; |
| dvander@706 | 24 |
typedef uint8_t jit_uint8_t; |
| dvander@706 | 25 |
typedef int32_t jit_int32_t; |
| dvander@706 | 26 |
typedef uint32_t jit_uint32_t; |
| dvander@706 | 27 |
typedef int64_t jit_int64_t; |
| dvander@706 | 28 |
typedef uint64_t jit_uint64_t; |
| dvander@706 | 29 |
#elif defined WIN32 |
| dvander@706 | 30 |
typedef __int8 jit_int8_t; |
| dvander@706 | 31 |
typedef unsigned __int8 jit_uint8_t; |
| dvander@706 | 32 |
typedef __int32 jit_int32_t; |
| dvander@706 | 33 |
typedef unsigned __int32 jit_uint32_t; |
| dvander@706 | 34 |
typedef __int64 jit_int64_t; |
| dvander@706 | 35 |
typedef unsigned __int64 jit_uint64_t; |
| dvander@706 | 36 |
#endif |
| dvander@706 | 37 |
|
| dvander@706 | 38 |
typedef char * jitcode_t; |
| dvander@706 | 39 |
typedef unsigned int jitoffs_t; |
| dvander@706 | 40 |
typedef signed int jitrel_t; |
| dvander@706 | 41 |
|
| dvander@706 | 42 |
class JitWriter |
| dvander@706 | 43 |
{ |
| dvander@706 | 44 |
public: |
| dvander@706 | 45 |
inline cell_t read_cell() |
| dvander@706 | 46 |
{ |
| dvander@706 | 47 |
cell_t val = *(inptr); |
| dvander@706 | 48 |
inptr++; |
| dvander@706 | 49 |
return val; |
| dvander@706 | 50 |
} |
| dvander@706 | 51 |
inline cell_t *read_cellptr() |
| dvander@706 | 52 |
{ |
| dvander@706 | 53 |
cell_t *val = *(cell_t **)(inptr); |
| dvander@706 | 54 |
inptr++; |
| dvander@706 | 55 |
return val; |
| dvander@706 | 56 |
} |
| dvander@706 | 57 |
inline void write_ubyte(jit_uint8_t c) |
| dvander@706 | 58 |
{ |
| dvander@706 | 59 |
if (outbase) |
| dvander@706 | 60 |
{ |
| dvander@706 | 61 |
*outptr = c; |
| dvander@706 | 62 |
} |
| dvander@706 | 63 |
outptr++; |
| dvander@706 | 64 |
} |
| dvander@1009 | 65 |
inline void write_ushort(unsigned short c) |
| dvander@1009 | 66 |
{ |
| dvander@1009 | 67 |
if (outbase) |
| dvander@1009 | 68 |
{ |
| dvander@1009 | 69 |
*(unsigned short *)outptr = c; |
| dvander@1009 | 70 |
} |
| dvander@1009 | 71 |
outptr += sizeof(unsigned short); |
| dvander@1009 | 72 |
} |
| dvander@706 | 73 |
inline void write_byte(jit_int8_t c) |
| dvander@706 | 74 |
{ |
| dvander@706 | 75 |
if (outbase) |
| dvander@706 | 76 |
{ |
| dvander@706 | 77 |
*outptr = c; |
| dvander@706 | 78 |
} |
| dvander@706 | 79 |
outptr++; |
| dvander@706 | 80 |
} |
| dvander@706 | 81 |
inline void write_int32(jit_int32_t c) |
| dvander@706 | 82 |
{ |
| dvander@706 | 83 |
if (outbase) |
| dvander@706 | 84 |
{ |
| dvander@706 | 85 |
*(jit_int32_t *)outptr = c; |
| dvander@706 | 86 |
} |
| dvander@706 | 87 |
outptr += sizeof(jit_int32_t); |
| dvander@706 | 88 |
} |
| dvander@706 | 89 |
inline void write_uint32(jit_uint32_t c) |
| dvander@706 | 90 |
{ |
| dvander@706 | 91 |
if (outbase) |
| dvander@706 | 92 |
{ |
| dvander@706 | 93 |
*(jit_uint32_t *)outptr = c; |
| dvander@706 | 94 |
} |
| dvander@706 | 95 |
outptr += sizeof(jit_uint32_t); |
| dvander@706 | 96 |
} |
| dvander@706 | 97 |
inline jitoffs_t get_outputpos() |
| dvander@706 | 98 |
{ |
| dvander@706 | 99 |
return (outptr - outbase); |
| dvander@706 | 100 |
} |
| dvander@706 | 101 |
inline void set_outputpos(jitoffs_t offs) |
| dvander@706 | 102 |
{ |
| dvander@706 | 103 |
outptr = outbase + offs; |
| dvander@706 | 104 |
} |
| dvander@706 | 105 |
inline jitoffs_t get_inputpos() |
| dvander@706 | 106 |
{ |
| dvander@706 | 107 |
return (jitoffs_t)((char *)inptr - (char *)inbase); |
| dvander@706 | 108 |
} |
| dvander@706 | 109 |
public: |
| dvander@706 | 110 |
cell_t *inptr; /* input pointer */ |
| dvander@706 | 111 |
cell_t *inbase; /* input base */ |
| dvander@706 | 112 |
jitcode_t outbase; /* output pointer */ |
| dvander@706 | 113 |
jitcode_t outptr; /* output base */ |
| dvander@706 | 114 |
SourcePawn::ICompilation *data; /* compiler live info */ |
| dvander@706 | 115 |
}; |
| dvander@706 | 116 |
|
| dvander@706 | 117 |
#endif //_INCLUDE_SOURCEPAWN_JIT_HELPERS_H_ |