Changeset 238 in dev for trunk/abdev/BasicCompiler32/NumOpe_Relation.cpp
- Timestamp:
- Jul 26, 2007, 5:22:11 AM (17 years ago)
- File:
-
- 1 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
Note:
See TracChangeset
for help on using the changeset viewer.