+++ /dev/null
-<!-- This defines instructions described in PowerISA Version 3.0 B Book 1 -->
-
-<!-- Section 3.3.13 Fixed-Point Logical Instructions page 92 - 100 -->
-
-<!-- The Logical instructions perform bit-parallel operations on 64-bit operands. -->
-
-<!-- The X-form Logical instructions with Rc=1, and the D-form Logical instructions -->
-<!-- andi. and andis., set the first three bits of CR Field 0 as described in -->
-<!-- Section 3.3.8, “Other Fixed-Point Instructions” on page 66. The Logical -->
-<!-- instructions do not change the SO, OV, OV32, CA, and CA32 bits in the XER. -->
-
-
-# AND Immediate
-
-D-Form
-
-* andi. RA,RS,UI
-
-Pseudo-code:
-
- RA <- (RS) & XLCASTU(UI)
-
-Special Registers Altered:
-
- CR0
-
-# OR Immediate
-
-D-Form
-
-* ori RA,RS,UI
-
-Pseudo-code:
-
- RA <- (RS) | XLCASTU(UI)
-
-Special Registers Altered:
-
- None
-
-# AND Immediate Shifted
-
-D-Form
-
-* andis. RA,RS,UI
-
-Pseudo-code:
-
- RA <- (RS) & XLCASTU(UI || [0]*16)
-
-Special Registers Altered:
-
- CR0
-
-# OR Immediate Shifted
-
-D-Form
-
-* oris RA,RS,UI
-
-Pseudo-code:
-
- RA <- (RS) | XLCASTU(UI || [0]*16)
-
-Special Registers Altered:
-
- None
-
-# XOR Immediate Shifted
-
-D-Form
-
-* xoris RA,RS,UI
-
-Pseudo-code:
-
- RA <- (RS) ^ XLCASTU(UI || [0]*16)
-
-Special Registers Altered:
-
- None
-
-# XOR Immediate
-
-D-Form
-
-* xori RA,RS,UI
-
-Pseudo-code:
-
- RA <- (RS) ^ XLCASTU(UI)
-
-Special Registers Altered:
-
- None
-
-# AND
-
-X-Form
-
-* and RA,RS,RB (Rc=0)
-* and. RA,RS,RB (Rc=1)
-
-Pseudo-code:
-
- RA <- (RS) & (RB)
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# OR
-
-X-Form
-
-* or RA,RS,RB (Rc=0)
-* or. RA,RS,RB (Rc=1)
-
-Pseudo-code:
-
- RA <- (RS) | (RB)
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# XOR
-
-X-Form
-
-* xor RA,RS,RB (Rc=0)
-* xor. RA,RS,RB (Rc=1)
-
-Pseudo-code:
-
- RA <- (RS) ^ (RB)
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# NAND
-
-X-Form
-
-* nand RA,RS,RB (Rc=0)
-* nand. RA,RS,RB (Rc=1)
-
-Pseudo-code:
-
- RA <- ¬((RS) & (RB))
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# NOR
-
-X-Form
-
-* nor RA,RS,RB (Rc=0)
-* nor. RA,RS,RB (Rc=1)
-
-Pseudo-code:
-
- RA <- ¬((RS) | (RB))
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# Equivalent
-
-X-Form
-
-* eqv RA,RS,RB (Rc=0)
-* eqv. RA,RS,RB (Rc=1)
-
-Pseudo-code:
-
- RA <- ¬((RS) ^ (RB))
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# AND with Complement
-
-X-Form
-
-* andc RA,RS,RB (Rc=0)
-* andc. RA,RS,RB (Rc=1)
-
-Pseudo-code:
-
- RA <- (RS) & ¬(RB)
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# OR with Complement
-
-X-Form
-
-* orc RA,RS,RB (Rc=0)
-* orc. RA,RS,RB (Rc=1)
-
-Pseudo-code:
-
- RA <- (RS) | ¬(RB)
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# Extend Sign Byte
-
-X-Form
-
-* extsb RA,RS (Rc=0)
-* extsb. RA,RS (Rc=1)
-
-Pseudo-code:
-
- RA <- EXTSXL(RS, 8)
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# Extend Sign Halfword
-
-X-Form
-
-* extsh RA,RS (Rc=0)
-* extsh. RA,RS (Rc=1)
-
-Pseudo-code:
-
- RA <- EXTSXL(RS, 16)
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# Count Leading Zeros Word
-
-X-Form
-
-* cntlzw RA,RS (Rc=0)
-* cntlzw. RA,RS (Rc=1)
-
-Pseudo-code:
-
- n <- (XLEN/2)
- do while n < XLEN
- if (RS)[n] = 1 then
- leave
- n <- n + 1
- RA <- n - (XLEN/2)
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# Count Trailing Zeros Word
-
-X-Form
-
-* cnttzw RA,RS (Rc=0)
-* cnttzw. RA,RS (Rc=1)
-
-Pseudo-code:
-
- n <- 0
- do while n < 32
- if (RS)[63-n] = 0b1 then
- leave
- n <- n + 1
- RA <- EXTZ64(n)
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# Compare Bytes
-
-X-Form
-
-* cmpb RA,RS,RB
-
-Pseudo-code:
-
- do n = 0 to ((XLEN/8)-1)
- if RS[8*n:8* n+7] = (RB)[8*n:8*n+7] then
- RA[8*n:8* n+7] <- [1]*8
- else
- RA[8*n:8* n+7] <- [0]*8
-
-Special Registers Altered:
-
- None
-
-# Population Count Bytes
-
-X-Form
-
-* popcntb RA,RS
-
-Pseudo-code:
-
- do i = 0 to ((XLEN/8)-1)
- n <- 0
- do j = 0 to 7
- if (RS)[(i*8)+j] = 1 then
- n <- n+1
- RA[(i*8):(i*8)+7] <- n
-
-Special Registers Altered:
-
- None
-
-# Population Count Words
-
-X-Form
-
-* popcntw RA,RS
-
-Pseudo-code:
-
- e <- (XLEN/2)-1
- do i = 0 to 1
- s <- i*XLEN/2
- n <- 0
- do j = 0 to e
- if (RS)[s+j] = 1 then
- n <- n+1
- RA[s:s+e] <- n
-
-Special Registers Altered:
-
- None
-
-# Parity Doubleword
-
-X-Form
-
-* prtyd RA,RS
-
-Pseudo-code:
-
- s <- 0
- do i = 0 to ((XLEN/8)-1)
- s <- s ^ (RS)[i*8+7]
- RA <- [0] * (XLEN-1) || s
-
-Special Registers Altered:
-
- None
-
-# Parity Word
-
-X-Form
-
-* prtyw RA,RS
-
-Pseudo-code:
-
- s <- 0
- t <- 0
- do i = 0 to ((XLEN/8/2)-1)
- s <- s ^ (RS)[i*8+7]
- do i = 4 to ((XLEN/8)-1)
- t <- t ^ (RS)[i*8+7]
- RA[0:(XLEN/2)-1] <- [0]*((XLEN/2)-1) || s
- RA[XLEN/2:XLEN-1] <- [0]*((XLEN/2)-1) || t
-
-Special Registers Altered:
-
- None
-
-# Extend Sign Word
-
-X-Form
-
-* extsw RA,RS (Rc=0)
-* extsw. RA,RS (Rc=1)
-
-Pseudo-code:
-
- RA <- EXTSXL(RS, 32)
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# Population Count Doubleword
-
-X-Form
-
-* popcntd RA,RS
-
-Pseudo-code:
-
- n <- 0
- do i = 0 to (XLEN-1)
- if (RS)[i] = 1 then
- n <- n+1
- RA <- n
-
-Special Registers Altered:
-
- None
-
-# Count Leading Zeros Doubleword
-
-X-Form
-
-* cntlzd RA,RS (Rc=0)
-* cntlzd. RA,RS (Rc=1)
-
-Pseudo-code:
-
- n <- 0
- do while n < XLEN
- if (RS)[n] = 1 then
- leave
- n <- n + 1
- RA <- n
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# Count Trailing Zeros Doubleword
-
-X-Form
-
-* cnttzd RA,RS (Rc=0)
-* cnttzd. RA,RS (Rc=1)
-
-Pseudo-code:
-
- n <- 0
- do while n < XLEN
- if (RS)[XLEN-1-n] = 0b1 then
- leave
- n <- n + 1
- RA <- EXTZ64(n)
-
-Special Registers Altered:
-
- CR0 (if Rc=1)
-
-# Bit Permute Doubleword
-
-X-Form
-
-* bpermd RA,RS,RB
-
-Pseudo-code:
-
- perm <- [0] * 8
- for i = 0 to ((XLEN/8)-1)
- index <- (RS)[8*i:8*i+7]
- if index <u XLEN then
- perm[i] <- (RB)[index]
- else
- perm[i] <- 0
- RA <- [0]*(XLEN-8) || perm[0:7]
-
-Special Registers Altered:
-
- None
-
-<!-- Checked March 2021 -->