+2020-07-20  Jan Beulich  <jbeulich@suse.com>
+
+       PR gas/4572
+       * config/tc-i386.c (i386_comment_chars): Drop TE_I386AIX from
+       conditional around it.
+       (md_begin): Insert backslash into operand_chars[] when slash is
+       a comment character.
+       * config/tc-i386-intel.c (i386_operator): Recognize \/, \%, and
+       \* as operators when / may be a comment character.
+       * testsuite/gas/i386/svr4.s, testsuite/gas/i386/svr4.d: New.
+       * testsuite/gas/i386/i386.exp: Run new test.
+
 2020-07-20  Jan Beulich  <jbeulich@suse.com>
 
        PR gas/4572
 
 {
   unsigned int j;
 
+#ifdef SVR4_COMMENT_CHARS
+  if (!name && operands == 2 && *input_line_pointer == '\\')
+    switch (input_line_pointer[1])
+      {
+      case '/': input_line_pointer += 2; return O_divide;
+      case '%': input_line_pointer += 2; return O_modulus;
+      case '*': input_line_pointer += 2; return O_multiply;
+      }
+#endif
+
   if (!intel_syntax)
     return O_absent;
 
 
 #endif
        ;
 
-#if (defined (TE_I386AIX)                              \
-     || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))        \
-        && !defined (TE_GNU)                           \
-        && !defined (TE_LINUX)                         \
-        && !defined (TE_FreeBSD)                       \
-        && !defined (TE_DragonFly)                     \
-        && !defined (TE_NetBSD)))
+#if ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))    \
+     && !defined (TE_GNU)                              \
+     && !defined (TE_LINUX)                            \
+     && !defined (TE_FreeBSD)                          \
+     && !defined (TE_DragonFly)                                \
+     && !defined (TE_NetBSD))
 /* This array holds the chars that always start a comment.  If the
    pre-processor is disabled, these aren't very useful.  The option
    --divide will remove '/' from this list.  */
            mnemonic_chars[c] = c;
            operand_chars[c] = c;
          }
+#ifdef SVR4_COMMENT_CHARS
+       else if (c == '\\' && strchr (i386_comment_chars, '/'))
+         operand_chars[c] = c;
+#endif
 
        if (ISALPHA (c) || ISDIGIT (c))
          identifier_chars[c] = c;
 
        run_dump_test "dw2-compressed-1"
        run_dump_test "dw2-compressed-3a"
        run_dump_test "dw2-compressed-3b"
+
+       if {![istarget "*-*-dragonfly*"]
+           && ![istarget "*-*-gnu*"]
+           && ![istarget "*-*-freebsd*"]
+           && ![istarget "*-*-linux*"]
+           && ![istarget "*-*-netbsd*"]} then {
+           run_dump_test "svr4"
+       }
     }
 }
 
 
--- /dev/null
+#objdump: -dtw
+#name: SVR4 comment char escape handling
+
+.*: +file format .*
+
+SYMBOL TABLE:
+0+00 .* \.text[        ]+0+ \.text
+0+00 .* \.data[        ]+0+ \.data
+0+00 .* \.bss[         ]+0+ \.bss
+0+00 .* \.text[        ]+0+ svr4
+0+04 .* \*ABS\*[       ]+0+ a
+0+03 .* \*ABS\*[       ]+0+ b
+0+4c .* \*ABS\*[       ]+0+ c
+
+Disassembly of section .text:
+
+0+0 <svr4>:
+[       ]*[0-9a-f]+:[   ]+b0 07[        ]+mov    \$0x7,%al
+[       ]*[0-9a-f]+:[   ]+b0 01[        ]+mov    \$0x1,%al
+[       ]*[0-9a-f]+:[   ]+b0 1e[        ]+mov    \$0x1e,%al
+[       ]*[0-9a-f]+:[   ]+b0 05[        ]+mov    \$0x5,%al
+[       ]*[0-9a-f]+:[   ]+b0 02[        ]+mov    \$0x2,%al
+[       ]*[0-9a-f]+:[   ]+b0 33[        ]+mov    \$0x33,%al
+#pass
 
--- /dev/null
+       .text
+
+       .if 1 / 2
+       .else
+       .error
+       .endif
+
+       .if 1 \/ 2
+       .error
+       .endif
+
+       .if 4 \% 2
+       .error
+       .endif
+
+       .if 1 \* 0
+       .error
+       .endif
+
+svr4:
+       mov     $(15 \/ 2), %al
+       mov     $(15 \% 2), %al
+       mov     $(15 \* 2), %al
+
+       .byte   0xb0, 17 \/ 3
+       .byte   0xb0, 17 \% 3
+       .byte   0xb0, 17 \* 3
+
+       .equiv  a, 19 \/ 4
+       .equiv  b, 19 \% 4
+       .equiv  c, 19 \* 4