### 3.3.3. Flexible second operand

Many general data processing instructions have a flexible second operand. This is shown as `Operand2` in the descriptions of the syntax of each instruction.

`Operand2` can be a:

#### Constant

You specify an Operand2 constant in the form:

```#`constant`
```

where `constant` can be:

• Any constant that can be produced by shifting an 8‑bit value left by any number of bits within a 32‑bit word.

• Any constant of the form `0x00XY00XY`.

• Any constant of the form `0xXY00XY00`.

• Any constant of the form `0xXYXYXYXY`.

### Note

In these constants, `X` and `Y` are hexadecimal digits.

In addition, in a small number of instructions, `constant` can take a wider range of values. These are described in the individual instruction descriptions.

When an Operand2 constant is used with the instructions `MOVS`, `MVNS`, `ANDS`, `ORRS`, `ORNS`, `EORS`, `BICS`, `TEQ` or `TST`, the carry flag is updated to bit[31] of the constant, if the constant is greater than 255 and can be produced by shifting an 8-bit value. These instructions do not affect the carry flag if Operand2 is any other constant.

##### Instruction substitution

Your assembler might be able to produce an equivalent instruction in cases where you specify a constant that is not permitted. For example, an assembler might assemble the instruction `CMP` `Rd`, `#0xFFFFFFFE` as the equivalent instruction `CMN` `Rd`, `#0x2`.

#### Register with optional shift

You specify an Operand2 register in the form:

````Rm` {, `shift`}
```

Where:

`Rm`

Is the register holding the data for the second operand.

`shift`

Is an optional shift to be applied to `Rm`. It can be one of:

```ASR #n```

Arithmetic shift right `n` bits, 1 ≤ `n` ≤ 32.

`LSL #n`

Logical shift left `n` bits, 1 ≤ `n` ≤ 31.

`LSR #n`

Logical shift right `n` bits, 1 ≤ `n` ≤ 32.

`ROR #n`

Rotate right `n` bits, 1 ≤ `n` ≤ 31.

`RRX`

Rotate right one bit, with extend.

`-`

If omitted, no shift occurs, equivalent to `LSL #0`.

If you omit the shift, or specify `LSL #0`, the instruction uses the value in `Rm`.

If you specify a shift, the shift is applied to the value in `Rm`, and the resulting 32-bit value is used by the instruction. However, the contents in the register `Rm` remain unchanged. Specifying a register with shift also updates the carry flag when used with certain instructions. For information on the shift operations and how they affect the carry flag, see Shift Operations.

 Copyright © 2015, 2018 Arm. All rights reserved. ARM DUI 0646C Non-Confidential ID121118 PDF version