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 -------------------------------------------------- */ |
