aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-08-31 23:47:55 +0200
committerMike Pall <mike>2010-08-31 23:47:55 +0200
commit233dc7607831b51237f05bfc5ff6261beb5cf9e2 (patch)
treec0f11d3a636c9706695d5445491fd20196a945a5 /src
parent96c1d8a8ad67e0470d518b03218678c321df3f77 (diff)
downloadluajit-233dc7607831b51237f05bfc5ff6261beb5cf9e2.tar.gz
luajit-233dc7607831b51237f05bfc5ff6261beb5cf9e2.tar.bz2
luajit-233dc7607831b51237f05bfc5ff6261beb5cf9e2.zip
PPC: Add support to call Lua functions.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_ppc.dasc55
1 files changed, 53 insertions, 2 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc
index d79902f4..764cd391 100644
--- a/src/buildvm_ppc.dasc
+++ b/src/buildvm_ppc.dasc
@@ -1124,7 +1124,26 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1124 break; 1124 break;
1125#endif 1125#endif
1126 case BC_IFUNCF: 1126 case BC_IFUNCF:
1127 | NYI 1127 | // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8
1128 | lwz TMP2, L->maxstack
1129 | lbz TMP1, -4+PC2PROTO(numparams)(PC)
1130 | lwz KBASE, -4+PC2PROTO(k)(PC)
1131 | cmplw RA, TMP2
1132 | slwi TMP1, TMP1, 3
1133 | bgt ->vm_growstack_l
1134 |2:
1135 | cmplw NARGS8:RC, TMP1 // Check for missing parameters.
1136 | ble >3
1137 if (op == BC_JFUNCF) {
1138 | NYI
1139 } else {
1140 | ins_next
1141 }
1142 |
1143 |3: // Clear missing parameters.
1144 | evstddx TISNIL, BASE, NARGS8:RC
1145 | addi NARGS8:RC, NARGS8:RC, 8
1146 | b <2
1128 break; 1147 break;
1129 1148
1130 case BC_JFUNCV: 1149 case BC_JFUNCV:
@@ -1135,7 +1154,39 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
1135 break; /* NYI: compiled vararg functions. */ 1154 break; /* NYI: compiled vararg functions. */
1136 1155
1137 case BC_IFUNCV: 1156 case BC_IFUNCV:
1138 | NYI 1157 | // BASE = new base, RA = BASE+framesize*8, RB = LFUNC, RC = nargs*8
1158 | lwz TMP2, L->maxstack
1159 | add TMP1, BASE, RC
1160 | add TMP0, RA, RC
1161 | stw LFUNC:RB, 4(TMP1) // Store copy of LFUNC.
1162 | addi TMP3, RC, 8+FRAME_VARG
1163 | lwz KBASE, -4+PC2PROTO(k)(PC)
1164 | cmplw TMP0, TMP2
1165 | stw TMP3, 0(TMP1) // Store delta + FRAME_VARG.
1166 | bge ->vm_growstack_l
1167 | lbz TMP2, -4+PC2PROTO(numparams)(PC)
1168 | mr RA, BASE
1169 | mr RC, TMP1
1170 | cmpwi TMP2, 0
1171 | addi BASE, TMP1, 8
1172 | beq >3
1173 |1:
1174 | cmplw RA, RC // Less args than parameters?
1175 | evldd TMP0, 0(RA)
1176 | bge >4
1177 | evstdd TISNIL, 0(RA) // Clear old fixarg slot (help the GC).
1178 | addi RA, RA, 8
1179 |2:
1180 | addic. TMP2, TMP2, -1
1181 | evstdd TMP0, 8(TMP1)
1182 | addi TMP1, TMP1, 8
1183 | bne <1
1184 |3:
1185 | ins_next
1186 |
1187 |4: // Clear missing parameters.
1188 | evmr TMP0, TISNIL
1189 | b <2
1139 break; 1190 break;
1140 1191
1141 case BC_FUNCC: 1192 case BC_FUNCC: