aboutsummaryrefslogtreecommitdiff
path: root/unix/as.vax/bitfields.s
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /unix/as.vax/bitfields.s
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'unix/as.vax/bitfields.s')
-rw-r--r--unix/as.vax/bitfields.s42
1 files changed, 42 insertions, 0 deletions
diff --git a/unix/as.vax/bitfields.s b/unix/as.vax/bitfields.s
new file mode 100644
index 00000000..5e28cd3d
--- /dev/null
+++ b/unix/as.vax/bitfields.s
@@ -0,0 +1,42 @@
+# BITFIELDS -- Routines for inserting and extracting bitfields into integers.
+
+# BITPAK -- Pack an integer into a bitfield of an array. Set all nbits
+# bits regardless of the value of the integer.
+
+ .text
+ .align 1
+ .globl _bitpak_
+
+ # bitpak (intval, array, offset, nbits)
+ .set INTVAL, 4
+ .set ARRAY, 8
+ .set OFFSET, 12 # one-indexed bit offset
+ .set NBITS, 16
+
+_bitpak_:
+ .word 0x0
+
+ subl3 $1, *OFFSET(ap), r1
+ insv *INTVAL(ap), r1, *NBITS(ap), *ARRAY(ap)
+ ret
+ .data
+
+# BITUPK -- Unpack a bitfield from an array and return as the function
+# value, an integer. Do not sign extend.
+
+ .text
+ .align 1
+ .globl _bitupk_
+
+ # bitupk (array, offset, nbits)
+ .set ARRAY, 4
+ .set OFFSET, 8 # one-indexed bit offset
+ .set NBITS, 12
+
+_bitupk_:
+ .word 0x0
+
+ subl3 $1, *OFFSET(ap), r1
+ extzv r1, *NBITS(ap), *ARRAY(ap), r0
+ ret
+ .data