diff options
author | Mike Pall <mike> | 2010-09-01 20:24:08 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-09-01 20:24:08 +0200 |
commit | 222e01fa83c758f5322b17b53294ca67aa2bda68 (patch) | |
tree | 4dcc3775de23e1b2ec01ac1c2a8d95fe4c3433fd /src | |
parent | 7ccdc8045bf06d8f2b24892e37a440c1c8b7d550 (diff) | |
download | luajit-222e01fa83c758f5322b17b53294ca67aa2bda68.tar.gz luajit-222e01fa83c758f5322b17b53294ca67aa2bda68.tar.bz2 luajit-222e01fa83c758f5322b17b53294ca67aa2bda68.zip |
PPC: Add loop instructions.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_ppc.dasc | 83 |
1 files changed, 77 insertions, 6 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 57c146b8..6ac1b036 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -223,6 +223,12 @@ | |||
223 | |.macro checkanyfail, label; bns label; .endmacro | 223 | |.macro checkanyfail, label; bns label; .endmacro |
224 | |.endif | 224 | |.endif |
225 | | | 225 | | |
226 | |.macro branch_RD | ||
227 | | srwi TMP0, RD, 1 | ||
228 | | add PC, PC, TMP0 | ||
229 | | addis PC, PC, -(BCBIAS_J*4 >> 16) | ||
230 | |.endmacro | ||
231 | | | ||
226 | |// Assumes DISPATCH is relative to GL. | 232 | |// Assumes DISPATCH is relative to GL. |
227 | #define DISPATCH_GL(field) (GG_DISP2G + (int)offsetof(global_State, field)) | 233 | #define DISPATCH_GL(field) (GG_DISP2G + (int)offsetof(global_State, field)) |
228 | #define DISPATCH_J(field) (GG_DISP2J + (int)offsetof(jit_State, field)) | 234 | #define DISPATCH_J(field) (GG_DISP2J + (int)offsetof(jit_State, field)) |
@@ -906,6 +912,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
906 | /* Generate the code for a single instruction. */ | 912 | /* Generate the code for a single instruction. */ |
907 | static void build_ins(BuildCtx *ctx, BCOp op, int defop) | 913 | static void build_ins(BuildCtx *ctx, BCOp op, int defop) |
908 | { | 914 | { |
915 | int vk = 0; | ||
909 | |=>defop: | 916 | |=>defop: |
910 | 917 | ||
911 | switch (op) { | 918 | switch (op) { |
@@ -1230,7 +1237,51 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1230 | #endif | 1237 | #endif |
1231 | case BC_FORI: | 1238 | case BC_FORI: |
1232 | case BC_IFORL: | 1239 | case BC_IFORL: |
1233 | | NYI | 1240 | | // RA = base*8, RD = target (after end of loop or start of loop) |
1241 | vk = (op == BC_IFORL || op == BC_JFORL); | ||
1242 | | add RA, BASE, RA | ||
1243 | | evldd TMP1, FORL_IDX*8(RA) | ||
1244 | | evldd TMP2, FORL_STOP*8(RA) | ||
1245 | | evldd TMP3, FORL_STEP*8(RA) | ||
1246 | if (!vk) { | ||
1247 | | evcmpgtu cr0, TMP1, TISNUM | ||
1248 | | evcmpgtu cr1, TMP2, TISNUM | ||
1249 | | evcmpgtu cr7, TMP3, TISNUM | ||
1250 | | cror 4*cr0+lt, 4*cr0+lt, 4*cr1+lt | ||
1251 | | cror 4*cr0+lt, 4*cr0+lt, 4*cr7+lt | ||
1252 | | blt ->vmeta_for | ||
1253 | } | ||
1254 | if (vk) { | ||
1255 | | efdadd TMP1, TMP1, TMP3 | ||
1256 | } | ||
1257 | if (vk) { | ||
1258 | | evstdd TMP1, FORL_IDX*8(RA) | ||
1259 | } | ||
1260 | | evcmpgts TMP3, TISNIL | ||
1261 | | evstdd TMP1, FORL_EXT*8(RA) | ||
1262 | | bge >2 | ||
1263 | | efdcmpgt TMP1, TMP2 | ||
1264 | |1: | ||
1265 | if (op != BC_JFORL) { | ||
1266 | | srwi RD, RD, 1 | ||
1267 | | add RD, PC, RD | ||
1268 | if (op == BC_JFORI) { | ||
1269 | | addis PC, RD, -(BCBIAS_J*4 >> 16) | ||
1270 | } else { | ||
1271 | | addis RD, RD, -(BCBIAS_J*4 >> 16) | ||
1272 | } | ||
1273 | } | ||
1274 | if (op == BC_FORI) { | ||
1275 | | iselgt PC, RD, PC | ||
1276 | } else if (op == BC_IFORL) { | ||
1277 | | iselgt PC, PC, RD | ||
1278 | } else { | ||
1279 | | ble =>BC_JLOOP | ||
1280 | } | ||
1281 | | ins_next | ||
1282 | |2: | ||
1283 | | efdcmpgt TMP2, TMP1 | ||
1284 | | b <1 | ||
1234 | break; | 1285 | break; |
1235 | 1286 | ||
1236 | case BC_ITERL: | 1287 | case BC_ITERL: |
@@ -1245,26 +1296,46 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1245 | break; | 1296 | break; |
1246 | #endif | 1297 | #endif |
1247 | case BC_IITERL: | 1298 | case BC_IITERL: |
1248 | | NYI | 1299 | | // RA = base*8, RD = target |
1300 | | evlddx TMP1, BASE, RA | ||
1301 | | subi RA, RA, 8 | ||
1302 | | checknil TMP1 | ||
1303 | | checkok >1 // Stop if iterator returned nil. | ||
1304 | if (op == BC_JITERL) { | ||
1305 | | NYI | ||
1306 | } else { | ||
1307 | | branch_RD // Otherwise save control var + branch. | ||
1308 | | evstddx TMP1, BASE, RA | ||
1309 | } | ||
1310 | |1: | ||
1311 | | ins_next | ||
1249 | break; | 1312 | break; |
1250 | 1313 | ||
1251 | case BC_LOOP: | 1314 | case BC_LOOP: |
1252 | | NYI | 1315 | | // RA = base*8, RD = target (loop extent) |
1316 | | // Note: RA/RD is only used by trace recorder to determine scope/extent | ||
1317 | | // This opcode does NOT jump, it's only purpose is to detect a hot loop. | ||
1253 | #if LJ_HASJIT | 1318 | #if LJ_HASJIT |
1254 | | // Fall through. Assumes BC_ILOOP follows. | 1319 | | hotloop |
1255 | #endif | 1320 | #endif |
1321 | | // Fall through. Assumes BC_ILOOP follows. | ||
1256 | break; | 1322 | break; |
1257 | 1323 | ||
1258 | case BC_ILOOP: | 1324 | case BC_ILOOP: |
1259 | | NYI | 1325 | | // RA = base*8, RD = target (loop extent) |
1326 | | ins_next | ||
1260 | break; | 1327 | break; |
1261 | 1328 | ||
1262 | case BC_JLOOP: | 1329 | case BC_JLOOP: |
1330 | #if LJ_HASJIT | ||
1263 | | NYI | 1331 | | NYI |
1332 | #endif | ||
1264 | break; | 1333 | break; |
1265 | 1334 | ||
1266 | case BC_JMP: | 1335 | case BC_JMP: |
1267 | | hotcall | 1336 | | // RA = base*8 (only used by trace recorder), RD = target |
1337 | | branch_RD | ||
1338 | | ins_next | ||
1268 | break; | 1339 | break; |
1269 | 1340 | ||
1270 | /* -- Function headers -------------------------------------------------- */ | 1341 | /* -- Function headers -------------------------------------------------- */ |