summaryrefslogtreecommitdiffhomepage
path: root/mixlib/mix_types.c
diff options
context:
space:
mode:
authorlitvin <litvindev@gmail.com>2015-01-12 10:18:17 +0300
committerjao <jao@gnu.org>2015-03-03 19:24:16 +0100
commit09b22f2e082350f398dcd142b6af70a30f105ce1 (patch)
tree7a6237a66ba550a3a96da5a371de11af036d2a9b /mixlib/mix_types.c
parentb83ce265d72783b8cc60e4020ec87908470cb8b6 (diff)
downloadmdk-09b22f2e082350f398dcd142b6af70a30f105ce1.tar.gz
mdk-09b22f2e082350f398dcd142b6af70a30f105ce1.tar.bz2
Add missed instructions: SLB,SRB,JAE,JAO,JXE,JXO (from volume 2, section 4.5.2)
Diffstat (limited to 'mixlib/mix_types.c')
-rw-r--r--mixlib/mix_types.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/mixlib/mix_types.c b/mixlib/mix_types.c
index 46e87a2..4dac3ba 100644
--- a/mixlib/mix_types.c
+++ b/mixlib/mix_types.c
@@ -463,6 +463,40 @@ mix_word_shift_right_circular (mix_word_t A, mix_word_t X, gulong count,
| ( mix_word_magnitude (A1) >> c ) | ( MIX_WORD_MAX & (X1 << (30 - c)) );
}
+void
+mix_word_shift_left_binary (mix_word_t A, mix_word_t X, gulong count,
+ mix_word_t *pA, mix_word_t *pX)
+{
+ if ( pX != NULL ) *pX = mix_word_sign (X);
+ if ( pA != NULL ) *pA = mix_word_sign (A);
+ if (count < 30) {
+ if ( pX != NULL ) *pX |= MIX_WORD_MAX & (X << count);
+ if ( pA != NULL )
+ *pA |= MIX_WORD_MAX & ( (A << count) |
+ (mix_word_magnitude (X) >> (30 - count)) );
+ } else if (count < 60 && pA != NULL)
+ *pA |= MIX_WORD_MAX & (X << (count - 30));
+ else
+ ;
+}
+
+void
+mix_word_shift_right_binary (mix_word_t A, mix_word_t X, gulong count,
+ mix_word_t *pA, mix_word_t *pX)
+{
+ if ( pX != NULL ) *pX = mix_word_sign (X);
+ if ( pA != NULL ) *pA = mix_word_sign (A);
+ if (count < 30) {
+ if ( pA != NULL )
+ *pA |= mix_word_magnitude (A) >> count;
+ if ( pX != NULL )
+ *pX |= MIX_WORD_MAX & ( (mix_word_magnitude (X) >> count)
+ | (A << (30 - count)) );
+ } else if (count < 60 && pX != NULL)
+ *pX |= mix_word_magnitude (A) >> (count - 30);
+ else
+ ;
+}
/* Printable representation */
void