Changeset 238 in dev for trunk/abdev
- Timestamp:
- Jul 26, 2007, 5:22:11 AM (17 years ago)
- Location:
- trunk/abdev
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/NumOpe_Relation.cpp
r237 r238 132 132 // 64ビット整数演算 133 133 //////////////////// 134 int TrueSchedule,135 FalseSchedule1,136 FalseSchedule2;137 134 138 135 // 第1項 <= 第2項 … … 145 142 compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX ); 146 143 144 CodeGenerator::PertialSchedule *pFalsePertialSchedule1; 147 145 if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){ 148 146 //符号なし演算 149 147 150 148 //ja FalseSchedule1(偽へジャンプ) 151 OpBuffer[obp++]=(char)0x77;149 pFalsePertialSchedule1 = compiler.codeGenerator.op_ja( 0, sizeof(char), true ); 152 150 } 153 151 else{ … … 155 153 156 154 //jg FalseSchedule1(偽へジャンプ) 157 OpBuffer[obp++]=(char)0x7F; 158 } 159 FalseSchedule1=obp; 160 obp++; 161 155 pFalsePertialSchedule1 = compiler.codeGenerator.op_jg( 0, sizeof(char), true ); 156 } 157 158 CodeGenerator::PertialSchedule *pTruePertialSchedule; 162 159 if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){ 163 160 //符号なし演算 164 161 165 162 //jb TrueSchedule(真へジャンプ) 166 OpBuffer[obp++]=(char)0x72;163 pTruePertialSchedule = compiler.codeGenerator.op_jb( 0, sizeof(char), true ); 167 164 } 168 165 else{ … … 170 167 171 168 //jl TrueSchedule(真へジャンプ) 172 OpBuffer[obp++]=(char)0x7C; 173 } 174 TrueSchedule=obp; 175 obp++; 169 pTruePertialSchedule = compiler.codeGenerator.op_jl( 0, sizeof(char), true ); 170 } 176 171 177 172 //cmp eax,ebx … … 179 174 180 175 //ja FalseSchedule2(偽へジャンプ) 181 OpBuffer[obp++]=(char)0x77; 182 FalseSchedule2=obp; 183 obp++; 176 CodeGenerator::PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_ja( 0, sizeof(char), true ); 184 177 185 178 //TrueScheduleのジャンプ先の設定 186 OpBuffer[TrueSchedule]=obp-(TrueSchedule+1);179 compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule ); 187 180 188 181 //mov eax,1 … … 190 183 191 184 //jmp 2(演算終了位置へジャンプ) 192 OpBuffer[obp++]=(char)0xEB; 193 OpBuffer[obp++]=(char)0x02; 185 compiler.codeGenerator.op_jmp( 2 ); 194 186 195 187 //FalseScheduleのジャンプ先の設定 196 OpBuffer[FalseSchedule1]=obp-(FalseSchedule1+1);197 OpBuffer[FalseSchedule2]=obp-(FalseSchedule2+1);188 compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule1 ); 189 compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule2 ); 198 190 199 191 //xor eax,eax(eaxを0にする) … … 230 222 231 223 //jbe 2(次のxorを飛び越す) 232 OpBuffer[obp++]=(char)0x76; 233 OpBuffer[obp++]=(char)0x02; 224 compiler.codeGenerator.op_jbe( 2 ); 234 225 } 235 226 else{ … … 237 228 238 229 //jle 2(次のxorを飛び越す) 239 OpBuffer[obp++]=(char)0x7E; 240 OpBuffer[obp++]=(char)0x02; 230 compiler.codeGenerator.op_jle( 2 ); 241 231 } 242 232 … … 327 317 328 318 //fcompp 329 OpBuffer[obp++]=(char)0xDE; 330 OpBuffer[obp++]=(char)0xD9; 319 compiler.codeGenerator.op_fcompp(); 331 320 332 321 //fnstsw ax … … 995 984 996 985 //je 2 997 OpBuffer[obp++]=(char)0x74; 998 OpBuffer[obp++]=(char)0x02; 986 compiler.codeGenerator.op_je( 2 ); 999 987 1000 988 //xor ecx,ecx … … 1009 997 // 64ビット整数演算 1010 998 //////////////////// 1011 int TrueSchedule1,1012 TrueSchedule2;1013 999 1014 1000 // 第1項 <> 第2項 … … 1021 1007 compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX ); 1022 1008 1023 //jnz TrueSchedule1(真へジャンプ) 1024 OpBuffer[obp++]=(char)0x75; 1025 TrueSchedule1=obp; 1026 obp++; 1009 //jne TrueSchedule1(真へジャンプ) 1010 CodeGenerator::PertialSchedule *pTruePertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 1027 1011 1028 1012 //cmp edx,ecx 1029 1013 compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX ); 1030 1014 1031 //jnz TrueSchedule2(真へジャンプ) 1032 OpBuffer[obp++]=(char)0x75; 1033 TrueSchedule2=obp; 1034 obp++; 1015 //jne TrueSchedule2(真へジャンプ) 1016 CodeGenerator::PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 1035 1017 1036 1018 //xor eax,eax(eaxを0にする) … … 1038 1020 1039 1021 //jmp 5(演算終了位置へジャンプ) 1040 OpBuffer[obp++]=(char)0xEB; 1041 OpBuffer[obp++]=(char)0x05; 1022 compiler.codeGenerator.op_jmp( 5 ); 1042 1023 1043 1024 //TrueScheduleのジャンプ先の設定 1044 OpBuffer[TrueSchedule1]=obp-(TrueSchedule1+1);1045 OpBuffer[TrueSchedule2]=obp-(TrueSchedule2+1);1025 compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule1 ); 1026 compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule2 ); 1046 1027 1047 1028 //mov eax,1 … … 1069 1050 1070 1051 //xor eax,ebx 1071 OpBuffer[obp++]=(char)0x33; 1072 OpBuffer[obp++]=(char)0xC3; 1073 1074 //jz 5(次のmovを飛び越す) 1075 OpBuffer[obp++]=(char)0x74; 1076 OpBuffer[obp++]=(char)0x05; 1052 compiler.codeGenerator.op_xor_RR( REG_EAX, REG_EBX ); 1053 1054 //je 5(次のmovを飛び越す) 1055 compiler.codeGenerator.op_je( 5 ); 1077 1056 1078 1057 //mov eax,1 … … 1171 1150 1172 1151 //jne 2(次のxorを飛び越す) 1173 OpBuffer[obp++]=(char)0x75; 1174 OpBuffer[obp++]=(char)0x02; 1152 compiler.codeGenerator.op_jne( 2 ); 1175 1153 1176 1154 //xor ecx,ecx … … 1185 1163 // 64ビット整数演算 1186 1164 //////////////////// 1187 int FalseSchedule1;1188 1165 1189 1166 // 第1項 == 第2項 … … 1196 1173 compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX ); 1197 1174 1198 //jnz FalseSchedule1(偽へジャンプ) 1199 OpBuffer[obp++]=(char)0x75; 1200 FalseSchedule1=obp; 1201 obp++; 1175 //jne FalseSchedule1(偽へジャンプ) 1176 CodeGenerator::PertialSchedule *pFalsePertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 1202 1177 1203 1178 //cmp edx,ecx … … 1205 1180 1206 1181 //jne FalseSchedule2(偽へジャンプ) 1207 CodeGenerator::PertialSchedule *pFalsePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );1182 CodeGenerator::PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 1208 1183 1209 1184 //mov eax,1 … … 1211 1186 1212 1187 //jmp 2(演算終了位置へジャンプ) 1213 OpBuffer[obp++]=(char)0xEB; 1214 OpBuffer[obp++]=(char)0x02; 1188 compiler.codeGenerator.op_jmp( 2 ); 1215 1189 1216 1190 //FalseScheduleのジャンプ先の設定 1217 OpBuffer[FalseSchedule1]=obp-(FalseSchedule1+1);1218 compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule );1191 compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule1 ); 1192 compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule2 ); 1219 1193 1220 1194 //xor eax,eax(eaxを0にする) … … 1242 1216 1243 1217 //xor eax,ebx 1244 OpBuffer[obp++]=(char)0x33; 1245 OpBuffer[obp++]=(char)0xC3; 1246 1247 //jz 4(次のxorとjmpを飛び越す) 1248 OpBuffer[obp++]=(char)0x74; 1249 OpBuffer[obp++]=(char)0x04; 1218 compiler.codeGenerator.op_xor_RR( REG_EAX, REG_EBX ); 1219 1220 //je 4(次のxorとjmpを飛び越す) 1221 compiler.codeGenerator.op_je( 4 ); 1250 1222 1251 1223 //xor eax,eax 1252 OpBuffer[obp++]=(char)0x33; 1253 OpBuffer[obp++]=(char)0xC0; 1224 compiler.codeGenerator.op_xor_RR( REG_EAX ); 1254 1225 1255 1226 //jmp 5 1256 OpBuffer[obp++]=(char)0xEB; 1257 OpBuffer[obp++]=(char)0x05; 1227 compiler.codeGenerator.op_jmp( 5 ); 1258 1228 1259 1229 //mov eax,1 -
trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h
r237 r238 17 17 18 18 public: 19 20 // コード生成時の部分的なスケジューリング 19 21 class PertialSchedule 20 22 { 21 int codePos; 22 int typeSize; 23 24 int _obpOld; 23 int id; // 通し番号 24 25 int codePos; // バッファ位置 26 int typeSize; // 対象サイズ(一般的には8bit/32bit) 27 28 int _obpOld; // 未完成 25 29 public: 26 30 PertialSchedule( int codePos, int typeSize ) … … 28 32 , typeSize( typeSize ) 29 33 { 34 static int _id = 0; 35 id = _id++; 36 30 37 extern int obp; 31 _obpOld = obp -typeSize;38 _obpOld = obp; 32 39 } 33 40 ~PertialSchedule() 34 41 { 42 } 43 44 bool IsEquals( const PertialSchedule &pertialSchedule ) 45 { 46 return ( this->id == pertialSchedule.id ); 35 47 } 36 48 … … 78 90 void CheckUnresolveSchedule(); 79 91 80 void opfix_JmpPertialSchedule( const PertialSchedule *pPertialSchedule ) 81 { 82 PertialSchedules::iterator it = pertialSchedules.begin(); 83 while( it != pertialSchedules.end() ) 84 { 85 if( &(*it) == pPertialSchedule ) 86 { 87 pNativeCode->Overwrite( pPertialSchedule->GetCodePos(), (char)(pNativeCode->GetSize() - pPertialSchedule->GetCodePos()) ); 88 89 // 未完成 90 extern int obp; 91 pNativeCode->OverwriteOld( pPertialSchedule->GetObpOld(), obp-pPertialSchedule->GetObpOld() ); 92 93 pertialSchedules.erase( it ); 94 } 95 else 96 { 97 it++; 98 } 99 } 100 } 92 void opfix_JmpPertialSchedule( const PertialSchedule *pPertialSchedule ); 101 93 102 94 … … 108 100 PertialSchedule *__jmp_op_format( char opcode, long offset, int op_size, bool isPertialSchedule = false ); 109 101 public: 110 void op_jle( long offset, int op_size = sizeof(char));111 void op_jbe( long offset, int op_size = sizeof(char));112 void op_jge( long offset, int op_size = sizeof(char));113 void op_jae( long offset, int op_size = sizeof(char));114 void op_jl( long offset, int op_size = sizeof(char));115 void op_jb( long offset, int op_size = sizeof(char));116 void op_jg( long offset, int op_size = sizeof(char));102 PertialSchedule *op_jle( long offset, int op_size = sizeof(char), bool isPertialSchedule = false ); 103 PertialSchedule *op_jbe( long offset, int op_size = sizeof(char), bool isPertialSchedule = false ); 104 PertialSchedule *op_jge( long offset, int op_size = sizeof(char), bool isPertialSchedule = false ); 105 PertialSchedule *op_jae( long offset, int op_size = sizeof(char), bool isPertialSchedule = false ); 106 PertialSchedule *op_jl( long offset, int op_size = sizeof(char), bool isPertialSchedule = false ); 107 PertialSchedule *op_jb( long offset, int op_size = sizeof(char), bool isPertialSchedule = false ); 108 PertialSchedule *op_jg( long offset, int op_size = sizeof(char), bool isPertialSchedule = false ); 117 109 PertialSchedule *op_ja( long offset, int op_size = sizeof(char), bool isPertialSchedule = false ); 118 110 PertialSchedule *op_jne( long offset, int op_size = sizeof(char), bool isPertialSchedule = false ); 119 void op_je( long offset, int op_size = sizeof(char));120 void op_jmp( long offset, int op_size = sizeof(char));111 PertialSchedule *op_je( long offset, int op_size = sizeof(char), bool isPertialSchedule = false ); 112 PertialSchedule *op_jmp( long offset, int op_size = sizeof(char), bool isPertialSchedule = false ); 121 113 122 114
Note:
See TracChangeset
for help on using the changeset viewer.