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: |
