951 (aSymbol == #pushThisContext) ifTrue:[stackDelta := 1. ^ 144]. |
936 (aSymbol == #pushThisContext) ifTrue:[stackDelta := 1. ^ 144]. |
952 |
937 |
953 self error:'invalid code symbol'. |
938 self error:'invalid code symbol'. |
954 errorFlag := #Error |
939 errorFlag := #Error |
955 ! ! |
940 ! ! |
956 |
|
957 !ByteCodeCompiler class methodsFor:'machine code constants'! |
|
958 |
|
959 sharedCodeFunctionFor:aSymbol |
|
960 "return the address of a shared code-function; |
|
961 the code below looks ugly, but adds some speed to instvar-access |
|
962 methods" |
|
963 |
|
964 |codeSymbol| |
|
965 |
|
966 (aSymbol == #retSelf) ifTrue:[ |
|
967 %{ |
|
968 extern OBJ __retSelf(); |
|
969 #if defined(SYSV4) && defined(i386) |
|
970 OBJ (*dummy)() = __retSelf; |
|
971 #endif |
|
972 RETURN ( _MKSMALLINT((int)__retSelf) ); |
|
973 %} |
|
974 ]. |
|
975 (aSymbol == #retNil) ifTrue:[ |
|
976 %{ |
|
977 extern OBJ __retNil(); |
|
978 #if defined(SYSV4) && defined(i386) |
|
979 OBJ (*dummy)() = __retNil; |
|
980 #endif |
|
981 RETURN ( _MKSMALLINT((int)__retNil) ); |
|
982 %} |
|
983 ]. |
|
984 (aSymbol == #retTrue) ifTrue:[ |
|
985 %{ |
|
986 extern OBJ __retTrue(); |
|
987 #if defined(SYSV4) && defined(i386) |
|
988 OBJ (*dummy)() = __retTrue; |
|
989 #endif |
|
990 RETURN ( _MKSMALLINT((int)__retTrue) ); |
|
991 %} |
|
992 ]. |
|
993 (aSymbol == #retFalse) ifTrue:[ |
|
994 %{ |
|
995 extern OBJ __retFalse(); |
|
996 #if defined(SYSV4) && defined(i386) |
|
997 OBJ (*dummy)() = __retFalse; |
|
998 #endif |
|
999 RETURN ( _MKSMALLINT((int)__retFalse) ); |
|
1000 %} |
|
1001 ]. |
|
1002 (aSymbol == #ret0) ifTrue:[ |
|
1003 %{ |
|
1004 extern OBJ __ret0(); |
|
1005 #if defined(SYSV4) && defined(i386) |
|
1006 OBJ (*dummy)() = __ret0; |
|
1007 #endif |
|
1008 RETURN ( _MKSMALLINT((int)__ret0) ); |
|
1009 %} |
|
1010 ]. |
|
1011 (aSymbol == #blockRet0) ifTrue:[ |
|
1012 %{ |
|
1013 extern OBJ __bRet0(); |
|
1014 #if defined(SYSV4) && defined(i386) |
|
1015 OBJ (*dummy)() = __bRet0; |
|
1016 #endif |
|
1017 RETURN ( _MKSMALLINT((int)__bRet0) ); |
|
1018 %} |
|
1019 ]. |
|
1020 (aSymbol == #blockRetNil) ifTrue:[ |
|
1021 %{ |
|
1022 extern OBJ __bRetNil(); |
|
1023 #if defined(SYSV4) && defined(i386) |
|
1024 OBJ (*dummy)() = __bRetNil; |
|
1025 #endif |
|
1026 RETURN ( _MKSMALLINT((int)__bRetNil) ); |
|
1027 %} |
|
1028 ]. |
|
1029 (aSymbol == #blockRetTrue) ifTrue:[ |
|
1030 %{ |
|
1031 extern OBJ __bRetTrue(); |
|
1032 #if defined(SYSV4) && defined(i386) |
|
1033 OBJ (*dummy)() = __bRetTrue; |
|
1034 #endif |
|
1035 RETURN ( _MKSMALLINT((int)__bRetTrue) ); |
|
1036 %} |
|
1037 ]. |
|
1038 (aSymbol == #blockRetFalse) ifTrue:[ |
|
1039 %{ |
|
1040 extern OBJ __bRetFalse(); |
|
1041 #if defined(SYSV4) && defined(i386) |
|
1042 OBJ (*dummy)() = __bRetFalse; |
|
1043 #endif |
|
1044 RETURN ( _MKSMALLINT((int)__bRetFalse) ); |
|
1045 %} |
|
1046 ]. |
|
1047 (aSymbol == #retInstVar1) ifTrue:[ |
|
1048 %{ |
|
1049 extern OBJ __retInst0(); |
|
1050 #if defined(SYSV4) && defined(i386) |
|
1051 OBJ (*dummy)() = __retInst0; |
|
1052 #endif |
|
1053 RETURN ( _MKSMALLINT((int)__retInst0) ); |
|
1054 %} |
|
1055 ]. |
|
1056 (aSymbol == #retInstVar2) ifTrue:[ |
|
1057 %{ |
|
1058 extern OBJ __retInst1(); |
|
1059 #if defined(SYSV4) && defined(i386) |
|
1060 OBJ (*dummy)() = __retInst1; |
|
1061 #endif |
|
1062 RETURN ( _MKSMALLINT((int)__retInst1) ); |
|
1063 %} |
|
1064 ]. |
|
1065 (aSymbol == #retInstVar3) ifTrue:[ |
|
1066 %{ |
|
1067 extern OBJ __retInst2(); |
|
1068 #if defined(SYSV4) && defined(i386) |
|
1069 OBJ (*dummy)() = __retInst2; |
|
1070 #endif |
|
1071 RETURN ( _MKSMALLINT((int)__retInst2) ); |
|
1072 %} |
|
1073 ]. |
|
1074 (aSymbol == #retInstVar4) ifTrue:[ |
|
1075 %{ |
|
1076 extern OBJ __retInst3(); |
|
1077 #if defined(SYSV4) && defined(i386) |
|
1078 OBJ (*dummy)() = __retInst3; |
|
1079 #endif |
|
1080 RETURN ( _MKSMALLINT((int)__retInst3) ); |
|
1081 %} |
|
1082 ]. |
|
1083 (aSymbol == #retInstVar5) ifTrue:[ |
|
1084 %{ |
|
1085 extern OBJ __retInst4(); |
|
1086 #if defined(SYSV4) && defined(i386) |
|
1087 OBJ (*dummy)() = __retInst4; |
|
1088 #endif |
|
1089 RETURN ( _MKSMALLINT((int)__retInst4) ); |
|
1090 %} |
|
1091 ]. |
|
1092 (aSymbol == #retInstVar6) ifTrue:[ |
|
1093 %{ |
|
1094 extern OBJ __retInst5(); |
|
1095 #if defined(SYSV4) && defined(i386) |
|
1096 OBJ (*dummy)() = __retInst5; |
|
1097 #endif |
|
1098 RETURN ( _MKSMALLINT((int)__retInst5) ); |
|
1099 %} |
|
1100 ]. |
|
1101 (aSymbol == #retInstVar7) ifTrue:[ |
|
1102 %{ |
|
1103 extern OBJ __retInst6(); |
|
1104 #if defined(SYSV4) && defined(i386) |
|
1105 OBJ (*dummy)() = __retInst6; |
|
1106 #endif |
|
1107 RETURN ( _MKSMALLINT((int)__retInst6) ); |
|
1108 %} |
|
1109 ]. |
|
1110 (aSymbol == #retInstVar8) ifTrue:[ |
|
1111 %{ |
|
1112 extern OBJ __retInst7(); |
|
1113 #if defined(SYSV4) && defined(i386) |
|
1114 OBJ (*dummy)() = __retInst7; |
|
1115 #endif |
|
1116 RETURN ( _MKSMALLINT((int)__retInst7) ); |
|
1117 %} |
|
1118 ]. |
|
1119 (aSymbol == #retInstVar9) ifTrue:[ |
|
1120 %{ |
|
1121 extern OBJ __retInst8(); |
|
1122 #if defined(SYSV4) && defined(i386) |
|
1123 OBJ (*dummy)() = __retInst8; |
|
1124 #endif |
|
1125 RETURN ( _MKSMALLINT((int)__retInst8) ); |
|
1126 %} |
|
1127 ]. |
|
1128 (aSymbol == #retInstVar10) ifTrue:[ |
|
1129 %{ |
|
1130 extern OBJ __retInst9(); |
|
1131 #if defined(SYSV4) && defined(i386) |
|
1132 OBJ (*dummy)() = __retInst9; |
|
1133 #endif |
|
1134 RETURN ( _MKSMALLINT((int)__retInst9) ); |
|
1135 %} |
|
1136 ]. |
|
1137 (aSymbol == #retInstVar11) ifTrue:[ |
|
1138 %{ |
|
1139 extern OBJ __retInst10(); |
|
1140 #if defined(SYSV4) && defined(i386) |
|
1141 OBJ (*dummy)() = __retInst10; |
|
1142 #endif |
|
1143 RETURN ( _MKSMALLINT((int)__retInst10) ); |
|
1144 %} |
|
1145 ]. |
|
1146 (aSymbol == #retInstVar12) ifTrue:[ |
|
1147 %{ |
|
1148 extern OBJ __retInst11(); |
|
1149 #if defined(SYSV4) && defined(i386) |
|
1150 OBJ (*dummy)() = __retInst11; |
|
1151 #endif |
|
1152 RETURN ( _MKSMALLINT((int)__retInst11) ); |
|
1153 %} |
|
1154 ]. |
|
1155 (aSymbol == #retInstVar13) ifTrue:[ |
|
1156 %{ |
|
1157 extern OBJ __retInst12(); |
|
1158 #if defined(SYSV4) && defined(i386) |
|
1159 OBJ (*dummy)() = __retInst12; |
|
1160 #endif |
|
1161 RETURN ( _MKSMALLINT((int)__retInst12) ); |
|
1162 %} |
|
1163 ]. |
|
1164 (aSymbol == #retInstVar14) ifTrue:[ |
|
1165 %{ |
|
1166 extern OBJ __retInst13(); |
|
1167 #if defined(SYSV4) && defined(i386) |
|
1168 OBJ (*dummy)() = __retInst13; |
|
1169 #endif |
|
1170 RETURN ( _MKSMALLINT((int)__retInst13) ); |
|
1171 %} |
|
1172 ]. |
|
1173 (aSymbol == #retInstVar15) ifTrue:[ |
|
1174 %{ |
|
1175 extern OBJ __retInst14(); |
|
1176 #if defined(SYSV4) && defined(i386) |
|
1177 OBJ (*dummy)() = __retInst14; |
|
1178 #endif |
|
1179 RETURN ( _MKSMALLINT((int)__retInst14) ); |
|
1180 %} |
|
1181 ]. |
|
1182 (aSymbol == #retInstVar16) ifTrue:[ |
|
1183 %{ |
|
1184 extern OBJ __retInst15(); |
|
1185 #if defined(SYSV4) && defined(i386) |
|
1186 OBJ (*dummy)() = __retInst15; |
|
1187 #endif |
|
1188 RETURN ( _MKSMALLINT((int)__retInst15) ); |
|
1189 %} |
|
1190 ]. |
|
1191 (aSymbol == #retInstVar17) ifTrue:[ |
|
1192 %{ |
|
1193 extern OBJ __retInst16(); |
|
1194 #if defined(SYSV4) && defined(i386) |
|
1195 OBJ (*dummy)() = __retInst16; |
|
1196 #endif |
|
1197 RETURN ( _MKSMALLINT((int)__retInst16) ); |
|
1198 %} |
|
1199 ]. |
|
1200 (aSymbol == #retInstVar18) ifTrue:[ |
|
1201 %{ |
|
1202 extern OBJ __retInst17(); |
|
1203 #if defined(SYSV4) && defined(i386) |
|
1204 OBJ (*dummy)() = __retInst17; |
|
1205 #endif |
|
1206 RETURN ( _MKSMALLINT((int)__retInst17) ); |
|
1207 %} |
|
1208 ]. |
|
1209 (aSymbol == #retInstVar19) ifTrue:[ |
|
1210 %{ |
|
1211 extern OBJ __retInst18(); |
|
1212 #if defined(SYSV4) && defined(i386) |
|
1213 OBJ (*dummy)() = __retInst18; |
|
1214 #endif |
|
1215 RETURN ( _MKSMALLINT((int)__retInst18) ); |
|
1216 %} |
|
1217 ]. |
|
1218 (aSymbol == #retInstVar20) ifTrue:[ |
|
1219 %{ |
|
1220 extern OBJ __retInst19(); |
|
1221 #if defined(SYSV4) && defined(i386) |
|
1222 OBJ (*dummy)() = __retInst19; |
|
1223 #endif |
|
1224 RETURN ( _MKSMALLINT((int)__retInst19) ); |
|
1225 %} |
|
1226 ]. |
|
1227 (aSymbol == #retInstVar21) ifTrue:[ |
|
1228 %{ |
|
1229 extern OBJ __retInst20(); |
|
1230 #if defined(SYSV4) && defined(i386) |
|
1231 OBJ (*dummy)() = __retInst20; |
|
1232 #endif |
|
1233 RETURN ( _MKSMALLINT((int)__retInst20) ); |
|
1234 %} |
|
1235 ]. |
|
1236 (aSymbol == #retInstVar22) ifTrue:[ |
|
1237 %{ |
|
1238 extern OBJ __retInst21(); |
|
1239 #if defined(SYSV4) && defined(i386) |
|
1240 OBJ (*dummy)() = __retInst21; |
|
1241 #endif |
|
1242 RETURN ( _MKSMALLINT((int)__retInst21) ); |
|
1243 %} |
|
1244 ]. |
|
1245 (aSymbol == #retInstVar23) ifTrue:[ |
|
1246 %{ |
|
1247 extern OBJ __retInst22(); |
|
1248 #if defined(SYSV4) && defined(i386) |
|
1249 OBJ (*dummy)() = __retInst22; |
|
1250 #endif |
|
1251 RETURN ( _MKSMALLINT((int)__retInst22) ); |
|
1252 %} |
|
1253 ]. |
|
1254 (aSymbol == #retInstVar24) ifTrue:[ |
|
1255 %{ |
|
1256 extern OBJ __retInst23(); |
|
1257 #if defined(SYSV4) && defined(i386) |
|
1258 OBJ (*dummy)() = __retInst23; |
|
1259 #endif |
|
1260 RETURN ( _MKSMALLINT((int)__retInst23) ); |
|
1261 %} |
|
1262 ]. |
|
1263 (aSymbol == #retInstVar25) ifTrue:[ |
|
1264 %{ |
|
1265 extern OBJ __retInst24(); |
|
1266 #if defined(SYSV4) && defined(i386) |
|
1267 OBJ (*dummy)() = __retInst24; |
|
1268 #endif |
|
1269 RETURN ( _MKSMALLINT((int)__retInst24) ); |
|
1270 %} |
|
1271 ]. |
|
1272 (aSymbol == #retInstVar26) ifTrue:[ |
|
1273 %{ |
|
1274 extern OBJ __retInst25(); |
|
1275 #if defined(SYSV4) && defined(i386) |
|
1276 OBJ (*dummy)() = __retInst25; |
|
1277 #endif |
|
1278 RETURN ( _MKSMALLINT((int)__retInst25) ); |
|
1279 %} |
|
1280 ]. |
|
1281 (aSymbol == #retInstVar27) ifTrue:[ |
|
1282 %{ |
|
1283 extern OBJ __retInst26(); |
|
1284 #if defined(SYSV4) && defined(i386) |
|
1285 OBJ (*dummy)() = __retInst26; |
|
1286 #endif |
|
1287 RETURN ( _MKSMALLINT((int)__retInst26) ); |
|
1288 %} |
|
1289 ]. |
|
1290 (aSymbol == #retInstVar28) ifTrue:[ |
|
1291 %{ |
|
1292 extern OBJ __retInst27(); |
|
1293 #if defined(SYSV4) && defined(i386) |
|
1294 OBJ (*dummy)() = __retInst27; |
|
1295 #endif |
|
1296 RETURN ( _MKSMALLINT((int)__retInst27) ); |
|
1297 %} |
|
1298 ]. |
|
1299 (aSymbol == #retInstVar29) ifTrue:[ |
|
1300 %{ |
|
1301 extern OBJ __retInst28(); |
|
1302 #if defined(SYSV4) && defined(i386) |
|
1303 OBJ (*dummy)() = __retInst28; |
|
1304 #endif |
|
1305 RETURN ( _MKSMALLINT((int)__retInst28) ); |
|
1306 %} |
|
1307 ]. |
|
1308 (aSymbol == #retInstVar30) ifTrue:[ |
|
1309 %{ |
|
1310 extern OBJ __retInst29(); |
|
1311 #if defined(SYSV4) && defined(i386) |
|
1312 OBJ (*dummy)() = __retInst29; |
|
1313 #endif |
|
1314 RETURN ( _MKSMALLINT((int)__retInst29) ); |
|
1315 %} |
|
1316 ]. |
|
1317 (aSymbol == #retInstVar31) ifTrue:[ |
|
1318 %{ |
|
1319 extern OBJ __retInst30(); |
|
1320 #if defined(SYSV4) && defined(i386) |
|
1321 OBJ (*dummy)() = __retInst30; |
|
1322 #endif |
|
1323 RETURN ( _MKSMALLINT((int)__retInst30) ); |
|
1324 %} |
|
1325 ]. |
|
1326 |
|
1327 (aSymbol == #storeInstVar1) ifTrue:[ |
|
1328 %{ |
|
1329 extern OBJ __setInst0(); |
|
1330 #if defined(SYSV4) && defined(i386) |
|
1331 OBJ (*dummy)() = __setInst0; |
|
1332 #endif |
|
1333 RETURN ( _MKSMALLINT((int)__setInst0) ); |
|
1334 %} |
|
1335 ]. |
|
1336 (aSymbol == #storeInstVar2) ifTrue:[ |
|
1337 %{ |
|
1338 extern OBJ __setInst1(); |
|
1339 #if defined(SYSV4) && defined(i386) |
|
1340 OBJ (*dummy)() = __setInst1; |
|
1341 #endif |
|
1342 RETURN ( _MKSMALLINT((int)__setInst1) ); |
|
1343 %} |
|
1344 ]. |
|
1345 (aSymbol == #storeInstVar3) ifTrue:[ |
|
1346 %{ |
|
1347 extern OBJ __setInst2(); |
|
1348 #if defined(SYSV4) && defined(i386) |
|
1349 OBJ (*dummy)() = __setInst2; |
|
1350 #endif |
|
1351 RETURN ( _MKSMALLINT((int)__setInst2) ); |
|
1352 %} |
|
1353 ]. |
|
1354 (aSymbol == #storeInstVar4) ifTrue:[ |
|
1355 %{ |
|
1356 extern OBJ __setInst3(); |
|
1357 #if defined(SYSV4) && defined(i386) |
|
1358 OBJ (*dummy)() = __setInst3; |
|
1359 #endif |
|
1360 RETURN ( _MKSMALLINT((int)__setInst3) ); |
|
1361 %} |
|
1362 ]. |
|
1363 (aSymbol == #storeInstVar5) ifTrue:[ |
|
1364 %{ |
|
1365 extern OBJ __setInst4(); |
|
1366 #if defined(SYSV4) && defined(i386) |
|
1367 OBJ (*dummy)() = __setInst4; |
|
1368 #endif |
|
1369 RETURN ( _MKSMALLINT((int)__setInst4) ); |
|
1370 %} |
|
1371 ]. |
|
1372 (aSymbol == #storeInstVar6) ifTrue:[ |
|
1373 %{ |
|
1374 extern OBJ __setInst5(); |
|
1375 #if defined(SYSV4) && defined(i386) |
|
1376 OBJ (*dummy)() = __setInst5; |
|
1377 #endif |
|
1378 RETURN ( _MKSMALLINT((int)__setInst5) ); |
|
1379 %} |
|
1380 ]. |
|
1381 (aSymbol == #storeInstVar7) ifTrue:[ |
|
1382 %{ |
|
1383 extern OBJ __setInst6(); |
|
1384 #if defined(SYSV4) && defined(i386) |
|
1385 OBJ (*dummy)() = __setInst6; |
|
1386 #endif |
|
1387 RETURN ( _MKSMALLINT((int)__setInst6) ); |
|
1388 %} |
|
1389 ]. |
|
1390 (aSymbol == #storeInstVar8) ifTrue:[ |
|
1391 %{ |
|
1392 extern OBJ __setInst7(); |
|
1393 #if defined(SYSV4) && defined(i386) |
|
1394 OBJ (*dummy)() = __setInst7; |
|
1395 #endif |
|
1396 RETURN ( _MKSMALLINT((int)__setInst7) ); |
|
1397 %} |
|
1398 ]. |
|
1399 (aSymbol == #storeInstVar9) ifTrue:[ |
|
1400 %{ |
|
1401 extern OBJ __setInst8(); |
|
1402 #if defined(SYSV4) && defined(i386) |
|
1403 OBJ (*dummy)() = __setInst8; |
|
1404 #endif |
|
1405 RETURN ( _MKSMALLINT((int)__setInst8) ); |
|
1406 %} |
|
1407 ]. |
|
1408 (aSymbol == #storeInstVar10) ifTrue:[ |
|
1409 %{ |
|
1410 extern OBJ __setInst9(); |
|
1411 #if defined(SYSV4) && defined(i386) |
|
1412 OBJ (*dummy)() = __setInst9; |
|
1413 #endif |
|
1414 RETURN ( _MKSMALLINT((int)__setInst9) ); |
|
1415 %} |
|
1416 ]. |
|
1417 (aSymbol == #storeInstVar11) ifTrue:[ |
|
1418 %{ |
|
1419 extern OBJ __setInst10(); |
|
1420 #if defined(SYSV4) && defined(i386) |
|
1421 OBJ (*dummy)() = __setInst10; |
|
1422 #endif |
|
1423 RETURN ( _MKSMALLINT((int)__setInst10) ); |
|
1424 %} |
|
1425 ]. |
|
1426 (aSymbol == #storeInstVar12) ifTrue:[ |
|
1427 %{ |
|
1428 extern OBJ __setInst11(); |
|
1429 #if defined(SYSV4) && defined(i386) |
|
1430 OBJ (*dummy)() = __setInst11; |
|
1431 #endif |
|
1432 RETURN ( _MKSMALLINT((int)__setInst11) ); |
|
1433 %} |
|
1434 ]. |
|
1435 (aSymbol == #storeInstVar13) ifTrue:[ |
|
1436 %{ |
|
1437 extern OBJ __setInst12(); |
|
1438 #if defined(SYSV4) && defined(i386) |
|
1439 OBJ (*dummy)() = __setInst12; |
|
1440 #endif |
|
1441 RETURN ( _MKSMALLINT((int)__setInst12) ); |
|
1442 %} |
|
1443 ]. |
|
1444 (aSymbol == #storeInstVar13) ifTrue:[ |
|
1445 %{ |
|
1446 extern OBJ __setInst12(); |
|
1447 #if defined(SYSV4) && defined(i386) |
|
1448 OBJ (*dummy)() = __setInst12; |
|
1449 #endif |
|
1450 RETURN ( _MKSMALLINT((int)__setInst12) ); |
|
1451 %} |
|
1452 ]. |
|
1453 (aSymbol == #storeInstVar14) ifTrue:[ |
|
1454 %{ |
|
1455 extern OBJ __setInst13(); |
|
1456 #if defined(SYSV4) && defined(i386) |
|
1457 OBJ (*dummy)() = __setInst13; |
|
1458 #endif |
|
1459 RETURN ( _MKSMALLINT((int)__setInst13) ); |
|
1460 %} |
|
1461 ]. |
|
1462 (aSymbol == #storeInstVar15) ifTrue:[ |
|
1463 %{ |
|
1464 extern OBJ __setInst14(); |
|
1465 #if defined(SYSV4) && defined(i386) |
|
1466 OBJ (*dummy)() = __setInst14; |
|
1467 #endif |
|
1468 RETURN ( _MKSMALLINT((int)__setInst14) ); |
|
1469 %} |
|
1470 ]. |
|
1471 (aSymbol == #storeInstVar16) ifTrue:[ |
|
1472 %{ |
|
1473 extern OBJ __setInst15(); |
|
1474 #if defined(SYSV4) && defined(i386) |
|
1475 OBJ (*dummy)() = __setInst15; |
|
1476 #endif |
|
1477 RETURN ( _MKSMALLINT((int)__setInst15) ); |
|
1478 %} |
|
1479 ]. |
|
1480 (aSymbol == #storeInstVar17) ifTrue:[ |
|
1481 %{ |
|
1482 extern OBJ __setInst16(); |
|
1483 #if defined(SYSV4) && defined(i386) |
|
1484 OBJ (*dummy)() = __setInst16; |
|
1485 #endif |
|
1486 RETURN ( _MKSMALLINT((int)__setInst16) ); |
|
1487 %} |
|
1488 ]. |
|
1489 (aSymbol == #storeInstVar18) ifTrue:[ |
|
1490 %{ |
|
1491 extern OBJ __setInst17(); |
|
1492 #if defined(SYSV4) && defined(i386) |
|
1493 OBJ (*dummy)() = __setInst17; |
|
1494 #endif |
|
1495 RETURN ( _MKSMALLINT((int)__setInst17) ); |
|
1496 %} |
|
1497 ]. |
|
1498 (aSymbol == #storeInstVar19) ifTrue:[ |
|
1499 %{ |
|
1500 extern OBJ __setInst18(); |
|
1501 #if defined(SYSV4) && defined(i386) |
|
1502 OBJ (*dummy)() = __setInst18; |
|
1503 #endif |
|
1504 RETURN ( _MKSMALLINT((int)__setInst18) ); |
|
1505 %} |
|
1506 ]. |
|
1507 (aSymbol == #storeInstVar20) ifTrue:[ |
|
1508 %{ |
|
1509 extern OBJ __setInst19(); |
|
1510 #if defined(SYSV4) && defined(i386) |
|
1511 OBJ (*dummy)() = __setInst19; |
|
1512 #endif |
|
1513 RETURN ( _MKSMALLINT((int)__setInst19) ); |
|
1514 %} |
|
1515 ]. |
|
1516 (aSymbol == #storeInstVar21) ifTrue:[ |
|
1517 %{ |
|
1518 extern OBJ __setInst20(); |
|
1519 #if defined(SYSV4) && defined(i386) |
|
1520 OBJ (*dummy)() = __setInst20; |
|
1521 #endif |
|
1522 RETURN ( _MKSMALLINT((int)__setInst20) ); |
|
1523 %} |
|
1524 ]. |
|
1525 (aSymbol == #storeInstVar22) ifTrue:[ |
|
1526 %{ |
|
1527 extern OBJ __setInst21(); |
|
1528 #if defined(SYSV4) && defined(i386) |
|
1529 OBJ (*dummy)() = __setInst21; |
|
1530 #endif |
|
1531 RETURN ( _MKSMALLINT((int)__setInst21) ); |
|
1532 %} |
|
1533 ]. |
|
1534 (aSymbol == #storeInstVar23) ifTrue:[ |
|
1535 %{ |
|
1536 extern OBJ __setInst22(); |
|
1537 #if defined(SYSV4) && defined(i386) |
|
1538 OBJ (*dummy)() = __setInst22; |
|
1539 #endif |
|
1540 RETURN ( _MKSMALLINT((int)__setInst22) ); |
|
1541 %} |
|
1542 ]. |
|
1543 (aSymbol == #storeInstVar23) ifTrue:[ |
|
1544 %{ |
|
1545 extern OBJ __setInst22(); |
|
1546 #if defined(SYSV4) && defined(i386) |
|
1547 OBJ (*dummy)() = __setInst22; |
|
1548 #endif |
|
1549 RETURN ( _MKSMALLINT((int)__setInst22) ); |
|
1550 %} |
|
1551 ]. |
|
1552 (aSymbol == #storeInstVar24) ifTrue:[ |
|
1553 %{ |
|
1554 extern OBJ __setInst23(); |
|
1555 #if defined(SYSV4) && defined(i386) |
|
1556 OBJ (*dummy)() = __setInst23; |
|
1557 #endif |
|
1558 RETURN ( _MKSMALLINT((int)__setInst23) ); |
|
1559 %} |
|
1560 ]. |
|
1561 (aSymbol == #storeInstVar25) ifTrue:[ |
|
1562 %{ |
|
1563 extern OBJ __setInst24(); |
|
1564 #if defined(SYSV4) && defined(i386) |
|
1565 OBJ (*dummy)() = __setInst24; |
|
1566 #endif |
|
1567 RETURN ( _MKSMALLINT((int)__setInst24) ); |
|
1568 %} |
|
1569 ]. |
|
1570 (aSymbol == #storeInstVar26) ifTrue:[ |
|
1571 %{ |
|
1572 extern OBJ __setInst25(); |
|
1573 #if defined(SYSV4) && defined(i386) |
|
1574 OBJ (*dummy)() = __setInst25; |
|
1575 #endif |
|
1576 RETURN ( _MKSMALLINT((int)__setInst25) ); |
|
1577 %} |
|
1578 ]. |
|
1579 (aSymbol == #storeInstVar27) ifTrue:[ |
|
1580 %{ |
|
1581 extern OBJ __setInst26(); |
|
1582 #if defined(SYSV4) && defined(i386) |
|
1583 OBJ (*dummy)() = __setInst26; |
|
1584 #endif |
|
1585 RETURN ( _MKSMALLINT((int)__setInst26) ); |
|
1586 %} |
|
1587 ]. |
|
1588 (aSymbol == #storeInstVar28) ifTrue:[ |
|
1589 %{ |
|
1590 extern OBJ __setInst27(); |
|
1591 #if defined(SYSV4) && defined(i386) |
|
1592 OBJ (*dummy)() = __setInst27; |
|
1593 #endif |
|
1594 RETURN ( _MKSMALLINT((int)__setInst27) ); |
|
1595 %} |
|
1596 ]. |
|
1597 (aSymbol == #storeInstVar29) ifTrue:[ |
|
1598 %{ |
|
1599 extern OBJ __setInst28(); |
|
1600 #if defined(SYSV4) && defined(i386) |
|
1601 OBJ (*dummy)() = __setInst28; |
|
1602 #endif |
|
1603 RETURN ( _MKSMALLINT((int)__setInst28) ); |
|
1604 %} |
|
1605 ]. |
|
1606 (aSymbol == #storeInstVar30) ifTrue:[ |
|
1607 %{ |
|
1608 extern OBJ __setInst29(); |
|
1609 #if defined(SYSV4) && defined(i386) |
|
1610 OBJ (*dummy)() = __setInst29; |
|
1611 #endif |
|
1612 RETURN ( _MKSMALLINT((int)__setInst29) ); |
|
1613 %} |
|
1614 ]. |
|
1615 (aSymbol == #storeInstVar31) ifTrue:[ |
|
1616 %{ |
|
1617 extern OBJ __setInst30(); |
|
1618 #if defined(SYSV4) && defined(i386) |
|
1619 OBJ (*dummy)() = __setInst30; |
|
1620 #endif |
|
1621 RETURN ( _MKSMALLINT((int)__setInst30) ); |
|
1622 %} |
|
1623 ]. |
|
1624 ^ nil |
|
1625 ! ! |
|
1626 |
|
1627 !ByteCodeCompiler methodsFor:'machine code generation'! |
|
1628 |
|
1629 checkForSharedCode:symbolicCodeArray |
|
1630 "if this method is a very simple one, |
|
1631 we can use the shared compiled code" |
|
1632 |
|
1633 |codeSymbol nArgs index| |
|
1634 |
|
1635 symbolicCodeArray isNil ifTrue:[^ nil]. |
|
1636 codeSymbol := symbolicCodeArray at:1. |
|
1637 nArgs := methodArgs size. |
|
1638 (nArgs == 0) ifTrue:[ |
|
1639 (codeSymbol == #retSelf) ifTrue:[^ codeSymbol]. |
|
1640 (codeSymbol == #retTrue) ifTrue:[^ codeSymbol]. |
|
1641 (codeSymbol == #retFalse) ifTrue:[^ codeSymbol]. |
|
1642 (codeSymbol == #retNil) ifTrue:[^ codeSymbol]. |
|
1643 (codeSymbol == #ret0) ifTrue:[^ codeSymbol]. |
|
1644 ('retInstVar*' match:codeSymbol) ifTrue:[^ codeSymbol]. |
|
1645 |
|
1646 (codeSymbol == #pushMethodArg1) ifTrue:[ |
|
1647 ((symbolicCodeArray at:2) == #storeInstVar) ifTrue:[ |
|
1648 index := symbolicCodeArray at:3. |
|
1649 ((symbolicCodeArray at:4) == #retSelf) ifTrue:[ |
|
1650 ^ ('storeInstVar' , index printString) asSymbol |
|
1651 ]. |
|
1652 ^ nil |
|
1653 ]. |
|
1654 ('storeInstVar*' match:(symbolicCodeArray at:2)) ifTrue:[ |
|
1655 ((symbolicCodeArray at:3) == #retSelf) ifTrue:[^ symbolicCodeArray at:2] |
|
1656 ]. |
|
1657 ^ nil |
|
1658 ]. |
|
1659 |
|
1660 codeSymbol == #pushInstVar ifTrue:[ |
|
1661 index := symbolicCodeArray at:2. |
|
1662 (symbolicCodeArray at:3) == #retTop ifTrue:[ |
|
1663 ^ ('retInstVar' , index printString) asSymbol |
|
1664 ]. |
|
1665 ^ nil |
|
1666 ] |
|
1667 ]. |
|
1668 ^ nil |
|
1669 ! |
|
1670 |
|
1671 checkForMachineCode:symbolicCodeArray |
|
1672 "if this method is a simple one, |
|
1673 we can compile it into machine code" |
|
1674 |
|
1675 |code1 code2 code3 name| |
|
1676 |
|
1677 symbolicCodeArray isNil ifTrue:[^ nil]. |
|
1678 |
|
1679 code1 := symbolicCodeArray at:1. |
|
1680 (code1 == #retNum) ifTrue:[ |
|
1681 ^ self codeForRetNum:(symbolicCodeArray at:2) |
|
1682 ]. |
|
1683 (code1 == #pushNum) ifTrue:[ |
|
1684 code2 := symbolicCodeArray at:3. |
|
1685 (code2 == #retTop) ifTrue:[ |
|
1686 ^ self codeForRetNum:(symbolicCodeArray at:2) |
|
1687 ]. |
|
1688 ^ nil |
|
1689 ]. |
|
1690 (code1 == #pushMethodArg1) ifTrue:[ |
|
1691 code2 := symbolicCodeArray at:2. |
|
1692 ((code2 == #storeGlobal) |
|
1693 or:[code2 == #storeClassVar]) ifTrue:[ |
|
1694 code3 := symbolicCodeArray at:4. |
|
1695 (code3 == #retSelf) ifTrue:[ |
|
1696 name := symbolicCodeArray at:3. |
|
1697 ^ self codeForSetCell:name |
|
1698 ] |
|
1699 ]. |
|
1700 ^ nil |
|
1701 ]. |
|
1702 (code1 == #pushGlobal) ifTrue:[ |
|
1703 code2 := symbolicCodeArray at:8. |
|
1704 (code2 == #retTop) ifTrue:[ |
|
1705 name := symbolicCodeArray at:2. |
|
1706 ^ self codeForRetCell:name |
|
1707 ]. |
|
1708 ^ nil |
|
1709 ]. |
|
1710 (code1 == #pushClassVar) ifTrue:[ |
|
1711 code2 := symbolicCodeArray at:8. |
|
1712 (code2 == #retTop) ifTrue:[ |
|
1713 name := symbolicCodeArray at:2. |
|
1714 ^ self codeForRetCell:name |
|
1715 ]. |
|
1716 ^ nil |
|
1717 ]. |
|
1718 (code1 == #pushLit) ifTrue:[ |
|
1719 code2 := symbolicCodeArray at:3. |
|
1720 (code2 == #retTop) ifTrue:[ |
|
1721 ^ nil |
|
1722 ]. |
|
1723 ^ nil |
|
1724 ]. |
|
1725 ^ nil |
|
1726 ! |
|
1727 |
|
1728 codeForRetNum:value |
|
1729 "^ number will be coded into machine code" |
|
1730 |
|
1731 |count b conIndex tagHi newCode| |
|
1732 |
|
1733 count := self codeProtoForRetNumEnd - self codeProtoForRetNum. |
|
1734 |
|
1735 b := ExternalBytes address:(self codeProtoForRetNum). |
|
1736 |
|
1737 "search for sequence 0x92345678" |
|
1738 |
|
1739 tagHi := false. |
|
1740 1 to:count-3 do:[:index | |
|
1741 (b at:index) == 16r92 ifTrue:[ |
|
1742 (b at:index+1) == 16r34 ifTrue:[ |
|
1743 (b at:index+2) == 16r56 ifTrue:[ |
|
1744 (b at:index+3) == 16r78 ifTrue:[ |
|
1745 conIndex := index. |
|
1746 tagHi := true |
|
1747 ] |
|
1748 ] |
|
1749 ] |
|
1750 ] |
|
1751 ]. |
|
1752 |
|
1753 conIndex isNil ifTrue:["'search failed' printNewline. "^ nil]. |
|
1754 tagHi ifFalse:['low tag unsupported' printNewline. ^ nil]. |
|
1755 |
|
1756 "allocate code ..." |
|
1757 |
|
1758 newCode := ExternalBytes newForText:count. |
|
1759 newCode isNil ifTrue:[ |
|
1760 'alloc of text (size ' print. count print. ') failed' printNewline. |
|
1761 ^ nil |
|
1762 ]. |
|
1763 |
|
1764 "copy from proto" |
|
1765 1 to:count do:[:index | |
|
1766 newCode at:index put:(b at:index) |
|
1767 ]. |
|
1768 "put in ret-value" |
|
1769 newCode at:conIndex put:((value bitShift:-24) bitAnd:16rFF). |
|
1770 newCode at:conIndex+1 put:((value bitShift:-16) bitAnd:16rFF). |
|
1771 newCode at:conIndex+2 put:((value bitShift:-8) bitAnd:16rFF). |
|
1772 newCode at:conIndex+3 put:(value bitAnd:16rFF). |
|
1773 tagHi ifTrue:[ |
|
1774 newCode at:conIndex |
|
1775 put:((newCode at:conIndex) bitOr:16r80) |
|
1776 ] ifFalse:[ |
|
1777 ]. |
|
1778 'address is:' print. (newCode address printStringRadix:16) printNewline. |
|
1779 ^ newCode address |
|
1780 |
|
1781 "ByteCodeCompiler new codeForRetNum:15" |
|
1782 ! |
|
1783 codeForRetCell:aGlobalOrClassVariableSymbol |
|
1784 "^ global will be coded into machine code" |
|
1785 |
|
1786 |cell count b conIndex newCode msbFirst| |
|
1787 |
|
1788 cell := Smalltalk cellAt:aGlobalOrClassVariableSymbol. |
|
1789 cell isNil ifTrue:[^ nil]. |
|
1790 |
|
1791 count := self codeProtoForRetCellEnd - self codeProtoForRetCell. |
|
1792 |
|
1793 b := ExternalBytes address:(self codeProtoForRetCell). |
|
1794 |
|
1795 msbFirst := true. |
|
1796 |
|
1797 "search for sequence 0x12345678 // 78563412" |
|
1798 1 to:count - 3 do:[:index | |
|
1799 (b at:index) == 16r12 ifTrue:[ |
|
1800 (b at:index+1) == 16r34 ifTrue:[ |
|
1801 (b at:index+2) == 16r56 ifTrue:[ |
|
1802 (b at:index+3) == 16r78 ifTrue:[ |
|
1803 conIndex := index |
|
1804 ] |
|
1805 ] |
|
1806 ] |
|
1807 ]. |
|
1808 conIndex isNil ifTrue:[ |
|
1809 (b at:index) == 16r78 ifTrue:[ |
|
1810 (b at:index+1) == 16r56 ifTrue:[ |
|
1811 (b at:index+2) == 16r34 ifTrue:[ |
|
1812 (b at:index+3) == 16r12 ifTrue:[ |
|
1813 conIndex := index. |
|
1814 msbFirst := false |
|
1815 ] |
|
1816 ] |
|
1817 ] |
|
1818 ] |
|
1819 ] |
|
1820 ]. |
|
1821 |
|
1822 conIndex isNil ifTrue:["'search failed' printNewline. " ^ nil]. |
|
1823 |
|
1824 "allocate code ..." |
|
1825 |
|
1826 newCode := ExternalBytes newForText:count. |
|
1827 newCode isNil ifTrue:['alloc of text (size ' print. count print. ') failed' printNewline.^ nil]. |
|
1828 |
|
1829 "copy from proto" |
|
1830 1 to:count do:[:index | |
|
1831 newCode at:index put:(b at:index) |
|
1832 ]. |
|
1833 "put in cell address" |
|
1834 msbFirst ifTrue:[ |
|
1835 newCode at:conIndex put:((cell bitShift:-24) bitAnd:16rFF). |
|
1836 newCode at:conIndex+1 put:((cell bitShift:-16) bitAnd:16rFF). |
|
1837 newCode at:conIndex+2 put:((cell bitShift:-8) bitAnd:16rFF). |
|
1838 newCode at:conIndex+3 put:(cell bitAnd:16rFF). |
|
1839 ] ifFalse:[ |
|
1840 newCode at:conIndex+3 put:((cell bitShift:-24) bitAnd:16rFF). |
|
1841 newCode at:conIndex+2 put:((cell bitShift:-16) bitAnd:16rFF). |
|
1842 newCode at:conIndex+1 put:((cell bitShift:-8) bitAnd:16rFF). |
|
1843 newCode at:conIndex put:(cell bitAnd:16rFF). |
|
1844 ]. |
|
1845 |
|
1846 'address is:' print. (newCode address printStringRadix:16) printNewline. |
|
1847 ^ newCode address |
|
1848 |
|
1849 "ByteCodeCompiler new codeForRetCell:#Transcript" |
|
1850 ! |
|
1851 |
|
1852 codeForSetCell:aGlobalOrClassVariableSymbol |
|
1853 "global := arg will be coded into machine code" |
|
1854 |
|
1855 |cell count b conIndex newCode| |
|
1856 |
|
1857 cell := Smalltalk cellAt:aGlobalOrClassVariableSymbol. |
|
1858 cell isNil ifTrue:[^ nil]. |
|
1859 |
|
1860 count := self codeProtoForSetCellEnd - self codeProtoForSetCell. |
|
1861 |
|
1862 b := ExternalBytes address:(self codeProtoForSetCell). |
|
1863 |
|
1864 "search for sequence 0x12345678" |
|
1865 1 to:count - 3 do:[:index | |
|
1866 (b at:index) == 16r12 ifTrue:[ |
|
1867 (b at:index+1) == 16r34 ifTrue:[ |
|
1868 (b at:index+2) == 16r56 ifTrue:[ |
|
1869 (b at:index+3) == 16r78 ifTrue:[ |
|
1870 conIndex := index |
|
1871 ] |
|
1872 ] |
|
1873 ] |
|
1874 ] |
|
1875 ]. |
|
1876 |
|
1877 conIndex isNil ifTrue:["'search failed' printNewline." ^ nil]. |
|
1878 |
|
1879 "allocate code ..." |
|
1880 |
|
1881 newCode := ExternalBytes newForData:count. |
|
1882 newCode isNil ifTrue:['alloc of data (size ' print. count print. ') failed' printNewline.^ nil]. |
|
1883 |
|
1884 "copy from proto" |
|
1885 1 to:count do:[:index | |
|
1886 newCode at:index put:(b at:index) |
|
1887 ]. |
|
1888 "put in cell address" |
|
1889 newCode at:conIndex put:((cell bitShift:-24) bitAnd:16rFF). |
|
1890 newCode at:conIndex+1 put:((cell bitShift:-16) bitAnd:16rFF). |
|
1891 newCode at:conIndex+2 put:((cell bitShift:-8) bitAnd:16rFF). |
|
1892 newCode at:conIndex+3 put:(cell bitAnd:16rFF). |
|
1893 |
|
1894 'address is:' print. (newCode address printStringRadix:16) printNewline. |
|
1895 ^ newCode address |
|
1896 |
|
1897 "ByteCodeCompiler new codeForSetCell:#xyz" |
|
1898 ! |
|
1899 |
|
1900 codeProtoForRetNum |
|
1901 %{ /* NOCONTEXT */ |
|
1902 extern OBJ __retNumProto(); |
|
1903 #if defined(SYSV4) && defined(i386) |
|
1904 OBJ (*dummy)() = __retNumProto; |
|
1905 #endif |
|
1906 RETURN ( _MKSMALLINT((int)__retNumProto) ); |
|
1907 %} |
|
1908 ! |
|
1909 |
|
1910 codeProtoForRetNumEnd |
|
1911 %{ /* NOCONTEXT */ |
|
1912 extern OBJ __retNumProtoEnd(); |
|
1913 #if defined(SYSV4) && defined(i386) |
|
1914 OBJ (*dummy)() = __retNumProtoEnd; |
|
1915 #endif |
|
1916 RETURN ( _MKSMALLINT((int)__retNumProtoEnd) ); |
|
1917 %} |
|
1918 ! |
|
1919 |
|
1920 codeProtoForRetCell |
|
1921 %{ /* NOCONTEXT */ |
|
1922 extern OBJ __retCellProto(); |
|
1923 #if defined(SYSV4) && defined(i386) |
|
1924 OBJ (*dummy)() = __retCellProto; |
|
1925 #endif |
|
1926 RETURN ( _MKSMALLINT((int)__retCellProto) ); |
|
1927 %} |
|
1928 ! |
|
1929 |
|
1930 codeProtoForRetCellEnd |
|
1931 %{ /* NOCONTEXT */ |
|
1932 extern OBJ __retCellProtoEnd(); |
|
1933 #if defined(SYSV4) && defined(i386) |
|
1934 OBJ (*dummy)() = __retCellProtoEnd; |
|
1935 #endif |
|
1936 RETURN ( _MKSMALLINT((int)__retCellProtoEnd) ); |
|
1937 %} |
|
1938 ! |
|
1939 |
|
1940 codeProtoForSetCell |
|
1941 %{ /* NOCONTEXT */ |
|
1942 extern OBJ __setCellProto(); |
|
1943 #if defined(SYSV4) && defined(i386) |
|
1944 OBJ (*dummy)() = __setCellProto; |
|
1945 #endif |
|
1946 RETURN ( _MKSMALLINT((int)__setCellProto) ); |
|
1947 %} |
|
1948 ! |
|
1949 |
|
1950 codeProtoForSetCellEnd |
|
1951 %{ /* NOCONTEXT */ |
|
1952 extern OBJ __setCellProtoEnd(); |
|
1953 #if defined(SYSV4) && defined(i386) |
|
1954 OBJ (*dummy)() = __setCellProtoEnd; |
|
1955 #endif |
|
1956 RETURN ( _MKSMALLINT((int)__setCellProtoEnd) ); |
|
1957 %} |
|
1958 |
|
1959 ! ! |
|