delocate: update to handle SVE2

Aarch64's SVE2 extension adds more syntax forms for registers, and a new
"tweak" pattern that means "multiply offset by the hardware's vector
length". This change tweaks delocate so that it can pass these forms.

See https://developer.arm.com/documentation/102340/0100/SVE2-architecture-fundamentals

Change-Id: I9a736dcf0b57d36d5e08a53e073da7fe3c62dea2
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/65349
Commit-Queue: David Benjamin <davidben@google.com>
Reviewed-by: David Benjamin <davidben@google.com>
Auto-Submit: Adam Langley <agl@google.com>
diff --git a/util/fipstools/delocate/delocate.peg b/util/fipstools/delocate/delocate.peg
index 2247f24..3381cae 100644
--- a/util/fipstools/delocate/delocate.peg
+++ b/util/fipstools/delocate/delocate.peg
@@ -82,9 +82,14 @@
                        ('#' '~'? '(' [0-9] WS? "<<" WS? [0-9] ')' ) /
                        ARMRegister)
                       ![fb:(+\-]
-ARMConstantTweak <- (([us] "xt" [xwhb]) / "lsl" / "lsr" / "ror" / "asr") (WS '#' Offset)?
-ARMRegister <- "sp" / ([xwdqshb] [0-9] [0-9]?) / "xzr" / "wzr" / "NZCV" / ARMVectorRegister / ('{' WS? ARMVectorRegister (',' WS? ARMVectorRegister)* WS? '}' ('[' [0-9] [0-9]? ']')? )
-ARMVectorRegister <- "v" [0-9] [0-9]? ('.' [0-9]* [bsdhq] ('[' [0-9] [0-9]? ']')? )?
+ARMConstantTweak <- ((([us] "xt" [xwhb]) / "lsl" / "lsr" / "ror" / "asr") (WS '#' Offset)?) /
+                    "mul vl"  # multiply offset by the hardware's vector length
+ARMRegister <- "sp" /
+               ([xwdqshb] [0-9] [0-9]?) /
+               "xzr" / "wzr" / "NZCV" / ARMVectorRegister / SVE2PredicateRegister /
+               ('{' WS? ARMVectorRegister (',' WS? ARMVectorRegister)* WS? '}' ('[' [0-9] [0-9]? ']')? )
+ARMVectorRegister <- [vz] [0-9] [0-9]? ('.' [0-9]* [bsdhq] ('[' [0-9] [0-9]? ']')? )?
+SVE2PredicateRegister <- "p" [0-9] [0-9]? "/" [mMzZ]
 # Compilers only output a very limited number of expression forms. Rather than
 # implement a full expression parser, this enumerate those forms plus a few
 # that appear in our hand-written assembly.
diff --git a/util/fipstools/delocate/delocate.peg.go b/util/fipstools/delocate/delocate.peg.go
index fa21419..f0963cc 100644
--- a/util/fipstools/delocate/delocate.peg.go
+++ b/util/fipstools/delocate/delocate.peg.go
@@ -64,6 +64,7 @@
 	ruleARMConstantTweak
 	ruleARMRegister
 	ruleARMVectorRegister
+	ruleSVE2PredicateRegister
 	ruleMemoryRef
 	ruleSymbolRef
 	ruleLow12BitsSymbolRef
@@ -125,6 +126,7 @@
 	"ARMConstantTweak",
 	"ARMRegister",
 	"ARMVectorRegister",
+	"SVE2PredicateRegister",
 	"MemoryRef",
 	"SymbolRef",
 	"Low12BitsSymbolRef",
@@ -250,7 +252,7 @@
 type Asm struct {
 	Buffer string
 	buffer []rune
-	rules  [58]func() bool
+	rules  [59]func() bool
 	parse  func(rule ...int) error
 	reset  func()
 	Pretty bool
@@ -4768,7 +4770,7 @@
 			position, tokenIndex = position532, tokenIndex532
 			return false
 		},
-		/* 43 ARMConstantTweak <- <(((('u' / 's') (('x' / 'X') ('t' / 'T')) ('x' / 'w' / 'h' / 'b')) / (('l' / 'L') ('s' / 'S') ('l' / 'L')) / (('l' / 'L') ('s' / 'S') ('r' / 'R')) / (('r' / 'R') ('o' / 'O') ('r' / 'R')) / (('a' / 'A') ('s' / 'S') ('r' / 'R'))) (WS '#' Offset)?)> */
+		/* 43 ARMConstantTweak <- <((((('u' / 's') (('x' / 'X') ('t' / 'T')) ('x' / 'w' / 'h' / 'b')) / (('l' / 'L') ('s' / 'S') ('l' / 'L')) / (('l' / 'L') ('s' / 'S') ('r' / 'R')) / (('r' / 'R') ('o' / 'O') ('r' / 'R')) / (('a' / 'A') ('s' / 'S') ('r' / 'R'))) (WS '#' Offset)?) / (('m' / 'M') ('u' / 'U') ('l' / 'L') ' ' ('v' / 'V') ('l' / 'L')))> */
 		func() bool {
 			position573, tokenIndex573 := position, tokenIndex
 			{
@@ -4777,289 +4779,375 @@
 					position575, tokenIndex575 := position, tokenIndex
 					{
 						position577, tokenIndex577 := position, tokenIndex
-						if buffer[position] != rune('u') {
-							goto l578
+						{
+							position579, tokenIndex579 := position, tokenIndex
+							if buffer[position] != rune('u') {
+								goto l580
+							}
+							position++
+							goto l579
+						l580:
+							position, tokenIndex = position579, tokenIndex579
+							if buffer[position] != rune('s') {
+								goto l578
+							}
+							position++
 						}
-						position++
+					l579:
+						{
+							position581, tokenIndex581 := position, tokenIndex
+							if buffer[position] != rune('x') {
+								goto l582
+							}
+							position++
+							goto l581
+						l582:
+							position, tokenIndex = position581, tokenIndex581
+							if buffer[position] != rune('X') {
+								goto l578
+							}
+							position++
+						}
+					l581:
+						{
+							position583, tokenIndex583 := position, tokenIndex
+							if buffer[position] != rune('t') {
+								goto l584
+							}
+							position++
+							goto l583
+						l584:
+							position, tokenIndex = position583, tokenIndex583
+							if buffer[position] != rune('T') {
+								goto l578
+							}
+							position++
+						}
+					l583:
+						{
+							position585, tokenIndex585 := position, tokenIndex
+							if buffer[position] != rune('x') {
+								goto l586
+							}
+							position++
+							goto l585
+						l586:
+							position, tokenIndex = position585, tokenIndex585
+							if buffer[position] != rune('w') {
+								goto l587
+							}
+							position++
+							goto l585
+						l587:
+							position, tokenIndex = position585, tokenIndex585
+							if buffer[position] != rune('h') {
+								goto l588
+							}
+							position++
+							goto l585
+						l588:
+							position, tokenIndex = position585, tokenIndex585
+							if buffer[position] != rune('b') {
+								goto l578
+							}
+							position++
+						}
+					l585:
 						goto l577
 					l578:
 						position, tokenIndex = position577, tokenIndex577
-						if buffer[position] != rune('s') {
-							goto l576
+						{
+							position590, tokenIndex590 := position, tokenIndex
+							if buffer[position] != rune('l') {
+								goto l591
+							}
+							position++
+							goto l590
+						l591:
+							position, tokenIndex = position590, tokenIndex590
+							if buffer[position] != rune('L') {
+								goto l589
+							}
+							position++
 						}
-						position++
+					l590:
+						{
+							position592, tokenIndex592 := position, tokenIndex
+							if buffer[position] != rune('s') {
+								goto l593
+							}
+							position++
+							goto l592
+						l593:
+							position, tokenIndex = position592, tokenIndex592
+							if buffer[position] != rune('S') {
+								goto l589
+							}
+							position++
+						}
+					l592:
+						{
+							position594, tokenIndex594 := position, tokenIndex
+							if buffer[position] != rune('l') {
+								goto l595
+							}
+							position++
+							goto l594
+						l595:
+							position, tokenIndex = position594, tokenIndex594
+							if buffer[position] != rune('L') {
+								goto l589
+							}
+							position++
+						}
+					l594:
+						goto l577
+					l589:
+						position, tokenIndex = position577, tokenIndex577
+						{
+							position597, tokenIndex597 := position, tokenIndex
+							if buffer[position] != rune('l') {
+								goto l598
+							}
+							position++
+							goto l597
+						l598:
+							position, tokenIndex = position597, tokenIndex597
+							if buffer[position] != rune('L') {
+								goto l596
+							}
+							position++
+						}
+					l597:
+						{
+							position599, tokenIndex599 := position, tokenIndex
+							if buffer[position] != rune('s') {
+								goto l600
+							}
+							position++
+							goto l599
+						l600:
+							position, tokenIndex = position599, tokenIndex599
+							if buffer[position] != rune('S') {
+								goto l596
+							}
+							position++
+						}
+					l599:
+						{
+							position601, tokenIndex601 := position, tokenIndex
+							if buffer[position] != rune('r') {
+								goto l602
+							}
+							position++
+							goto l601
+						l602:
+							position, tokenIndex = position601, tokenIndex601
+							if buffer[position] != rune('R') {
+								goto l596
+							}
+							position++
+						}
+					l601:
+						goto l577
+					l596:
+						position, tokenIndex = position577, tokenIndex577
+						{
+							position604, tokenIndex604 := position, tokenIndex
+							if buffer[position] != rune('r') {
+								goto l605
+							}
+							position++
+							goto l604
+						l605:
+							position, tokenIndex = position604, tokenIndex604
+							if buffer[position] != rune('R') {
+								goto l603
+							}
+							position++
+						}
+					l604:
+						{
+							position606, tokenIndex606 := position, tokenIndex
+							if buffer[position] != rune('o') {
+								goto l607
+							}
+							position++
+							goto l606
+						l607:
+							position, tokenIndex = position606, tokenIndex606
+							if buffer[position] != rune('O') {
+								goto l603
+							}
+							position++
+						}
+					l606:
+						{
+							position608, tokenIndex608 := position, tokenIndex
+							if buffer[position] != rune('r') {
+								goto l609
+							}
+							position++
+							goto l608
+						l609:
+							position, tokenIndex = position608, tokenIndex608
+							if buffer[position] != rune('R') {
+								goto l603
+							}
+							position++
+						}
+					l608:
+						goto l577
+					l603:
+						position, tokenIndex = position577, tokenIndex577
+						{
+							position610, tokenIndex610 := position, tokenIndex
+							if buffer[position] != rune('a') {
+								goto l611
+							}
+							position++
+							goto l610
+						l611:
+							position, tokenIndex = position610, tokenIndex610
+							if buffer[position] != rune('A') {
+								goto l576
+							}
+							position++
+						}
+					l610:
+						{
+							position612, tokenIndex612 := position, tokenIndex
+							if buffer[position] != rune('s') {
+								goto l613
+							}
+							position++
+							goto l612
+						l613:
+							position, tokenIndex = position612, tokenIndex612
+							if buffer[position] != rune('S') {
+								goto l576
+							}
+							position++
+						}
+					l612:
+						{
+							position614, tokenIndex614 := position, tokenIndex
+							if buffer[position] != rune('r') {
+								goto l615
+							}
+							position++
+							goto l614
+						l615:
+							position, tokenIndex = position614, tokenIndex614
+							if buffer[position] != rune('R') {
+								goto l576
+							}
+							position++
+						}
+					l614:
 					}
 				l577:
 					{
-						position579, tokenIndex579 := position, tokenIndex
-						if buffer[position] != rune('x') {
-							goto l580
+						position616, tokenIndex616 := position, tokenIndex
+						if !_rules[ruleWS]() {
+							goto l616
+						}
+						if buffer[position] != rune('#') {
+							goto l616
 						}
 						position++
-						goto l579
-					l580:
-						position, tokenIndex = position579, tokenIndex579
-						if buffer[position] != rune('X') {
-							goto l576
+						if !_rules[ruleOffset]() {
+							goto l616
 						}
-						position++
+						goto l617
+					l616:
+						position, tokenIndex = position616, tokenIndex616
 					}
-				l579:
-					{
-						position581, tokenIndex581 := position, tokenIndex
-						if buffer[position] != rune('t') {
-							goto l582
-						}
-						position++
-						goto l581
-					l582:
-						position, tokenIndex = position581, tokenIndex581
-						if buffer[position] != rune('T') {
-							goto l576
-						}
-						position++
-					}
-				l581:
-					{
-						position583, tokenIndex583 := position, tokenIndex
-						if buffer[position] != rune('x') {
-							goto l584
-						}
-						position++
-						goto l583
-					l584:
-						position, tokenIndex = position583, tokenIndex583
-						if buffer[position] != rune('w') {
-							goto l585
-						}
-						position++
-						goto l583
-					l585:
-						position, tokenIndex = position583, tokenIndex583
-						if buffer[position] != rune('h') {
-							goto l586
-						}
-						position++
-						goto l583
-					l586:
-						position, tokenIndex = position583, tokenIndex583
-						if buffer[position] != rune('b') {
-							goto l576
-						}
-						position++
-					}
-				l583:
+				l617:
 					goto l575
 				l576:
 					position, tokenIndex = position575, tokenIndex575
 					{
-						position588, tokenIndex588 := position, tokenIndex
-						if buffer[position] != rune('l') {
-							goto l589
+						position618, tokenIndex618 := position, tokenIndex
+						if buffer[position] != rune('m') {
+							goto l619
 						}
 						position++
-						goto l588
-					l589:
-						position, tokenIndex = position588, tokenIndex588
-						if buffer[position] != rune('L') {
-							goto l587
-						}
-						position++
-					}
-				l588:
-					{
-						position590, tokenIndex590 := position, tokenIndex
-						if buffer[position] != rune('s') {
-							goto l591
-						}
-						position++
-						goto l590
-					l591:
-						position, tokenIndex = position590, tokenIndex590
-						if buffer[position] != rune('S') {
-							goto l587
-						}
-						position++
-					}
-				l590:
-					{
-						position592, tokenIndex592 := position, tokenIndex
-						if buffer[position] != rune('l') {
-							goto l593
-						}
-						position++
-						goto l592
-					l593:
-						position, tokenIndex = position592, tokenIndex592
-						if buffer[position] != rune('L') {
-							goto l587
-						}
-						position++
-					}
-				l592:
-					goto l575
-				l587:
-					position, tokenIndex = position575, tokenIndex575
-					{
-						position595, tokenIndex595 := position, tokenIndex
-						if buffer[position] != rune('l') {
-							goto l596
-						}
-						position++
-						goto l595
-					l596:
-						position, tokenIndex = position595, tokenIndex595
-						if buffer[position] != rune('L') {
-							goto l594
-						}
-						position++
-					}
-				l595:
-					{
-						position597, tokenIndex597 := position, tokenIndex
-						if buffer[position] != rune('s') {
-							goto l598
-						}
-						position++
-						goto l597
-					l598:
-						position, tokenIndex = position597, tokenIndex597
-						if buffer[position] != rune('S') {
-							goto l594
-						}
-						position++
-					}
-				l597:
-					{
-						position599, tokenIndex599 := position, tokenIndex
-						if buffer[position] != rune('r') {
-							goto l600
-						}
-						position++
-						goto l599
-					l600:
-						position, tokenIndex = position599, tokenIndex599
-						if buffer[position] != rune('R') {
-							goto l594
-						}
-						position++
-					}
-				l599:
-					goto l575
-				l594:
-					position, tokenIndex = position575, tokenIndex575
-					{
-						position602, tokenIndex602 := position, tokenIndex
-						if buffer[position] != rune('r') {
-							goto l603
-						}
-						position++
-						goto l602
-					l603:
-						position, tokenIndex = position602, tokenIndex602
-						if buffer[position] != rune('R') {
-							goto l601
-						}
-						position++
-					}
-				l602:
-					{
-						position604, tokenIndex604 := position, tokenIndex
-						if buffer[position] != rune('o') {
-							goto l605
-						}
-						position++
-						goto l604
-					l605:
-						position, tokenIndex = position604, tokenIndex604
-						if buffer[position] != rune('O') {
-							goto l601
-						}
-						position++
-					}
-				l604:
-					{
-						position606, tokenIndex606 := position, tokenIndex
-						if buffer[position] != rune('r') {
-							goto l607
-						}
-						position++
-						goto l606
-					l607:
-						position, tokenIndex = position606, tokenIndex606
-						if buffer[position] != rune('R') {
-							goto l601
-						}
-						position++
-					}
-				l606:
-					goto l575
-				l601:
-					position, tokenIndex = position575, tokenIndex575
-					{
-						position608, tokenIndex608 := position, tokenIndex
-						if buffer[position] != rune('a') {
-							goto l609
-						}
-						position++
-						goto l608
-					l609:
-						position, tokenIndex = position608, tokenIndex608
-						if buffer[position] != rune('A') {
+						goto l618
+					l619:
+						position, tokenIndex = position618, tokenIndex618
+						if buffer[position] != rune('M') {
 							goto l573
 						}
 						position++
 					}
-				l608:
+				l618:
 					{
-						position610, tokenIndex610 := position, tokenIndex
-						if buffer[position] != rune('s') {
-							goto l611
+						position620, tokenIndex620 := position, tokenIndex
+						if buffer[position] != rune('u') {
+							goto l621
 						}
 						position++
-						goto l610
-					l611:
-						position, tokenIndex = position610, tokenIndex610
-						if buffer[position] != rune('S') {
+						goto l620
+					l621:
+						position, tokenIndex = position620, tokenIndex620
+						if buffer[position] != rune('U') {
 							goto l573
 						}
 						position++
 					}
-				l610:
+				l620:
 					{
-						position612, tokenIndex612 := position, tokenIndex
-						if buffer[position] != rune('r') {
-							goto l613
+						position622, tokenIndex622 := position, tokenIndex
+						if buffer[position] != rune('l') {
+							goto l623
 						}
 						position++
-						goto l612
-					l613:
-						position, tokenIndex = position612, tokenIndex612
-						if buffer[position] != rune('R') {
+						goto l622
+					l623:
+						position, tokenIndex = position622, tokenIndex622
+						if buffer[position] != rune('L') {
 							goto l573
 						}
 						position++
 					}
-				l612:
-				}
-			l575:
-				{
-					position614, tokenIndex614 := position, tokenIndex
-					if !_rules[ruleWS]() {
-						goto l614
-					}
-					if buffer[position] != rune('#') {
-						goto l614
+				l622:
+					if buffer[position] != rune(' ') {
+						goto l573
 					}
 					position++
-					if !_rules[ruleOffset]() {
-						goto l614
+					{
+						position624, tokenIndex624 := position, tokenIndex
+						if buffer[position] != rune('v') {
+							goto l625
+						}
+						position++
+						goto l624
+					l625:
+						position, tokenIndex = position624, tokenIndex624
+						if buffer[position] != rune('V') {
+							goto l573
+						}
+						position++
 					}
-					goto l615
-				l614:
-					position, tokenIndex = position614, tokenIndex614
+				l624:
+					{
+						position626, tokenIndex626 := position, tokenIndex
+						if buffer[position] != rune('l') {
+							goto l627
+						}
+						position++
+						goto l626
+					l627:
+						position, tokenIndex = position626, tokenIndex626
+						if buffer[position] != rune('L') {
+							goto l573
+						}
+						position++
+					}
+				l626:
 				}
-			l615:
+			l575:
 				add(ruleARMConstantTweak, position574)
 			}
 			return true
@@ -5067,1530 +5155,1611 @@
 			position, tokenIndex = position573, tokenIndex573
 			return false
 		},
-		/* 44 ARMRegister <- <((('s' / 'S') ('p' / 'P')) / (('x' / 'w' / 'd' / 'q' / 's' / 'h' / 'b') [0-9] [0-9]?) / (('x' / 'X') ('z' / 'Z') ('r' / 'R')) / (('w' / 'W') ('z' / 'Z') ('r' / 'R')) / (('n' / 'N') ('z' / 'Z') ('c' / 'C') ('v' / 'V')) / ARMVectorRegister / ('{' WS? ARMVectorRegister (',' WS? ARMVectorRegister)* WS? '}' ('[' [0-9] [0-9]? ']')?))> */
+		/* 44 ARMRegister <- <((('s' / 'S') ('p' / 'P')) / (('x' / 'w' / 'd' / 'q' / 's' / 'h' / 'b') [0-9] [0-9]?) / (('x' / 'X') ('z' / 'Z') ('r' / 'R')) / (('w' / 'W') ('z' / 'Z') ('r' / 'R')) / (('n' / 'N') ('z' / 'Z') ('c' / 'C') ('v' / 'V')) / ARMVectorRegister / SVE2PredicateRegister / ('{' WS? ARMVectorRegister (',' WS? ARMVectorRegister)* WS? '}' ('[' [0-9] [0-9]? ']')?))> */
 		func() bool {
-			position616, tokenIndex616 := position, tokenIndex
+			position628, tokenIndex628 := position, tokenIndex
 			{
-				position617 := position
+				position629 := position
 				{
-					position618, tokenIndex618 := position, tokenIndex
+					position630, tokenIndex630 := position, tokenIndex
 					{
-						position620, tokenIndex620 := position, tokenIndex
+						position632, tokenIndex632 := position, tokenIndex
 						if buffer[position] != rune('s') {
-							goto l621
+							goto l633
 						}
 						position++
-						goto l620
-					l621:
-						position, tokenIndex = position620, tokenIndex620
+						goto l632
+					l633:
+						position, tokenIndex = position632, tokenIndex632
 						if buffer[position] != rune('S') {
-							goto l619
-						}
-						position++
-					}
-				l620:
-					{
-						position622, tokenIndex622 := position, tokenIndex
-						if buffer[position] != rune('p') {
-							goto l623
-						}
-						position++
-						goto l622
-					l623:
-						position, tokenIndex = position622, tokenIndex622
-						if buffer[position] != rune('P') {
-							goto l619
-						}
-						position++
-					}
-				l622:
-					goto l618
-				l619:
-					position, tokenIndex = position618, tokenIndex618
-					{
-						position625, tokenIndex625 := position, tokenIndex
-						if buffer[position] != rune('x') {
-							goto l626
-						}
-						position++
-						goto l625
-					l626:
-						position, tokenIndex = position625, tokenIndex625
-						if buffer[position] != rune('w') {
-							goto l627
-						}
-						position++
-						goto l625
-					l627:
-						position, tokenIndex = position625, tokenIndex625
-						if buffer[position] != rune('d') {
-							goto l628
-						}
-						position++
-						goto l625
-					l628:
-						position, tokenIndex = position625, tokenIndex625
-						if buffer[position] != rune('q') {
-							goto l629
-						}
-						position++
-						goto l625
-					l629:
-						position, tokenIndex = position625, tokenIndex625
-						if buffer[position] != rune('s') {
-							goto l630
-						}
-						position++
-						goto l625
-					l630:
-						position, tokenIndex = position625, tokenIndex625
-						if buffer[position] != rune('h') {
 							goto l631
 						}
 						position++
-						goto l625
-					l631:
-						position, tokenIndex = position625, tokenIndex625
-						if buffer[position] != rune('b') {
-							goto l624
-						}
-						position++
 					}
-				l625:
-					if c := buffer[position]; c < rune('0') || c > rune('9') {
-						goto l624
-					}
-					position++
+				l632:
 					{
-						position632, tokenIndex632 := position, tokenIndex
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l632
+						position634, tokenIndex634 := position, tokenIndex
+						if buffer[position] != rune('p') {
+							goto l635
 						}
 						position++
-						goto l633
-					l632:
-						position, tokenIndex = position632, tokenIndex632
-					}
-				l633:
-					goto l618
-				l624:
-					position, tokenIndex = position618, tokenIndex618
-					{
-						position635, tokenIndex635 := position, tokenIndex
-						if buffer[position] != rune('x') {
-							goto l636
-						}
-						position++
-						goto l635
-					l636:
-						position, tokenIndex = position635, tokenIndex635
-						if buffer[position] != rune('X') {
-							goto l634
+						goto l634
+					l635:
+						position, tokenIndex = position634, tokenIndex634
+						if buffer[position] != rune('P') {
+							goto l631
 						}
 						position++
 					}
-				l635:
+				l634:
+					goto l630
+				l631:
+					position, tokenIndex = position630, tokenIndex630
 					{
 						position637, tokenIndex637 := position, tokenIndex
-						if buffer[position] != rune('z') {
+						if buffer[position] != rune('x') {
 							goto l638
 						}
 						position++
 						goto l637
 					l638:
 						position, tokenIndex = position637, tokenIndex637
-						if buffer[position] != rune('Z') {
-							goto l634
+						if buffer[position] != rune('w') {
+							goto l639
+						}
+						position++
+						goto l637
+					l639:
+						position, tokenIndex = position637, tokenIndex637
+						if buffer[position] != rune('d') {
+							goto l640
+						}
+						position++
+						goto l637
+					l640:
+						position, tokenIndex = position637, tokenIndex637
+						if buffer[position] != rune('q') {
+							goto l641
+						}
+						position++
+						goto l637
+					l641:
+						position, tokenIndex = position637, tokenIndex637
+						if buffer[position] != rune('s') {
+							goto l642
+						}
+						position++
+						goto l637
+					l642:
+						position, tokenIndex = position637, tokenIndex637
+						if buffer[position] != rune('h') {
+							goto l643
+						}
+						position++
+						goto l637
+					l643:
+						position, tokenIndex = position637, tokenIndex637
+						if buffer[position] != rune('b') {
+							goto l636
 						}
 						position++
 					}
 				l637:
-					{
-						position639, tokenIndex639 := position, tokenIndex
-						if buffer[position] != rune('r') {
-							goto l640
-						}
-						position++
-						goto l639
-					l640:
-						position, tokenIndex = position639, tokenIndex639
-						if buffer[position] != rune('R') {
-							goto l634
-						}
-						position++
+					if c := buffer[position]; c < rune('0') || c > rune('9') {
+						goto l636
 					}
-				l639:
-					goto l618
-				l634:
-					position, tokenIndex = position618, tokenIndex618
-					{
-						position642, tokenIndex642 := position, tokenIndex
-						if buffer[position] != rune('w') {
-							goto l643
-						}
-						position++
-						goto l642
-					l643:
-						position, tokenIndex = position642, tokenIndex642
-						if buffer[position] != rune('W') {
-							goto l641
-						}
-						position++
-					}
-				l642:
+					position++
 					{
 						position644, tokenIndex644 := position, tokenIndex
-						if buffer[position] != rune('z') {
-							goto l645
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l644
 						}
 						position++
-						goto l644
-					l645:
+						goto l645
+					l644:
 						position, tokenIndex = position644, tokenIndex644
-						if buffer[position] != rune('Z') {
-							goto l641
-						}
-						position++
 					}
-				l644:
+				l645:
+					goto l630
+				l636:
+					position, tokenIndex = position630, tokenIndex630
 					{
-						position646, tokenIndex646 := position, tokenIndex
-						if buffer[position] != rune('r') {
-							goto l647
+						position647, tokenIndex647 := position, tokenIndex
+						if buffer[position] != rune('x') {
+							goto l648
 						}
 						position++
-						goto l646
-					l647:
-						position, tokenIndex = position646, tokenIndex646
-						if buffer[position] != rune('R') {
-							goto l641
+						goto l647
+					l648:
+						position, tokenIndex = position647, tokenIndex647
+						if buffer[position] != rune('X') {
+							goto l646
 						}
 						position++
 					}
-				l646:
-					goto l618
-				l641:
-					position, tokenIndex = position618, tokenIndex618
+				l647:
 					{
 						position649, tokenIndex649 := position, tokenIndex
-						if buffer[position] != rune('n') {
+						if buffer[position] != rune('z') {
 							goto l650
 						}
 						position++
 						goto l649
 					l650:
 						position, tokenIndex = position649, tokenIndex649
-						if buffer[position] != rune('N') {
-							goto l648
+						if buffer[position] != rune('Z') {
+							goto l646
 						}
 						position++
 					}
 				l649:
 					{
 						position651, tokenIndex651 := position, tokenIndex
-						if buffer[position] != rune('z') {
+						if buffer[position] != rune('r') {
 							goto l652
 						}
 						position++
 						goto l651
 					l652:
 						position, tokenIndex = position651, tokenIndex651
-						if buffer[position] != rune('Z') {
-							goto l648
+						if buffer[position] != rune('R') {
+							goto l646
 						}
 						position++
 					}
 				l651:
+					goto l630
+				l646:
+					position, tokenIndex = position630, tokenIndex630
 					{
-						position653, tokenIndex653 := position, tokenIndex
-						if buffer[position] != rune('c') {
-							goto l654
+						position654, tokenIndex654 := position, tokenIndex
+						if buffer[position] != rune('w') {
+							goto l655
 						}
 						position++
-						goto l653
-					l654:
-						position, tokenIndex = position653, tokenIndex653
-						if buffer[position] != rune('C') {
-							goto l648
+						goto l654
+					l655:
+						position, tokenIndex = position654, tokenIndex654
+						if buffer[position] != rune('W') {
+							goto l653
 						}
 						position++
 					}
-				l653:
+				l654:
 					{
-						position655, tokenIndex655 := position, tokenIndex
-						if buffer[position] != rune('v') {
-							goto l656
+						position656, tokenIndex656 := position, tokenIndex
+						if buffer[position] != rune('z') {
+							goto l657
 						}
 						position++
-						goto l655
-					l656:
-						position, tokenIndex = position655, tokenIndex655
-						if buffer[position] != rune('V') {
-							goto l648
+						goto l656
+					l657:
+						position, tokenIndex = position656, tokenIndex656
+						if buffer[position] != rune('Z') {
+							goto l653
 						}
 						position++
 					}
-				l655:
-					goto l618
-				l648:
-					position, tokenIndex = position618, tokenIndex618
-					if !_rules[ruleARMVectorRegister]() {
-						goto l657
-					}
-					goto l618
-				l657:
-					position, tokenIndex = position618, tokenIndex618
-					if buffer[position] != rune('{') {
-						goto l616
-					}
-					position++
+				l656:
 					{
 						position658, tokenIndex658 := position, tokenIndex
-						if !_rules[ruleWS]() {
-							goto l658
+						if buffer[position] != rune('r') {
+							goto l659
 						}
-						goto l659
-					l658:
+						position++
+						goto l658
+					l659:
 						position, tokenIndex = position658, tokenIndex658
+						if buffer[position] != rune('R') {
+							goto l653
+						}
+						position++
 					}
-				l659:
-					if !_rules[ruleARMVectorRegister]() {
-						goto l616
-					}
-				l660:
+				l658:
+					goto l630
+				l653:
+					position, tokenIndex = position630, tokenIndex630
 					{
 						position661, tokenIndex661 := position, tokenIndex
-						if buffer[position] != rune(',') {
-							goto l661
+						if buffer[position] != rune('n') {
+							goto l662
 						}
 						position++
-						{
-							position662, tokenIndex662 := position, tokenIndex
-							if !_rules[ruleWS]() {
-								goto l662
-							}
-							goto l663
-						l662:
-							position, tokenIndex = position662, tokenIndex662
-						}
-					l663:
-						if !_rules[ruleARMVectorRegister]() {
-							goto l661
-						}
-						goto l660
-					l661:
+						goto l661
+					l662:
 						position, tokenIndex = position661, tokenIndex661
+						if buffer[position] != rune('N') {
+							goto l660
+						}
+						position++
 					}
+				l661:
 					{
-						position664, tokenIndex664 := position, tokenIndex
-						if !_rules[ruleWS]() {
+						position663, tokenIndex663 := position, tokenIndex
+						if buffer[position] != rune('z') {
 							goto l664
 						}
-						goto l665
+						position++
+						goto l663
 					l664:
-						position, tokenIndex = position664, tokenIndex664
+						position, tokenIndex = position663, tokenIndex663
+						if buffer[position] != rune('Z') {
+							goto l660
+						}
+						position++
+					}
+				l663:
+					{
+						position665, tokenIndex665 := position, tokenIndex
+						if buffer[position] != rune('c') {
+							goto l666
+						}
+						position++
+						goto l665
+					l666:
+						position, tokenIndex = position665, tokenIndex665
+						if buffer[position] != rune('C') {
+							goto l660
+						}
+						position++
 					}
 				l665:
-					if buffer[position] != rune('}') {
-						goto l616
-					}
-					position++
 					{
-						position666, tokenIndex666 := position, tokenIndex
-						if buffer[position] != rune('[') {
-							goto l666
-						}
-						position++
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l666
-						}
-						position++
-						{
-							position668, tokenIndex668 := position, tokenIndex
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l668
-							}
-							position++
-							goto l669
-						l668:
-							position, tokenIndex = position668, tokenIndex668
-						}
-					l669:
-						if buffer[position] != rune(']') {
-							goto l666
+						position667, tokenIndex667 := position, tokenIndex
+						if buffer[position] != rune('v') {
+							goto l668
 						}
 						position++
 						goto l667
-					l666:
-						position, tokenIndex = position666, tokenIndex666
+					l668:
+						position, tokenIndex = position667, tokenIndex667
+						if buffer[position] != rune('V') {
+							goto l660
+						}
+						position++
 					}
 				l667:
-				}
-			l618:
-				add(ruleARMRegister, position617)
-			}
-			return true
-		l616:
-			position, tokenIndex = position616, tokenIndex616
-			return false
-		},
-		/* 45 ARMVectorRegister <- <(('v' / 'V') [0-9] [0-9]? ('.' [0-9]* ('b' / 's' / 'd' / 'h' / 'q') ('[' [0-9] [0-9]? ']')?)?)> */
-		func() bool {
-			position670, tokenIndex670 := position, tokenIndex
-			{
-				position671 := position
-				{
-					position672, tokenIndex672 := position, tokenIndex
-					if buffer[position] != rune('v') {
-						goto l673
+					goto l630
+				l660:
+					position, tokenIndex = position630, tokenIndex630
+					if !_rules[ruleARMVectorRegister]() {
+						goto l669
 					}
-					position++
-					goto l672
-				l673:
-					position, tokenIndex = position672, tokenIndex672
-					if buffer[position] != rune('V') {
+					goto l630
+				l669:
+					position, tokenIndex = position630, tokenIndex630
+					if !_rules[ruleSVE2PredicateRegister]() {
 						goto l670
 					}
-					position++
-				}
-			l672:
-				if c := buffer[position]; c < rune('0') || c > rune('9') {
-					goto l670
-				}
-				position++
-				{
-					position674, tokenIndex674 := position, tokenIndex
-					if c := buffer[position]; c < rune('0') || c > rune('9') {
-						goto l674
+					goto l630
+				l670:
+					position, tokenIndex = position630, tokenIndex630
+					if buffer[position] != rune('{') {
+						goto l628
 					}
 					position++
-					goto l675
-				l674:
-					position, tokenIndex = position674, tokenIndex674
-				}
-			l675:
-				{
-					position676, tokenIndex676 := position, tokenIndex
-					if buffer[position] != rune('.') {
-						goto l676
+					{
+						position671, tokenIndex671 := position, tokenIndex
+						if !_rules[ruleWS]() {
+							goto l671
+						}
+						goto l672
+					l671:
+						position, tokenIndex = position671, tokenIndex671
 					}
-					position++
+				l672:
+					if !_rules[ruleARMVectorRegister]() {
+						goto l628
+					}
+				l673:
+					{
+						position674, tokenIndex674 := position, tokenIndex
+						if buffer[position] != rune(',') {
+							goto l674
+						}
+						position++
+						{
+							position675, tokenIndex675 := position, tokenIndex
+							if !_rules[ruleWS]() {
+								goto l675
+							}
+							goto l676
+						l675:
+							position, tokenIndex = position675, tokenIndex675
+						}
+					l676:
+						if !_rules[ruleARMVectorRegister]() {
+							goto l674
+						}
+						goto l673
+					l674:
+						position, tokenIndex = position674, tokenIndex674
+					}
+					{
+						position677, tokenIndex677 := position, tokenIndex
+						if !_rules[ruleWS]() {
+							goto l677
+						}
+						goto l678
+					l677:
+						position, tokenIndex = position677, tokenIndex677
+					}
 				l678:
+					if buffer[position] != rune('}') {
+						goto l628
+					}
+					position++
 					{
 						position679, tokenIndex679 := position, tokenIndex
+						if buffer[position] != rune('[') {
+							goto l679
+						}
+						position++
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
 							goto l679
 						}
 						position++
-						goto l678
+						{
+							position681, tokenIndex681 := position, tokenIndex
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l681
+							}
+							position++
+							goto l682
+						l681:
+							position, tokenIndex = position681, tokenIndex681
+						}
+					l682:
+						if buffer[position] != rune(']') {
+							goto l679
+						}
+						position++
+						goto l680
 					l679:
 						position, tokenIndex = position679, tokenIndex679
 					}
+				l680:
+				}
+			l630:
+				add(ruleARMRegister, position629)
+			}
+			return true
+		l628:
+			position, tokenIndex = position628, tokenIndex628
+			return false
+		},
+		/* 45 ARMVectorRegister <- <(('v' / 'z') [0-9] [0-9]? ('.' [0-9]* ('b' / 's' / 'd' / 'h' / 'q') ('[' [0-9] [0-9]? ']')?)?)> */
+		func() bool {
+			position683, tokenIndex683 := position, tokenIndex
+			{
+				position684 := position
+				{
+					position685, tokenIndex685 := position, tokenIndex
+					if buffer[position] != rune('v') {
+						goto l686
+					}
+					position++
+					goto l685
+				l686:
+					position, tokenIndex = position685, tokenIndex685
+					if buffer[position] != rune('z') {
+						goto l683
+					}
+					position++
+				}
+			l685:
+				if c := buffer[position]; c < rune('0') || c > rune('9') {
+					goto l683
+				}
+				position++
+				{
+					position687, tokenIndex687 := position, tokenIndex
+					if c := buffer[position]; c < rune('0') || c > rune('9') {
+						goto l687
+					}
+					position++
+					goto l688
+				l687:
+					position, tokenIndex = position687, tokenIndex687
+				}
+			l688:
+				{
+					position689, tokenIndex689 := position, tokenIndex
+					if buffer[position] != rune('.') {
+						goto l689
+					}
+					position++
+				l691:
 					{
-						position680, tokenIndex680 := position, tokenIndex
+						position692, tokenIndex692 := position, tokenIndex
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l692
+						}
+						position++
+						goto l691
+					l692:
+						position, tokenIndex = position692, tokenIndex692
+					}
+					{
+						position693, tokenIndex693 := position, tokenIndex
 						if buffer[position] != rune('b') {
-							goto l681
+							goto l694
 						}
 						position++
-						goto l680
-					l681:
-						position, tokenIndex = position680, tokenIndex680
+						goto l693
+					l694:
+						position, tokenIndex = position693, tokenIndex693
 						if buffer[position] != rune('s') {
-							goto l682
+							goto l695
 						}
 						position++
-						goto l680
-					l682:
-						position, tokenIndex = position680, tokenIndex680
+						goto l693
+					l695:
+						position, tokenIndex = position693, tokenIndex693
 						if buffer[position] != rune('d') {
-							goto l683
+							goto l696
 						}
 						position++
-						goto l680
-					l683:
-						position, tokenIndex = position680, tokenIndex680
+						goto l693
+					l696:
+						position, tokenIndex = position693, tokenIndex693
 						if buffer[position] != rune('h') {
-							goto l684
+							goto l697
 						}
 						position++
-						goto l680
-					l684:
-						position, tokenIndex = position680, tokenIndex680
+						goto l693
+					l697:
+						position, tokenIndex = position693, tokenIndex693
 						if buffer[position] != rune('q') {
-							goto l676
+							goto l689
 						}
 						position++
 					}
-				l680:
+				l693:
 					{
-						position685, tokenIndex685 := position, tokenIndex
+						position698, tokenIndex698 := position, tokenIndex
 						if buffer[position] != rune('[') {
-							goto l685
+							goto l698
 						}
 						position++
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l685
+							goto l698
 						}
 						position++
 						{
-							position687, tokenIndex687 := position, tokenIndex
+							position700, tokenIndex700 := position, tokenIndex
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l687
+								goto l700
 							}
 							position++
-							goto l688
-						l687:
-							position, tokenIndex = position687, tokenIndex687
+							goto l701
+						l700:
+							position, tokenIndex = position700, tokenIndex700
 						}
-					l688:
+					l701:
 						if buffer[position] != rune(']') {
-							goto l685
+							goto l698
 						}
 						position++
-						goto l686
-					l685:
-						position, tokenIndex = position685, tokenIndex685
-					}
-				l686:
-					goto l677
-				l676:
-					position, tokenIndex = position676, tokenIndex676
-				}
-			l677:
-				add(ruleARMVectorRegister, position671)
-			}
-			return true
-		l670:
-			position, tokenIndex = position670, tokenIndex670
-			return false
-		},
-		/* 46 MemoryRef <- <((SymbolRef BaseIndexScale) / SymbolRef / Low12BitsSymbolRef / (Offset* BaseIndexScale) / (SegmentRegister Offset BaseIndexScale) / (SegmentRegister BaseIndexScale) / (SegmentRegister Offset) / ARMBaseIndexScale / BaseIndexScale)> */
-		func() bool {
-			position689, tokenIndex689 := position, tokenIndex
-			{
-				position690 := position
-				{
-					position691, tokenIndex691 := position, tokenIndex
-					if !_rules[ruleSymbolRef]() {
-						goto l692
-					}
-					if !_rules[ruleBaseIndexScale]() {
-						goto l692
-					}
-					goto l691
-				l692:
-					position, tokenIndex = position691, tokenIndex691
-					if !_rules[ruleSymbolRef]() {
-						goto l693
-					}
-					goto l691
-				l693:
-					position, tokenIndex = position691, tokenIndex691
-					if !_rules[ruleLow12BitsSymbolRef]() {
-						goto l694
-					}
-					goto l691
-				l694:
-					position, tokenIndex = position691, tokenIndex691
-				l696:
-					{
-						position697, tokenIndex697 := position, tokenIndex
-						if !_rules[ruleOffset]() {
-							goto l697
-						}
-						goto l696
-					l697:
-						position, tokenIndex = position697, tokenIndex697
-					}
-					if !_rules[ruleBaseIndexScale]() {
-						goto l695
-					}
-					goto l691
-				l695:
-					position, tokenIndex = position691, tokenIndex691
-					if !_rules[ruleSegmentRegister]() {
-						goto l698
-					}
-					if !_rules[ruleOffset]() {
-						goto l698
-					}
-					if !_rules[ruleBaseIndexScale]() {
-						goto l698
-					}
-					goto l691
-				l698:
-					position, tokenIndex = position691, tokenIndex691
-					if !_rules[ruleSegmentRegister]() {
 						goto l699
+					l698:
+						position, tokenIndex = position698, tokenIndex698
 					}
-					if !_rules[ruleBaseIndexScale]() {
-						goto l699
-					}
-					goto l691
 				l699:
-					position, tokenIndex = position691, tokenIndex691
-					if !_rules[ruleSegmentRegister]() {
-						goto l700
-					}
-					if !_rules[ruleOffset]() {
-						goto l700
-					}
-					goto l691
-				l700:
-					position, tokenIndex = position691, tokenIndex691
-					if !_rules[ruleARMBaseIndexScale]() {
-						goto l701
-					}
-					goto l691
-				l701:
-					position, tokenIndex = position691, tokenIndex691
-					if !_rules[ruleBaseIndexScale]() {
-						goto l689
-					}
+					goto l690
+				l689:
+					position, tokenIndex = position689, tokenIndex689
 				}
-			l691:
-				add(ruleMemoryRef, position690)
+			l690:
+				add(ruleARMVectorRegister, position684)
 			}
 			return true
-		l689:
-			position, tokenIndex = position689, tokenIndex689
+		l683:
+			position, tokenIndex = position683, tokenIndex683
 			return false
 		},
-		/* 47 SymbolRef <- <((Offset* '+')? (LocalSymbol / SymbolName) Offset* ('@' Section Offset*)?)> */
+		/* 46 SVE2PredicateRegister <- <(('p' / 'P') [0-9] [0-9]? '/' ('m' / 'M' / 'z' / 'Z'))> */
 		func() bool {
 			position702, tokenIndex702 := position, tokenIndex
 			{
 				position703 := position
 				{
 					position704, tokenIndex704 := position, tokenIndex
-				l706:
-					{
-						position707, tokenIndex707 := position, tokenIndex
-						if !_rules[ruleOffset]() {
-							goto l707
-						}
-						goto l706
-					l707:
-						position, tokenIndex = position707, tokenIndex707
-					}
-					if buffer[position] != rune('+') {
-						goto l704
+					if buffer[position] != rune('p') {
+						goto l705
 					}
 					position++
-					goto l705
-				l704:
+					goto l704
+				l705:
 					position, tokenIndex = position704, tokenIndex704
+					if buffer[position] != rune('P') {
+						goto l702
+					}
+					position++
 				}
-			l705:
+			l704:
+				if c := buffer[position]; c < rune('0') || c > rune('9') {
+					goto l702
+				}
+				position++
+				{
+					position706, tokenIndex706 := position, tokenIndex
+					if c := buffer[position]; c < rune('0') || c > rune('9') {
+						goto l706
+					}
+					position++
+					goto l707
+				l706:
+					position, tokenIndex = position706, tokenIndex706
+				}
+			l707:
+				if buffer[position] != rune('/') {
+					goto l702
+				}
+				position++
 				{
 					position708, tokenIndex708 := position, tokenIndex
-					if !_rules[ruleLocalSymbol]() {
+					if buffer[position] != rune('m') {
 						goto l709
 					}
+					position++
 					goto l708
 				l709:
 					position, tokenIndex = position708, tokenIndex708
-					if !_rules[ruleSymbolName]() {
-						goto l702
-					}
-				}
-			l708:
-			l710:
-				{
-					position711, tokenIndex711 := position, tokenIndex
-					if !_rules[ruleOffset]() {
-						goto l711
-					}
-					goto l710
-				l711:
-					position, tokenIndex = position711, tokenIndex711
-				}
-				{
-					position712, tokenIndex712 := position, tokenIndex
-					if buffer[position] != rune('@') {
-						goto l712
+					if buffer[position] != rune('M') {
+						goto l710
 					}
 					position++
-					if !_rules[ruleSection]() {
-						goto l712
+					goto l708
+				l710:
+					position, tokenIndex = position708, tokenIndex708
+					if buffer[position] != rune('z') {
+						goto l711
 					}
-				l714:
-					{
-						position715, tokenIndex715 := position, tokenIndex
-						if !_rules[ruleOffset]() {
-							goto l715
-						}
-						goto l714
-					l715:
-						position, tokenIndex = position715, tokenIndex715
+					position++
+					goto l708
+				l711:
+					position, tokenIndex = position708, tokenIndex708
+					if buffer[position] != rune('Z') {
+						goto l702
 					}
-					goto l713
-				l712:
-					position, tokenIndex = position712, tokenIndex712
+					position++
 				}
-			l713:
-				add(ruleSymbolRef, position703)
+			l708:
+				add(ruleSVE2PredicateRegister, position703)
 			}
 			return true
 		l702:
 			position, tokenIndex = position702, tokenIndex702
 			return false
 		},
-		/* 48 Low12BitsSymbolRef <- <(':' ('l' / 'L') ('o' / 'O') '1' '2' ':' (LocalSymbol / SymbolName) Offset?)> */
+		/* 47 MemoryRef <- <((SymbolRef BaseIndexScale) / SymbolRef / Low12BitsSymbolRef / (Offset* BaseIndexScale) / (SegmentRegister Offset BaseIndexScale) / (SegmentRegister BaseIndexScale) / (SegmentRegister Offset) / ARMBaseIndexScale / BaseIndexScale)> */
 		func() bool {
-			position716, tokenIndex716 := position, tokenIndex
+			position712, tokenIndex712 := position, tokenIndex
 			{
-				position717 := position
-				if buffer[position] != rune(':') {
-					goto l716
-				}
-				position++
+				position713 := position
 				{
-					position718, tokenIndex718 := position, tokenIndex
-					if buffer[position] != rune('l') {
-						goto l719
+					position714, tokenIndex714 := position, tokenIndex
+					if !_rules[ruleSymbolRef]() {
+						goto l715
 					}
-					position++
-					goto l718
-				l719:
-					position, tokenIndex = position718, tokenIndex718
-					if buffer[position] != rune('L') {
+					if !_rules[ruleBaseIndexScale]() {
+						goto l715
+					}
+					goto l714
+				l715:
+					position, tokenIndex = position714, tokenIndex714
+					if !_rules[ruleSymbolRef]() {
 						goto l716
 					}
-					position++
-				}
-			l718:
-				{
-					position720, tokenIndex720 := position, tokenIndex
-					if buffer[position] != rune('o') {
+					goto l714
+				l716:
+					position, tokenIndex = position714, tokenIndex714
+					if !_rules[ruleLow12BitsSymbolRef]() {
+						goto l717
+					}
+					goto l714
+				l717:
+					position, tokenIndex = position714, tokenIndex714
+				l719:
+					{
+						position720, tokenIndex720 := position, tokenIndex
+						if !_rules[ruleOffset]() {
+							goto l720
+						}
+						goto l719
+					l720:
+						position, tokenIndex = position720, tokenIndex720
+					}
+					if !_rules[ruleBaseIndexScale]() {
+						goto l718
+					}
+					goto l714
+				l718:
+					position, tokenIndex = position714, tokenIndex714
+					if !_rules[ruleSegmentRegister]() {
 						goto l721
 					}
-					position++
-					goto l720
-				l721:
-					position, tokenIndex = position720, tokenIndex720
-					if buffer[position] != rune('O') {
-						goto l716
+					if !_rules[ruleOffset]() {
+						goto l721
 					}
-					position++
-				}
-			l720:
-				if buffer[position] != rune('1') {
-					goto l716
-				}
-				position++
-				if buffer[position] != rune('2') {
-					goto l716
-				}
-				position++
-				if buffer[position] != rune(':') {
-					goto l716
-				}
-				position++
-				{
-					position722, tokenIndex722 := position, tokenIndex
-					if !_rules[ruleLocalSymbol]() {
+					if !_rules[ruleBaseIndexScale]() {
+						goto l721
+					}
+					goto l714
+				l721:
+					position, tokenIndex = position714, tokenIndex714
+					if !_rules[ruleSegmentRegister]() {
+						goto l722
+					}
+					if !_rules[ruleBaseIndexScale]() {
+						goto l722
+					}
+					goto l714
+				l722:
+					position, tokenIndex = position714, tokenIndex714
+					if !_rules[ruleSegmentRegister]() {
 						goto l723
 					}
-					goto l722
-				l723:
-					position, tokenIndex = position722, tokenIndex722
-					if !_rules[ruleSymbolName]() {
-						goto l716
-					}
-				}
-			l722:
-				{
-					position724, tokenIndex724 := position, tokenIndex
 					if !_rules[ruleOffset]() {
+						goto l723
+					}
+					goto l714
+				l723:
+					position, tokenIndex = position714, tokenIndex714
+					if !_rules[ruleARMBaseIndexScale]() {
 						goto l724
 					}
-					goto l725
+					goto l714
 				l724:
-					position, tokenIndex = position724, tokenIndex724
+					position, tokenIndex = position714, tokenIndex714
+					if !_rules[ruleBaseIndexScale]() {
+						goto l712
+					}
 				}
-			l725:
-				add(ruleLow12BitsSymbolRef, position717)
+			l714:
+				add(ruleMemoryRef, position713)
 			}
 			return true
-		l716:
-			position, tokenIndex = position716, tokenIndex716
+		l712:
+			position, tokenIndex = position712, tokenIndex712
 			return false
 		},
-		/* 49 ARMBaseIndexScale <- <('[' ARMRegister (',' WS? (('#' Offset (('*' [0-9]+) / ('*' '(' [0-9]+ Operator [0-9]+ ')') / ('+' [0-9]+)*)?) / ARMGOTLow12 / Low12BitsSymbolRef / ARMRegister) (',' WS? ARMConstantTweak)?)? ']' ARMPostincrement?)> */
+		/* 48 SymbolRef <- <((Offset* '+')? (LocalSymbol / SymbolName) Offset* ('@' Section Offset*)?)> */
 		func() bool {
-			position726, tokenIndex726 := position, tokenIndex
+			position725, tokenIndex725 := position, tokenIndex
 			{
-				position727 := position
-				if buffer[position] != rune('[') {
-					goto l726
-				}
-				position++
-				if !_rules[ruleARMRegister]() {
-					goto l726
-				}
+				position726 := position
 				{
-					position728, tokenIndex728 := position, tokenIndex
-					if buffer[position] != rune(',') {
-						goto l728
-					}
-					position++
+					position727, tokenIndex727 := position, tokenIndex
+				l729:
 					{
 						position730, tokenIndex730 := position, tokenIndex
-						if !_rules[ruleWS]() {
+						if !_rules[ruleOffset]() {
 							goto l730
 						}
-						goto l731
+						goto l729
 					l730:
 						position, tokenIndex = position730, tokenIndex730
 					}
-				l731:
-					{
-						position732, tokenIndex732 := position, tokenIndex
-						if buffer[position] != rune('#') {
-							goto l733
-						}
-						position++
-						if !_rules[ruleOffset]() {
-							goto l733
-						}
-						{
-							position734, tokenIndex734 := position, tokenIndex
-							{
-								position736, tokenIndex736 := position, tokenIndex
-								if buffer[position] != rune('*') {
-									goto l737
-								}
-								position++
-								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l737
-								}
-								position++
-							l738:
-								{
-									position739, tokenIndex739 := position, tokenIndex
-									if c := buffer[position]; c < rune('0') || c > rune('9') {
-										goto l739
-									}
-									position++
-									goto l738
-								l739:
-									position, tokenIndex = position739, tokenIndex739
-								}
-								goto l736
-							l737:
-								position, tokenIndex = position736, tokenIndex736
-								if buffer[position] != rune('*') {
-									goto l740
-								}
-								position++
-								if buffer[position] != rune('(') {
-									goto l740
-								}
-								position++
-								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l740
-								}
-								position++
-							l741:
-								{
-									position742, tokenIndex742 := position, tokenIndex
-									if c := buffer[position]; c < rune('0') || c > rune('9') {
-										goto l742
-									}
-									position++
-									goto l741
-								l742:
-									position, tokenIndex = position742, tokenIndex742
-								}
-								if !_rules[ruleOperator]() {
-									goto l740
-								}
-								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l740
-								}
-								position++
-							l743:
-								{
-									position744, tokenIndex744 := position, tokenIndex
-									if c := buffer[position]; c < rune('0') || c > rune('9') {
-										goto l744
-									}
-									position++
-									goto l743
-								l744:
-									position, tokenIndex = position744, tokenIndex744
-								}
-								if buffer[position] != rune(')') {
-									goto l740
-								}
-								position++
-								goto l736
-							l740:
-								position, tokenIndex = position736, tokenIndex736
-							l745:
-								{
-									position746, tokenIndex746 := position, tokenIndex
-									if buffer[position] != rune('+') {
-										goto l746
-									}
-									position++
-									if c := buffer[position]; c < rune('0') || c > rune('9') {
-										goto l746
-									}
-									position++
-								l747:
-									{
-										position748, tokenIndex748 := position, tokenIndex
-										if c := buffer[position]; c < rune('0') || c > rune('9') {
-											goto l748
-										}
-										position++
-										goto l747
-									l748:
-										position, tokenIndex = position748, tokenIndex748
-									}
-									goto l745
-								l746:
-									position, tokenIndex = position746, tokenIndex746
-								}
-							}
-						l736:
-							goto l735
-
-							position, tokenIndex = position734, tokenIndex734
-						}
-					l735:
-						goto l732
-					l733:
-						position, tokenIndex = position732, tokenIndex732
-						if !_rules[ruleARMGOTLow12]() {
-							goto l749
-						}
-						goto l732
-					l749:
-						position, tokenIndex = position732, tokenIndex732
-						if !_rules[ruleLow12BitsSymbolRef]() {
-							goto l750
-						}
-						goto l732
-					l750:
-						position, tokenIndex = position732, tokenIndex732
-						if !_rules[ruleARMRegister]() {
-							goto l728
-						}
+					if buffer[position] != rune('+') {
+						goto l727
 					}
-				l732:
-					{
-						position751, tokenIndex751 := position, tokenIndex
-						if buffer[position] != rune(',') {
-							goto l751
-						}
-						position++
-						{
-							position753, tokenIndex753 := position, tokenIndex
-							if !_rules[ruleWS]() {
-								goto l753
-							}
-							goto l754
-						l753:
-							position, tokenIndex = position753, tokenIndex753
-						}
-					l754:
-						if !_rules[ruleARMConstantTweak]() {
-							goto l751
-						}
-						goto l752
-					l751:
-						position, tokenIndex = position751, tokenIndex751
-					}
-				l752:
-					goto l729
-				l728:
-					position, tokenIndex = position728, tokenIndex728
+					position++
+					goto l728
+				l727:
+					position, tokenIndex = position727, tokenIndex727
 				}
-			l729:
-				if buffer[position] != rune(']') {
-					goto l726
-				}
-				position++
+			l728:
 				{
-					position755, tokenIndex755 := position, tokenIndex
-					if !_rules[ruleARMPostincrement]() {
-						goto l755
+					position731, tokenIndex731 := position, tokenIndex
+					if !_rules[ruleLocalSymbol]() {
+						goto l732
 					}
-					goto l756
-				l755:
-					position, tokenIndex = position755, tokenIndex755
+					goto l731
+				l732:
+					position, tokenIndex = position731, tokenIndex731
+					if !_rules[ruleSymbolName]() {
+						goto l725
+					}
 				}
-			l756:
-				add(ruleARMBaseIndexScale, position727)
+			l731:
+			l733:
+				{
+					position734, tokenIndex734 := position, tokenIndex
+					if !_rules[ruleOffset]() {
+						goto l734
+					}
+					goto l733
+				l734:
+					position, tokenIndex = position734, tokenIndex734
+				}
+				{
+					position735, tokenIndex735 := position, tokenIndex
+					if buffer[position] != rune('@') {
+						goto l735
+					}
+					position++
+					if !_rules[ruleSection]() {
+						goto l735
+					}
+				l737:
+					{
+						position738, tokenIndex738 := position, tokenIndex
+						if !_rules[ruleOffset]() {
+							goto l738
+						}
+						goto l737
+					l738:
+						position, tokenIndex = position738, tokenIndex738
+					}
+					goto l736
+				l735:
+					position, tokenIndex = position735, tokenIndex735
+				}
+			l736:
+				add(ruleSymbolRef, position726)
 			}
 			return true
-		l726:
-			position, tokenIndex = position726, tokenIndex726
+		l725:
+			position, tokenIndex = position725, tokenIndex725
 			return false
 		},
-		/* 50 ARMGOTLow12 <- <(':' ('g' / 'G') ('o' / 'O') ('t' / 'T') '_' ('l' / 'L') ('o' / 'O') '1' '2' ':' SymbolName)> */
+		/* 49 Low12BitsSymbolRef <- <(':' ('l' / 'L') ('o' / 'O') '1' '2' ':' (LocalSymbol / SymbolName) Offset?)> */
 		func() bool {
-			position757, tokenIndex757 := position, tokenIndex
+			position739, tokenIndex739 := position, tokenIndex
 			{
-				position758 := position
+				position740 := position
 				if buffer[position] != rune(':') {
-					goto l757
+					goto l739
 				}
 				position++
 				{
-					position759, tokenIndex759 := position, tokenIndex
-					if buffer[position] != rune('g') {
-						goto l760
-					}
-					position++
-					goto l759
-				l760:
-					position, tokenIndex = position759, tokenIndex759
-					if buffer[position] != rune('G') {
-						goto l757
-					}
-					position++
-				}
-			l759:
-				{
-					position761, tokenIndex761 := position, tokenIndex
-					if buffer[position] != rune('o') {
-						goto l762
-					}
-					position++
-					goto l761
-				l762:
-					position, tokenIndex = position761, tokenIndex761
-					if buffer[position] != rune('O') {
-						goto l757
-					}
-					position++
-				}
-			l761:
-				{
-					position763, tokenIndex763 := position, tokenIndex
-					if buffer[position] != rune('t') {
-						goto l764
-					}
-					position++
-					goto l763
-				l764:
-					position, tokenIndex = position763, tokenIndex763
-					if buffer[position] != rune('T') {
-						goto l757
-					}
-					position++
-				}
-			l763:
-				if buffer[position] != rune('_') {
-					goto l757
-				}
-				position++
-				{
-					position765, tokenIndex765 := position, tokenIndex
+					position741, tokenIndex741 := position, tokenIndex
 					if buffer[position] != rune('l') {
-						goto l766
+						goto l742
 					}
 					position++
-					goto l765
-				l766:
-					position, tokenIndex = position765, tokenIndex765
+					goto l741
+				l742:
+					position, tokenIndex = position741, tokenIndex741
 					if buffer[position] != rune('L') {
-						goto l757
+						goto l739
 					}
 					position++
 				}
-			l765:
+			l741:
 				{
-					position767, tokenIndex767 := position, tokenIndex
+					position743, tokenIndex743 := position, tokenIndex
 					if buffer[position] != rune('o') {
-						goto l768
+						goto l744
 					}
 					position++
-					goto l767
-				l768:
-					position, tokenIndex = position767, tokenIndex767
+					goto l743
+				l744:
+					position, tokenIndex = position743, tokenIndex743
 					if buffer[position] != rune('O') {
-						goto l757
+						goto l739
 					}
 					position++
 				}
-			l767:
+			l743:
 				if buffer[position] != rune('1') {
-					goto l757
+					goto l739
 				}
 				position++
 				if buffer[position] != rune('2') {
-					goto l757
+					goto l739
 				}
 				position++
 				if buffer[position] != rune(':') {
-					goto l757
+					goto l739
 				}
 				position++
-				if !_rules[ruleSymbolName]() {
-					goto l757
+				{
+					position745, tokenIndex745 := position, tokenIndex
+					if !_rules[ruleLocalSymbol]() {
+						goto l746
+					}
+					goto l745
+				l746:
+					position, tokenIndex = position745, tokenIndex745
+					if !_rules[ruleSymbolName]() {
+						goto l739
+					}
 				}
-				add(ruleARMGOTLow12, position758)
+			l745:
+				{
+					position747, tokenIndex747 := position, tokenIndex
+					if !_rules[ruleOffset]() {
+						goto l747
+					}
+					goto l748
+				l747:
+					position, tokenIndex = position747, tokenIndex747
+				}
+			l748:
+				add(ruleLow12BitsSymbolRef, position740)
 			}
 			return true
-		l757:
-			position, tokenIndex = position757, tokenIndex757
+		l739:
+			position, tokenIndex = position739, tokenIndex739
 			return false
 		},
-		/* 51 ARMPostincrement <- <'!'> */
+		/* 50 ARMBaseIndexScale <- <('[' ARMRegister (',' WS? (('#' Offset (('*' [0-9]+) / ('*' '(' [0-9]+ Operator [0-9]+ ')') / ('+' [0-9]+)*)?) / ARMGOTLow12 / Low12BitsSymbolRef / ARMRegister) (',' WS? ARMConstantTweak)?)? ']' ARMPostincrement?)> */
 		func() bool {
-			position769, tokenIndex769 := position, tokenIndex
+			position749, tokenIndex749 := position, tokenIndex
 			{
-				position770 := position
-				if buffer[position] != rune('!') {
-					goto l769
+				position750 := position
+				if buffer[position] != rune('[') {
+					goto l749
 				}
 				position++
-				add(ruleARMPostincrement, position770)
-			}
-			return true
-		l769:
-			position, tokenIndex = position769, tokenIndex769
-			return false
-		},
-		/* 52 BaseIndexScale <- <('(' RegisterOrConstant? WS? (',' WS? RegisterOrConstant WS? (',' [0-9]+)?)? ')')> */
-		func() bool {
-			position771, tokenIndex771 := position, tokenIndex
-			{
-				position772 := position
-				if buffer[position] != rune('(') {
-					goto l771
+				if !_rules[ruleARMRegister]() {
+					goto l749
 				}
-				position++
 				{
-					position773, tokenIndex773 := position, tokenIndex
-					if !_rules[ruleRegisterOrConstant]() {
-						goto l773
-					}
-					goto l774
-				l773:
-					position, tokenIndex = position773, tokenIndex773
-				}
-			l774:
-				{
-					position775, tokenIndex775 := position, tokenIndex
-					if !_rules[ruleWS]() {
-						goto l775
-					}
-					goto l776
-				l775:
-					position, tokenIndex = position775, tokenIndex775
-				}
-			l776:
-				{
-					position777, tokenIndex777 := position, tokenIndex
+					position751, tokenIndex751 := position, tokenIndex
 					if buffer[position] != rune(',') {
-						goto l777
+						goto l751
 					}
 					position++
 					{
-						position779, tokenIndex779 := position, tokenIndex
+						position753, tokenIndex753 := position, tokenIndex
 						if !_rules[ruleWS]() {
-							goto l779
+							goto l753
 						}
-						goto l780
-					l779:
-						position, tokenIndex = position779, tokenIndex779
+						goto l754
+					l753:
+						position, tokenIndex = position753, tokenIndex753
 					}
-				l780:
-					if !_rules[ruleRegisterOrConstant]() {
-						goto l777
-					}
+				l754:
 					{
-						position781, tokenIndex781 := position, tokenIndex
-						if !_rules[ruleWS]() {
-							goto l781
-						}
-						goto l782
-					l781:
-						position, tokenIndex = position781, tokenIndex781
-					}
-				l782:
-					{
-						position783, tokenIndex783 := position, tokenIndex
-						if buffer[position] != rune(',') {
-							goto l783
+						position755, tokenIndex755 := position, tokenIndex
+						if buffer[position] != rune('#') {
+							goto l756
 						}
 						position++
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l783
+						if !_rules[ruleOffset]() {
+							goto l756
 						}
-						position++
-					l785:
 						{
-							position786, tokenIndex786 := position, tokenIndex
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l786
+							position757, tokenIndex757 := position, tokenIndex
+							{
+								position759, tokenIndex759 := position, tokenIndex
+								if buffer[position] != rune('*') {
+									goto l760
+								}
+								position++
+								if c := buffer[position]; c < rune('0') || c > rune('9') {
+									goto l760
+								}
+								position++
+							l761:
+								{
+									position762, tokenIndex762 := position, tokenIndex
+									if c := buffer[position]; c < rune('0') || c > rune('9') {
+										goto l762
+									}
+									position++
+									goto l761
+								l762:
+									position, tokenIndex = position762, tokenIndex762
+								}
+								goto l759
+							l760:
+								position, tokenIndex = position759, tokenIndex759
+								if buffer[position] != rune('*') {
+									goto l763
+								}
+								position++
+								if buffer[position] != rune('(') {
+									goto l763
+								}
+								position++
+								if c := buffer[position]; c < rune('0') || c > rune('9') {
+									goto l763
+								}
+								position++
+							l764:
+								{
+									position765, tokenIndex765 := position, tokenIndex
+									if c := buffer[position]; c < rune('0') || c > rune('9') {
+										goto l765
+									}
+									position++
+									goto l764
+								l765:
+									position, tokenIndex = position765, tokenIndex765
+								}
+								if !_rules[ruleOperator]() {
+									goto l763
+								}
+								if c := buffer[position]; c < rune('0') || c > rune('9') {
+									goto l763
+								}
+								position++
+							l766:
+								{
+									position767, tokenIndex767 := position, tokenIndex
+									if c := buffer[position]; c < rune('0') || c > rune('9') {
+										goto l767
+									}
+									position++
+									goto l766
+								l767:
+									position, tokenIndex = position767, tokenIndex767
+								}
+								if buffer[position] != rune(')') {
+									goto l763
+								}
+								position++
+								goto l759
+							l763:
+								position, tokenIndex = position759, tokenIndex759
+							l768:
+								{
+									position769, tokenIndex769 := position, tokenIndex
+									if buffer[position] != rune('+') {
+										goto l769
+									}
+									position++
+									if c := buffer[position]; c < rune('0') || c > rune('9') {
+										goto l769
+									}
+									position++
+								l770:
+									{
+										position771, tokenIndex771 := position, tokenIndex
+										if c := buffer[position]; c < rune('0') || c > rune('9') {
+											goto l771
+										}
+										position++
+										goto l770
+									l771:
+										position, tokenIndex = position771, tokenIndex771
+									}
+									goto l768
+								l769:
+									position, tokenIndex = position769, tokenIndex769
+								}
 							}
-							position++
-							goto l785
-						l786:
-							position, tokenIndex = position786, tokenIndex786
+						l759:
+							goto l758
+
+							position, tokenIndex = position757, tokenIndex757
 						}
-						goto l784
-					l783:
-						position, tokenIndex = position783, tokenIndex783
+					l758:
+						goto l755
+					l756:
+						position, tokenIndex = position755, tokenIndex755
+						if !_rules[ruleARMGOTLow12]() {
+							goto l772
+						}
+						goto l755
+					l772:
+						position, tokenIndex = position755, tokenIndex755
+						if !_rules[ruleLow12BitsSymbolRef]() {
+							goto l773
+						}
+						goto l755
+					l773:
+						position, tokenIndex = position755, tokenIndex755
+						if !_rules[ruleARMRegister]() {
+							goto l751
+						}
 					}
-				l784:
-					goto l778
-				l777:
-					position, tokenIndex = position777, tokenIndex777
+				l755:
+					{
+						position774, tokenIndex774 := position, tokenIndex
+						if buffer[position] != rune(',') {
+							goto l774
+						}
+						position++
+						{
+							position776, tokenIndex776 := position, tokenIndex
+							if !_rules[ruleWS]() {
+								goto l776
+							}
+							goto l777
+						l776:
+							position, tokenIndex = position776, tokenIndex776
+						}
+					l777:
+						if !_rules[ruleARMConstantTweak]() {
+							goto l774
+						}
+						goto l775
+					l774:
+						position, tokenIndex = position774, tokenIndex774
+					}
+				l775:
+					goto l752
+				l751:
+					position, tokenIndex = position751, tokenIndex751
 				}
-			l778:
-				if buffer[position] != rune(')') {
-					goto l771
+			l752:
+				if buffer[position] != rune(']') {
+					goto l749
 				}
 				position++
-				add(ruleBaseIndexScale, position772)
+				{
+					position778, tokenIndex778 := position, tokenIndex
+					if !_rules[ruleARMPostincrement]() {
+						goto l778
+					}
+					goto l779
+				l778:
+					position, tokenIndex = position778, tokenIndex778
+				}
+			l779:
+				add(ruleARMBaseIndexScale, position750)
 			}
 			return true
-		l771:
-			position, tokenIndex = position771, tokenIndex771
+		l749:
+			position, tokenIndex = position749, tokenIndex749
 			return false
 		},
-		/* 53 Operator <- <('+' / '-')> */
+		/* 51 ARMGOTLow12 <- <(':' ('g' / 'G') ('o' / 'O') ('t' / 'T') '_' ('l' / 'L') ('o' / 'O') '1' '2' ':' SymbolName)> */
 		func() bool {
-			position787, tokenIndex787 := position, tokenIndex
+			position780, tokenIndex780 := position, tokenIndex
 			{
-				position788 := position
+				position781 := position
+				if buffer[position] != rune(':') {
+					goto l780
+				}
+				position++
 				{
-					position789, tokenIndex789 := position, tokenIndex
-					if buffer[position] != rune('+') {
-						goto l790
+					position782, tokenIndex782 := position, tokenIndex
+					if buffer[position] != rune('g') {
+						goto l783
 					}
 					position++
-					goto l789
-				l790:
-					position, tokenIndex = position789, tokenIndex789
-					if buffer[position] != rune('-') {
+					goto l782
+				l783:
+					position, tokenIndex = position782, tokenIndex782
+					if buffer[position] != rune('G') {
+						goto l780
+					}
+					position++
+				}
+			l782:
+				{
+					position784, tokenIndex784 := position, tokenIndex
+					if buffer[position] != rune('o') {
+						goto l785
+					}
+					position++
+					goto l784
+				l785:
+					position, tokenIndex = position784, tokenIndex784
+					if buffer[position] != rune('O') {
+						goto l780
+					}
+					position++
+				}
+			l784:
+				{
+					position786, tokenIndex786 := position, tokenIndex
+					if buffer[position] != rune('t') {
 						goto l787
 					}
 					position++
+					goto l786
+				l787:
+					position, tokenIndex = position786, tokenIndex786
+					if buffer[position] != rune('T') {
+						goto l780
+					}
+					position++
 				}
-			l789:
-				add(ruleOperator, position788)
-			}
-			return true
-		l787:
-			position, tokenIndex = position787, tokenIndex787
-			return false
-		},
-		/* 54 Offset <- <('+'? '-'? (('0' ('b' / 'B') ('0' / '1')+) / ('0' ('x' / 'X') ([0-9] / [0-9] / ([a-f] / [A-F]))+) / [0-9]+))> */
-		func() bool {
-			position791, tokenIndex791 := position, tokenIndex
-			{
-				position792 := position
-				{
-					position793, tokenIndex793 := position, tokenIndex
-					if buffer[position] != rune('+') {
-						goto l793
-					}
-					position++
-					goto l794
-				l793:
-					position, tokenIndex = position793, tokenIndex793
+			l786:
+				if buffer[position] != rune('_') {
+					goto l780
 				}
-			l794:
+				position++
 				{
-					position795, tokenIndex795 := position, tokenIndex
-					if buffer[position] != rune('-') {
-						goto l795
+					position788, tokenIndex788 := position, tokenIndex
+					if buffer[position] != rune('l') {
+						goto l789
 					}
 					position++
-					goto l796
-				l795:
-					position, tokenIndex = position795, tokenIndex795
+					goto l788
+				l789:
+					position, tokenIndex = position788, tokenIndex788
+					if buffer[position] != rune('L') {
+						goto l780
+					}
+					position++
 				}
-			l796:
+			l788:
 				{
-					position797, tokenIndex797 := position, tokenIndex
-					if buffer[position] != rune('0') {
-						goto l798
-					}
-					position++
-					{
-						position799, tokenIndex799 := position, tokenIndex
-						if buffer[position] != rune('b') {
-							goto l800
-						}
-						position++
-						goto l799
-					l800:
-						position, tokenIndex = position799, tokenIndex799
-						if buffer[position] != rune('B') {
-							goto l798
-						}
-						position++
-					}
-				l799:
-					{
-						position803, tokenIndex803 := position, tokenIndex
-						if buffer[position] != rune('0') {
-							goto l804
-						}
-						position++
-						goto l803
-					l804:
-						position, tokenIndex = position803, tokenIndex803
-						if buffer[position] != rune('1') {
-							goto l798
-						}
-						position++
-					}
-				l803:
-				l801:
-					{
-						position802, tokenIndex802 := position, tokenIndex
-						{
-							position805, tokenIndex805 := position, tokenIndex
-							if buffer[position] != rune('0') {
-								goto l806
-							}
-							position++
-							goto l805
-						l806:
-							position, tokenIndex = position805, tokenIndex805
-							if buffer[position] != rune('1') {
-								goto l802
-							}
-							position++
-						}
-					l805:
-						goto l801
-					l802:
-						position, tokenIndex = position802, tokenIndex802
-					}
-					goto l797
-				l798:
-					position, tokenIndex = position797, tokenIndex797
-					if buffer[position] != rune('0') {
-						goto l807
-					}
-					position++
-					{
-						position808, tokenIndex808 := position, tokenIndex
-						if buffer[position] != rune('x') {
-							goto l809
-						}
-						position++
-						goto l808
-					l809:
-						position, tokenIndex = position808, tokenIndex808
-						if buffer[position] != rune('X') {
-							goto l807
-						}
-						position++
-					}
-				l808:
-					{
-						position812, tokenIndex812 := position, tokenIndex
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l813
-						}
-						position++
-						goto l812
-					l813:
-						position, tokenIndex = position812, tokenIndex812
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l814
-						}
-						position++
-						goto l812
-					l814:
-						position, tokenIndex = position812, tokenIndex812
-						{
-							position815, tokenIndex815 := position, tokenIndex
-							if c := buffer[position]; c < rune('a') || c > rune('f') {
-								goto l816
-							}
-							position++
-							goto l815
-						l816:
-							position, tokenIndex = position815, tokenIndex815
-							if c := buffer[position]; c < rune('A') || c > rune('F') {
-								goto l807
-							}
-							position++
-						}
-					l815:
-					}
-				l812:
-				l810:
-					{
-						position811, tokenIndex811 := position, tokenIndex
-						{
-							position817, tokenIndex817 := position, tokenIndex
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l818
-							}
-							position++
-							goto l817
-						l818:
-							position, tokenIndex = position817, tokenIndex817
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l819
-							}
-							position++
-							goto l817
-						l819:
-							position, tokenIndex = position817, tokenIndex817
-							{
-								position820, tokenIndex820 := position, tokenIndex
-								if c := buffer[position]; c < rune('a') || c > rune('f') {
-									goto l821
-								}
-								position++
-								goto l820
-							l821:
-								position, tokenIndex = position820, tokenIndex820
-								if c := buffer[position]; c < rune('A') || c > rune('F') {
-									goto l811
-								}
-								position++
-							}
-						l820:
-						}
-					l817:
-						goto l810
-					l811:
-						position, tokenIndex = position811, tokenIndex811
-					}
-					goto l797
-				l807:
-					position, tokenIndex = position797, tokenIndex797
-					if c := buffer[position]; c < rune('0') || c > rune('9') {
+					position790, tokenIndex790 := position, tokenIndex
+					if buffer[position] != rune('o') {
 						goto l791
 					}
 					position++
-				l822:
+					goto l790
+				l791:
+					position, tokenIndex = position790, tokenIndex790
+					if buffer[position] != rune('O') {
+						goto l780
+					}
+					position++
+				}
+			l790:
+				if buffer[position] != rune('1') {
+					goto l780
+				}
+				position++
+				if buffer[position] != rune('2') {
+					goto l780
+				}
+				position++
+				if buffer[position] != rune(':') {
+					goto l780
+				}
+				position++
+				if !_rules[ruleSymbolName]() {
+					goto l780
+				}
+				add(ruleARMGOTLow12, position781)
+			}
+			return true
+		l780:
+			position, tokenIndex = position780, tokenIndex780
+			return false
+		},
+		/* 52 ARMPostincrement <- <'!'> */
+		func() bool {
+			position792, tokenIndex792 := position, tokenIndex
+			{
+				position793 := position
+				if buffer[position] != rune('!') {
+					goto l792
+				}
+				position++
+				add(ruleARMPostincrement, position793)
+			}
+			return true
+		l792:
+			position, tokenIndex = position792, tokenIndex792
+			return false
+		},
+		/* 53 BaseIndexScale <- <('(' RegisterOrConstant? WS? (',' WS? RegisterOrConstant WS? (',' [0-9]+)?)? ')')> */
+		func() bool {
+			position794, tokenIndex794 := position, tokenIndex
+			{
+				position795 := position
+				if buffer[position] != rune('(') {
+					goto l794
+				}
+				position++
+				{
+					position796, tokenIndex796 := position, tokenIndex
+					if !_rules[ruleRegisterOrConstant]() {
+						goto l796
+					}
+					goto l797
+				l796:
+					position, tokenIndex = position796, tokenIndex796
+				}
+			l797:
+				{
+					position798, tokenIndex798 := position, tokenIndex
+					if !_rules[ruleWS]() {
+						goto l798
+					}
+					goto l799
+				l798:
+					position, tokenIndex = position798, tokenIndex798
+				}
+			l799:
+				{
+					position800, tokenIndex800 := position, tokenIndex
+					if buffer[position] != rune(',') {
+						goto l800
+					}
+					position++
 					{
-						position823, tokenIndex823 := position, tokenIndex
+						position802, tokenIndex802 := position, tokenIndex
+						if !_rules[ruleWS]() {
+							goto l802
+						}
+						goto l803
+					l802:
+						position, tokenIndex = position802, tokenIndex802
+					}
+				l803:
+					if !_rules[ruleRegisterOrConstant]() {
+						goto l800
+					}
+					{
+						position804, tokenIndex804 := position, tokenIndex
+						if !_rules[ruleWS]() {
+							goto l804
+						}
+						goto l805
+					l804:
+						position, tokenIndex = position804, tokenIndex804
+					}
+				l805:
+					{
+						position806, tokenIndex806 := position, tokenIndex
+						if buffer[position] != rune(',') {
+							goto l806
+						}
+						position++
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l806
+						}
+						position++
+					l808:
+						{
+							position809, tokenIndex809 := position, tokenIndex
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l809
+							}
+							position++
+							goto l808
+						l809:
+							position, tokenIndex = position809, tokenIndex809
+						}
+						goto l807
+					l806:
+						position, tokenIndex = position806, tokenIndex806
+					}
+				l807:
+					goto l801
+				l800:
+					position, tokenIndex = position800, tokenIndex800
+				}
+			l801:
+				if buffer[position] != rune(')') {
+					goto l794
+				}
+				position++
+				add(ruleBaseIndexScale, position795)
+			}
+			return true
+		l794:
+			position, tokenIndex = position794, tokenIndex794
+			return false
+		},
+		/* 54 Operator <- <('+' / '-')> */
+		func() bool {
+			position810, tokenIndex810 := position, tokenIndex
+			{
+				position811 := position
+				{
+					position812, tokenIndex812 := position, tokenIndex
+					if buffer[position] != rune('+') {
+						goto l813
+					}
+					position++
+					goto l812
+				l813:
+					position, tokenIndex = position812, tokenIndex812
+					if buffer[position] != rune('-') {
+						goto l810
+					}
+					position++
+				}
+			l812:
+				add(ruleOperator, position811)
+			}
+			return true
+		l810:
+			position, tokenIndex = position810, tokenIndex810
+			return false
+		},
+		/* 55 Offset <- <('+'? '-'? (('0' ('b' / 'B') ('0' / '1')+) / ('0' ('x' / 'X') ([0-9] / [0-9] / ([a-f] / [A-F]))+) / [0-9]+))> */
+		func() bool {
+			position814, tokenIndex814 := position, tokenIndex
+			{
+				position815 := position
+				{
+					position816, tokenIndex816 := position, tokenIndex
+					if buffer[position] != rune('+') {
+						goto l816
+					}
+					position++
+					goto l817
+				l816:
+					position, tokenIndex = position816, tokenIndex816
+				}
+			l817:
+				{
+					position818, tokenIndex818 := position, tokenIndex
+					if buffer[position] != rune('-') {
+						goto l818
+					}
+					position++
+					goto l819
+				l818:
+					position, tokenIndex = position818, tokenIndex818
+				}
+			l819:
+				{
+					position820, tokenIndex820 := position, tokenIndex
+					if buffer[position] != rune('0') {
+						goto l821
+					}
+					position++
+					{
+						position822, tokenIndex822 := position, tokenIndex
+						if buffer[position] != rune('b') {
 							goto l823
 						}
 						position++
 						goto l822
 					l823:
-						position, tokenIndex = position823, tokenIndex823
+						position, tokenIndex = position822, tokenIndex822
+						if buffer[position] != rune('B') {
+							goto l821
+						}
+						position++
 					}
-				}
-			l797:
-				add(ruleOffset, position792)
-			}
-			return true
-		l791:
-			position, tokenIndex = position791, tokenIndex791
-			return false
-		},
-		/* 55 Section <- <([a-z] / [A-Z] / '@')+> */
-		func() bool {
-			position824, tokenIndex824 := position, tokenIndex
-			{
-				position825 := position
-				{
-					position828, tokenIndex828 := position, tokenIndex
-					if c := buffer[position]; c < rune('a') || c > rune('z') {
-						goto l829
+				l822:
+					{
+						position826, tokenIndex826 := position, tokenIndex
+						if buffer[position] != rune('0') {
+							goto l827
+						}
+						position++
+						goto l826
+					l827:
+						position, tokenIndex = position826, tokenIndex826
+						if buffer[position] != rune('1') {
+							goto l821
+						}
+						position++
 					}
-					position++
-					goto l828
-				l829:
-					position, tokenIndex = position828, tokenIndex828
-					if c := buffer[position]; c < rune('A') || c > rune('Z') {
+				l826:
+				l824:
+					{
+						position825, tokenIndex825 := position, tokenIndex
+						{
+							position828, tokenIndex828 := position, tokenIndex
+							if buffer[position] != rune('0') {
+								goto l829
+							}
+							position++
+							goto l828
+						l829:
+							position, tokenIndex = position828, tokenIndex828
+							if buffer[position] != rune('1') {
+								goto l825
+							}
+							position++
+						}
+					l828:
+						goto l824
+					l825:
+						position, tokenIndex = position825, tokenIndex825
+					}
+					goto l820
+				l821:
+					position, tokenIndex = position820, tokenIndex820
+					if buffer[position] != rune('0') {
 						goto l830
 					}
 					position++
-					goto l828
-				l830:
-					position, tokenIndex = position828, tokenIndex828
-					if buffer[position] != rune('@') {
-						goto l824
-					}
-					position++
-				}
-			l828:
-			l826:
-				{
-					position827, tokenIndex827 := position, tokenIndex
 					{
 						position831, tokenIndex831 := position, tokenIndex
-						if c := buffer[position]; c < rune('a') || c > rune('z') {
+						if buffer[position] != rune('x') {
 							goto l832
 						}
 						position++
 						goto l831
 					l832:
 						position, tokenIndex = position831, tokenIndex831
-						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l833
-						}
-						position++
-						goto l831
-					l833:
-						position, tokenIndex = position831, tokenIndex831
-						if buffer[position] != rune('@') {
-							goto l827
+						if buffer[position] != rune('X') {
+							goto l830
 						}
 						position++
 					}
 				l831:
-					goto l826
-				l827:
-					position, tokenIndex = position827, tokenIndex827
+					{
+						position835, tokenIndex835 := position, tokenIndex
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l836
+						}
+						position++
+						goto l835
+					l836:
+						position, tokenIndex = position835, tokenIndex835
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l837
+						}
+						position++
+						goto l835
+					l837:
+						position, tokenIndex = position835, tokenIndex835
+						{
+							position838, tokenIndex838 := position, tokenIndex
+							if c := buffer[position]; c < rune('a') || c > rune('f') {
+								goto l839
+							}
+							position++
+							goto l838
+						l839:
+							position, tokenIndex = position838, tokenIndex838
+							if c := buffer[position]; c < rune('A') || c > rune('F') {
+								goto l830
+							}
+							position++
+						}
+					l838:
+					}
+				l835:
+				l833:
+					{
+						position834, tokenIndex834 := position, tokenIndex
+						{
+							position840, tokenIndex840 := position, tokenIndex
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l841
+							}
+							position++
+							goto l840
+						l841:
+							position, tokenIndex = position840, tokenIndex840
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l842
+							}
+							position++
+							goto l840
+						l842:
+							position, tokenIndex = position840, tokenIndex840
+							{
+								position843, tokenIndex843 := position, tokenIndex
+								if c := buffer[position]; c < rune('a') || c > rune('f') {
+									goto l844
+								}
+								position++
+								goto l843
+							l844:
+								position, tokenIndex = position843, tokenIndex843
+								if c := buffer[position]; c < rune('A') || c > rune('F') {
+									goto l834
+								}
+								position++
+							}
+						l843:
+						}
+					l840:
+						goto l833
+					l834:
+						position, tokenIndex = position834, tokenIndex834
+					}
+					goto l820
+				l830:
+					position, tokenIndex = position820, tokenIndex820
+					if c := buffer[position]; c < rune('0') || c > rune('9') {
+						goto l814
+					}
+					position++
+				l845:
+					{
+						position846, tokenIndex846 := position, tokenIndex
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l846
+						}
+						position++
+						goto l845
+					l846:
+						position, tokenIndex = position846, tokenIndex846
+					}
 				}
-				add(ruleSection, position825)
+			l820:
+				add(ruleOffset, position815)
 			}
 			return true
-		l824:
-			position, tokenIndex = position824, tokenIndex824
+		l814:
+			position, tokenIndex = position814, tokenIndex814
 			return false
 		},
-		/* 56 SegmentRegister <- <('%' ([c-g] / 's') ('s' ':'))> */
+		/* 56 Section <- <([a-z] / [A-Z] / '@')+> */
 		func() bool {
-			position834, tokenIndex834 := position, tokenIndex
+			position847, tokenIndex847 := position, tokenIndex
 			{
-				position835 := position
+				position848 := position
+				{
+					position851, tokenIndex851 := position, tokenIndex
+					if c := buffer[position]; c < rune('a') || c > rune('z') {
+						goto l852
+					}
+					position++
+					goto l851
+				l852:
+					position, tokenIndex = position851, tokenIndex851
+					if c := buffer[position]; c < rune('A') || c > rune('Z') {
+						goto l853
+					}
+					position++
+					goto l851
+				l853:
+					position, tokenIndex = position851, tokenIndex851
+					if buffer[position] != rune('@') {
+						goto l847
+					}
+					position++
+				}
+			l851:
+			l849:
+				{
+					position850, tokenIndex850 := position, tokenIndex
+					{
+						position854, tokenIndex854 := position, tokenIndex
+						if c := buffer[position]; c < rune('a') || c > rune('z') {
+							goto l855
+						}
+						position++
+						goto l854
+					l855:
+						position, tokenIndex = position854, tokenIndex854
+						if c := buffer[position]; c < rune('A') || c > rune('Z') {
+							goto l856
+						}
+						position++
+						goto l854
+					l856:
+						position, tokenIndex = position854, tokenIndex854
+						if buffer[position] != rune('@') {
+							goto l850
+						}
+						position++
+					}
+				l854:
+					goto l849
+				l850:
+					position, tokenIndex = position850, tokenIndex850
+				}
+				add(ruleSection, position848)
+			}
+			return true
+		l847:
+			position, tokenIndex = position847, tokenIndex847
+			return false
+		},
+		/* 57 SegmentRegister <- <('%' ([c-g] / 's') ('s' ':'))> */
+		func() bool {
+			position857, tokenIndex857 := position, tokenIndex
+			{
+				position858 := position
 				if buffer[position] != rune('%') {
-					goto l834
+					goto l857
 				}
 				position++
 				{
-					position836, tokenIndex836 := position, tokenIndex
+					position859, tokenIndex859 := position, tokenIndex
 					if c := buffer[position]; c < rune('c') || c > rune('g') {
-						goto l837
+						goto l860
 					}
 					position++
-					goto l836
-				l837:
-					position, tokenIndex = position836, tokenIndex836
+					goto l859
+				l860:
+					position, tokenIndex = position859, tokenIndex859
 					if buffer[position] != rune('s') {
-						goto l834
+						goto l857
 					}
 					position++
 				}
-			l836:
+			l859:
 				if buffer[position] != rune('s') {
-					goto l834
+					goto l857
 				}
 				position++
 				if buffer[position] != rune(':') {
-					goto l834
+					goto l857
 				}
 				position++
-				add(ruleSegmentRegister, position835)
+				add(ruleSegmentRegister, position858)
 			}
 			return true
-		l834:
-			position, tokenIndex = position834, tokenIndex834
+		l857:
+			position, tokenIndex = position857, tokenIndex857
 			return false
 		},
 	}
diff --git a/util/fipstools/delocate/testdata/aarch64-Basic/in.s b/util/fipstools/delocate/testdata/aarch64-Basic/in.s
index 8b45e25..b21ebcb 100644
--- a/util/fipstools/delocate/testdata/aarch64-Basic/in.s
+++ b/util/fipstools/delocate/testdata/aarch64-Basic/in.s
@@ -78,6 +78,9 @@
 	add w0, w1, b2, sxtw
 	add w0, w1, b2, sxtx
 
+        // Aarch64 SVE2 added these forms:
+        ld1d { z1.d }, p0/z, [x13, x11, lsl #3]
+        ld1b { z11.b }, p15/z, [x10, #1, mul vl]
 
 local_function:
 
diff --git a/util/fipstools/delocate/testdata/aarch64-Basic/out.s b/util/fipstools/delocate/testdata/aarch64-Basic/out.s
index 852312b..4c03265 100644
--- a/util/fipstools/delocate/testdata/aarch64-Basic/out.s
+++ b/util/fipstools/delocate/testdata/aarch64-Basic/out.s
@@ -125,6 +125,9 @@
 	add w0, w1, b2, sxtw
 	add w0, w1, b2, sxtx
 
+        // Aarch64 SVE2 added these forms:
+        ld1d { z1.d }, p0/z, [x13, x11, lsl #3]
+        ld1b { z11.b }, p15/z, [x10, #1, mul vl]
 
 .Llocal_function_local_target:
 local_function: