From 5f57d4ecf51c2f420dae56dfb9fc525d1979ec7c Mon Sep 17 00:00:00 2001
From: Alan Modra <amodra@gmail.com>
Date: Fri, 3 Jan 2020 08:12:00 +1030
Subject: [PATCH] ubsan: cr16: left shift cannot be represented in type 'int'

	* cr16-dis.c (cr16_match_opcode): Avoid shift left of signed value.
---
 opcodes/ChangeLog  | 4 ++++
 opcodes/cr16-dis.c | 3 +--
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 514466ed635..d72dcec0426 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,7 @@
+2020-01-04  Alan Modra  <amodra@gmail.com>
+
+	* cr16-dis.c (cr16_match_opcode): Avoid shift left of signed value.
+
 2020-01-04  Alan Modra  <amodra@gmail.com>
 
 	* crx-dis.c (match_opcode): Avoid shift left of signed value.
diff --git a/opcodes/cr16-dis.c b/opcodes/cr16-dis.c
index c40a07e2502..1be67b21181 100644
--- a/opcodes/cr16-dis.c
+++ b/opcodes/cr16-dis.c
@@ -319,8 +319,7 @@ cr16_match_opcode (void)
 {
   unsigned long mask;
   /* The instruction 'constant' opcode doesn't exceed 32 bits.  */
-  unsigned long doubleWord = (cr16_words[1]
-			     + (cr16_words[0] << 16)) & 0xffffffff;
+  unsigned long doubleWord = cr16_words[1] + ((unsigned) cr16_words[0] << 16);
 
   /* Start searching from end of instruction table.  */
   instruction = &cr16_instruction[NUMOPCODES - 2];
-- 
GitLab