diff options
author | Mike Pall <mike> | 2010-08-31 23:47:55 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-08-31 23:47:55 +0200 |
commit | 233dc7607831b51237f05bfc5ff6261beb5cf9e2 (patch) | |
tree | c0f11d3a636c9706695d5445491fd20196a945a5 /src | |
parent | 96c1d8a8ad67e0470d518b03218678c321df3f77 (diff) | |
download | luajit-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.dasc | 55 |
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: |