diff options
author | Mike Pall <mike> | 2010-09-30 02:56:54 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-09-30 02:56:54 +0200 |
commit | 4afff973a414a0d596d9a65c1c207e705dc5176e (patch) | |
tree | d35a2b08ba0571a3b78dc309af6c0502b76a5d0d /src | |
parent | 408cd055a4547b22bfa0a10947d75fbeb284a360 (diff) | |
download | luajit-4afff973a414a0d596d9a65c1c207e705dc5176e.tar.gz luajit-4afff973a414a0d596d9a65c1c207e705dc5176e.tar.bz2 luajit-4afff973a414a0d596d9a65c1c207e705dc5176e.zip |
PPC: Add bit.* fast functions.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_ppc.dasc | 83 |
1 files changed, 53 insertions, 30 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 67c4f75c..5c418797 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -140,6 +140,8 @@ | |||
140 | |// These basic macros should really be part of DynASM. | 140 | |// These basic macros should really be part of DynASM. |
141 | |.macro srwi, rx, ry, n; rlwinm rx, ry, 32-n, n, 31; .endmacro | 141 | |.macro srwi, rx, ry, n; rlwinm rx, ry, 32-n, n, 31; .endmacro |
142 | |.macro slwi, rx, ry, n; rlwinm rx, ry, n, 0, 31-n; .endmacro | 142 | |.macro slwi, rx, ry, n; rlwinm rx, ry, n, 0, 31-n; .endmacro |
143 | |.macro rotlwi, rx, ry, n; rlwinm rx, ry, n, 0, 31; .endmacro | ||
144 | |.macro rotlw, rx, ry, rn; rlwnm rx, ry, rn, 0, 31; .endmacro | ||
143 | |.macro subi, rx, ry, i; addi rx, ry, -i; .endmacro | 145 | |.macro subi, rx, ry, i; addi rx, ry, -i; .endmacro |
144 | | | 146 | | |
145 | |// Trap for not-yet-implemented parts. | 147 | |// Trap for not-yet-implemented parts. |
@@ -1103,45 +1105,66 @@ static void build_subroutines(BuildCtx *ctx) | |||
1103 | | | 1105 | | |
1104 | |//-- Bit library -------------------------------------------------------- | 1106 | |//-- Bit library -------------------------------------------------------- |
1105 | | | 1107 | | |
1106 | |.ffunc_n bit_tobit | ||
1107 | | NYI | ||
1108 | | | ||
1109 | |.macro .ffunc_bit, name | 1108 | |.macro .ffunc_bit, name |
1110 | | .ffunc_n name | 1109 | | .ffunc_n bit_..name |
1111 | | NYI | 1110 | | efdadd CARG1, CARG1, TOBIT |
1112 | |.endmacro | 1111 | |.endmacro |
1113 | | | 1112 | | |
1113 | |.ffunc_bit tobit | ||
1114 | |->fff_resbit: | ||
1115 | | efdcfsi CRET1, CARG1 | ||
1116 | | b ->fff_restv | ||
1117 | | | ||
1114 | |.macro .ffunc_bit_op, name, ins | 1118 | |.macro .ffunc_bit_op, name, ins |
1115 | | .ffunc_bit name | 1119 | | .ffunc_bit name |
1116 | | NYI | 1120 | | li TMP1, 8 |
1121 | |1: | ||
1122 | | evlddx CARG2, BASE, TMP1 | ||
1123 | | cmplw cr1, TMP1, NARGS8:RC | ||
1124 | | checknum CARG2 | ||
1125 | | bge cr1, ->fff_resbit | ||
1126 | | checkfail ->fff_fallback | ||
1127 | | efdadd CARG2, CARG2, TOBIT | ||
1128 | | ins CARG1, CARG1, CARG2 | ||
1129 | | addi TMP1, TMP1, 8 | ||
1130 | | b <1 | ||
1117 | |.endmacro | 1131 | |.endmacro |
1118 | | | 1132 | | |
1119 | |.ffunc_bit_op bit_band, and | 1133 | |.ffunc_bit_op band, and |
1120 | |.ffunc_bit_op bit_bor, or | 1134 | |.ffunc_bit_op bor, or |
1121 | |.ffunc_bit_op bit_bxor, xor | 1135 | |.ffunc_bit_op bxor, xor |
1122 | | | 1136 | | |
1123 | |.ffunc_bit bit_bswap | 1137 | |.ffunc_bit bswap |
1124 | | NYI | 1138 | | rotlwi TMP0, CARG1, 8 |
1125 | | | 1139 | | rlwimi TMP0, CARG1, 24, 0, 7 |
1126 | |.ffunc_bit bit_bnot | 1140 | | rlwimi TMP0, CARG1, 24, 16, 23 |
1127 | | NYI | 1141 | | efdcfsi CRET1, TMP0 |
1128 | | | 1142 | | b ->fff_restv |
1129 | |->fff_resbit: | 1143 | | |
1130 | | NYI | 1144 | |.ffunc_bit bnot |
1131 | | | 1145 | | not TMP0, CARG1 |
1132 | |->fff_fallback_bit_op: | 1146 | | efdcfsi CRET1, TMP0 |
1133 | | NYI | 1147 | | b ->fff_restv |
1134 | | | 1148 | | |
1135 | |.macro .ffunc_bit_sh, name, ins | 1149 | |.macro .ffunc_bit_sh, name, ins, shmod |
1136 | | .ffunc_nn name | 1150 | | .ffunc_nn bit_..name |
1137 | | NYI | 1151 | | efdadd CARG2, CARG2, TOBIT |
1152 | | efdadd CARG1, CARG1, TOBIT | ||
1153 | |.if shmod == 1 | ||
1154 | | rlwinm CARG2, CARG2, 0, 27, 31 | ||
1155 | |.elif shmod == 2 | ||
1156 | | neg CARG2, CARG2 | ||
1157 | |.endif | ||
1158 | | ins TMP0, CARG1, CARG2 | ||
1159 | | efdcfsi CRET1, TMP0 | ||
1160 | | b ->fff_restv | ||
1138 | |.endmacro | 1161 | |.endmacro |
1139 | | | 1162 | | |
1140 | |.ffunc_bit_sh bit_lshift, shl | 1163 | |.ffunc_bit_sh lshift, slw, 1 |
1141 | |.ffunc_bit_sh bit_rshift, shr | 1164 | |.ffunc_bit_sh rshift, srw, 1 |
1142 | |.ffunc_bit_sh bit_arshift, sar | 1165 | |.ffunc_bit_sh arshift, sraw, 1 |
1143 | |.ffunc_bit_sh bit_rol, rol | 1166 | |.ffunc_bit_sh rol, rotlw, 0 |
1144 | |.ffunc_bit_sh bit_ror, ror | 1167 | |.ffunc_bit_sh ror, rotlw, 2 |
1145 | | | 1168 | | |
1146 | |//----------------------------------------------------------------------- | 1169 | |//----------------------------------------------------------------------- |
1147 | | | 1170 | | |