diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/buildvm_ppc.dasc | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 6989c447..960f9b7b 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
| @@ -1121,13 +1121,41 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 1121 | | ins_next_ | 1121 | | ins_next_ |
| 1122 | break; | 1122 | break; |
| 1123 | case BC_NOT: | 1123 | case BC_NOT: |
| 1124 | | NYI | 1124 | | // RA = dst*8, RD = src*8 |
| 1125 | | lwzx TMP0, BASE, RD | ||
| 1126 | | subfic TMP1, TMP0, LJ_TTRUE | ||
| 1127 | | adde TMP0, TMP0, TMP1 | ||
| 1128 | | stwx TMP0, BASE, RA | ||
| 1129 | | ins_next | ||
| 1125 | break; | 1130 | break; |
| 1126 | case BC_UNM: | 1131 | case BC_UNM: |
| 1127 | | NYI | 1132 | | // RA = dst*8, RD = src*8 |
| 1133 | | evlddx TMP0, BASE, RD | ||
| 1134 | | lus TMP1, 0x8000 | ||
| 1135 | | li TMP2, 0 | ||
| 1136 | | checknum TMP0 | ||
| 1137 | | evmergelo TMP1, TMP1, TMP2 | ||
| 1138 | | checkfail ->vmeta_unm | ||
| 1139 | | evxor TMP0, TMP0, TMP1 | ||
| 1140 | | evstddx TMP0, BASE, RA | ||
| 1141 | | ins_next | ||
| 1128 | break; | 1142 | break; |
| 1129 | case BC_LEN: | 1143 | case BC_LEN: |
| 1130 | | NYI | 1144 | | // RA = dst*8, RD = src*8 |
| 1145 | | evlddx CARG1, BASE, RD | ||
| 1146 | | checkstr CARG1 | ||
| 1147 | | checkfail >2 | ||
| 1148 | | lwz CRET1, STR:CARG1->len | ||
| 1149 | |1: | ||
| 1150 | | efdcfsi TMP0, CRET1 | ||
| 1151 | | evstddx TMP0, BASE, RA | ||
| 1152 | | ins_next | ||
| 1153 | |2: | ||
| 1154 | | checktab CARG1 | ||
| 1155 | | checkfail ->vmeta_len | ||
| 1156 | | bl extern lj_tab_len // (GCtab *t) | ||
| 1157 | | // Returns uint32_t (but less than 2^31). | ||
| 1158 | | b <1 | ||
| 1131 | break; | 1159 | break; |
| 1132 | 1160 | ||
| 1133 | /* -- Binary ops -------------------------------------------------------- */ | 1161 | /* -- Binary ops -------------------------------------------------------- */ |
