diff options
-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 -------------------------------------------------------- */ |