From: Jacob Lifshay Date: Mon, 7 Aug 2023 23:04:00 +0000 (-0700) Subject: split out instructions from openpower/isa/prefix_codes.mdwn X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3d68a361cc10073249a4c84e3c9a125aa2f90d4e;p=openpower-isa.git split out instructions from openpower/isa/prefix_codes.mdwn --- diff --git a/openpower/isa/prefix_codes.mdwn b/openpower/isa/prefix_codes.mdwn index 8d641543..0317fd90 100644 --- a/openpower/isa/prefix_codes.mdwn +++ b/openpower/isa/prefix_codes.mdwn @@ -1,83 +1,3 @@ -# [DRAFT] Prefix-code decode - -VA-Form - -* pcdec. RT,RA,RB,RC - -Pseudo-code: - - tree[0:63] <- (RB) - mode <- tree[62:63] - tree[62:63] <- 0 - ra_used <- 0b0 - in_bits[0:63] <- (RC|0) - if in_bits = 0 then - in_bits[0:63] <- 1 - orig_in_bits <- in_bits - tree_index <- 1 - found <- 0b0 - hit_end <- 0b0 - do bit_length = 1 to 6 - in_bit <- in_bits[63] - if in_bits = 1 then - if ra_used | (_RA = 0) then - hit_end <- 0b1 - leave - ra_used <- 0b1 - in_bit <- (RA)[63] - in_bits <- 0b1 || (RA)[0:62] - else - in_bits <- 0b0 || in_bits[0:62] - # walk the binary tree in `tree` from parent to the selected child - tree_index <- tree_index * 2 - if in_bit = 1 then - tree_index <- tree_index + 1 - if tree_index < 64 then - if tree[63 - tree_index] then - found <- 0b1 - leave - compressed_index <- 0 - do i = 0 to 127 - possible <- 1 - j <- i - do while j >= 4 - j <- j / 2 - if tree[63 - j] then - possible <- 0 - leave - if i = tree_index then - leave - else if i >= 64 then - compressed_index <- compressed_index + possible - else if tree[63 - i] = 1 then - compressed_index <- compressed_index + possible - switch(mode) - case(0): - RT[0:63] <- tree_index - if ¬found then - in_bits <- orig_in_bits - ra_used <- 0b0 - case(1): - RT[0:63] <- tree_index - if hit_end then - in_bits <- orig_in_bits - ra_used <- 0b0 - case(2): - RT[0:63] <- compressed_index - if ¬found then - in_bits <- orig_in_bits - ra_used <- 0b0 - RT[0:63] <- tree_index - default: - RT[0:63] <- compressed_index - if hit_end then - in_bits <- orig_in_bits - ra_used <- 0b0 - RS <- in_bits - CR0 <- ra_used || (tree_index >= 64) || found || hit_end - -Special Registers Altered: - - CR0 +[[!inline pagenames="openpower/isa/prefix_codes/pcdec." raw="yes"]] diff --git a/openpower/isa/prefix_codes/pcdec..mdwn b/openpower/isa/prefix_codes/pcdec..mdwn new file mode 100644 index 00000000..922de2a9 --- /dev/null +++ b/openpower/isa/prefix_codes/pcdec..mdwn @@ -0,0 +1,13 @@ +# [DRAFT] Prefix-code decode + +VA-Form + +* pcdec. RT,RA,RB,RC + +Pseudo-code: + +[[!inline pagenames="openpower/isa/prefix_codes/pcdec._code" raw="yes"]] + +Special Registers Altered: + + CR0 diff --git a/openpower/isa/prefix_codes/pcdec._code.mdwn b/openpower/isa/prefix_codes/pcdec._code.mdwn new file mode 100644 index 00000000..cd3ddc3a --- /dev/null +++ b/openpower/isa/prefix_codes/pcdec._code.mdwn @@ -0,0 +1,69 @@ + tree[0:63] <- (RB) + mode <- tree[62:63] + tree[62:63] <- 0 + ra_used <- 0b0 + in_bits[0:63] <- (RC|0) + if in_bits = 0 then + in_bits[0:63] <- 1 + orig_in_bits <- in_bits + tree_index <- 1 + found <- 0b0 + hit_end <- 0b0 + do bit_length = 1 to 6 + in_bit <- in_bits[63] + if in_bits = 1 then + if ra_used | (_RA = 0) then + hit_end <- 0b1 + leave + ra_used <- 0b1 + in_bit <- (RA)[63] + in_bits <- 0b1 || (RA)[0:62] + else + in_bits <- 0b0 || in_bits[0:62] + # walk the binary tree in `tree` from parent to the selected child + tree_index <- tree_index * 2 + if in_bit = 1 then + tree_index <- tree_index + 1 + if tree_index < 64 then + if tree[63 - tree_index] then + found <- 0b1 + leave + compressed_index <- 0 + do i = 0 to 127 + possible <- 1 + j <- i + do while j >= 4 + j <- j / 2 + if tree[63 - j] then + possible <- 0 + leave + if i = tree_index then + leave + else if i >= 64 then + compressed_index <- compressed_index + possible + else if tree[63 - i] = 1 then + compressed_index <- compressed_index + possible + switch(mode) + case(0): + RT[0:63] <- tree_index + if ¬found then + in_bits <- orig_in_bits + ra_used <- 0b0 + case(1): + RT[0:63] <- tree_index + if hit_end then + in_bits <- orig_in_bits + ra_used <- 0b0 + case(2): + RT[0:63] <- compressed_index + if ¬found then + in_bits <- orig_in_bits + ra_used <- 0b0 + RT[0:63] <- tree_index + default: + RT[0:63] <- compressed_index + if hit_end then + in_bits <- orig_in_bits + ra_used <- 0b0 + RS <- in_bits + CR0 <- ra_used || (tree_index >= 64) || found || hit_end