aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-09-01 20:24:08 +0200
committerMike Pall <mike>2010-09-01 20:24:08 +0200
commit222e01fa83c758f5322b17b53294ca67aa2bda68 (patch)
tree4dcc3775de23e1b2ec01ac1c2a8d95fe4c3433fd /src
parent7ccdc8045bf06d8f2b24892e37a440c1c8b7d550 (diff)
downloadluajit-222e01fa83c758f5322b17b53294ca67aa2bda68.tar.gz
luajit-222e01fa83c758f5322b17b53294ca67aa2bda68.tar.bz2
luajit-222e01fa83c758f5322b17b53294ca67aa2bda68.zip
PPC: Add loop instructions.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_ppc.dasc83
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. */
907static void build_ins(BuildCtx *ctx, BCOp op, int defop) 913static 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 -------------------------------------------------- */