OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <limits.h> // For LONG_MIN, LONG_MAX. | 5 #include <limits.h> // For LONG_MIN, LONG_MAX. |
6 | 6 |
7 #if V8_TARGET_ARCH_MIPS | 7 #if V8_TARGET_ARCH_MIPS |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/base/division-by-constant.h" | 10 #include "src/base/division-by-constant.h" |
(...skipping 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 BranchLong(L, PROTECT); | 1204 BranchLong(L, PROTECT); |
1205 bind(&skip); | 1205 bind(&skip); |
1206 } else { | 1206 } else { |
1207 bnvc(rs, rt, L); | 1207 bnvc(rs, rt, L); |
1208 } | 1208 } |
1209 } | 1209 } |
1210 | 1210 |
1211 // ------------Pseudo-instructions------------- | 1211 // ------------Pseudo-instructions------------- |
1212 | 1212 |
1213 // Word Swap Byte | 1213 // Word Swap Byte |
1214 void MacroAssembler::ByteSwapSigned(Register reg, int operand_size) { | 1214 void MacroAssembler::ByteSwapSigned(Register dest, Register src, |
| 1215 int operand_size) { |
1215 DCHECK(operand_size == 1 || operand_size == 2 || operand_size == 4); | 1216 DCHECK(operand_size == 1 || operand_size == 2 || operand_size == 4); |
1216 if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { | 1217 if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { |
1217 if (operand_size == 2) { | 1218 if (operand_size == 2) { |
1218 seh(reg, reg); | 1219 seh(src, src); |
1219 } else if (operand_size == 1) { | 1220 } else if (operand_size == 1) { |
1220 seb(reg, reg); | 1221 seb(src, src); |
1221 } | 1222 } |
1222 // No need to do any preparation if operand_size is 4 | 1223 // No need to do any preparation if operand_size is 4 |
1223 | 1224 |
1224 wsbh(reg, reg); | 1225 wsbh(dest, src); |
1225 rotr(reg, reg, 16); | 1226 rotr(dest, dest, 16); |
1226 } else if (IsMipsArchVariant(kMips32r1) || IsMipsArchVariant(kLoongson)) { | 1227 } else if (IsMipsArchVariant(kMips32r1) || IsMipsArchVariant(kLoongson)) { |
1227 if (operand_size == 1) { | 1228 if (operand_size == 1) { |
1228 sll(reg, reg, 24); | 1229 sll(src, src, 24); |
1229 sra(reg, reg, 24); | 1230 sra(src, src, 24); |
1230 } else if (operand_size == 2) { | 1231 } else if (operand_size == 2) { |
1231 sll(reg, reg, 16); | 1232 sll(src, src, 16); |
1232 sra(reg, reg, 16); | 1233 sra(src, src, 16); |
1233 } | 1234 } |
1234 // No need to do any preparation if operand_size is 4 | 1235 // No need to do any preparation if operand_size is 4 |
1235 | 1236 |
1236 Register tmp = t0; | 1237 Register tmp = t0; |
1237 Register tmp2 = t1; | 1238 Register tmp2 = t1; |
1238 | 1239 |
1239 andi(tmp2, reg, 0xFF); | 1240 andi(tmp2, src, 0xFF); |
1240 sll(tmp2, tmp2, 24); | 1241 sll(tmp2, tmp2, 24); |
1241 or_(tmp, zero_reg, tmp2); | 1242 or_(tmp, zero_reg, tmp2); |
1242 | 1243 |
1243 andi(tmp2, reg, 0xFF00); | 1244 andi(tmp2, src, 0xFF00); |
1244 sll(tmp2, tmp2, 8); | 1245 sll(tmp2, tmp2, 8); |
1245 or_(tmp, tmp, tmp2); | 1246 or_(tmp, tmp, tmp2); |
1246 | 1247 |
1247 srl(reg, reg, 8); | 1248 srl(src, src, 8); |
1248 andi(tmp2, reg, 0xFF00); | 1249 andi(tmp2, src, 0xFF00); |
1249 or_(tmp, tmp, tmp2); | 1250 or_(tmp, tmp, tmp2); |
1250 | 1251 |
1251 srl(reg, reg, 16); | 1252 srl(src, src, 16); |
1252 andi(tmp2, reg, 0xFF); | 1253 andi(tmp2, src, 0xFF); |
1253 or_(tmp, tmp, tmp2); | 1254 or_(tmp, tmp, tmp2); |
1254 | 1255 |
1255 or_(reg, tmp, zero_reg); | 1256 or_(dest, tmp, zero_reg); |
1256 } | 1257 } |
1257 } | 1258 } |
1258 | 1259 |
1259 void MacroAssembler::ByteSwapUnsigned(Register reg, int operand_size) { | 1260 void MacroAssembler::ByteSwapUnsigned(Register dest, Register src, |
| 1261 int operand_size) { |
1260 DCHECK(operand_size == 1 || operand_size == 2); | 1262 DCHECK(operand_size == 1 || operand_size == 2); |
1261 | 1263 |
1262 if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { | 1264 if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { |
1263 if (operand_size == 1) { | 1265 if (operand_size == 1) { |
1264 andi(reg, reg, 0xFF); | 1266 andi(src, src, 0xFF); |
1265 } else { | 1267 } else { |
1266 andi(reg, reg, 0xFFFF); | 1268 andi(src, src, 0xFFFF); |
1267 } | 1269 } |
1268 // No need to do any preparation if operand_size is 4 | 1270 // No need to do any preparation if operand_size is 4 |
1269 | 1271 |
1270 wsbh(reg, reg); | 1272 wsbh(dest, src); |
1271 rotr(reg, reg, 16); | 1273 rotr(dest, dest, 16); |
1272 } else if (IsMipsArchVariant(kMips32r1) || IsMipsArchVariant(kLoongson)) { | 1274 } else if (IsMipsArchVariant(kMips32r1) || IsMipsArchVariant(kLoongson)) { |
1273 if (operand_size == 1) { | 1275 if (operand_size == 1) { |
1274 sll(reg, reg, 24); | 1276 sll(src, src, 24); |
1275 } else { | 1277 } else { |
1276 Register tmp = t0; | 1278 Register tmp = t0; |
1277 | 1279 |
1278 andi(tmp, reg, 0xFF00); | 1280 andi(tmp, src, 0xFF00); |
1279 sll(reg, reg, 24); | 1281 sll(src, src, 24); |
1280 sll(tmp, tmp, 8); | 1282 sll(tmp, tmp, 8); |
1281 or_(reg, tmp, reg); | 1283 or_(dest, tmp, src); |
1282 } | 1284 } |
1283 } | 1285 } |
1284 } | 1286 } |
1285 | 1287 |
1286 void MacroAssembler::Ulw(Register rd, const MemOperand& rs) { | 1288 void MacroAssembler::Ulw(Register rd, const MemOperand& rs) { |
1287 DCHECK(!rd.is(at)); | 1289 DCHECK(!rd.is(at)); |
1288 DCHECK(!rs.rm().is(at)); | 1290 DCHECK(!rs.rm().is(at)); |
1289 if (IsMipsArchVariant(kMips32r6)) { | 1291 if (IsMipsArchVariant(kMips32r6)) { |
1290 lw(rd, rs); | 1292 lw(rd, rs); |
1291 } else { | 1293 } else { |
(...skipping 5637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6929 if (mag.shift > 0) sra(result, result, mag.shift); | 6931 if (mag.shift > 0) sra(result, result, mag.shift); |
6930 srl(at, dividend, 31); | 6932 srl(at, dividend, 31); |
6931 Addu(result, result, Operand(at)); | 6933 Addu(result, result, Operand(at)); |
6932 } | 6934 } |
6933 | 6935 |
6934 | 6936 |
6935 } // namespace internal | 6937 } // namespace internal |
6936 } // namespace v8 | 6938 } // namespace v8 |
6937 | 6939 |
6938 #endif // V8_TARGET_ARCH_MIPS | 6940 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |