Table 6.8
Instructions for signed extend and zero extend of data values
Conversion operation | Instruction |
Converting an 8-bit signed data to 32-bit or 16-bit signed data | SXTB (signed extend byte) |
Converting an 16-bit signed data to 32-bit signed data | SXTH (signed extend half word) |
Converting an 8-bit unsigned data to 32-bit or 16-bit data | UXTB (zero extend byte) |
Converting an 16-bit unsigned data to 32-bit data | UXTH (zero extend half word) |
Table 6.9
Memory read instructions with signed extend and zero extend of data values
Conversion operation | Instruction |
Read an 8-bit signed data from memory and convert it to a 16-bit or 32-bit signed value | LDRSB |
Read an 16-bit signed data from memory and convert it to a 32-bit signed value | LDRSH |
Read an 8-bit unsigned data from memory and convert it to a 16-bit or 32-bit value | LDRB |
Read an 16-bit unsigned data from memory and convert it to a 32-bit value | LDRH |
Table 6.10
Instructions for conversions between big endian and little endian data
Conversion operation | Instruction |
Convert a little endian 32-bit value to big endian, or vice versa | REV |
Convert a little endian 16-bit unsigned value to big endian, or vice versa | REV16 |
Convert a little endian 16-bit signed value to big endian, or vice versa | REVSH |
LDR r0, =0xFFFFFFFF ; X_Low ( X = 0x3333FFFFFFFFFFFF)
LDR r1, =0x3333FFFF ; X_High
LDR r2, =0x00000001 ; Y_Low ( Y = 0x3333000000000001)
LDR r3, =0x33330000 ; Y_High
ADDS r0, r0, r2 ; lower 32-bit
ADCS r1, r1, r3 ; upper 32-bit
LDR r0, =0x00000001 ; X_Low( X = 0x0000000100000001)
LDR r1, =0x00000001 ; X_High
LDR r2, =0x00000003 ; Y_Low( Y = 0x0000000000000003)
LDR r3, =0x00000000 ; Y_High
SUBS r0, r0, r2 ; lower 32-bit
SBCS r1, r1, r3 ; upper 32-bit
simple_divide
; Inputs
; R0 = dividend
; R1 = divider
; Outputs
; R0 = quotient
; R1 = remainder
PUSH {R2-R4} ; Save registers to stack
MOV R2, R0 ; Save dividend to R2 as R0 will be changed
MOVS R3, #0x1 ; loop control
LSLS R3, R3, #31 ; N = 0x80000000
MOVS R0, #0 ; initial Quotient
MOVS R4, #0 ; initial Tmp
simple_divide_loop
LSLS R2, R2, #1 ; Shift dividend left by 1 bit, MSB go into carry
ADCS R4, R4, R4 ; Shift Tmp left by 1 bit, carry move into LSB
CMP R4, R1
BCC simple_divide_lessthan
ADDS R0, R0, R3 ; Increment quotient
SUBS R4, R4, R1
simple_divide_lessthan
LSRS R3, R3, #1 ; N = N >> 1
BNE simple_divide_loop
MOV R1, R4 ; Put remainder in R1, Quotient is already in R0
POP {R2-R4}; Restore used register
BX LR ; Return
simple_sqrt
; Input : R0
; Output : R0 (square root result)
PUSH {R1-R3} ; Save registers to stack
MOVS R1, #0x1 ; Set loop control register
LSLS R1, R1, #15 ; R1 = 0x00008000
MOVS R2, #0 ; Initialize result
simple_sqrt_loop
ADDS R2, R2, R1 ; M = (M + N)
MOVS R3, R2 ; Copy (M + N) to R3
MULS R3, R3, R3 ; R3 = (M + N) ˆ 2
CMP R3, R0
BLS simple_sqrt_lessequal
SUBS R2, R2, R1 ; M = (M - N)
simple_sqrt_lessequal
LSRS R1, R1, #1 ; N = N >> 1
BNE simple_sqrt_loop
MOV R0, R2 ; Copy to R0 and return
POP {R1-R3} ;
BX LR ; Return
LSRS R0, R0, #<n+1> ; Shift bit “n” into carry flag in APSR
BCS <label> ; branch if carry is set
LSLS R0, R0, #27 ; Remove un-needed top bits
LSRS R0, R0, #31 ; Move required bit into bit 0
LSLS R0, R0, #(32-W-P) ; Remove un-needed top bits
LSRS R0, R0, #(32-W) ; Align required bits to bit 0
LSLS R0, R0, #(32-8-4) ; Remove un-needed top bits
LSRS R0, R0, #(32-8) ; Align required bits to bit 0
RORS R0, R0, #4 ; Shift unneeded bit to bit 0
LSRS R0, R0, #8 ; Align required bits to bit 0
RORS R0, R0, #(32-8-4) ; store value to original position
LDR R1, =Bit_Mask ; Bit to clear
BICS R0, R0, R1 ; Clear bits that are not required
18.224.59.231