[binutils-gdb] ubsan: frv: left shift of negative value

Alan Modra amodra@sourceware.org
Sat Feb 1 12:54:00 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b2b1453ad4305f1a000a514e4dfcc09af49fb3dc

commit b2b1453ad4305f1a000a514e4dfcc09af49fb3dc
Author: Alan Modra <amodra@gmail.com>
Date:   Sat Feb 1 13:08:43 2020 +1030

    ubsan: frv: left shift of negative value
    
    More non-bugs flagged by ubsan, unless you happen to be compiling for
    a 1's complement host.
    
    cpu/
    	* frv.cpu (f-u12): Multiply rather than left shift signed values.
    	(f-label16, f-label24): Likewise.
    opcodes/
    	* frv-ibld.c: Regenerate.

Diff:
---
 cpu/ChangeLog      | 5 +++++
 cpu/frv.cpu        | 8 ++++----
 opcodes/ChangeLog  | 4 ++++
 opcodes/frv-ibld.c | 6 +++---
 4 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/cpu/ChangeLog b/cpu/ChangeLog
index 3e8f019..5611cd1 100644
--- a/cpu/ChangeLog
+++ b/cpu/ChangeLog
@@ -1,3 +1,8 @@
+2020-02-01  Alan Modra  <amodra@gmail.com>
+
+	* frv.cpu (f-u12): Multiply rather than left shift signed values.
+	(f-label16, f-label24): Likewise.
+
 2020-01-30  Alan Modra  <amodra@gmail.com>
 
 	* m32c.cpu (f-src32-rn-unprefixed-QI): Shift before inverting.
diff --git a/cpu/frv.cpu b/cpu/frv.cpu
index b6c4f80..cdb169e 100644
--- a/cpu/frv.cpu
+++ b/cpu/frv.cpu
@@ -1984,7 +1984,7 @@
 		(set (ifield f-u12-l) (and (ifield f-u12) #x3f))
 		)
       (sequence () ; extract
-		(set (ifield f-u12) (or (sll (ifield f-u12-h) 6)
+		(set (ifield f-u12) (or (mul (ifield f-u12-h) 64)
 					(ifield f-u12-l)))
 		)
 )
@@ -2016,7 +2016,7 @@
 
 (df  f-label16    "18 bit pc relative signed offset" (PCREL-ADDR) 15 16 INT
      ((value pc) (sra WI (sub WI value pc) (const 2)))
-     ((value pc) (add WI (sll WI value (const 2)) pc))
+     ((value pc) (add WI (mul WI value (const 4)) pc))
 )
 
 (df   f-labelH6   "upper 6  bits of label24"  () 30  6 INT #f #f)
@@ -2034,9 +2034,9 @@
       ; extract
       (sequence ()
 		(set (ifield f-label24)
-		     (add (sll (or (sll (ifield f-labelH6) (const 18))
+		     (add (mul (or (mul (ifield f-labelH6) (sll 1 18))
 				   (ifield f-labelL18))
-			       (const 2))
+			       (const 4))
 			  pc)))
 )
 
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index f163ad2..6349ff0 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,7 @@
+2020-02-01  Alan Modra  <amodra@gmail.com>
+
+	* frv-ibld.c: Regenerate.
+
 2020-01-31  Jan Beulich  <jbeulich@suse.com>
 
 	* i386-dis.c (EXxmm_mdq, xmm_mdq_mode): Delete.
diff --git a/opcodes/frv-ibld.c b/opcodes/frv-ibld.c
index 34396f5..5e31df2 100644
--- a/opcodes/frv-ibld.c
+++ b/opcodes/frv-ibld.c
@@ -1090,7 +1090,7 @@ frv_cgen_extract_operand (CGEN_CPU_DESC cd,
       {
         long value;
         length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 16, 32, total_length, pc, & value);
-        value = ((((value) << (2))) + (pc));
+        value = ((((value) * (4))) + (pc));
         fields->f_label16 = value;
       }
       break;
@@ -1101,7 +1101,7 @@ frv_cgen_extract_operand (CGEN_CPU_DESC cd,
         length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 18, 32, total_length, pc, & fields->f_labelL18);
         if (length <= 0) break;
 {
-  FLD (f_label24) = ((((((((FLD (f_labelH6)) << (18))) | (FLD (f_labelL18)))) << (2))) + (pc));
+  FLD (f_label24) = ((((((((FLD (f_labelH6)) * (((1) << (18))))) | (FLD (f_labelL18)))) * (4))) + (pc));
 }
       }
       break;
@@ -1156,7 +1156,7 @@ frv_cgen_extract_operand (CGEN_CPU_DESC cd,
         length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_u12_l);
         if (length <= 0) break;
 {
-  FLD (f_u12) = ((((FLD (f_u12_h)) << (6))) | (FLD (f_u12_l)));
+  FLD (f_u12) = ((((FLD (f_u12_h)) * (64))) | (FLD (f_u12_l)));
 }
       }
       break;



More information about the Binutils-cvs mailing list