Changeset 38429 in webkit for trunk/JavaScriptCore/masm
- Timestamp:
- Nov 15, 2008, 2:24:48 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/masm/X86Assembler.h
r38428 r38429 41 41 namespace JSC { 42 42 43 class JITCodeBuffer {43 class AssemblerBuffer { 44 44 public: 45 JITCodeBuffer(int size)46 : m_buffer(static_cast<char*>(fastMalloc( size)))47 , m_ size(size)48 , m_ index(0)49 { 50 } 51 52 ~ JITCodeBuffer()45 AssemblerBuffer(int capacity) 46 : m_buffer(static_cast<char*>(fastMalloc(capacity))) 47 , m_capacity(capacity) 48 , m_size(0) 49 { 50 } 51 52 ~AssemblerBuffer() 53 53 { 54 54 fastFree(m_buffer); … … 57 57 void ensureSpace(int space) 58 58 { 59 if (m_ index > m_size- space)60 grow Buffer();59 if (m_size > m_capacity - space) 60 grow(); 61 61 } 62 62 63 63 bool isAligned(int alignment) 64 64 { 65 return !(m_ index& (alignment - 1));65 return !(m_size & (alignment - 1)); 66 66 } 67 67 68 68 void putByteUnchecked(int value) 69 69 { 70 m_buffer[m_index] = value; 71 m_index++; 70 ASSERT(!(m_size > m_capacity - 4)); 71 m_buffer[m_size] = value; 72 m_size++; 72 73 } 73 74 74 75 void putByte(int value) 75 76 { 76 if (m_ index > m_size- 4)77 grow Buffer();77 if (m_size > m_capacity - 4) 78 grow(); 78 79 putByteUnchecked(value); 79 80 } … … 81 82 void putShortUnchecked(int value) 82 83 { 83 *(short*)(&m_buffer[m_index]) = value; 84 m_index += 2; 84 ASSERT(!(m_size > m_capacity - 4)); 85 *reinterpret_cast<short*>(&m_buffer[m_size]) = value; 86 m_size += 2; 85 87 } 86 88 87 89 void putShort(int value) 88 90 { 89 if (m_ index > m_size- 4)90 grow Buffer();91 if (m_size > m_capacity - 4) 92 grow(); 91 93 putShortUnchecked(value); 92 94 } … … 94 96 void putIntUnchecked(int value) 95 97 { 96 *reinterpret_cast<int*>(&m_buffer[m_ index]) = value;97 m_ index+= 4;98 *reinterpret_cast<int*>(&m_buffer[m_size]) = value; 99 m_size += 4; 98 100 } 99 101 100 102 void putInt(int value) 101 103 { 102 if (m_ index > m_size- 4)103 grow Buffer();104 if (m_size > m_capacity - 4) 105 grow(); 104 106 putIntUnchecked(value); 105 107 } 106 108 107 void* getEIP() 108 { 109 return m_buffer + m_index; 110 } 111 112 void* start() 109 void* data() 113 110 { 114 111 return m_buffer; 115 112 } 116 113 117 int getOffset()118 { 119 return m_ index;120 } 121 122 JITCodeBuffer* reset()123 { 124 m_ index= 0;114 int size() 115 { 116 return m_size; 117 } 118 119 AssemblerBuffer* reset() 120 { 121 m_size = 0; 125 122 return this; 126 123 } … … 128 125 void* copy() 129 126 { 130 if (!m_ index)127 if (!m_size) 131 128 return 0; 132 129 133 void* result = WTF::fastMallocExecutable(m_ index);130 void* result = WTF::fastMallocExecutable(m_size); 134 131 135 132 if (!result) 136 133 return 0; 137 134 138 return memcpy(result, m_buffer, m_ index);135 return memcpy(result, m_buffer, m_size); 139 136 } 140 137 141 138 private: 142 void grow Buffer()143 { 144 m_ size += m_size/ 2;145 m_buffer = static_cast<char*>(fastRealloc(m_buffer, m_ size));139 void grow() 140 { 141 m_capacity += m_capacity / 2; 142 m_buffer = static_cast<char*>(fastRealloc(m_buffer, m_capacity)); 146 143 } 147 144 148 145 char* m_buffer; 146 int m_capacity; 149 147 int m_size; 150 int m_index;151 148 }; 152 149 … … 252 249 OP2_JGE_rel32 = 0x8D, 253 250 OP2_JLE_rel32 = 0x8E, 254 OP2_JG_rel32 = 0x8F,251 OP2_JG_rel32 = 0x8F, 255 252 OP2_IMUL_GvEv = 0xAF, 256 253 OP2_MOVZX_GvEb = 0xB6, … … 281 278 } OpcodeID; 282 279 283 static const int MAX_INSTRUCTION_SIZE= 16;284 285 X86Assembler( JITCodeBuffer* m_buffer)280 static const int maxInstructionSize = 16; 281 282 X86Assembler(AssemblerBuffer* m_buffer) 286 283 : m_buffer(m_buffer) 287 284 { … … 519 516 void testl_i32r(int imm, RegisterID dst) 520 517 { 521 m_buffer->ensureSpace( MAX_INSTRUCTION_SIZE);518 m_buffer->ensureSpace(maxInstructionSize); 522 519 m_buffer->putByteUnchecked(OP_GROUP3_EvIz); 523 520 emitModRm_opr_Unchecked(GROUP3_OP_TEST, dst); … … 633 630 void movl_mr(int offset, RegisterID base, RegisterID dst) 634 631 { 635 m_buffer->ensureSpace( MAX_INSTRUCTION_SIZE);632 m_buffer->ensureSpace(maxInstructionSize); 636 633 m_buffer->putByteUnchecked(OP_MOV_GvEv); 637 634 emitModRm_rm_Unchecked(dst, base, offset); … … 686 683 void movl_rm(RegisterID src, int offset, RegisterID base) 687 684 { 688 m_buffer->ensureSpace( MAX_INSTRUCTION_SIZE);685 m_buffer->ensureSpace(maxInstructionSize); 689 686 m_buffer->putByteUnchecked(OP_MOV_EvGv); 690 687 emitModRm_rm_Unchecked(src, base, offset); … … 706 703 void movl_i32m(int imm, int offset, RegisterID base) 707 704 { 708 m_buffer->ensureSpace( MAX_INSTRUCTION_SIZE);705 m_buffer->ensureSpace(maxInstructionSize); 709 706 m_buffer->putByteUnchecked(OP_GROUP11_EvIz); 710 707 emitModRm_opm_Unchecked(GROUP11_MOV, base, offset); … … 902 899 m_buffer->putByte(OP_CALL_rel32); 903 900 m_buffer->putInt(0); 904 return JmpSrc(m_buffer-> getOffset());901 return JmpSrc(m_buffer->size()); 905 902 } 906 903 … … 909 906 m_buffer->putByte(OP_GROUP5_Ev); 910 907 emitModRm_opr(GROUP5_OP_CALLN, dst); 911 return JmpSrc(m_buffer-> getOffset());908 return JmpSrc(m_buffer->size()); 912 909 } 913 910 914 911 JmpDst label() 915 912 { 916 return JmpDst(m_buffer-> getOffset());913 return JmpDst(m_buffer->size()); 917 914 } 918 915 … … 929 926 m_buffer->putByte(OP_JMP_rel32); 930 927 m_buffer->putInt(0); 931 return JmpSrc(m_buffer-> getOffset());928 return JmpSrc(m_buffer->size()); 932 929 } 933 930 … … 937 934 m_buffer->putByte(OP2_JNE_rel32); 938 935 m_buffer->putInt(0); 939 return JmpSrc(m_buffer-> getOffset());936 return JmpSrc(m_buffer->size()); 940 937 } 941 938 … … 947 944 JmpSrc emitUnlinkedJe() 948 945 { 949 m_buffer->ensureSpace( MAX_INSTRUCTION_SIZE);946 m_buffer->ensureSpace(maxInstructionSize); 950 947 m_buffer->putByteUnchecked(OP_2BYTE_ESCAPE); 951 948 m_buffer->putByteUnchecked(OP2_JE_rel32); 952 949 m_buffer->putIntUnchecked(0); 953 return JmpSrc(m_buffer-> getOffset());950 return JmpSrc(m_buffer->size()); 954 951 } 955 952 … … 959 956 m_buffer->putByte(OP2_JL_rel32); 960 957 m_buffer->putInt(0); 961 return JmpSrc(m_buffer-> getOffset());958 return JmpSrc(m_buffer->size()); 962 959 } 963 960 … … 967 964 m_buffer->putByte(OP2_JB_rel32); 968 965 m_buffer->putInt(0); 969 return JmpSrc(m_buffer-> getOffset());966 return JmpSrc(m_buffer->size()); 970 967 } 971 968 … … 975 972 m_buffer->putByte(OP2_JLE_rel32); 976 973 m_buffer->putInt(0); 977 return JmpSrc(m_buffer-> getOffset());974 return JmpSrc(m_buffer->size()); 978 975 } 979 976 … … 983 980 m_buffer->putByte(OP2_JBE_rel32); 984 981 m_buffer->putInt(0); 985 return JmpSrc(m_buffer-> getOffset());982 return JmpSrc(m_buffer->size()); 986 983 } 987 984 … … 991 988 m_buffer->putByte(OP2_JGE_rel32); 992 989 m_buffer->putInt(0); 993 return JmpSrc(m_buffer-> getOffset());990 return JmpSrc(m_buffer->size()); 994 991 } 995 992 … … 999 996 m_buffer->putByte(OP2_JG_rel32); 1000 997 m_buffer->putInt(0); 1001 return JmpSrc(m_buffer-> getOffset());998 return JmpSrc(m_buffer->size()); 1002 999 } 1003 1000 … … 1007 1004 m_buffer->putByte(OP2_JA_rel32); 1008 1005 m_buffer->putInt(0); 1009 return JmpSrc(m_buffer-> getOffset());1006 return JmpSrc(m_buffer->size()); 1010 1007 } 1011 1008 … … 1015 1012 m_buffer->putByte(OP2_JAE_rel32); 1016 1013 m_buffer->putInt(0); 1017 return JmpSrc(m_buffer-> getOffset());1014 return JmpSrc(m_buffer->size()); 1018 1015 } 1019 1016 … … 1023 1020 m_buffer->putByte(OP2_JO_rel32); 1024 1021 m_buffer->putInt(0); 1025 return JmpSrc(m_buffer-> getOffset());1022 return JmpSrc(m_buffer->size()); 1026 1023 } 1027 1024 … … 1031 1028 m_buffer->putByte(OP2_JP_rel32); 1032 1029 m_buffer->putInt(0); 1033 return JmpSrc(m_buffer-> getOffset());1030 return JmpSrc(m_buffer->size()); 1034 1031 } 1035 1032 … … 1039 1036 m_buffer->putByte(OP2_JS_rel32); 1040 1037 m_buffer->putInt(0); 1041 return JmpSrc(m_buffer-> getOffset());1038 return JmpSrc(m_buffer->size()); 1042 1039 } 1043 1040 … … 1052 1049 ASSERT(from.m_offset != -1); 1053 1050 1054 reinterpret_cast<int*>(reinterpret_cast<ptrdiff_t>(m_buffer-> start()) + from.m_offset)[-1] = to.m_offset - from.m_offset;1051 reinterpret_cast<int*>(reinterpret_cast<ptrdiff_t>(m_buffer->data()) + from.m_offset)[-1] = to.m_offset - from.m_offset; 1055 1052 } 1056 1053 … … 1151 1148 void emitModRm_rr(RegisterID reg, RegisterID rm) 1152 1149 { 1153 m_buffer->ensureSpace( MAX_INSTRUCTION_SIZE);1150 m_buffer->ensureSpace(maxInstructionSize); 1154 1151 emitModRm_rr_Unchecked(reg, rm); 1155 1152 } … … 1200 1197 void emitModRm_rm(RegisterID reg, RegisterID base, int offset) 1201 1198 { 1202 m_buffer->ensureSpace( MAX_INSTRUCTION_SIZE);1199 m_buffer->ensureSpace(maxInstructionSize); 1203 1200 emitModRm_rm_Unchecked(reg, base, offset); 1204 1201 } … … 1233 1230 void emitModRm_opr(OpcodeID opcodeID, RegisterID rm) 1234 1231 { 1235 m_buffer->ensureSpace( MAX_INSTRUCTION_SIZE);1232 m_buffer->ensureSpace(maxInstructionSize); 1236 1233 emitModRm_opr_Unchecked(opcodeID, rm); 1237 1234 } … … 1267 1264 } 1268 1265 1269 JITCodeBuffer* m_buffer;1266 AssemblerBuffer* m_buffer; 1270 1267 }; 1271 1268
Note:
See TracChangeset
for help on using the changeset viewer.