+2017-08-01  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR gas/21874
+       * config/tc-i386-intel.c (i386_intel_operand): Update segment
+       register check.
+       * testsuite/gas/i386/intelok.s: Replace "fs:gs:[eax]" with
+       "fs:[eax]".
+       * testsuite/gas/i386/inval-seg.s: Add tests for invalid segment
+       register.
+       * testsuite/gas/i386/x86-64-inval-seg.s: Likewise.
+       * testsuite/gas/i386/inval-seg.l: Updated.
+       * testsuite/gas/i386/x86-64-inval-seg.l: Likewise.
+
 2017-07-31  John David Anglin  <danglin@gcc.gnu.org>
 
        * config/tc-hppa.c (pa_ip): Clear `d' bit in branch on bit instructions
 
 
       if (intel_state.seg)
        {
-         for (;;)
-           {
-             expP = symbol_get_value_expression (intel_state.seg);
-             if (expP->X_op != O_full_ptr)
-               break;
-             intel_state.seg = expP->X_add_symbol;
-           }
+         expP = symbol_get_value_expression (intel_state.seg);
          if (expP->X_op != O_register)
            {
              as_bad (_("segment register name expected"));
 
        mov     eax, [eax[ecx]]
        mov     eax, [[eax][ecx]]
        mov     eax, es:[eax]
-       mov     eax, fs:gs:[eax]
+       mov     eax, fs:[eax]
 
        # expressions
 
 
 .*: Assembler messages:
 .*:3: Error: .*
 .*:4: Error: .*
+.*:7: Error: .*
+.*:8: Error: .*
+.*:9: Error: .*
+.*:10: Error: .*
 GAS LISTING .*
 
 
-   1 [         ]*      .text
-   2 [         ]*# All the following should be illegal
-   3 [         ]*      movl    %ds,\(%eax\)
-   4 [         ]*      movl    \(%eax\),%ds
+[      ]*1[    ]+\.text
+[      ]*2[    ]+\# All the following should be illegal
+[      ]*3[    ]+movl  %ds,\(%eax\)
+[      ]*4[    ]+movl  \(%eax\),%ds
+[      ]*5[    ]+
+[      ]*6[    ]+\.intel_syntax noprefix
+[      ]*7[    ]+mov   eax, DWORD PTR fs:foobar:16
+[      ]*8[    ]+mov   eax, DWORD PTR fs:foobar:barfoo:16
+[      ]*9[    ]+mov   eax, DWORD PTR fs:ds:16
+[      ]*10[   ]+mov   eax, DWORD PTR fs:ds:cs:16
 
 # All the following should be illegal
        movl    %ds,(%eax)
        movl    (%eax),%ds
+
+       .intel_syntax noprefix
+       mov     eax, DWORD PTR fs:foobar:16
+       mov     eax, DWORD PTR fs:foobar:barfoo:16
+       mov     eax, DWORD PTR fs:ds:16
+       mov     eax, DWORD PTR fs:ds:cs:16
 
 .*:4: Error: .*
 .*:5: Error: .*
 .*:6: Error: .*
+.*:9: Error: .*
+.*:10: Error: .*
+.*:11: Error: .*
+.*:12: Error: .*
 GAS LISTING .*
 
 
-   1 [         ]*      .text
-   2 [         ]*# All the following should be illegal
-   3 [         ]*      movq    %ds,\(%rax\)
-   4 [         ]*      movl    %ds,\(%rax\)
-   5 [         ]*      movq    \(%rax\),%ds
-   6 [         ]*      movl    \(%rax\),%ds
+[      ]*1[    ]+\.text
+[      ]*2[    ]+\# All the following should be illegal
+[      ]*3[    ]+movq  %ds,\(%rax\)
+[      ]*4[    ]+movl  %ds,\(%rax\)
+[      ]*5[    ]+movq  \(%rax\),%ds
+[      ]*6[    ]+movl  \(%rax\),%ds
+[      ]*7[    ]+
+[      ]*8[    ]+\.intel_syntax noprefix
+[      ]*9[    ]+mov   eax, DWORD PTR fs:foobar:16
+[      ]*10[   ]+mov   eax, DWORD PTR fs:foobar:barfoo:16
+[      ]*11[   ]+mov   eax, DWORD PTR fs:ds:16
+[      ]*12[   ]+mov   eax, DWORD PTR fs:ds:cs:16
 
        movl    %ds,(%rax)
        movq    (%rax),%ds
        movl    (%rax),%ds
+
+       .intel_syntax noprefix
+       mov     eax, DWORD PTR fs:foobar:16
+       mov     eax, DWORD PTR fs:foobar:barfoo:16
+       mov     eax, DWORD PTR fs:ds:16
+       mov     eax, DWORD PTR fs:ds:cs:16