| Index: src/arm/assembler-arm.cc
|
| ===================================================================
|
| --- src/arm/assembler-arm.cc (revision 4740)
|
| +++ src/arm/assembler-arm.cc (working copy)
|
| @@ -903,20 +903,6 @@
|
|
|
| // Data-processing instructions.
|
|
|
| -// UBFX <Rd>,<Rn>,#<lsb>,#<width - 1>
|
| -// Instruction details available in ARM DDI 0406A, A8-464.
|
| -// cond(31-28) | 01111(27-23)| 1(22) | 1(21) | widthm1(20-16) |
|
| -// Rd(15-12) | lsb(11-7) | 101(6-4) | Rn(3-0)
|
| -void Assembler::ubfx(Register dst, Register src1, const Operand& src2,
|
| - const Operand& src3, Condition cond) {
|
| - ASSERT(!src2.rm_.is_valid() && !src3.rm_.is_valid());
|
| - ASSERT(static_cast<uint32_t>(src2.imm32_) <= 0x1f);
|
| - ASSERT(static_cast<uint32_t>(src3.imm32_) <= 0x1f);
|
| - emit(cond | 0x3F*B21 | src3.imm32_*B16 |
|
| - dst.code()*B12 | src2.imm32_*B7 | 0x5*B4 | src1.code());
|
| -}
|
| -
|
| -
|
| void Assembler::and_(Register dst, Register src1, const Operand& src2,
|
| SBit s, Condition cond) {
|
| addrmod1(cond | 0*B21 | s, src1, dst, src2);
|
| @@ -1106,6 +1092,82 @@
|
| }
|
|
|
|
|
| +// Bitfield manipulation instructions.
|
| +
|
| +// Unsigned bit field extract.
|
| +// Extracts #width adjacent bits from position #lsb in a register, and
|
| +// writes them to the low bits of a destination register.
|
| +// ubfx dst, src, #lsb, #width
|
| +void Assembler::ubfx(Register dst,
|
| + Register src,
|
| + int lsb,
|
| + int width,
|
| + Condition cond) {
|
| + // v7 and above.
|
| + ASSERT(CpuFeatures::IsSupported(ARMv7));
|
| + ASSERT(!dst.is(pc) && !src.is(pc));
|
| + ASSERT((lsb >= 0) && (lsb <= 31));
|
| + ASSERT((width >= 1) && (width <= (32 - lsb)));
|
| + emit(cond | 0xf*B23 | B22 | B21 | (width - 1)*B16 | dst.code()*B12 |
|
| + lsb*B7 | B6 | B4 | src.code());
|
| +}
|
| +
|
| +
|
| +// Signed bit field extract.
|
| +// Extracts #width adjacent bits from position #lsb in a register, and
|
| +// writes them to the low bits of a destination register. The extracted
|
| +// value is sign extended to fill the destination register.
|
| +// sbfx dst, src, #lsb, #width
|
| +void Assembler::sbfx(Register dst,
|
| + Register src,
|
| + int lsb,
|
| + int width,
|
| + Condition cond) {
|
| + // v7 and above.
|
| + ASSERT(CpuFeatures::IsSupported(ARMv7));
|
| + ASSERT(!dst.is(pc) && !src.is(pc));
|
| + ASSERT((lsb >= 0) && (lsb <= 31));
|
| + ASSERT((width >= 1) && (width <= (32 - lsb)));
|
| + emit(cond | 0xf*B23 | B21 | (width - 1)*B16 | dst.code()*B12 |
|
| + lsb*B7 | B6 | B4 | src.code());
|
| +}
|
| +
|
| +
|
| +// Bit field clear.
|
| +// Sets #width adjacent bits at position #lsb in the destination register
|
| +// to zero, preserving the value of the other bits.
|
| +// bfc dst, #lsb, #width
|
| +void Assembler::bfc(Register dst, int lsb, int width, Condition cond) {
|
| + // v7 and above.
|
| + ASSERT(CpuFeatures::IsSupported(ARMv7));
|
| + ASSERT(!dst.is(pc));
|
| + ASSERT((lsb >= 0) && (lsb <= 31));
|
| + ASSERT((width >= 1) && (width <= (32 - lsb)));
|
| + int msb = lsb + width - 1;
|
| + emit(cond | 0x1f*B22 | msb*B16 | dst.code()*B12 | lsb*B7 | B4 | 0xf);
|
| +}
|
| +
|
| +
|
| +// Bit field insert.
|
| +// Inserts #width adjacent bits from the low bits of the source register
|
| +// into position #lsb of the destination register.
|
| +// bfi dst, src, #lsb, #width
|
| +void Assembler::bfi(Register dst,
|
| + Register src,
|
| + int lsb,
|
| + int width,
|
| + Condition cond) {
|
| + // v7 and above.
|
| + ASSERT(CpuFeatures::IsSupported(ARMv7));
|
| + ASSERT(!dst.is(pc) && !src.is(pc));
|
| + ASSERT((lsb >= 0) && (lsb <= 31));
|
| + ASSERT((width >= 1) && (width <= (32 - lsb)));
|
| + int msb = lsb + width - 1;
|
| + emit(cond | 0x1f*B22 | msb*B16 | dst.code()*B12 | lsb*B7 | B4 |
|
| + src.code());
|
| +}
|
| +
|
| +
|
| // Status register access instructions.
|
| void Assembler::mrs(Register dst, SRegister s, Condition cond) {
|
| ASSERT(!dst.is(pc));
|
|
|