ppc/svp64: introduce alias for 1<<%r3 predicate
authorDmitry Selyutin <ghostmansd@gmail.com>
Sun, 28 May 2023 22:04:56 +0000 (01:04 +0300)
committerDmitry Selyutin <ghostmansd@gmail.com>
Mon, 7 Aug 2023 20:02:38 +0000 (23:02 +0300)
gas/config/tc-ppc-svp64.c

index 8f0cd06b67dc28f8de547162b2fbc4482da36494..bf49d38f0a91d229100748080d4f5e37611e2636 100644 (file)
@@ -91,6 +91,7 @@ enum svp64_predicate {
 static void
 svp64_operand (expressionS *exp)
 {
+  bool caret = false;
   bool vector = false;
   bool compat = false;
   char *origin = input_line_pointer;
@@ -106,6 +107,11 @@ svp64_operand (expressionS *exp)
       else
        ++input_line_pointer;
     }
+  else if (input_line_pointer[0] == '^')
+    {
+      caret = true;
+      ++input_line_pointer;
+    }
 
   if (!vector && !compat && !reg_names_p &&
       (input_line_pointer[0] != '%' || !ISALPHA (input_line_pointer[1])))
@@ -118,8 +124,22 @@ svp64_operand (expressionS *exp)
 
   if (exp->X_op == O_absent)
     input_line_pointer = origin;
-  else if (vector &&
-      ((exp->X_op == O_register) || (exp->X_op == O_constant)))
+  else if (exp->X_op == O_register)
+    {
+      if (caret)
+        {
+          if (exp->X_add_number == 3)
+            {
+              exp->X_op = O_predicate;
+              exp->X_add_number = SVP64_PREDICATE_1BIT_R3;
+            }
+          else
+            exp->X_op = O_illegal;
+        }
+      else if (vector)
+        exp->X_op = O_vector;
+    }
+  else if ((exp->X_op == O_constant) && vector)
     exp->X_op = O_vector;
 
   if (compat)