PR26449, PR26450 UBSAN: frv-ibld.c:135 left shift
[deliverable/binutils-gdb.git] / opcodes / or1k-ibld.c
index cc2955f04169c1ec0ae2670e1d7aa7e172ed536f..576a13918b6c37605f43076ae5739908edfcb286 100644 (file)
@@ -85,20 +85,20 @@ insert_1 (CGEN_CPU_DESC cd,
          int word_length,
          unsigned char *bufp)
 {
-  unsigned long x,mask;
+  unsigned long x, mask;
   int shift;
 
-  x = cgen_get_insn_value (cd, bufp, word_length);
+  x = cgen_get_insn_value (cd, bufp, word_length, cd->endian);
 
   /* Written this way to avoid undefined behaviour.  */
-  mask = (((1L << (length - 1)) - 1) << 1) | 1;
+  mask = (1UL << (length - 1) << 1) - 1;
   if (CGEN_INSN_LSB0_P)
     shift = (start + 1) - length;
   else
     shift = (word_length - (start + length));
   x = (x & ~(mask << shift)) | ((value & mask) << shift);
 
-  cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x);
+  cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x, cd->endian);
 }
 
 #endif /* ! CGEN_INT_INSN_P */
@@ -131,13 +131,15 @@ insert_normal (CGEN_CPU_DESC cd,
               CGEN_INSN_BYTES_PTR buffer)
 {
   static char errbuf[100];
-  /* Written this way to avoid undefined behaviour.  */
-  unsigned long mask = (((1L << (length - 1)) - 1) << 1) | 1;
+  unsigned long mask;
 
   /* If LENGTH is zero, this operand doesn't contribute to the value.  */
   if (length == 0)
     return NULL;
 
+  /* Written this way to avoid undefined behaviour.  */
+  mask = (1UL << (length - 1) << 1) - 1;
+
   if (word_length > 8 * sizeof (CGEN_INSN_INT))
     abort ();
 
@@ -269,8 +271,8 @@ insert_insn_normal (CGEN_CPU_DESC cd,
 #else
 
   cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize,
-                                       (unsigned) CGEN_FIELDS_BITSIZE (fields)),
-                      value);
+                                        (unsigned) CGEN_FIELDS_BITSIZE (fields)),
+                      value, cd->insn_endian);
 
 #endif /* ! CGEN_INT_INSN_P */
 
@@ -314,7 +316,7 @@ put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
     {
       int shift = insn_length - length;
       /* Written this way to avoid undefined behaviour.  */
-      CGEN_INSN_INT mask = (((1L << (length - 1)) - 1) << 1) | 1;
+      CGEN_INSN_INT mask = length == 0 ? 0 : (1UL << (length - 1) << 1) - 1;
 
       *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift);
     }
@@ -387,7 +389,7 @@ extract_1 (CGEN_CPU_DESC cd,
   unsigned long x;
   int shift;
 
-  x = cgen_get_insn_value (cd, bufp, word_length);
+  x = cgen_get_insn_value (cd, bufp, word_length, cd->endian);
 
   if (CGEN_INSN_LSB0_P)
     shift = (start + 1) - length;
@@ -480,7 +482,10 @@ extract_normal (CGEN_CPU_DESC cd,
        abort ();
 
       if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0)
-       return 0;
+       {
+         *valuep = 0;
+         return 0;
+       }
 
       value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc);
     }
@@ -488,7 +493,7 @@ extract_normal (CGEN_CPU_DESC cd,
 #endif /* ! CGEN_INT_INSN_P */
 
   /* Written this way to avoid undefined behaviour.  */
-  mask = (((1L << (length - 1)) - 1) << 1) | 1;
+  mask = (1UL << (length - 1) << 1) - 1;
 
   value &= mask;
   /* sign extend? */
@@ -576,14 +581,14 @@ or1k_cgen_insert_operand (CGEN_CPU_DESC cd,
     case OR1K_OPERAND_DISP21 :
       {
         long value = fields->f_disp21;
-        value = ((((DI) (value) >> (13))) - (((DI) (pc) >> (13))));
+        value = ((((SI) (value) >> (13))) - (((SI) (pc) >> (13))));
         errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_ABS_ADDR), 0, 20, 21, 32, total_length, buffer);
       }
       break;
     case OR1K_OPERAND_DISP26 :
       {
         long value = fields->f_disp26;
-        value = ((DI) (((value) - (pc))) >> (2));
+        value = ((SI) (((value) - (pc))) >> (2));
         errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 25, 26, 32, total_length, buffer);
       }
       break;
@@ -604,9 +609,6 @@ or1k_cgen_insert_operand (CGEN_CPU_DESC cd,
           break;
       }
       break;
-    case OR1K_OPERAND_RADF :
-      errmsg = insert_normal (cd, fields->f_r2, 0, 0, 20, 5, 32, total_length, buffer);
-      break;
     case OR1K_OPERAND_RADI :
       {
 {
@@ -641,9 +643,6 @@ or1k_cgen_insert_operand (CGEN_CPU_DESC cd,
           break;
       }
       break;
-    case OR1K_OPERAND_RBDF :
-      errmsg = insert_normal (cd, fields->f_r3, 0, 0, 15, 5, 32, total_length, buffer);
-      break;
     case OR1K_OPERAND_RBDI :
       {
 {
@@ -678,9 +677,6 @@ or1k_cgen_insert_operand (CGEN_CPU_DESC cd,
           break;
       }
       break;
-    case OR1K_OPERAND_RDDF :
-      errmsg = insert_normal (cd, fields->f_r1, 0, 0, 25, 5, 32, total_length, buffer);
-      break;
     case OR1K_OPERAND_RDDI :
       {
 {
@@ -783,7 +779,7 @@ or1k_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_ABS_ADDR), 0, 20, 21, 32, total_length, pc, & value);
-        value = ((((value) + (((DI) (pc) >> (13))))) * (MAKEDI (0, 8192)));
+        value = ((((value) + (((SI) (pc) >> (13))))) * (8192));
         fields->f_disp21 = value;
       }
       break;
@@ -791,7 +787,7 @@ or1k_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, 25, 26, 32, total_length, pc, & value);
-        value = ((((value) * (MAKEDI (0, 4)))) + (pc));
+        value = ((((value) * (4))) + (pc));
         fields->f_disp26 = value;
       }
       break;
@@ -807,9 +803,6 @@ or1k_cgen_extract_operand (CGEN_CPU_DESC cd,
   FLD (f_rad32) = ((FLD (f_r2)) | (((FLD (f_raoff_9_1)) << (5))));
       }
       break;
-    case OR1K_OPERAND_RADF :
-      length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 5, 32, total_length, pc, & fields->f_r2);
-      break;
     case OR1K_OPERAND_RADI :
       {
         length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 5, 32, total_length, pc, & fields->f_r2);
@@ -834,9 +827,6 @@ or1k_cgen_extract_operand (CGEN_CPU_DESC cd,
   FLD (f_rbd32) = ((FLD (f_r3)) | (((FLD (f_rboff_8_1)) << (5))));
       }
       break;
-    case OR1K_OPERAND_RBDF :
-      length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 5, 32, total_length, pc, & fields->f_r3);
-      break;
     case OR1K_OPERAND_RBDI :
       {
         length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 5, 32, total_length, pc, & fields->f_r3);
@@ -861,9 +851,6 @@ or1k_cgen_extract_operand (CGEN_CPU_DESC cd,
   FLD (f_rdd32) = ((FLD (f_r1)) | (((FLD (f_rdoff_10_1)) << (5))));
       }
       break;
-    case OR1K_OPERAND_RDDF :
-      length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 5, 32, total_length, pc, & fields->f_r1);
-      break;
     case OR1K_OPERAND_RDDI :
       {
         length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 5, 32, total_length, pc, & fields->f_r1);
@@ -954,9 +941,6 @@ or1k_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
     case OR1K_OPERAND_RAD32F :
       value = fields->f_rad32;
       break;
-    case OR1K_OPERAND_RADF :
-      value = fields->f_r2;
-      break;
     case OR1K_OPERAND_RADI :
       value = fields->f_rad32;
       break;
@@ -969,9 +953,6 @@ or1k_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
     case OR1K_OPERAND_RBD32F :
       value = fields->f_rbd32;
       break;
-    case OR1K_OPERAND_RBDF :
-      value = fields->f_r3;
-      break;
     case OR1K_OPERAND_RBDI :
       value = fields->f_rbd32;
       break;
@@ -984,9 +965,6 @@ or1k_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
     case OR1K_OPERAND_RDD32F :
       value = fields->f_rdd32;
       break;
-    case OR1K_OPERAND_RDDF :
-      value = fields->f_r1;
-      break;
     case OR1K_OPERAND_RDDI :
       value = fields->f_rdd32;
       break;
@@ -1041,9 +1019,6 @@ or1k_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
     case OR1K_OPERAND_RAD32F :
       value = fields->f_rad32;
       break;
-    case OR1K_OPERAND_RADF :
-      value = fields->f_r2;
-      break;
     case OR1K_OPERAND_RADI :
       value = fields->f_rad32;
       break;
@@ -1056,9 +1031,6 @@ or1k_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
     case OR1K_OPERAND_RBD32F :
       value = fields->f_rbd32;
       break;
-    case OR1K_OPERAND_RBDF :
-      value = fields->f_r3;
-      break;
     case OR1K_OPERAND_RBDI :
       value = fields->f_rbd32;
       break;
@@ -1071,9 +1043,6 @@ or1k_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
     case OR1K_OPERAND_RDD32F :
       value = fields->f_rdd32;
       break;
-    case OR1K_OPERAND_RDDF :
-      value = fields->f_r1;
-      break;
     case OR1K_OPERAND_RDDI :
       value = fields->f_rdd32;
       break;
@@ -1135,9 +1104,6 @@ or1k_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
     case OR1K_OPERAND_RAD32F :
       fields->f_rad32 = value;
       break;
-    case OR1K_OPERAND_RADF :
-      fields->f_r2 = value;
-      break;
     case OR1K_OPERAND_RADI :
       fields->f_rad32 = value;
       break;
@@ -1150,9 +1116,6 @@ or1k_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
     case OR1K_OPERAND_RBD32F :
       fields->f_rbd32 = value;
       break;
-    case OR1K_OPERAND_RBDF :
-      fields->f_r3 = value;
-      break;
     case OR1K_OPERAND_RBDI :
       fields->f_rbd32 = value;
       break;
@@ -1165,9 +1128,6 @@ or1k_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
     case OR1K_OPERAND_RDD32F :
       fields->f_rdd32 = value;
       break;
-    case OR1K_OPERAND_RDDF :
-      fields->f_r1 = value;
-      break;
     case OR1K_OPERAND_RDDI :
       fields->f_rdd32 = value;
       break;
@@ -1219,9 +1179,6 @@ or1k_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
     case OR1K_OPERAND_RAD32F :
       fields->f_rad32 = value;
       break;
-    case OR1K_OPERAND_RADF :
-      fields->f_r2 = value;
-      break;
     case OR1K_OPERAND_RADI :
       fields->f_rad32 = value;
       break;
@@ -1234,9 +1191,6 @@ or1k_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
     case OR1K_OPERAND_RBD32F :
       fields->f_rbd32 = value;
       break;
-    case OR1K_OPERAND_RBDF :
-      fields->f_r3 = value;
-      break;
     case OR1K_OPERAND_RBDI :
       fields->f_rbd32 = value;
       break;
@@ -1249,9 +1203,6 @@ or1k_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
     case OR1K_OPERAND_RDD32F :
       fields->f_rdd32 = value;
       break;
-    case OR1K_OPERAND_RDDF :
-      fields->f_r1 = value;
-      break;
     case OR1K_OPERAND_RDDI :
       fields->f_rdd32 = value;
       break;
This page took 0.027565 seconds and 4 git commands to generate.