Support medium memory models.

With `-mcmodel=medium`, Clang may emit loads of the GOT address.
Delocate needs to handle that in order to avoid a relocation inside the
module.

Bug: b:316210772
Change-Id: I55eb2711860e43f68de131e28538aef9f5ce1889
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/64791
Auto-Submit: Adam Langley <agl@google.com>
Reviewed-by: David Benjamin <davidben@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/util/fipstools/delocate/delocate.go b/util/fipstools/delocate/delocate.go
index 8e0e508..cd08bed 100644
--- a/util/fipstools/delocate/delocate.go
+++ b/util/fipstools/delocate/delocate.go
@@ -1163,6 +1163,22 @@
 
 			args = append(args, argStr)
 
+		case ruleGOTAddress:
+			if instructionName != "leaq" {
+				return nil, fmt.Errorf("_GLOBAL_OFFSET_TABLE_ used outside of lea")
+			}
+			if i != 0 || len(argNodes) != 2 {
+				return nil, fmt.Errorf("Load of _GLOBAL_OFFSET_TABLE_ address didn't have expected form")
+			}
+			d.gotDeltaNeeded = true
+			changed = true
+			targetReg := d.contents(argNodes[1])
+			args = append(args, ".Lboringssl_got_delta(%rip)")
+			wrappers = append(wrappers, func(k func()) {
+				k()
+				d.output.WriteString(fmt.Sprintf("\taddq .Lboringssl_got_delta(%%rip), %s\n", targetReg))
+			})
+
 		case ruleGOTLocation:
 			if instructionName != "movabsq" {
 				return nil, fmt.Errorf("_GLOBAL_OFFSET_TABLE_ lookup didn't use movabsq")
diff --git a/util/fipstools/delocate/delocate.peg b/util/fipstools/delocate/delocate.peg
index d5537e2..2247f24 100644
--- a/util/fipstools/delocate/delocate.peg
+++ b/util/fipstools/delocate/delocate.peg
@@ -68,8 +68,9 @@
 LocalLabelRef <- [0-9][0-9$]*[bf]
 Instruction <- InstructionName (WS InstructionArg ((WS? ',' WS?) InstructionArg)*)?
 InstructionName <- [[A-Z]][[A-Z.0-9]]* [.+\-]?
-InstructionArg <- IndirectionIndicator? (ARMConstantTweak / RegisterOrConstant / LocalLabelRef / TOCRefHigh / TOCRefLow / GOTLocation / GOTSymbolOffset / MemoryRef) AVX512Token*
+InstructionArg <- IndirectionIndicator? (ARMConstantTweak / RegisterOrConstant / LocalLabelRef / TOCRefHigh / TOCRefLow / GOTLocation / GOTAddress / GOTSymbolOffset / MemoryRef) AVX512Token*
 GOTLocation <- '$_GLOBAL_OFFSET_TABLE_-' LocalSymbol
+GOTAddress <- '_GLOBAL_OFFSET_TABLE_(%rip)'
 GOTSymbolOffset <- ('$' SymbolName '@GOT' 'OFF'?) / (":got:" SymbolName)
 AVX512Token <- WS? '{' '%'? [0-9a-z]* '}'
 TOCRefHigh <- '.TOC.-' ('0b' / ('.L' [a-zA-Z_0-9]+)) "@ha"
diff --git a/util/fipstools/delocate/delocate.peg.go b/util/fipstools/delocate/delocate.peg.go
index 7659cbc..fa21419 100644
--- a/util/fipstools/delocate/delocate.peg.go
+++ b/util/fipstools/delocate/delocate.peg.go
@@ -54,6 +54,7 @@
 	ruleInstructionName
 	ruleInstructionArg
 	ruleGOTLocation
+	ruleGOTAddress
 	ruleGOTSymbolOffset
 	ruleAVX512Token
 	ruleTOCRefHigh
@@ -114,6 +115,7 @@
 	"InstructionName",
 	"InstructionArg",
 	"GOTLocation",
+	"GOTAddress",
 	"GOTSymbolOffset",
 	"AVX512Token",
 	"TOCRefHigh",
@@ -248,7 +250,7 @@
 type Asm struct {
 	Buffer string
 	buffer []rune
-	rules  [57]func() bool
+	rules  [58]func() bool
 	parse  func(rule ...int) error
 	reset  func()
 	Pretty bool
@@ -3671,7 +3673,7 @@
 			position, tokenIndex = position438, tokenIndex438
 			return false
 		},
-		/* 34 InstructionArg <- <(IndirectionIndicator? (ARMConstantTweak / RegisterOrConstant / LocalLabelRef / TOCRefHigh / TOCRefLow / GOTLocation / GOTSymbolOffset / MemoryRef) AVX512Token*)> */
+		/* 34 InstructionArg <- <(IndirectionIndicator? (ARMConstantTweak / RegisterOrConstant / LocalLabelRef / TOCRefHigh / TOCRefLow / GOTLocation / GOTAddress / GOTSymbolOffset / MemoryRef) AVX512Token*)> */
 		func() bool {
 			position455, tokenIndex455 := position, tokenIndex
 			{
@@ -3724,26 +3726,32 @@
 					goto l459
 				l465:
 					position, tokenIndex = position459, tokenIndex459
-					if !_rules[ruleGOTSymbolOffset]() {
+					if !_rules[ruleGOTAddress]() {
 						goto l466
 					}
 					goto l459
 				l466:
 					position, tokenIndex = position459, tokenIndex459
+					if !_rules[ruleGOTSymbolOffset]() {
+						goto l467
+					}
+					goto l459
+				l467:
+					position, tokenIndex = position459, tokenIndex459
 					if !_rules[ruleMemoryRef]() {
 						goto l455
 					}
 				}
 			l459:
-			l467:
+			l468:
 				{
-					position468, tokenIndex468 := position, tokenIndex
+					position469, tokenIndex469 := position, tokenIndex
 					if !_rules[ruleAVX512Token]() {
-						goto l468
+						goto l469
 					}
-					goto l467
-				l468:
-					position, tokenIndex = position468, tokenIndex468
+					goto l468
+				l469:
+					position, tokenIndex = position469, tokenIndex469
 				}
 				add(ruleInstructionArg, position456)
 			}
@@ -3754,1024 +3762,1126 @@
 		},
 		/* 35 GOTLocation <- <('$' '_' 'G' 'L' 'O' 'B' 'A' 'L' '_' 'O' 'F' 'F' 'S' 'E' 'T' '_' 'T' 'A' 'B' 'L' 'E' '_' '-' LocalSymbol)> */
 		func() bool {
-			position469, tokenIndex469 := position, tokenIndex
+			position470, tokenIndex470 := position, tokenIndex
 			{
-				position470 := position
+				position471 := position
 				if buffer[position] != rune('$') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('_') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('G') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('L') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('O') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('B') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('A') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('L') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('_') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('O') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('F') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('F') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('S') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('E') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('T') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('_') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('T') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('A') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('B') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('L') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('E') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('_') {
-					goto l469
+					goto l470
 				}
 				position++
 				if buffer[position] != rune('-') {
-					goto l469
+					goto l470
 				}
 				position++
 				if !_rules[ruleLocalSymbol]() {
-					goto l469
+					goto l470
 				}
-				add(ruleGOTLocation, position470)
+				add(ruleGOTLocation, position471)
 			}
 			return true
-		l469:
-			position, tokenIndex = position469, tokenIndex469
+		l470:
+			position, tokenIndex = position470, tokenIndex470
 			return false
 		},
-		/* 36 GOTSymbolOffset <- <(('$' SymbolName ('@' 'G' 'O' 'T') ('O' 'F' 'F')?) / (':' ('g' / 'G') ('o' / 'O') ('t' / 'T') ':' SymbolName))> */
+		/* 36 GOTAddress <- <('_' 'G' 'L' 'O' 'B' 'A' 'L' '_' 'O' 'F' 'F' 'S' 'E' 'T' '_' 'T' 'A' 'B' 'L' 'E' '_' '(' '%' 'r' 'i' 'p' ')')> */
 		func() bool {
-			position471, tokenIndex471 := position, tokenIndex
+			position472, tokenIndex472 := position, tokenIndex
 			{
-				position472 := position
-				{
-					position473, tokenIndex473 := position, tokenIndex
-					if buffer[position] != rune('$') {
-						goto l474
-					}
-					position++
-					if !_rules[ruleSymbolName]() {
-						goto l474
-					}
-					if buffer[position] != rune('@') {
-						goto l474
-					}
-					position++
-					if buffer[position] != rune('G') {
-						goto l474
-					}
-					position++
-					if buffer[position] != rune('O') {
-						goto l474
-					}
-					position++
-					if buffer[position] != rune('T') {
-						goto l474
-					}
-					position++
-					{
-						position475, tokenIndex475 := position, tokenIndex
-						if buffer[position] != rune('O') {
-							goto l475
-						}
-						position++
-						if buffer[position] != rune('F') {
-							goto l475
-						}
-						position++
-						if buffer[position] != rune('F') {
-							goto l475
-						}
-						position++
-						goto l476
-					l475:
-						position, tokenIndex = position475, tokenIndex475
-					}
-				l476:
-					goto l473
-				l474:
-					position, tokenIndex = position473, tokenIndex473
-					if buffer[position] != rune(':') {
-						goto l471
-					}
-					position++
-					{
-						position477, tokenIndex477 := position, tokenIndex
-						if buffer[position] != rune('g') {
-							goto l478
-						}
-						position++
-						goto l477
-					l478:
-						position, tokenIndex = position477, tokenIndex477
-						if buffer[position] != rune('G') {
-							goto l471
-						}
-						position++
-					}
-				l477:
-					{
-						position479, tokenIndex479 := position, tokenIndex
-						if buffer[position] != rune('o') {
-							goto l480
-						}
-						position++
-						goto l479
-					l480:
-						position, tokenIndex = position479, tokenIndex479
-						if buffer[position] != rune('O') {
-							goto l471
-						}
-						position++
-					}
-				l479:
-					{
-						position481, tokenIndex481 := position, tokenIndex
-						if buffer[position] != rune('t') {
-							goto l482
-						}
-						position++
-						goto l481
-					l482:
-						position, tokenIndex = position481, tokenIndex481
-						if buffer[position] != rune('T') {
-							goto l471
-						}
-						position++
-					}
-				l481:
-					if buffer[position] != rune(':') {
-						goto l471
-					}
-					position++
-					if !_rules[ruleSymbolName]() {
-						goto l471
-					}
-				}
-			l473:
-				add(ruleGOTSymbolOffset, position472)
-			}
-			return true
-		l471:
-			position, tokenIndex = position471, tokenIndex471
-			return false
-		},
-		/* 37 AVX512Token <- <(WS? '{' '%'? ([0-9] / [a-z])* '}')> */
-		func() bool {
-			position483, tokenIndex483 := position, tokenIndex
-			{
-				position484 := position
-				{
-					position485, tokenIndex485 := position, tokenIndex
-					if !_rules[ruleWS]() {
-						goto l485
-					}
-					goto l486
-				l485:
-					position, tokenIndex = position485, tokenIndex485
-				}
-			l486:
-				if buffer[position] != rune('{') {
-					goto l483
+				position473 := position
+				if buffer[position] != rune('_') {
+					goto l472
 				}
 				position++
-				{
-					position487, tokenIndex487 := position, tokenIndex
-					if buffer[position] != rune('%') {
-						goto l487
-					}
-					position++
-					goto l488
-				l487:
-					position, tokenIndex = position487, tokenIndex487
-				}
-			l488:
-			l489:
-				{
-					position490, tokenIndex490 := position, tokenIndex
-					{
-						position491, tokenIndex491 := position, tokenIndex
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l492
-						}
-						position++
-						goto l491
-					l492:
-						position, tokenIndex = position491, tokenIndex491
-						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l490
-						}
-						position++
-					}
-				l491:
-					goto l489
-				l490:
-					position, tokenIndex = position490, tokenIndex490
-				}
-				if buffer[position] != rune('}') {
-					goto l483
+				if buffer[position] != rune('G') {
+					goto l472
 				}
 				position++
-				add(ruleAVX512Token, position484)
-			}
-			return true
-		l483:
-			position, tokenIndex = position483, tokenIndex483
-			return false
-		},
-		/* 38 TOCRefHigh <- <('.' 'T' 'O' 'C' '.' '-' (('0' 'b') / ('.' 'L' ([a-z] / [A-Z] / '_' / [0-9])+)) ('@' ('h' / 'H') ('a' / 'A')))> */
-		func() bool {
-			position493, tokenIndex493 := position, tokenIndex
-			{
-				position494 := position
-				if buffer[position] != rune('.') {
-					goto l493
-				}
-				position++
-				if buffer[position] != rune('T') {
-					goto l493
+				if buffer[position] != rune('L') {
+					goto l472
 				}
 				position++
 				if buffer[position] != rune('O') {
-					goto l493
+					goto l472
 				}
 				position++
-				if buffer[position] != rune('C') {
-					goto l493
+				if buffer[position] != rune('B') {
+					goto l472
 				}
 				position++
-				if buffer[position] != rune('.') {
-					goto l493
+				if buffer[position] != rune('A') {
+					goto l472
 				}
 				position++
-				if buffer[position] != rune('-') {
-					goto l493
+				if buffer[position] != rune('L') {
+					goto l472
 				}
 				position++
+				if buffer[position] != rune('_') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('O') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('F') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('F') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('S') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('E') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('T') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('_') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('T') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('A') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('B') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('L') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('E') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('_') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('(') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('%') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('r') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('i') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune('p') {
+					goto l472
+				}
+				position++
+				if buffer[position] != rune(')') {
+					goto l472
+				}
+				position++
+				add(ruleGOTAddress, position473)
+			}
+			return true
+		l472:
+			position, tokenIndex = position472, tokenIndex472
+			return false
+		},
+		/* 37 GOTSymbolOffset <- <(('$' SymbolName ('@' 'G' 'O' 'T') ('O' 'F' 'F')?) / (':' ('g' / 'G') ('o' / 'O') ('t' / 'T') ':' SymbolName))> */
+		func() bool {
+			position474, tokenIndex474 := position, tokenIndex
+			{
+				position475 := position
 				{
-					position495, tokenIndex495 := position, tokenIndex
-					if buffer[position] != rune('0') {
-						goto l496
+					position476, tokenIndex476 := position, tokenIndex
+					if buffer[position] != rune('$') {
+						goto l477
 					}
 					position++
-					if buffer[position] != rune('b') {
-						goto l496
+					if !_rules[ruleSymbolName]() {
+						goto l477
+					}
+					if buffer[position] != rune('@') {
+						goto l477
 					}
 					position++
-					goto l495
-				l496:
-					position, tokenIndex = position495, tokenIndex495
-					if buffer[position] != rune('.') {
-						goto l493
+					if buffer[position] != rune('G') {
+						goto l477
 					}
 					position++
-					if buffer[position] != rune('L') {
-						goto l493
+					if buffer[position] != rune('O') {
+						goto l477
+					}
+					position++
+					if buffer[position] != rune('T') {
+						goto l477
 					}
 					position++
 					{
-						position499, tokenIndex499 := position, tokenIndex
-						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l500
+						position478, tokenIndex478 := position, tokenIndex
+						if buffer[position] != rune('O') {
+							goto l478
 						}
 						position++
-						goto l499
-					l500:
-						position, tokenIndex = position499, tokenIndex499
-						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l501
+						if buffer[position] != rune('F') {
+							goto l478
 						}
 						position++
-						goto l499
-					l501:
-						position, tokenIndex = position499, tokenIndex499
-						if buffer[position] != rune('_') {
-							goto l502
+						if buffer[position] != rune('F') {
+							goto l478
 						}
 						position++
-						goto l499
-					l502:
-						position, tokenIndex = position499, tokenIndex499
+						goto l479
+					l478:
+						position, tokenIndex = position478, tokenIndex478
+					}
+				l479:
+					goto l476
+				l477:
+					position, tokenIndex = position476, tokenIndex476
+					if buffer[position] != rune(':') {
+						goto l474
+					}
+					position++
+					{
+						position480, tokenIndex480 := position, tokenIndex
+						if buffer[position] != rune('g') {
+							goto l481
+						}
+						position++
+						goto l480
+					l481:
+						position, tokenIndex = position480, tokenIndex480
+						if buffer[position] != rune('G') {
+							goto l474
+						}
+						position++
+					}
+				l480:
+					{
+						position482, tokenIndex482 := position, tokenIndex
+						if buffer[position] != rune('o') {
+							goto l483
+						}
+						position++
+						goto l482
+					l483:
+						position, tokenIndex = position482, tokenIndex482
+						if buffer[position] != rune('O') {
+							goto l474
+						}
+						position++
+					}
+				l482:
+					{
+						position484, tokenIndex484 := position, tokenIndex
+						if buffer[position] != rune('t') {
+							goto l485
+						}
+						position++
+						goto l484
+					l485:
+						position, tokenIndex = position484, tokenIndex484
+						if buffer[position] != rune('T') {
+							goto l474
+						}
+						position++
+					}
+				l484:
+					if buffer[position] != rune(':') {
+						goto l474
+					}
+					position++
+					if !_rules[ruleSymbolName]() {
+						goto l474
+					}
+				}
+			l476:
+				add(ruleGOTSymbolOffset, position475)
+			}
+			return true
+		l474:
+			position, tokenIndex = position474, tokenIndex474
+			return false
+		},
+		/* 38 AVX512Token <- <(WS? '{' '%'? ([0-9] / [a-z])* '}')> */
+		func() bool {
+			position486, tokenIndex486 := position, tokenIndex
+			{
+				position487 := position
+				{
+					position488, tokenIndex488 := position, tokenIndex
+					if !_rules[ruleWS]() {
+						goto l488
+					}
+					goto l489
+				l488:
+					position, tokenIndex = position488, tokenIndex488
+				}
+			l489:
+				if buffer[position] != rune('{') {
+					goto l486
+				}
+				position++
+				{
+					position490, tokenIndex490 := position, tokenIndex
+					if buffer[position] != rune('%') {
+						goto l490
+					}
+					position++
+					goto l491
+				l490:
+					position, tokenIndex = position490, tokenIndex490
+				}
+			l491:
+			l492:
+				{
+					position493, tokenIndex493 := position, tokenIndex
+					{
+						position494, tokenIndex494 := position, tokenIndex
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l495
+						}
+						position++
+						goto l494
+					l495:
+						position, tokenIndex = position494, tokenIndex494
+						if c := buffer[position]; c < rune('a') || c > rune('z') {
 							goto l493
 						}
 						position++
 					}
-				l499:
-				l497:
-					{
-						position498, tokenIndex498 := position, tokenIndex
-						{
-							position503, tokenIndex503 := position, tokenIndex
-							if c := buffer[position]; c < rune('a') || c > rune('z') {
-								goto l504
-							}
-							position++
-							goto l503
-						l504:
-							position, tokenIndex = position503, tokenIndex503
-							if c := buffer[position]; c < rune('A') || c > rune('Z') {
-								goto l505
-							}
-							position++
-							goto l503
-						l505:
-							position, tokenIndex = position503, tokenIndex503
-							if buffer[position] != rune('_') {
-								goto l506
-							}
-							position++
-							goto l503
-						l506:
-							position, tokenIndex = position503, tokenIndex503
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l498
-							}
-							position++
-						}
-					l503:
-						goto l497
-					l498:
-						position, tokenIndex = position498, tokenIndex498
-					}
+				l494:
+					goto l492
+				l493:
+					position, tokenIndex = position493, tokenIndex493
 				}
-			l495:
-				if buffer[position] != rune('@') {
-					goto l493
+				if buffer[position] != rune('}') {
+					goto l486
 				}
 				position++
-				{
-					position507, tokenIndex507 := position, tokenIndex
-					if buffer[position] != rune('h') {
-						goto l508
-					}
-					position++
-					goto l507
-				l508:
-					position, tokenIndex = position507, tokenIndex507
-					if buffer[position] != rune('H') {
-						goto l493
-					}
-					position++
-				}
-			l507:
-				{
-					position509, tokenIndex509 := position, tokenIndex
-					if buffer[position] != rune('a') {
-						goto l510
-					}
-					position++
-					goto l509
-				l510:
-					position, tokenIndex = position509, tokenIndex509
-					if buffer[position] != rune('A') {
-						goto l493
-					}
-					position++
-				}
-			l509:
-				add(ruleTOCRefHigh, position494)
+				add(ruleAVX512Token, position487)
 			}
 			return true
-		l493:
-			position, tokenIndex = position493, tokenIndex493
+		l486:
+			position, tokenIndex = position486, tokenIndex486
 			return false
 		},
-		/* 39 TOCRefLow <- <('.' 'T' 'O' 'C' '.' '-' (('0' 'b') / ('.' 'L' ([a-z] / [A-Z] / '_' / [0-9])+)) ('@' ('l' / 'L')))> */
+		/* 39 TOCRefHigh <- <('.' 'T' 'O' 'C' '.' '-' (('0' 'b') / ('.' 'L' ([a-z] / [A-Z] / '_' / [0-9])+)) ('@' ('h' / 'H') ('a' / 'A')))> */
 		func() bool {
-			position511, tokenIndex511 := position, tokenIndex
+			position496, tokenIndex496 := position, tokenIndex
 			{
-				position512 := position
+				position497 := position
 				if buffer[position] != rune('.') {
-					goto l511
+					goto l496
 				}
 				position++
 				if buffer[position] != rune('T') {
-					goto l511
+					goto l496
 				}
 				position++
 				if buffer[position] != rune('O') {
-					goto l511
+					goto l496
 				}
 				position++
 				if buffer[position] != rune('C') {
-					goto l511
+					goto l496
 				}
 				position++
 				if buffer[position] != rune('.') {
-					goto l511
+					goto l496
 				}
 				position++
 				if buffer[position] != rune('-') {
-					goto l511
+					goto l496
 				}
 				position++
 				{
-					position513, tokenIndex513 := position, tokenIndex
+					position498, tokenIndex498 := position, tokenIndex
 					if buffer[position] != rune('0') {
-						goto l514
+						goto l499
 					}
 					position++
 					if buffer[position] != rune('b') {
+						goto l499
+					}
+					position++
+					goto l498
+				l499:
+					position, tokenIndex = position498, tokenIndex498
+					if buffer[position] != rune('.') {
+						goto l496
+					}
+					position++
+					if buffer[position] != rune('L') {
+						goto l496
+					}
+					position++
+					{
+						position502, tokenIndex502 := position, tokenIndex
+						if c := buffer[position]; c < rune('a') || c > rune('z') {
+							goto l503
+						}
+						position++
+						goto l502
+					l503:
+						position, tokenIndex = position502, tokenIndex502
+						if c := buffer[position]; c < rune('A') || c > rune('Z') {
+							goto l504
+						}
+						position++
+						goto l502
+					l504:
+						position, tokenIndex = position502, tokenIndex502
+						if buffer[position] != rune('_') {
+							goto l505
+						}
+						position++
+						goto l502
+					l505:
+						position, tokenIndex = position502, tokenIndex502
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l496
+						}
+						position++
+					}
+				l502:
+				l500:
+					{
+						position501, tokenIndex501 := position, tokenIndex
+						{
+							position506, tokenIndex506 := position, tokenIndex
+							if c := buffer[position]; c < rune('a') || c > rune('z') {
+								goto l507
+							}
+							position++
+							goto l506
+						l507:
+							position, tokenIndex = position506, tokenIndex506
+							if c := buffer[position]; c < rune('A') || c > rune('Z') {
+								goto l508
+							}
+							position++
+							goto l506
+						l508:
+							position, tokenIndex = position506, tokenIndex506
+							if buffer[position] != rune('_') {
+								goto l509
+							}
+							position++
+							goto l506
+						l509:
+							position, tokenIndex = position506, tokenIndex506
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l501
+							}
+							position++
+						}
+					l506:
+						goto l500
+					l501:
+						position, tokenIndex = position501, tokenIndex501
+					}
+				}
+			l498:
+				if buffer[position] != rune('@') {
+					goto l496
+				}
+				position++
+				{
+					position510, tokenIndex510 := position, tokenIndex
+					if buffer[position] != rune('h') {
+						goto l511
+					}
+					position++
+					goto l510
+				l511:
+					position, tokenIndex = position510, tokenIndex510
+					if buffer[position] != rune('H') {
+						goto l496
+					}
+					position++
+				}
+			l510:
+				{
+					position512, tokenIndex512 := position, tokenIndex
+					if buffer[position] != rune('a') {
+						goto l513
+					}
+					position++
+					goto l512
+				l513:
+					position, tokenIndex = position512, tokenIndex512
+					if buffer[position] != rune('A') {
+						goto l496
+					}
+					position++
+				}
+			l512:
+				add(ruleTOCRefHigh, position497)
+			}
+			return true
+		l496:
+			position, tokenIndex = position496, tokenIndex496
+			return false
+		},
+		/* 40 TOCRefLow <- <('.' 'T' 'O' 'C' '.' '-' (('0' 'b') / ('.' 'L' ([a-z] / [A-Z] / '_' / [0-9])+)) ('@' ('l' / 'L')))> */
+		func() bool {
+			position514, tokenIndex514 := position, tokenIndex
+			{
+				position515 := position
+				if buffer[position] != rune('.') {
+					goto l514
+				}
+				position++
+				if buffer[position] != rune('T') {
+					goto l514
+				}
+				position++
+				if buffer[position] != rune('O') {
+					goto l514
+				}
+				position++
+				if buffer[position] != rune('C') {
+					goto l514
+				}
+				position++
+				if buffer[position] != rune('.') {
+					goto l514
+				}
+				position++
+				if buffer[position] != rune('-') {
+					goto l514
+				}
+				position++
+				{
+					position516, tokenIndex516 := position, tokenIndex
+					if buffer[position] != rune('0') {
+						goto l517
+					}
+					position++
+					if buffer[position] != rune('b') {
+						goto l517
+					}
+					position++
+					goto l516
+				l517:
+					position, tokenIndex = position516, tokenIndex516
+					if buffer[position] != rune('.') {
 						goto l514
 					}
 					position++
-					goto l513
-				l514:
-					position, tokenIndex = position513, tokenIndex513
-					if buffer[position] != rune('.') {
-						goto l511
-					}
-					position++
 					if buffer[position] != rune('L') {
-						goto l511
+						goto l514
 					}
 					position++
 					{
-						position517, tokenIndex517 := position, tokenIndex
+						position520, tokenIndex520 := position, tokenIndex
 						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l518
-						}
-						position++
-						goto l517
-					l518:
-						position, tokenIndex = position517, tokenIndex517
-						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l519
-						}
-						position++
-						goto l517
-					l519:
-						position, tokenIndex = position517, tokenIndex517
-						if buffer[position] != rune('_') {
-							goto l520
-						}
-						position++
-						goto l517
-					l520:
-						position, tokenIndex = position517, tokenIndex517
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l511
-						}
-						position++
-					}
-				l517:
-				l515:
-					{
-						position516, tokenIndex516 := position, tokenIndex
-						{
-							position521, tokenIndex521 := position, tokenIndex
-							if c := buffer[position]; c < rune('a') || c > rune('z') {
-								goto l522
-							}
-							position++
 							goto l521
-						l522:
-							position, tokenIndex = position521, tokenIndex521
-							if c := buffer[position]; c < rune('A') || c > rune('Z') {
-								goto l523
-							}
-							position++
-							goto l521
-						l523:
-							position, tokenIndex = position521, tokenIndex521
-							if buffer[position] != rune('_') {
-								goto l524
-							}
-							position++
-							goto l521
-						l524:
-							position, tokenIndex = position521, tokenIndex521
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l516
-							}
-							position++
 						}
+						position++
+						goto l520
 					l521:
-						goto l515
-					l516:
-						position, tokenIndex = position516, tokenIndex516
-					}
-				}
-			l513:
-				if buffer[position] != rune('@') {
-					goto l511
-				}
-				position++
-				{
-					position525, tokenIndex525 := position, tokenIndex
-					if buffer[position] != rune('l') {
-						goto l526
-					}
-					position++
-					goto l525
-				l526:
-					position, tokenIndex = position525, tokenIndex525
-					if buffer[position] != rune('L') {
-						goto l511
-					}
-					position++
-				}
-			l525:
-				add(ruleTOCRefLow, position512)
-			}
-			return true
-		l511:
-			position, tokenIndex = position511, tokenIndex511
-			return false
-		},
-		/* 40 IndirectionIndicator <- <'*'> */
-		func() bool {
-			position527, tokenIndex527 := position, tokenIndex
-			{
-				position528 := position
-				if buffer[position] != rune('*') {
-					goto l527
-				}
-				position++
-				add(ruleIndirectionIndicator, position528)
-			}
-			return true
-		l527:
-			position, tokenIndex = position527, tokenIndex527
-			return false
-		},
-		/* 41 RegisterOrConstant <- <((('%' ([a-z] / [A-Z]) ([a-z] / [A-Z] / ([0-9] / [0-9]))*) / ('$'? ((Offset Offset) / Offset)) / ('#' Offset ('*' [0-9]+ ('-' [0-9] [0-9]*)?)?) / ('#' '~'? '(' [0-9] WS? ('<' '<') WS? [0-9] ')') / ARMRegister) !('f' / 'b' / ':' / '(' / '+' / '-'))> */
-		func() bool {
-			position529, tokenIndex529 := position, tokenIndex
-			{
-				position530 := position
-				{
-					position531, tokenIndex531 := position, tokenIndex
-					if buffer[position] != rune('%') {
-						goto l532
-					}
-					position++
-					{
-						position533, tokenIndex533 := position, tokenIndex
-						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l534
-						}
-						position++
-						goto l533
-					l534:
-						position, tokenIndex = position533, tokenIndex533
+						position, tokenIndex = position520, tokenIndex520
 						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l532
+							goto l522
+						}
+						position++
+						goto l520
+					l522:
+						position, tokenIndex = position520, tokenIndex520
+						if buffer[position] != rune('_') {
+							goto l523
+						}
+						position++
+						goto l520
+					l523:
+						position, tokenIndex = position520, tokenIndex520
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l514
 						}
 						position++
 					}
-				l533:
-				l535:
+				l520:
+				l518:
+					{
+						position519, tokenIndex519 := position, tokenIndex
+						{
+							position524, tokenIndex524 := position, tokenIndex
+							if c := buffer[position]; c < rune('a') || c > rune('z') {
+								goto l525
+							}
+							position++
+							goto l524
+						l525:
+							position, tokenIndex = position524, tokenIndex524
+							if c := buffer[position]; c < rune('A') || c > rune('Z') {
+								goto l526
+							}
+							position++
+							goto l524
+						l526:
+							position, tokenIndex = position524, tokenIndex524
+							if buffer[position] != rune('_') {
+								goto l527
+							}
+							position++
+							goto l524
+						l527:
+							position, tokenIndex = position524, tokenIndex524
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l519
+							}
+							position++
+						}
+					l524:
+						goto l518
+					l519:
+						position, tokenIndex = position519, tokenIndex519
+					}
+				}
+			l516:
+				if buffer[position] != rune('@') {
+					goto l514
+				}
+				position++
+				{
+					position528, tokenIndex528 := position, tokenIndex
+					if buffer[position] != rune('l') {
+						goto l529
+					}
+					position++
+					goto l528
+				l529:
+					position, tokenIndex = position528, tokenIndex528
+					if buffer[position] != rune('L') {
+						goto l514
+					}
+					position++
+				}
+			l528:
+				add(ruleTOCRefLow, position515)
+			}
+			return true
+		l514:
+			position, tokenIndex = position514, tokenIndex514
+			return false
+		},
+		/* 41 IndirectionIndicator <- <'*'> */
+		func() bool {
+			position530, tokenIndex530 := position, tokenIndex
+			{
+				position531 := position
+				if buffer[position] != rune('*') {
+					goto l530
+				}
+				position++
+				add(ruleIndirectionIndicator, position531)
+			}
+			return true
+		l530:
+			position, tokenIndex = position530, tokenIndex530
+			return false
+		},
+		/* 42 RegisterOrConstant <- <((('%' ([a-z] / [A-Z]) ([a-z] / [A-Z] / ([0-9] / [0-9]))*) / ('$'? ((Offset Offset) / Offset)) / ('#' Offset ('*' [0-9]+ ('-' [0-9] [0-9]*)?)?) / ('#' '~'? '(' [0-9] WS? ('<' '<') WS? [0-9] ')') / ARMRegister) !('f' / 'b' / ':' / '(' / '+' / '-'))> */
+		func() bool {
+			position532, tokenIndex532 := position, tokenIndex
+			{
+				position533 := position
+				{
+					position534, tokenIndex534 := position, tokenIndex
+					if buffer[position] != rune('%') {
+						goto l535
+					}
+					position++
 					{
 						position536, tokenIndex536 := position, tokenIndex
-						{
-							position537, tokenIndex537 := position, tokenIndex
-							if c := buffer[position]; c < rune('a') || c > rune('z') {
-								goto l538
-							}
-							position++
+						if c := buffer[position]; c < rune('a') || c > rune('z') {
 							goto l537
-						l538:
-							position, tokenIndex = position537, tokenIndex537
-							if c := buffer[position]; c < rune('A') || c > rune('Z') {
-								goto l539
-							}
-							position++
-							goto l537
-						l539:
-							position, tokenIndex = position537, tokenIndex537
-							{
-								position540, tokenIndex540 := position, tokenIndex
-								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l541
-								}
-								position++
-								goto l540
-							l541:
-								position, tokenIndex = position540, tokenIndex540
-								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l536
-								}
-								position++
-							}
-						l540:
-						}
-					l537:
-						goto l535
-					l536:
-						position, tokenIndex = position536, tokenIndex536
-					}
-					goto l531
-				l532:
-					position, tokenIndex = position531, tokenIndex531
-					{
-						position543, tokenIndex543 := position, tokenIndex
-						if buffer[position] != rune('$') {
-							goto l543
 						}
 						position++
-						goto l544
-					l543:
-						position, tokenIndex = position543, tokenIndex543
+						goto l536
+					l537:
+						position, tokenIndex = position536, tokenIndex536
+						if c := buffer[position]; c < rune('A') || c > rune('Z') {
+							goto l535
+						}
+						position++
 					}
-				l544:
+				l536:
+				l538:
 					{
-						position545, tokenIndex545 := position, tokenIndex
-						if !_rules[ruleOffset]() {
+						position539, tokenIndex539 := position, tokenIndex
+						{
+							position540, tokenIndex540 := position, tokenIndex
+							if c := buffer[position]; c < rune('a') || c > rune('z') {
+								goto l541
+							}
+							position++
+							goto l540
+						l541:
+							position, tokenIndex = position540, tokenIndex540
+							if c := buffer[position]; c < rune('A') || c > rune('Z') {
+								goto l542
+							}
+							position++
+							goto l540
+						l542:
+							position, tokenIndex = position540, tokenIndex540
+							{
+								position543, tokenIndex543 := position, tokenIndex
+								if c := buffer[position]; c < rune('0') || c > rune('9') {
+									goto l544
+								}
+								position++
+								goto l543
+							l544:
+								position, tokenIndex = position543, tokenIndex543
+								if c := buffer[position]; c < rune('0') || c > rune('9') {
+									goto l539
+								}
+								position++
+							}
+						l543:
+						}
+					l540:
+						goto l538
+					l539:
+						position, tokenIndex = position539, tokenIndex539
+					}
+					goto l534
+				l535:
+					position, tokenIndex = position534, tokenIndex534
+					{
+						position546, tokenIndex546 := position, tokenIndex
+						if buffer[position] != rune('$') {
 							goto l546
 						}
-						if !_rules[ruleOffset]() {
-							goto l546
-						}
-						goto l545
+						position++
+						goto l547
 					l546:
-						position, tokenIndex = position545, tokenIndex545
+						position, tokenIndex = position546, tokenIndex546
+					}
+				l547:
+					{
+						position548, tokenIndex548 := position, tokenIndex
 						if !_rules[ruleOffset]() {
-							goto l542
+							goto l549
+						}
+						if !_rules[ruleOffset]() {
+							goto l549
+						}
+						goto l548
+					l549:
+						position, tokenIndex = position548, tokenIndex548
+						if !_rules[ruleOffset]() {
+							goto l545
 						}
 					}
+				l548:
+					goto l534
 				l545:
-					goto l531
-				l542:
-					position, tokenIndex = position531, tokenIndex531
+					position, tokenIndex = position534, tokenIndex534
 					if buffer[position] != rune('#') {
-						goto l547
+						goto l550
 					}
 					position++
 					if !_rules[ruleOffset]() {
-						goto l547
+						goto l550
 					}
 					{
-						position548, tokenIndex548 := position, tokenIndex
+						position551, tokenIndex551 := position, tokenIndex
 						if buffer[position] != rune('*') {
-							goto l548
+							goto l551
 						}
 						position++
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l548
+							goto l551
 						}
 						position++
-					l550:
+					l553:
 						{
-							position551, tokenIndex551 := position, tokenIndex
+							position554, tokenIndex554 := position, tokenIndex
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l551
+								goto l554
 							}
 							position++
-							goto l550
-						l551:
-							position, tokenIndex = position551, tokenIndex551
+							goto l553
+						l554:
+							position, tokenIndex = position554, tokenIndex554
 						}
 						{
-							position552, tokenIndex552 := position, tokenIndex
+							position555, tokenIndex555 := position, tokenIndex
 							if buffer[position] != rune('-') {
-								goto l552
+								goto l555
 							}
 							position++
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l552
+								goto l555
 							}
 							position++
-						l554:
+						l557:
 							{
-								position555, tokenIndex555 := position, tokenIndex
+								position558, tokenIndex558 := position, tokenIndex
 								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l555
+									goto l558
 								}
 								position++
-								goto l554
-							l555:
-								position, tokenIndex = position555, tokenIndex555
+								goto l557
+							l558:
+								position, tokenIndex = position558, tokenIndex558
 							}
-							goto l553
-						l552:
-							position, tokenIndex = position552, tokenIndex552
+							goto l556
+						l555:
+							position, tokenIndex = position555, tokenIndex555
 						}
-					l553:
-						goto l549
-					l548:
-						position, tokenIndex = position548, tokenIndex548
+					l556:
+						goto l552
+					l551:
+						position, tokenIndex = position551, tokenIndex551
 					}
-				l549:
-					goto l531
-				l547:
-					position, tokenIndex = position531, tokenIndex531
+				l552:
+					goto l534
+				l550:
+					position, tokenIndex = position534, tokenIndex534
 					if buffer[position] != rune('#') {
-						goto l556
+						goto l559
 					}
 					position++
 					{
-						position557, tokenIndex557 := position, tokenIndex
+						position560, tokenIndex560 := position, tokenIndex
 						if buffer[position] != rune('~') {
-							goto l557
+							goto l560
 						}
 						position++
-						goto l558
-					l557:
-						position, tokenIndex = position557, tokenIndex557
+						goto l561
+					l560:
+						position, tokenIndex = position560, tokenIndex560
 					}
-				l558:
+				l561:
 					if buffer[position] != rune('(') {
-						goto l556
+						goto l559
 					}
 					position++
 					if c := buffer[position]; c < rune('0') || c > rune('9') {
-						goto l556
+						goto l559
 					}
 					position++
 					{
-						position559, tokenIndex559 := position, tokenIndex
+						position562, tokenIndex562 := position, tokenIndex
 						if !_rules[ruleWS]() {
-							goto l559
+							goto l562
 						}
-						goto l560
-					l559:
-						position, tokenIndex = position559, tokenIndex559
+						goto l563
+					l562:
+						position, tokenIndex = position562, tokenIndex562
 					}
-				l560:
+				l563:
 					if buffer[position] != rune('<') {
-						goto l556
+						goto l559
 					}
 					position++
 					if buffer[position] != rune('<') {
-						goto l556
+						goto l559
 					}
 					position++
 					{
-						position561, tokenIndex561 := position, tokenIndex
+						position564, tokenIndex564 := position, tokenIndex
 						if !_rules[ruleWS]() {
-							goto l561
+							goto l564
 						}
-						goto l562
-					l561:
-						position, tokenIndex = position561, tokenIndex561
+						goto l565
+					l564:
+						position, tokenIndex = position564, tokenIndex564
 					}
-				l562:
+				l565:
 					if c := buffer[position]; c < rune('0') || c > rune('9') {
-						goto l556
+						goto l559
 					}
 					position++
 					if buffer[position] != rune(')') {
-						goto l556
+						goto l559
 					}
 					position++
-					goto l531
-				l556:
-					position, tokenIndex = position531, tokenIndex531
+					goto l534
+				l559:
+					position, tokenIndex = position534, tokenIndex534
 					if !_rules[ruleARMRegister]() {
-						goto l529
+						goto l532
 					}
 				}
-			l531:
+			l534:
 				{
-					position563, tokenIndex563 := position, tokenIndex
+					position566, tokenIndex566 := position, tokenIndex
 					{
-						position564, tokenIndex564 := position, tokenIndex
+						position567, tokenIndex567 := position, tokenIndex
 						if buffer[position] != rune('f') {
-							goto l565
-						}
-						position++
-						goto l564
-					l565:
-						position, tokenIndex = position564, tokenIndex564
-						if buffer[position] != rune('b') {
-							goto l566
-						}
-						position++
-						goto l564
-					l566:
-						position, tokenIndex = position564, tokenIndex564
-						if buffer[position] != rune(':') {
-							goto l567
-						}
-						position++
-						goto l564
-					l567:
-						position, tokenIndex = position564, tokenIndex564
-						if buffer[position] != rune('(') {
 							goto l568
 						}
 						position++
-						goto l564
+						goto l567
 					l568:
-						position, tokenIndex = position564, tokenIndex564
-						if buffer[position] != rune('+') {
+						position, tokenIndex = position567, tokenIndex567
+						if buffer[position] != rune('b') {
 							goto l569
 						}
 						position++
-						goto l564
+						goto l567
 					l569:
-						position, tokenIndex = position564, tokenIndex564
+						position, tokenIndex = position567, tokenIndex567
+						if buffer[position] != rune(':') {
+							goto l570
+						}
+						position++
+						goto l567
+					l570:
+						position, tokenIndex = position567, tokenIndex567
+						if buffer[position] != rune('(') {
+							goto l571
+						}
+						position++
+						goto l567
+					l571:
+						position, tokenIndex = position567, tokenIndex567
+						if buffer[position] != rune('+') {
+							goto l572
+						}
+						position++
+						goto l567
+					l572:
+						position, tokenIndex = position567, tokenIndex567
 						if buffer[position] != rune('-') {
-							goto l563
+							goto l566
 						}
 						position++
 					}
-				l564:
-					goto l529
-				l563:
-					position, tokenIndex = position563, tokenIndex563
+				l567:
+					goto l532
+				l566:
+					position, tokenIndex = position566, tokenIndex566
 				}
-				add(ruleRegisterOrConstant, position530)
+				add(ruleRegisterOrConstant, position533)
 			}
 			return true
-		l529:
-			position, tokenIndex = position529, tokenIndex529
+		l532:
+			position, tokenIndex = position532, tokenIndex532
 			return false
 		},
-		/* 42 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)?)> */
 		func() bool {
-			position570, tokenIndex570 := position, tokenIndex
+			position573, tokenIndex573 := position, tokenIndex
 			{
-				position571 := position
+				position574 := position
 				{
-					position572, tokenIndex572 := position, tokenIndex
+					position575, tokenIndex575 := position, tokenIndex
 					{
-						position574, tokenIndex574 := position, tokenIndex
+						position577, tokenIndex577 := position, tokenIndex
 						if buffer[position] != rune('u') {
-							goto l575
+							goto l578
 						}
 						position++
-						goto l574
-					l575:
-						position, tokenIndex = position574, tokenIndex574
+						goto l577
+					l578:
+						position, tokenIndex = position577, tokenIndex577
 						if buffer[position] != rune('s') {
-							goto l573
+							goto l576
 						}
 						position++
 					}
-				l574:
+				l577:
 					{
-						position576, tokenIndex576 := position, tokenIndex
+						position579, tokenIndex579 := position, tokenIndex
 						if buffer[position] != rune('x') {
-							goto l577
+							goto l580
 						}
 						position++
-						goto l576
-					l577:
-						position, tokenIndex = position576, tokenIndex576
+						goto l579
+					l580:
+						position, tokenIndex = position579, tokenIndex579
 						if buffer[position] != rune('X') {
-							goto l573
+							goto l576
 						}
 						position++
 					}
-				l576:
+				l579:
 					{
-						position578, tokenIndex578 := position, tokenIndex
+						position581, tokenIndex581 := position, tokenIndex
 						if buffer[position] != rune('t') {
-							goto l579
-						}
-						position++
-						goto l578
-					l579:
-						position, tokenIndex = position578, tokenIndex578
-						if buffer[position] != rune('T') {
-							goto l573
-						}
-						position++
-					}
-				l578:
-					{
-						position580, tokenIndex580 := position, tokenIndex
-						if buffer[position] != rune('x') {
-							goto l581
-						}
-						position++
-						goto l580
-					l581:
-						position, tokenIndex = position580, tokenIndex580
-						if buffer[position] != rune('w') {
 							goto l582
 						}
 						position++
-						goto l580
+						goto l581
 					l582:
-						position, tokenIndex = position580, tokenIndex580
-						if buffer[position] != rune('h') {
-							goto l583
-						}
-						position++
-						goto l580
-					l583:
-						position, tokenIndex = position580, tokenIndex580
-						if buffer[position] != rune('b') {
-							goto l573
+						position, tokenIndex = position581, tokenIndex581
+						if buffer[position] != rune('T') {
+							goto l576
 						}
 						position++
 					}
-				l580:
-					goto l572
-				l573:
-					position, tokenIndex = position572, tokenIndex572
+				l581:
 					{
-						position585, tokenIndex585 := position, tokenIndex
-						if buffer[position] != rune('l') {
+						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 l585
+						goto l583
 					l586:
-						position, tokenIndex = position585, tokenIndex585
-						if buffer[position] != rune('L') {
-							goto l584
+						position, tokenIndex = position583, tokenIndex583
+						if buffer[position] != rune('b') {
+							goto l576
 						}
 						position++
 					}
-				l585:
+				l583:
+					goto l575
+				l576:
+					position, tokenIndex = position575, tokenIndex575
 					{
-						position587, tokenIndex587 := position, tokenIndex
-						if buffer[position] != rune('s') {
-							goto l588
-						}
-						position++
-						goto l587
-					l588:
-						position, tokenIndex = position587, tokenIndex587
-						if buffer[position] != rune('S') {
-							goto l584
-						}
-						position++
-					}
-				l587:
-					{
-						position589, tokenIndex589 := position, tokenIndex
+						position588, tokenIndex588 := position, tokenIndex
 						if buffer[position] != rune('l') {
-							goto l590
+							goto l589
 						}
 						position++
-						goto l589
-					l590:
-						position, tokenIndex = position589, tokenIndex589
+						goto l588
+					l589:
+						position, tokenIndex = position588, tokenIndex588
 						if buffer[position] != rune('L') {
-							goto l584
+							goto l587
 						}
 						position++
 					}
-				l589:
-					goto l572
-				l584:
-					position, tokenIndex = position572, tokenIndex572
+				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') {
@@ -4782,44 +4892,44 @@
 					l593:
 						position, tokenIndex = position592, tokenIndex592
 						if buffer[position] != rune('L') {
-							goto l591
+							goto l587
 						}
 						position++
 					}
 				l592:
+					goto l575
+				l587:
+					position, tokenIndex = position575, tokenIndex575
 					{
-						position594, tokenIndex594 := position, tokenIndex
+						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 l595
+							goto l598
 						}
 						position++
-						goto l594
-					l595:
-						position, tokenIndex = position594, tokenIndex594
+						goto l597
+					l598:
+						position, tokenIndex = position597, tokenIndex597
 						if buffer[position] != rune('S') {
-							goto l591
+							goto l594
 						}
 						position++
 					}
-				l594:
-					{
-						position596, tokenIndex596 := position, tokenIndex
-						if buffer[position] != rune('r') {
-							goto l597
-						}
-						position++
-						goto l596
-					l597:
-						position, tokenIndex = position596, tokenIndex596
-						if buffer[position] != rune('R') {
-							goto l591
-						}
-						position++
-					}
-				l596:
-					goto l572
-				l591:
-					position, tokenIndex = position572, tokenIndex572
+				l597:
 					{
 						position599, tokenIndex599 := position, tokenIndex
 						if buffer[position] != rune('r') {
@@ -4830,933 +4940,925 @@
 					l600:
 						position, tokenIndex = position599, tokenIndex599
 						if buffer[position] != rune('R') {
-							goto l598
+							goto l594
 						}
 						position++
 					}
 				l599:
+					goto l575
+				l594:
+					position, tokenIndex = position575, tokenIndex575
 					{
-						position601, tokenIndex601 := position, tokenIndex
+						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 l602
+							goto l605
 						}
 						position++
-						goto l601
-					l602:
-						position, tokenIndex = position601, tokenIndex601
+						goto l604
+					l605:
+						position, tokenIndex = position604, tokenIndex604
 						if buffer[position] != rune('O') {
-							goto l598
+							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
 					{
-						position603, tokenIndex603 := position, tokenIndex
-						if buffer[position] != rune('r') {
-							goto l604
-						}
-						position++
-						goto l603
-					l604:
-						position, tokenIndex = position603, tokenIndex603
-						if buffer[position] != rune('R') {
-							goto l598
-						}
-						position++
-					}
-				l603:
-					goto l572
-				l598:
-					position, tokenIndex = position572, tokenIndex572
-					{
-						position605, tokenIndex605 := position, tokenIndex
+						position608, tokenIndex608 := position, tokenIndex
 						if buffer[position] != rune('a') {
-							goto l606
+							goto l609
 						}
 						position++
-						goto l605
-					l606:
-						position, tokenIndex = position605, tokenIndex605
+						goto l608
+					l609:
+						position, tokenIndex = position608, tokenIndex608
 						if buffer[position] != rune('A') {
-							goto l570
+							goto l573
 						}
 						position++
 					}
-				l605:
+				l608:
 					{
-						position607, tokenIndex607 := position, tokenIndex
+						position610, tokenIndex610 := position, tokenIndex
 						if buffer[position] != rune('s') {
-							goto l608
+							goto l611
 						}
 						position++
-						goto l607
-					l608:
-						position, tokenIndex = position607, tokenIndex607
+						goto l610
+					l611:
+						position, tokenIndex = position610, tokenIndex610
 						if buffer[position] != rune('S') {
-							goto l570
+							goto l573
 						}
 						position++
 					}
-				l607:
+				l610:
 					{
-						position609, tokenIndex609 := position, tokenIndex
+						position612, tokenIndex612 := position, tokenIndex
 						if buffer[position] != rune('r') {
-							goto l610
+							goto l613
 						}
 						position++
-						goto l609
-					l610:
-						position, tokenIndex = position609, tokenIndex609
+						goto l612
+					l613:
+						position, tokenIndex = position612, tokenIndex612
 						if buffer[position] != rune('R') {
-							goto l570
+							goto l573
 						}
 						position++
 					}
-				l609:
+				l612:
 				}
-			l572:
+			l575:
 				{
-					position611, tokenIndex611 := position, tokenIndex
+					position614, tokenIndex614 := position, tokenIndex
 					if !_rules[ruleWS]() {
-						goto l611
+						goto l614
 					}
 					if buffer[position] != rune('#') {
-						goto l611
+						goto l614
 					}
 					position++
 					if !_rules[ruleOffset]() {
-						goto l611
+						goto l614
 					}
-					goto l612
-				l611:
-					position, tokenIndex = position611, tokenIndex611
+					goto l615
+				l614:
+					position, tokenIndex = position614, tokenIndex614
 				}
-			l612:
-				add(ruleARMConstantTweak, position571)
+			l615:
+				add(ruleARMConstantTweak, position574)
 			}
 			return true
-		l570:
-			position, tokenIndex = position570, tokenIndex570
+		l573:
+			position, tokenIndex = position573, tokenIndex573
 			return false
 		},
-		/* 43 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 / ('{' WS? ARMVectorRegister (',' WS? ARMVectorRegister)* WS? '}' ('[' [0-9] [0-9]? ']')?))> */
 		func() bool {
-			position613, tokenIndex613 := position, tokenIndex
+			position616, tokenIndex616 := position, tokenIndex
 			{
-				position614 := position
+				position617 := position
 				{
-					position615, tokenIndex615 := position, tokenIndex
+					position618, tokenIndex618 := position, tokenIndex
 					{
-						position617, tokenIndex617 := position, tokenIndex
+						position620, tokenIndex620 := position, tokenIndex
 						if buffer[position] != rune('s') {
-							goto l618
+							goto l621
 						}
 						position++
-						goto l617
-					l618:
-						position, tokenIndex = position617, tokenIndex617
+						goto l620
+					l621:
+						position, tokenIndex = position620, tokenIndex620
 						if buffer[position] != rune('S') {
-							goto l616
+							goto l619
 						}
 						position++
 					}
-				l617:
-					{
-						position619, tokenIndex619 := position, tokenIndex
-						if buffer[position] != rune('p') {
-							goto l620
-						}
-						position++
-						goto l619
-					l620:
-						position, tokenIndex = position619, tokenIndex619
-						if buffer[position] != rune('P') {
-							goto l616
-						}
-						position++
-					}
-				l619:
-					goto l615
-				l616:
-					position, tokenIndex = position615, tokenIndex615
+				l620:
 					{
 						position622, tokenIndex622 := position, tokenIndex
-						if buffer[position] != rune('x') {
+						if buffer[position] != rune('p') {
 							goto l623
 						}
 						position++
 						goto l622
 					l623:
 						position, tokenIndex = position622, tokenIndex622
-						if buffer[position] != rune('w') {
-							goto l624
-						}
-						position++
-						goto l622
-					l624:
-						position, tokenIndex = position622, tokenIndex622
-						if buffer[position] != rune('d') {
-							goto l625
-						}
-						position++
-						goto l622
-					l625:
-						position, tokenIndex = position622, tokenIndex622
-						if buffer[position] != rune('q') {
-							goto l626
-						}
-						position++
-						goto l622
-					l626:
-						position, tokenIndex = position622, tokenIndex622
-						if buffer[position] != rune('s') {
-							goto l627
-						}
-						position++
-						goto l622
-					l627:
-						position, tokenIndex = position622, tokenIndex622
-						if buffer[position] != rune('h') {
-							goto l628
-						}
-						position++
-						goto l622
-					l628:
-						position, tokenIndex = position622, tokenIndex622
-						if buffer[position] != rune('b') {
-							goto l621
+						if buffer[position] != rune('P') {
+							goto l619
 						}
 						position++
 					}
 				l622:
-					if c := buffer[position]; c < rune('0') || c > rune('9') {
-						goto l621
-					}
-					position++
+					goto l618
+				l619:
+					position, tokenIndex = position618, tokenIndex618
 					{
-						position629, tokenIndex629 := position, tokenIndex
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
+						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 l630
+						goto l625
 					l629:
-						position, tokenIndex = position629, tokenIndex629
+						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++
 					}
-				l630:
-					goto l615
-				l621:
-					position, tokenIndex = position615, tokenIndex615
+				l625:
+					if c := buffer[position]; c < rune('0') || c > rune('9') {
+						goto l624
+					}
+					position++
 					{
 						position632, tokenIndex632 := position, tokenIndex
-						if buffer[position] != rune('x') {
-							goto l633
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l632
 						}
 						position++
-						goto l632
-					l633:
+						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 l631
+							goto l634
 						}
 						position++
 					}
-				l632:
+				l635:
 					{
-						position634, tokenIndex634 := position, tokenIndex
+						position637, tokenIndex637 := position, tokenIndex
 						if buffer[position] != rune('z') {
-							goto l635
+							goto l638
 						}
 						position++
-						goto l634
-					l635:
-						position, tokenIndex = position634, tokenIndex634
+						goto l637
+					l638:
+						position, tokenIndex = position637, tokenIndex637
 						if buffer[position] != rune('Z') {
-							goto l631
+							goto l634
 						}
 						position++
 					}
-				l634:
-					{
-						position636, tokenIndex636 := position, tokenIndex
-						if buffer[position] != rune('r') {
-							goto l637
-						}
-						position++
-						goto l636
-					l637:
-						position, tokenIndex = position636, tokenIndex636
-						if buffer[position] != rune('R') {
-							goto l631
-						}
-						position++
-					}
-				l636:
-					goto l615
-				l631:
-					position, tokenIndex = position615, tokenIndex615
+				l637:
 					{
 						position639, tokenIndex639 := position, tokenIndex
-						if buffer[position] != rune('w') {
+						if buffer[position] != rune('r') {
 							goto l640
 						}
 						position++
 						goto l639
 					l640:
 						position, tokenIndex = position639, tokenIndex639
-						if buffer[position] != rune('W') {
-							goto l638
+						if buffer[position] != rune('R') {
+							goto l634
 						}
 						position++
 					}
 				l639:
+					goto l618
+				l634:
+					position, tokenIndex = position618, tokenIndex618
 					{
-						position641, tokenIndex641 := position, tokenIndex
+						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:
+					{
+						position644, tokenIndex644 := position, tokenIndex
 						if buffer[position] != rune('z') {
-							goto l642
+							goto l645
 						}
 						position++
-						goto l641
-					l642:
-						position, tokenIndex = position641, tokenIndex641
+						goto l644
+					l645:
+						position, tokenIndex = position644, tokenIndex644
 						if buffer[position] != rune('Z') {
-							goto l638
+							goto l641
 						}
 						position++
 					}
-				l641:
-					{
-						position643, tokenIndex643 := position, tokenIndex
-						if buffer[position] != rune('r') {
-							goto l644
-						}
-						position++
-						goto l643
-					l644:
-						position, tokenIndex = position643, tokenIndex643
-						if buffer[position] != rune('R') {
-							goto l638
-						}
-						position++
-					}
-				l643:
-					goto l615
-				l638:
-					position, tokenIndex = position615, tokenIndex615
+				l644:
 					{
 						position646, tokenIndex646 := position, tokenIndex
-						if buffer[position] != rune('n') {
+						if buffer[position] != rune('r') {
 							goto l647
 						}
 						position++
 						goto l646
 					l647:
 						position, tokenIndex = position646, tokenIndex646
-						if buffer[position] != rune('N') {
-							goto l645
+						if buffer[position] != rune('R') {
+							goto l641
 						}
 						position++
 					}
 				l646:
+					goto l618
+				l641:
+					position, tokenIndex = position618, tokenIndex618
 					{
-						position648, tokenIndex648 := position, tokenIndex
+						position649, tokenIndex649 := position, tokenIndex
+						if buffer[position] != rune('n') {
+							goto l650
+						}
+						position++
+						goto l649
+					l650:
+						position, tokenIndex = position649, tokenIndex649
+						if buffer[position] != rune('N') {
+							goto l648
+						}
+						position++
+					}
+				l649:
+					{
+						position651, tokenIndex651 := position, tokenIndex
 						if buffer[position] != rune('z') {
-							goto l649
+							goto l652
 						}
 						position++
-						goto l648
-					l649:
-						position, tokenIndex = position648, tokenIndex648
+						goto l651
+					l652:
+						position, tokenIndex = position651, tokenIndex651
 						if buffer[position] != rune('Z') {
-							goto l645
+							goto l648
 						}
 						position++
 					}
-				l648:
+				l651:
 					{
-						position650, tokenIndex650 := position, tokenIndex
+						position653, tokenIndex653 := position, tokenIndex
 						if buffer[position] != rune('c') {
-							goto l651
+							goto l654
 						}
 						position++
-						goto l650
-					l651:
-						position, tokenIndex = position650, tokenIndex650
+						goto l653
+					l654:
+						position, tokenIndex = position653, tokenIndex653
 						if buffer[position] != rune('C') {
-							goto l645
+							goto l648
 						}
 						position++
 					}
-				l650:
+				l653:
 					{
-						position652, tokenIndex652 := position, tokenIndex
+						position655, tokenIndex655 := position, tokenIndex
 						if buffer[position] != rune('v') {
-							goto l653
+							goto l656
 						}
 						position++
-						goto l652
-					l653:
-						position, tokenIndex = position652, tokenIndex652
+						goto l655
+					l656:
+						position, tokenIndex = position655, tokenIndex655
 						if buffer[position] != rune('V') {
-							goto l645
+							goto l648
 						}
 						position++
 					}
-				l652:
-					goto l615
-				l645:
-					position, tokenIndex = position615, tokenIndex615
+				l655:
+					goto l618
+				l648:
+					position, tokenIndex = position618, tokenIndex618
 					if !_rules[ruleARMVectorRegister]() {
-						goto l654
+						goto l657
 					}
-					goto l615
-				l654:
-					position, tokenIndex = position615, tokenIndex615
+					goto l618
+				l657:
+					position, tokenIndex = position618, tokenIndex618
 					if buffer[position] != rune('{') {
-						goto l613
+						goto l616
 					}
 					position++
 					{
-						position655, tokenIndex655 := position, tokenIndex
-						if !_rules[ruleWS]() {
-							goto l655
-						}
-						goto l656
-					l655:
-						position, tokenIndex = position655, tokenIndex655
-					}
-				l656:
-					if !_rules[ruleARMVectorRegister]() {
-						goto l613
-					}
-				l657:
-					{
 						position658, tokenIndex658 := position, tokenIndex
-						if buffer[position] != rune(',') {
+						if !_rules[ruleWS]() {
 							goto l658
 						}
-						position++
-						{
-							position659, tokenIndex659 := position, tokenIndex
-							if !_rules[ruleWS]() {
-								goto l659
-							}
-							goto l660
-						l659:
-							position, tokenIndex = position659, tokenIndex659
-						}
-					l660:
-						if !_rules[ruleARMVectorRegister]() {
-							goto l658
-						}
-						goto l657
+						goto l659
 					l658:
 						position, tokenIndex = position658, tokenIndex658
 					}
+				l659:
+					if !_rules[ruleARMVectorRegister]() {
+						goto l616
+					}
+				l660:
 					{
 						position661, tokenIndex661 := position, tokenIndex
-						if !_rules[ruleWS]() {
+						if buffer[position] != rune(',') {
 							goto l661
 						}
-						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:
 						position, tokenIndex = position661, tokenIndex661
 					}
-				l662:
+					{
+						position664, tokenIndex664 := position, tokenIndex
+						if !_rules[ruleWS]() {
+							goto l664
+						}
+						goto l665
+					l664:
+						position, tokenIndex = position664, tokenIndex664
+					}
+				l665:
 					if buffer[position] != rune('}') {
-						goto l613
+						goto l616
 					}
 					position++
 					{
-						position663, tokenIndex663 := position, tokenIndex
+						position666, tokenIndex666 := position, tokenIndex
 						if buffer[position] != rune('[') {
-							goto l663
+							goto l666
 						}
 						position++
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l663
+							goto l666
 						}
 						position++
 						{
-							position665, tokenIndex665 := position, tokenIndex
+							position668, tokenIndex668 := position, tokenIndex
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l665
+								goto l668
 							}
 							position++
-							goto l666
-						l665:
-							position, tokenIndex = position665, tokenIndex665
+							goto l669
+						l668:
+							position, tokenIndex = position668, tokenIndex668
 						}
-					l666:
+					l669:
 						if buffer[position] != rune(']') {
-							goto l663
+							goto l666
 						}
 						position++
-						goto l664
-					l663:
-						position, tokenIndex = position663, tokenIndex663
+						goto l667
+					l666:
+						position, tokenIndex = position666, tokenIndex666
 					}
-				l664:
+				l667:
 				}
-			l615:
-				add(ruleARMRegister, position614)
+			l618:
+				add(ruleARMRegister, position617)
 			}
 			return true
-		l613:
-			position, tokenIndex = position613, tokenIndex613
+		l616:
+			position, tokenIndex = position616, tokenIndex616
 			return false
 		},
-		/* 44 ARMVectorRegister <- <(('v' / 'V') [0-9] [0-9]? ('.' [0-9]* ('b' / 's' / 'd' / 'h' / 'q') ('[' [0-9] [0-9]? ']')?)?)> */
+		/* 45 ARMVectorRegister <- <(('v' / 'V') [0-9] [0-9]? ('.' [0-9]* ('b' / 's' / 'd' / 'h' / 'q') ('[' [0-9] [0-9]? ']')?)?)> */
 		func() bool {
-			position667, tokenIndex667 := position, tokenIndex
+			position670, tokenIndex670 := position, tokenIndex
 			{
-				position668 := position
+				position671 := position
 				{
-					position669, tokenIndex669 := position, tokenIndex
+					position672, tokenIndex672 := position, tokenIndex
 					if buffer[position] != rune('v') {
-						goto l670
-					}
-					position++
-					goto l669
-				l670:
-					position, tokenIndex = position669, tokenIndex669
-					if buffer[position] != rune('V') {
-						goto l667
-					}
-					position++
-				}
-			l669:
-				if c := buffer[position]; c < rune('0') || c > rune('9') {
-					goto l667
-				}
-				position++
-				{
-					position671, tokenIndex671 := position, tokenIndex
-					if c := buffer[position]; c < rune('0') || c > rune('9') {
-						goto l671
-					}
-					position++
-					goto l672
-				l671:
-					position, tokenIndex = position671, tokenIndex671
-				}
-			l672:
-				{
-					position673, tokenIndex673 := position, tokenIndex
-					if buffer[position] != rune('.') {
 						goto l673
 					}
 					position++
-				l675:
-					{
-						position676, tokenIndex676 := position, tokenIndex
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l676
-						}
-						position++
-						goto l675
-					l676:
-						position, tokenIndex = position676, tokenIndex676
+					goto l672
+				l673:
+					position, tokenIndex = position672, tokenIndex672
+					if buffer[position] != rune('V') {
+						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
+					}
+					position++
+					goto l675
+				l674:
+					position, tokenIndex = position674, tokenIndex674
+				}
+			l675:
+				{
+					position676, tokenIndex676 := position, tokenIndex
+					if buffer[position] != rune('.') {
+						goto l676
+					}
+					position++
+				l678:
 					{
-						position677, tokenIndex677 := position, tokenIndex
-						if buffer[position] != rune('b') {
-							goto l678
-						}
-						position++
-						goto l677
-					l678:
-						position, tokenIndex = position677, tokenIndex677
-						if buffer[position] != rune('s') {
+						position679, tokenIndex679 := position, tokenIndex
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
 							goto l679
 						}
 						position++
-						goto l677
+						goto l678
 					l679:
-						position, tokenIndex = position677, tokenIndex677
-						if buffer[position] != rune('d') {
-							goto l680
-						}
-						position++
-						goto l677
-					l680:
-						position, tokenIndex = position677, tokenIndex677
-						if buffer[position] != rune('h') {
+						position, tokenIndex = position679, tokenIndex679
+					}
+					{
+						position680, tokenIndex680 := position, tokenIndex
+						if buffer[position] != rune('b') {
 							goto l681
 						}
 						position++
-						goto l677
+						goto l680
 					l681:
-						position, tokenIndex = position677, tokenIndex677
+						position, tokenIndex = position680, tokenIndex680
+						if buffer[position] != rune('s') {
+							goto l682
+						}
+						position++
+						goto l680
+					l682:
+						position, tokenIndex = position680, tokenIndex680
+						if buffer[position] != rune('d') {
+							goto l683
+						}
+						position++
+						goto l680
+					l683:
+						position, tokenIndex = position680, tokenIndex680
+						if buffer[position] != rune('h') {
+							goto l684
+						}
+						position++
+						goto l680
+					l684:
+						position, tokenIndex = position680, tokenIndex680
 						if buffer[position] != rune('q') {
-							goto l673
+							goto l676
 						}
 						position++
 					}
-				l677:
+				l680:
 					{
-						position682, tokenIndex682 := position, tokenIndex
+						position685, tokenIndex685 := position, tokenIndex
 						if buffer[position] != rune('[') {
-							goto l682
+							goto l685
 						}
 						position++
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l682
+							goto l685
 						}
 						position++
 						{
-							position684, tokenIndex684 := position, tokenIndex
+							position687, tokenIndex687 := position, tokenIndex
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l684
+								goto l687
 							}
 							position++
-							goto l685
-						l684:
-							position, tokenIndex = position684, tokenIndex684
+							goto l688
+						l687:
+							position, tokenIndex = position687, tokenIndex687
 						}
-					l685:
+					l688:
 						if buffer[position] != rune(']') {
-							goto l682
+							goto l685
 						}
 						position++
-						goto l683
-					l682:
-						position, tokenIndex = position682, tokenIndex682
+						goto l686
+					l685:
+						position, tokenIndex = position685, tokenIndex685
 					}
-				l683:
-					goto l674
-				l673:
-					position, tokenIndex = position673, tokenIndex673
+				l686:
+					goto l677
+				l676:
+					position, tokenIndex = position676, tokenIndex676
 				}
-			l674:
-				add(ruleARMVectorRegister, position668)
+			l677:
+				add(ruleARMVectorRegister, position671)
 			}
 			return true
-		l667:
-			position, tokenIndex = position667, tokenIndex667
+		l670:
+			position, tokenIndex = position670, tokenIndex670
 			return false
 		},
-		/* 45 MemoryRef <- <((SymbolRef BaseIndexScale) / SymbolRef / Low12BitsSymbolRef / (Offset* BaseIndexScale) / (SegmentRegister Offset BaseIndexScale) / (SegmentRegister BaseIndexScale) / (SegmentRegister Offset) / ARMBaseIndexScale / BaseIndexScale)> */
+		/* 46 MemoryRef <- <((SymbolRef BaseIndexScale) / SymbolRef / Low12BitsSymbolRef / (Offset* BaseIndexScale) / (SegmentRegister Offset BaseIndexScale) / (SegmentRegister BaseIndexScale) / (SegmentRegister Offset) / ARMBaseIndexScale / BaseIndexScale)> */
 		func() bool {
-			position686, tokenIndex686 := position, tokenIndex
+			position689, tokenIndex689 := position, tokenIndex
 			{
-				position687 := position
+				position690 := position
 				{
-					position688, tokenIndex688 := position, tokenIndex
+					position691, tokenIndex691 := position, tokenIndex
 					if !_rules[ruleSymbolRef]() {
-						goto l689
-					}
-					if !_rules[ruleBaseIndexScale]() {
-						goto l689
-					}
-					goto l688
-				l689:
-					position, tokenIndex = position688, tokenIndex688
-					if !_rules[ruleSymbolRef]() {
-						goto l690
-					}
-					goto l688
-				l690:
-					position, tokenIndex = position688, tokenIndex688
-					if !_rules[ruleLow12BitsSymbolRef]() {
-						goto l691
-					}
-					goto l688
-				l691:
-					position, tokenIndex = position688, tokenIndex688
-				l693:
-					{
-						position694, tokenIndex694 := position, tokenIndex
-						if !_rules[ruleOffset]() {
-							goto l694
-						}
-						goto l693
-					l694:
-						position, tokenIndex = position694, tokenIndex694
+						goto l692
 					}
 					if !_rules[ruleBaseIndexScale]() {
 						goto l692
 					}
-					goto l688
+					goto l691
 				l692:
-					position, tokenIndex = position688, tokenIndex688
-					if !_rules[ruleSegmentRegister]() {
-						goto l695
+					position, tokenIndex = position691, tokenIndex691
+					if !_rules[ruleSymbolRef]() {
+						goto l693
 					}
-					if !_rules[ruleOffset]() {
-						goto l695
+					goto l691
+				l693:
+					position, tokenIndex = position691, tokenIndex691
+					if !_rules[ruleLow12BitsSymbolRef]() {
+						goto l694
 					}
-					if !_rules[ruleBaseIndexScale]() {
-						goto l695
-					}
-					goto l688
-				l695:
-					position, tokenIndex = position688, tokenIndex688
-					if !_rules[ruleSegmentRegister]() {
-						goto l696
-					}
-					if !_rules[ruleBaseIndexScale]() {
-						goto l696
-					}
-					goto l688
+					goto l691
+				l694:
+					position, tokenIndex = position691, tokenIndex691
 				l696:
-					position, tokenIndex = position688, tokenIndex688
+					{
+						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 l697
-					}
-					if !_rules[ruleOffset]() {
-						goto l697
-					}
-					goto l688
-				l697:
-					position, tokenIndex = position688, tokenIndex688
-					if !_rules[ruleARMBaseIndexScale]() {
 						goto l698
 					}
-					goto l688
-				l698:
-					position, tokenIndex = position688, tokenIndex688
+					if !_rules[ruleOffset]() {
+						goto l698
+					}
 					if !_rules[ruleBaseIndexScale]() {
-						goto l686
+						goto l698
 					}
-				}
-			l688:
-				add(ruleMemoryRef, position687)
-			}
-			return true
-		l686:
-			position, tokenIndex = position686, tokenIndex686
-			return false
-		},
-		/* 46 SymbolRef <- <((Offset* '+')? (LocalSymbol / SymbolName) Offset* ('@' Section Offset*)?)> */
-		func() bool {
-			position699, tokenIndex699 := position, tokenIndex
-			{
-				position700 := position
-				{
-					position701, tokenIndex701 := position, tokenIndex
-				l703:
-					{
-						position704, tokenIndex704 := position, tokenIndex
-						if !_rules[ruleOffset]() {
-							goto l704
-						}
-						goto l703
-					l704:
-						position, tokenIndex = position704, tokenIndex704
-					}
-					if buffer[position] != rune('+') {
-						goto l701
-					}
-					position++
-					goto l702
-				l701:
-					position, tokenIndex = position701, tokenIndex701
-				}
-			l702:
-				{
-					position705, tokenIndex705 := position, tokenIndex
-					if !_rules[ruleLocalSymbol]() {
-						goto l706
-					}
-					goto l705
-				l706:
-					position, tokenIndex = position705, tokenIndex705
-					if !_rules[ruleSymbolName]() {
+					goto l691
+				l698:
+					position, tokenIndex = position691, tokenIndex691
+					if !_rules[ruleSegmentRegister]() {
 						goto l699
 					}
+					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
+					}
+				}
+			l691:
+				add(ruleMemoryRef, position690)
+			}
+			return true
+		l689:
+			position, tokenIndex = position689, tokenIndex689
+			return false
+		},
+		/* 47 SymbolRef <- <((Offset* '+')? (LocalSymbol / SymbolName) Offset* ('@' Section Offset*)?)> */
+		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
+					}
+					position++
+					goto l705
+				l704:
+					position, tokenIndex = position704, tokenIndex704
 				}
 			l705:
-			l707:
 				{
 					position708, tokenIndex708 := position, tokenIndex
-					if !_rules[ruleOffset]() {
-						goto l708
+					if !_rules[ruleLocalSymbol]() {
+						goto l709
 					}
-					goto l707
-				l708:
+					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
 				}
 				{
-					position709, tokenIndex709 := position, tokenIndex
+					position712, tokenIndex712 := position, tokenIndex
 					if buffer[position] != rune('@') {
-						goto l709
+						goto l712
 					}
 					position++
 					if !_rules[ruleSection]() {
-						goto l709
+						goto l712
 					}
-				l711:
+				l714:
 					{
-						position712, tokenIndex712 := position, tokenIndex
+						position715, tokenIndex715 := position, tokenIndex
 						if !_rules[ruleOffset]() {
-							goto l712
+							goto l715
 						}
-						goto l711
-					l712:
-						position, tokenIndex = position712, tokenIndex712
+						goto l714
+					l715:
+						position, tokenIndex = position715, tokenIndex715
 					}
-					goto l710
-				l709:
-					position, tokenIndex = position709, tokenIndex709
+					goto l713
+				l712:
+					position, tokenIndex = position712, tokenIndex712
 				}
-			l710:
-				add(ruleSymbolRef, position700)
+			l713:
+				add(ruleSymbolRef, position703)
 			}
 			return true
-		l699:
-			position, tokenIndex = position699, tokenIndex699
+		l702:
+			position, tokenIndex = position702, tokenIndex702
 			return false
 		},
-		/* 47 Low12BitsSymbolRef <- <(':' ('l' / 'L') ('o' / 'O') '1' '2' ':' (LocalSymbol / SymbolName) Offset?)> */
+		/* 48 Low12BitsSymbolRef <- <(':' ('l' / 'L') ('o' / 'O') '1' '2' ':' (LocalSymbol / SymbolName) Offset?)> */
 		func() bool {
-			position713, tokenIndex713 := position, tokenIndex
+			position716, tokenIndex716 := position, tokenIndex
 			{
-				position714 := position
+				position717 := position
 				if buffer[position] != rune(':') {
-					goto l713
+					goto l716
 				}
 				position++
 				{
-					position715, tokenIndex715 := position, tokenIndex
+					position718, tokenIndex718 := position, tokenIndex
 					if buffer[position] != rune('l') {
+						goto l719
+					}
+					position++
+					goto l718
+				l719:
+					position, tokenIndex = position718, tokenIndex718
+					if buffer[position] != rune('L') {
 						goto l716
 					}
 					position++
-					goto l715
-				l716:
-					position, tokenIndex = position715, tokenIndex715
-					if buffer[position] != rune('L') {
-						goto l713
-					}
-					position++
 				}
-			l715:
+			l718:
 				{
-					position717, tokenIndex717 := position, tokenIndex
+					position720, tokenIndex720 := position, tokenIndex
 					if buffer[position] != rune('o') {
-						goto l718
+						goto l721
 					}
 					position++
-					goto l717
-				l718:
-					position, tokenIndex = position717, tokenIndex717
+					goto l720
+				l721:
+					position, tokenIndex = position720, tokenIndex720
 					if buffer[position] != rune('O') {
-						goto l713
+						goto l716
 					}
 					position++
 				}
-			l717:
+			l720:
 				if buffer[position] != rune('1') {
-					goto l713
+					goto l716
 				}
 				position++
 				if buffer[position] != rune('2') {
-					goto l713
+					goto l716
 				}
 				position++
 				if buffer[position] != rune(':') {
-					goto l713
+					goto l716
 				}
 				position++
 				{
-					position719, tokenIndex719 := position, tokenIndex
+					position722, tokenIndex722 := position, tokenIndex
 					if !_rules[ruleLocalSymbol]() {
-						goto l720
-					}
-					goto l719
-				l720:
-					position, tokenIndex = position719, tokenIndex719
-					if !_rules[ruleSymbolName]() {
-						goto l713
-					}
-				}
-			l719:
-				{
-					position721, tokenIndex721 := position, tokenIndex
-					if !_rules[ruleOffset]() {
-						goto l721
+						goto l723
 					}
 					goto l722
-				l721:
-					position, tokenIndex = position721, tokenIndex721
+				l723:
+					position, tokenIndex = position722, tokenIndex722
+					if !_rules[ruleSymbolName]() {
+						goto l716
+					}
 				}
 			l722:
-				add(ruleLow12BitsSymbolRef, position714)
+				{
+					position724, tokenIndex724 := position, tokenIndex
+					if !_rules[ruleOffset]() {
+						goto l724
+					}
+					goto l725
+				l724:
+					position, tokenIndex = position724, tokenIndex724
+				}
+			l725:
+				add(ruleLow12BitsSymbolRef, position717)
 			}
 			return true
-		l713:
-			position, tokenIndex = position713, tokenIndex713
+		l716:
+			position, tokenIndex = position716, tokenIndex716
 			return false
 		},
-		/* 48 ARMBaseIndexScale <- <('[' ARMRegister (',' WS? (('#' Offset (('*' [0-9]+) / ('*' '(' [0-9]+ Operator [0-9]+ ')') / ('+' [0-9]+)*)?) / ARMGOTLow12 / Low12BitsSymbolRef / ARMRegister) (',' WS? ARMConstantTweak)?)? ']' ARMPostincrement?)> */
+		/* 49 ARMBaseIndexScale <- <('[' ARMRegister (',' WS? (('#' Offset (('*' [0-9]+) / ('*' '(' [0-9]+ Operator [0-9]+ ')') / ('+' [0-9]+)*)?) / ARMGOTLow12 / Low12BitsSymbolRef / ARMRegister) (',' WS? ARMConstantTweak)?)? ']' ARMPostincrement?)> */
 		func() bool {
-			position723, tokenIndex723 := position, tokenIndex
+			position726, tokenIndex726 := position, tokenIndex
 			{
-				position724 := position
+				position727 := position
 				if buffer[position] != rune('[') {
-					goto l723
+					goto l726
 				}
 				position++
 				if !_rules[ruleARMRegister]() {
-					goto l723
+					goto l726
 				}
 				{
-					position725, tokenIndex725 := position, tokenIndex
+					position728, tokenIndex728 := position, tokenIndex
 					if buffer[position] != rune(',') {
-						goto l725
+						goto l728
 					}
 					position++
 					{
-						position727, tokenIndex727 := position, tokenIndex
+						position730, tokenIndex730 := position, tokenIndex
 						if !_rules[ruleWS]() {
-							goto l727
-						}
-						goto l728
-					l727:
-						position, tokenIndex = position727, tokenIndex727
-					}
-				l728:
-					{
-						position729, tokenIndex729 := position, tokenIndex
-						if buffer[position] != rune('#') {
 							goto l730
 						}
+						goto l731
+					l730:
+						position, tokenIndex = position730, tokenIndex730
+					}
+				l731:
+					{
+						position732, tokenIndex732 := position, tokenIndex
+						if buffer[position] != rune('#') {
+							goto l733
+						}
 						position++
 						if !_rules[ruleOffset]() {
-							goto l730
+							goto l733
 						}
 						{
-							position731, tokenIndex731 := position, tokenIndex
+							position734, tokenIndex734 := position, tokenIndex
 							{
-								position733, tokenIndex733 := position, tokenIndex
+								position736, tokenIndex736 := position, tokenIndex
 								if buffer[position] != rune('*') {
-									goto l734
-								}
-								position++
-								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l734
-								}
-								position++
-							l735:
-								{
-									position736, tokenIndex736 := position, tokenIndex
-									if c := buffer[position]; c < rune('0') || c > rune('9') {
-										goto l736
-									}
-									position++
-									goto l735
-								l736:
-									position, tokenIndex = position736, tokenIndex736
-								}
-								goto l733
-							l734:
-								position, tokenIndex = position733, tokenIndex733
-								if buffer[position] != rune('*') {
-									goto l737
-								}
-								position++
-								if buffer[position] != rune('(') {
 									goto l737
 								}
 								position++
@@ -5775,694 +5877,720 @@
 								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 l737
+									goto l740
 								}
 								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l737
+									goto l740
 								}
 								position++
-							l740:
+							l743:
 								{
-									position741, tokenIndex741 := position, tokenIndex
+									position744, tokenIndex744 := position, tokenIndex
 									if c := buffer[position]; c < rune('0') || c > rune('9') {
-										goto l741
+										goto l744
 									}
 									position++
-									goto l740
-								l741:
-									position, tokenIndex = position741, tokenIndex741
+									goto l743
+								l744:
+									position, tokenIndex = position744, tokenIndex744
 								}
 								if buffer[position] != rune(')') {
-									goto l737
+									goto l740
 								}
 								position++
-								goto l733
-							l737:
-								position, tokenIndex = position733, tokenIndex733
-							l742:
+								goto l736
+							l740:
+								position, tokenIndex = position736, tokenIndex736
+							l745:
 								{
-									position743, tokenIndex743 := position, tokenIndex
+									position746, tokenIndex746 := position, tokenIndex
 									if buffer[position] != rune('+') {
-										goto l743
+										goto l746
 									}
 									position++
 									if c := buffer[position]; c < rune('0') || c > rune('9') {
-										goto l743
+										goto l746
 									}
 									position++
-								l744:
+								l747:
 									{
-										position745, tokenIndex745 := position, tokenIndex
+										position748, tokenIndex748 := position, tokenIndex
 										if c := buffer[position]; c < rune('0') || c > rune('9') {
-											goto l745
+											goto l748
 										}
 										position++
-										goto l744
-									l745:
-										position, tokenIndex = position745, tokenIndex745
+										goto l747
+									l748:
+										position, tokenIndex = position748, tokenIndex748
 									}
-									goto l742
-								l743:
-									position, tokenIndex = position743, tokenIndex743
+									goto l745
+								l746:
+									position, tokenIndex = position746, tokenIndex746
 								}
 							}
-						l733:
-							goto l732
+						l736:
+							goto l735
 
-							position, tokenIndex = position731, tokenIndex731
+							position, tokenIndex = position734, tokenIndex734
 						}
-					l732:
-						goto l729
-					l730:
-						position, tokenIndex = position729, tokenIndex729
+					l735:
+						goto l732
+					l733:
+						position, tokenIndex = position732, tokenIndex732
 						if !_rules[ruleARMGOTLow12]() {
-							goto l746
+							goto l749
 						}
-						goto l729
-					l746:
-						position, tokenIndex = position729, tokenIndex729
+						goto l732
+					l749:
+						position, tokenIndex = position732, tokenIndex732
 						if !_rules[ruleLow12BitsSymbolRef]() {
-							goto l747
+							goto l750
 						}
-						goto l729
-					l747:
-						position, tokenIndex = position729, tokenIndex729
+						goto l732
+					l750:
+						position, tokenIndex = position732, tokenIndex732
 						if !_rules[ruleARMRegister]() {
-							goto l725
+							goto l728
 						}
 					}
-				l729:
+				l732:
 					{
-						position748, tokenIndex748 := position, tokenIndex
+						position751, tokenIndex751 := position, tokenIndex
 						if buffer[position] != rune(',') {
-							goto l748
+							goto l751
 						}
 						position++
 						{
-							position750, tokenIndex750 := position, tokenIndex
+							position753, tokenIndex753 := position, tokenIndex
 							if !_rules[ruleWS]() {
-								goto l750
+								goto l753
 							}
-							goto l751
-						l750:
-							position, tokenIndex = position750, tokenIndex750
+							goto l754
+						l753:
+							position, tokenIndex = position753, tokenIndex753
 						}
-					l751:
+					l754:
 						if !_rules[ruleARMConstantTweak]() {
-							goto l748
+							goto l751
 						}
-						goto l749
-					l748:
-						position, tokenIndex = position748, tokenIndex748
+						goto l752
+					l751:
+						position, tokenIndex = position751, tokenIndex751
 					}
-				l749:
-					goto l726
-				l725:
-					position, tokenIndex = position725, tokenIndex725
+				l752:
+					goto l729
+				l728:
+					position, tokenIndex = position728, tokenIndex728
 				}
-			l726:
+			l729:
 				if buffer[position] != rune(']') {
-					goto l723
+					goto l726
 				}
 				position++
 				{
-					position752, tokenIndex752 := position, tokenIndex
+					position755, tokenIndex755 := position, tokenIndex
 					if !_rules[ruleARMPostincrement]() {
-						goto l752
+						goto l755
 					}
-					goto l753
-				l752:
-					position, tokenIndex = position752, tokenIndex752
+					goto l756
+				l755:
+					position, tokenIndex = position755, tokenIndex755
 				}
-			l753:
-				add(ruleARMBaseIndexScale, position724)
+			l756:
+				add(ruleARMBaseIndexScale, position727)
 			}
 			return true
-		l723:
-			position, tokenIndex = position723, tokenIndex723
+		l726:
+			position, tokenIndex = position726, tokenIndex726
 			return false
 		},
-		/* 49 ARMGOTLow12 <- <(':' ('g' / 'G') ('o' / 'O') ('t' / 'T') '_' ('l' / 'L') ('o' / 'O') '1' '2' ':' SymbolName)> */
+		/* 50 ARMGOTLow12 <- <(':' ('g' / 'G') ('o' / 'O') ('t' / 'T') '_' ('l' / 'L') ('o' / 'O') '1' '2' ':' SymbolName)> */
 		func() bool {
-			position754, tokenIndex754 := position, tokenIndex
+			position757, tokenIndex757 := position, tokenIndex
 			{
-				position755 := position
+				position758 := position
 				if buffer[position] != rune(':') {
-					goto l754
+					goto l757
 				}
 				position++
 				{
-					position756, tokenIndex756 := position, tokenIndex
+					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++
-					goto l756
-				l757:
-					position, tokenIndex = position756, tokenIndex756
-					if buffer[position] != rune('G') {
-						goto l754
-					}
-					position++
 				}
-			l756:
+			l759:
 				{
-					position758, tokenIndex758 := position, tokenIndex
+					position761, tokenIndex761 := position, tokenIndex
 					if buffer[position] != rune('o') {
-						goto l759
+						goto l762
 					}
 					position++
-					goto l758
-				l759:
-					position, tokenIndex = position758, tokenIndex758
+					goto l761
+				l762:
+					position, tokenIndex = position761, tokenIndex761
 					if buffer[position] != rune('O') {
-						goto l754
+						goto l757
 					}
 					position++
 				}
-			l758:
+			l761:
 				{
-					position760, tokenIndex760 := position, tokenIndex
+					position763, tokenIndex763 := position, tokenIndex
 					if buffer[position] != rune('t') {
-						goto l761
+						goto l764
 					}
 					position++
-					goto l760
-				l761:
-					position, tokenIndex = position760, tokenIndex760
+					goto l763
+				l764:
+					position, tokenIndex = position763, tokenIndex763
 					if buffer[position] != rune('T') {
-						goto l754
+						goto l757
 					}
 					position++
 				}
-			l760:
+			l763:
 				if buffer[position] != rune('_') {
-					goto l754
+					goto l757
 				}
 				position++
 				{
-					position762, tokenIndex762 := position, tokenIndex
+					position765, tokenIndex765 := position, tokenIndex
 					if buffer[position] != rune('l') {
-						goto l763
+						goto l766
 					}
 					position++
-					goto l762
-				l763:
-					position, tokenIndex = position762, tokenIndex762
+					goto l765
+				l766:
+					position, tokenIndex = position765, tokenIndex765
 					if buffer[position] != rune('L') {
-						goto l754
+						goto l757
 					}
 					position++
 				}
-			l762:
+			l765:
 				{
-					position764, tokenIndex764 := position, tokenIndex
+					position767, tokenIndex767 := position, tokenIndex
 					if buffer[position] != rune('o') {
-						goto l765
+						goto l768
 					}
 					position++
-					goto l764
-				l765:
-					position, tokenIndex = position764, tokenIndex764
+					goto l767
+				l768:
+					position, tokenIndex = position767, tokenIndex767
 					if buffer[position] != rune('O') {
-						goto l754
+						goto l757
 					}
 					position++
 				}
-			l764:
+			l767:
 				if buffer[position] != rune('1') {
-					goto l754
+					goto l757
 				}
 				position++
 				if buffer[position] != rune('2') {
-					goto l754
+					goto l757
 				}
 				position++
 				if buffer[position] != rune(':') {
-					goto l754
+					goto l757
 				}
 				position++
 				if !_rules[ruleSymbolName]() {
-					goto l754
+					goto l757
 				}
-				add(ruleARMGOTLow12, position755)
+				add(ruleARMGOTLow12, position758)
 			}
 			return true
-		l754:
-			position, tokenIndex = position754, tokenIndex754
+		l757:
+			position, tokenIndex = position757, tokenIndex757
 			return false
 		},
-		/* 50 ARMPostincrement <- <'!'> */
+		/* 51 ARMPostincrement <- <'!'> */
 		func() bool {
-			position766, tokenIndex766 := position, tokenIndex
+			position769, tokenIndex769 := position, tokenIndex
 			{
-				position767 := position
+				position770 := position
 				if buffer[position] != rune('!') {
-					goto l766
+					goto l769
 				}
 				position++
-				add(ruleARMPostincrement, position767)
+				add(ruleARMPostincrement, position770)
 			}
 			return true
-		l766:
-			position, tokenIndex = position766, tokenIndex766
+		l769:
+			position, tokenIndex = position769, tokenIndex769
 			return false
 		},
-		/* 51 BaseIndexScale <- <('(' RegisterOrConstant? WS? (',' WS? RegisterOrConstant WS? (',' [0-9]+)?)? ')')> */
+		/* 52 BaseIndexScale <- <('(' RegisterOrConstant? WS? (',' WS? RegisterOrConstant WS? (',' [0-9]+)?)? ')')> */
 		func() bool {
-			position768, tokenIndex768 := position, tokenIndex
+			position771, tokenIndex771 := position, tokenIndex
 			{
-				position769 := position
+				position772 := position
 				if buffer[position] != rune('(') {
-					goto l768
+					goto l771
 				}
 				position++
 				{
-					position770, tokenIndex770 := position, tokenIndex
+					position773, tokenIndex773 := position, tokenIndex
 					if !_rules[ruleRegisterOrConstant]() {
-						goto l770
+						goto l773
 					}
-					goto l771
-				l770:
-					position, tokenIndex = position770, tokenIndex770
+					goto l774
+				l773:
+					position, tokenIndex = position773, tokenIndex773
 				}
-			l771:
+			l774:
 				{
-					position772, tokenIndex772 := position, tokenIndex
+					position775, tokenIndex775 := position, tokenIndex
 					if !_rules[ruleWS]() {
-						goto l772
+						goto l775
 					}
-					goto l773
-				l772:
-					position, tokenIndex = position772, tokenIndex772
+					goto l776
+				l775:
+					position, tokenIndex = position775, tokenIndex775
 				}
-			l773:
+			l776:
 				{
-					position774, tokenIndex774 := position, tokenIndex
+					position777, tokenIndex777 := position, tokenIndex
 					if buffer[position] != rune(',') {
-						goto l774
+						goto l777
 					}
 					position++
 					{
-						position776, tokenIndex776 := position, tokenIndex
+						position779, tokenIndex779 := position, tokenIndex
 						if !_rules[ruleWS]() {
-							goto l776
+							goto l779
 						}
-						goto l777
-					l776:
-						position, tokenIndex = position776, tokenIndex776
+						goto l780
+					l779:
+						position, tokenIndex = position779, tokenIndex779
 					}
-				l777:
+				l780:
 					if !_rules[ruleRegisterOrConstant]() {
-						goto l774
+						goto l777
 					}
 					{
-						position778, tokenIndex778 := position, tokenIndex
+						position781, tokenIndex781 := position, tokenIndex
 						if !_rules[ruleWS]() {
-							goto l778
+							goto l781
 						}
-						goto l779
-					l778:
-						position, tokenIndex = position778, tokenIndex778
+						goto l782
+					l781:
+						position, tokenIndex = position781, tokenIndex781
 					}
-				l779:
+				l782:
 					{
-						position780, tokenIndex780 := position, tokenIndex
+						position783, tokenIndex783 := position, tokenIndex
 						if buffer[position] != rune(',') {
-							goto l780
+							goto l783
 						}
 						position++
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l780
+							goto l783
 						}
 						position++
-					l782:
+					l785:
 						{
-							position783, tokenIndex783 := position, tokenIndex
+							position786, tokenIndex786 := position, tokenIndex
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l783
+								goto l786
 							}
 							position++
-							goto l782
-						l783:
-							position, tokenIndex = position783, tokenIndex783
+							goto l785
+						l786:
+							position, tokenIndex = position786, tokenIndex786
 						}
-						goto l781
-					l780:
-						position, tokenIndex = position780, tokenIndex780
+						goto l784
+					l783:
+						position, tokenIndex = position783, tokenIndex783
 					}
-				l781:
-					goto l775
-				l774:
-					position, tokenIndex = position774, tokenIndex774
+				l784:
+					goto l778
+				l777:
+					position, tokenIndex = position777, tokenIndex777
 				}
-			l775:
+			l778:
 				if buffer[position] != rune(')') {
-					goto l768
+					goto l771
 				}
 				position++
-				add(ruleBaseIndexScale, position769)
+				add(ruleBaseIndexScale, position772)
 			}
 			return true
-		l768:
-			position, tokenIndex = position768, tokenIndex768
+		l771:
+			position, tokenIndex = position771, tokenIndex771
 			return false
 		},
-		/* 52 Operator <- <('+' / '-')> */
+		/* 53 Operator <- <('+' / '-')> */
 		func() bool {
-			position784, tokenIndex784 := position, tokenIndex
+			position787, tokenIndex787 := position, tokenIndex
 			{
-				position785 := position
+				position788 := position
 				{
-					position786, tokenIndex786 := position, tokenIndex
-					if buffer[position] != rune('+') {
-						goto l787
-					}
-					position++
-					goto l786
-				l787:
-					position, tokenIndex = position786, tokenIndex786
-					if buffer[position] != rune('-') {
-						goto l784
-					}
-					position++
-				}
-			l786:
-				add(ruleOperator, position785)
-			}
-			return true
-		l784:
-			position, tokenIndex = position784, tokenIndex784
-			return false
-		},
-		/* 53 Offset <- <('+'? '-'? (('0' ('b' / 'B') ('0' / '1')+) / ('0' ('x' / 'X') ([0-9] / [0-9] / ([a-f] / [A-F]))+) / [0-9]+))> */
-		func() bool {
-			position788, tokenIndex788 := position, tokenIndex
-			{
-				position789 := position
-				{
-					position790, tokenIndex790 := position, tokenIndex
+					position789, tokenIndex789 := position, tokenIndex
 					if buffer[position] != rune('+') {
 						goto l790
 					}
 					position++
-					goto l791
+					goto l789
 				l790:
-					position, tokenIndex = position790, tokenIndex790
-				}
-			l791:
-				{
-					position792, tokenIndex792 := position, tokenIndex
+					position, tokenIndex = position789, tokenIndex789
 					if buffer[position] != rune('-') {
-						goto l792
+						goto l787
 					}
 					position++
-					goto l793
-				l792:
-					position, tokenIndex = position792, tokenIndex792
 				}
-			l793:
+			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
 				{
-					position794, tokenIndex794 := position, tokenIndex
-					if buffer[position] != rune('0') {
+					position793, tokenIndex793 := position, tokenIndex
+					if buffer[position] != rune('+') {
+						goto l793
+					}
+					position++
+					goto l794
+				l793:
+					position, tokenIndex = position793, tokenIndex793
+				}
+			l794:
+				{
+					position795, tokenIndex795 := position, tokenIndex
+					if buffer[position] != rune('-') {
 						goto l795
 					}
 					position++
-					{
-						position796, tokenIndex796 := position, tokenIndex
-						if buffer[position] != rune('b') {
-							goto l797
-						}
-						position++
-						goto l796
-					l797:
-						position, tokenIndex = position796, tokenIndex796
-						if buffer[position] != rune('B') {
-							goto l795
-						}
-						position++
-					}
-				l796:
-					{
-						position800, tokenIndex800 := position, tokenIndex
-						if buffer[position] != rune('0') {
-							goto l801
-						}
-						position++
-						goto l800
-					l801:
-						position, tokenIndex = position800, tokenIndex800
-						if buffer[position] != rune('1') {
-							goto l795
-						}
-						position++
-					}
-				l800:
-				l798:
-					{
-						position799, tokenIndex799 := position, tokenIndex
-						{
-							position802, tokenIndex802 := position, tokenIndex
-							if buffer[position] != rune('0') {
-								goto l803
-							}
-							position++
-							goto l802
-						l803:
-							position, tokenIndex = position802, tokenIndex802
-							if buffer[position] != rune('1') {
-								goto l799
-							}
-							position++
-						}
-					l802:
-						goto l798
-					l799:
-						position, tokenIndex = position799, tokenIndex799
-					}
-					goto l794
+					goto l796
 				l795:
-					position, tokenIndex = position794, tokenIndex794
+					position, tokenIndex = position795, tokenIndex795
+				}
+			l796:
+				{
+					position797, tokenIndex797 := position, tokenIndex
 					if buffer[position] != rune('0') {
-						goto l804
+						goto l798
 					}
 					position++
 					{
-						position805, tokenIndex805 := position, tokenIndex
-						if buffer[position] != rune('x') {
-							goto l806
+						position799, tokenIndex799 := position, tokenIndex
+						if buffer[position] != rune('b') {
+							goto l800
 						}
 						position++
-						goto l805
-					l806:
-						position, tokenIndex = position805, tokenIndex805
-						if buffer[position] != rune('X') {
+						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++
 					}
-				l805:
+				l803:
+				l801:
 					{
-						position809, tokenIndex809 := position, tokenIndex
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l810
-						}
-						position++
-						goto l809
-					l810:
-						position, tokenIndex = position809, tokenIndex809
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l811
-						}
-						position++
-						goto l809
-					l811:
-						position, tokenIndex = position809, tokenIndex809
+						position802, tokenIndex802 := position, tokenIndex
 						{
-							position812, tokenIndex812 := position, tokenIndex
-							if c := buffer[position]; c < rune('a') || c > rune('f') {
-								goto l813
+							position805, tokenIndex805 := position, tokenIndex
+							if buffer[position] != rune('0') {
+								goto l806
 							}
 							position++
-							goto l812
-						l813:
-							position, tokenIndex = position812, tokenIndex812
-							if c := buffer[position]; c < rune('A') || c > rune('F') {
-								goto l804
+							goto l805
+						l806:
+							position, tokenIndex = position805, tokenIndex805
+							if buffer[position] != rune('1') {
+								goto l802
 							}
 							position++
 						}
-					l812:
+					l805:
+						goto l801
+					l802:
+						position, tokenIndex = position802, tokenIndex802
 					}
-				l809:
-				l807:
+					goto l797
+				l798:
+					position, tokenIndex = position797, tokenIndex797
+					if buffer[position] != rune('0') {
+						goto l807
+					}
+					position++
 					{
 						position808, tokenIndex808 := position, tokenIndex
-						{
-							position814, tokenIndex814 := position, tokenIndex
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l815
-							}
-							position++
+						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
-						l815:
-							position, tokenIndex = position814, tokenIndex814
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
+						}
+						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 l814
+							goto l815
 						l816:
-							position, tokenIndex = position814, tokenIndex814
+							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
 							{
-								position817, tokenIndex817 := position, tokenIndex
+								position820, tokenIndex820 := position, tokenIndex
 								if c := buffer[position]; c < rune('a') || c > rune('f') {
-									goto l818
+									goto l821
 								}
 								position++
-								goto l817
-							l818:
-								position, tokenIndex = position817, tokenIndex817
+								goto l820
+							l821:
+								position, tokenIndex = position820, tokenIndex820
 								if c := buffer[position]; c < rune('A') || c > rune('F') {
-									goto l808
+									goto l811
 								}
 								position++
 							}
-						l817:
+						l820:
 						}
-					l814:
-						goto l807
-					l808:
-						position, tokenIndex = position808, tokenIndex808
+					l817:
+						goto l810
+					l811:
+						position, tokenIndex = position811, tokenIndex811
 					}
-					goto l794
-				l804:
-					position, tokenIndex = position794, tokenIndex794
+					goto l797
+				l807:
+					position, tokenIndex = position797, tokenIndex797
 					if c := buffer[position]; c < rune('0') || c > rune('9') {
-						goto l788
+						goto l791
 					}
 					position++
-				l819:
+				l822:
 					{
-						position820, tokenIndex820 := position, tokenIndex
+						position823, tokenIndex823 := position, tokenIndex
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l820
+							goto l823
 						}
 						position++
-						goto l819
-					l820:
-						position, tokenIndex = position820, tokenIndex820
+						goto l822
+					l823:
+						position, tokenIndex = position823, tokenIndex823
 					}
 				}
-			l794:
-				add(ruleOffset, position789)
+			l797:
+				add(ruleOffset, position792)
 			}
 			return true
-		l788:
-			position, tokenIndex = position788, tokenIndex788
+		l791:
+			position, tokenIndex = position791, tokenIndex791
 			return false
 		},
-		/* 54 Section <- <([a-z] / [A-Z] / '@')+> */
+		/* 55 Section <- <([a-z] / [A-Z] / '@')+> */
 		func() bool {
-			position821, tokenIndex821 := position, tokenIndex
+			position824, tokenIndex824 := position, tokenIndex
 			{
-				position822 := position
+				position825 := position
 				{
-					position825, tokenIndex825 := position, tokenIndex
+					position828, tokenIndex828 := position, tokenIndex
 					if c := buffer[position]; c < rune('a') || c > rune('z') {
-						goto l826
+						goto l829
 					}
 					position++
-					goto l825
-				l826:
-					position, tokenIndex = position825, tokenIndex825
+					goto l828
+				l829:
+					position, tokenIndex = position828, tokenIndex828
 					if c := buffer[position]; c < rune('A') || c > rune('Z') {
-						goto l827
+						goto l830
 					}
 					position++
-					goto l825
-				l827:
-					position, tokenIndex = position825, tokenIndex825
+					goto l828
+				l830:
+					position, tokenIndex = position828, tokenIndex828
 					if buffer[position] != rune('@') {
-						goto l821
+						goto l824
 					}
 					position++
 				}
-			l825:
-			l823:
+			l828:
+			l826:
 				{
-					position824, tokenIndex824 := position, tokenIndex
+					position827, tokenIndex827 := position, tokenIndex
 					{
-						position828, tokenIndex828 := position, tokenIndex
+						position831, tokenIndex831 := position, tokenIndex
 						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l829
+							goto l832
 						}
 						position++
-						goto l828
-					l829:
-						position, tokenIndex = position828, tokenIndex828
+						goto l831
+					l832:
+						position, tokenIndex = position831, tokenIndex831
 						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l830
+							goto l833
 						}
 						position++
-						goto l828
-					l830:
-						position, tokenIndex = position828, tokenIndex828
+						goto l831
+					l833:
+						position, tokenIndex = position831, tokenIndex831
 						if buffer[position] != rune('@') {
-							goto l824
+							goto l827
 						}
 						position++
 					}
-				l828:
-					goto l823
-				l824:
-					position, tokenIndex = position824, tokenIndex824
+				l831:
+					goto l826
+				l827:
+					position, tokenIndex = position827, tokenIndex827
 				}
-				add(ruleSection, position822)
+				add(ruleSection, position825)
 			}
 			return true
-		l821:
-			position, tokenIndex = position821, tokenIndex821
+		l824:
+			position, tokenIndex = position824, tokenIndex824
 			return false
 		},
-		/* 55 SegmentRegister <- <('%' ([c-g] / 's') ('s' ':'))> */
+		/* 56 SegmentRegister <- <('%' ([c-g] / 's') ('s' ':'))> */
 		func() bool {
-			position831, tokenIndex831 := position, tokenIndex
+			position834, tokenIndex834 := position, tokenIndex
 			{
-				position832 := position
+				position835 := position
 				if buffer[position] != rune('%') {
-					goto l831
+					goto l834
 				}
 				position++
 				{
-					position833, tokenIndex833 := position, tokenIndex
+					position836, tokenIndex836 := position, tokenIndex
 					if c := buffer[position]; c < rune('c') || c > rune('g') {
+						goto l837
+					}
+					position++
+					goto l836
+				l837:
+					position, tokenIndex = position836, tokenIndex836
+					if buffer[position] != rune('s') {
 						goto l834
 					}
 					position++
-					goto l833
-				l834:
-					position, tokenIndex = position833, tokenIndex833
-					if buffer[position] != rune('s') {
-						goto l831
-					}
-					position++
 				}
-			l833:
+			l836:
 				if buffer[position] != rune('s') {
-					goto l831
+					goto l834
 				}
 				position++
 				if buffer[position] != rune(':') {
-					goto l831
+					goto l834
 				}
 				position++
-				add(ruleSegmentRegister, position832)
+				add(ruleSegmentRegister, position835)
 			}
 			return true
-		l831:
-			position, tokenIndex = position831, tokenIndex831
+		l834:
+			position, tokenIndex = position834, tokenIndex834
 			return false
 		},
 	}
diff --git a/util/fipstools/delocate/testdata/x86_64-GOTRewrite/in.s b/util/fipstools/delocate/testdata/x86_64-GOTRewrite/in.s
index a00a691..3b7a1ed 100644
--- a/util/fipstools/delocate/testdata/x86_64-GOTRewrite/in.s
+++ b/util/fipstools/delocate/testdata/x86_64-GOTRewrite/in.s
@@ -65,4 +65,7 @@
 	cmpq foo@GOTPCREL(%rip), %rax
 	cmpq %rax, foo@GOTPCREL(%rip)
 
+	# With -mcmodel=medium, the code may load the address of the GOT directly.
+	leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
+
 .comm foobar,64,32
diff --git a/util/fipstools/delocate/testdata/x86_64-GOTRewrite/out.s b/util/fipstools/delocate/testdata/x86_64-GOTRewrite/out.s
index f118e4f..ae47e41 100644
--- a/util/fipstools/delocate/testdata/x86_64-GOTRewrite/out.s
+++ b/util/fipstools/delocate/testdata/x86_64-GOTRewrite/out.s
@@ -268,6 +268,11 @@
 	popq %rbx
 	leaq 128(%rsp), %rsp
 
+	# With -mcmodel=medium, the code may load the address of the GOT directly.
+# WAS leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
+	leaq	.Lboringssl_got_delta(%rip), %rcx
+	addq .Lboringssl_got_delta(%rip), %rcx
+
 .comm foobar,64,32
 .text
 .loc 1 2 0
@@ -302,6 +307,8 @@
 .size OPENSSL_ia32cap_addr_delta, 8
 OPENSSL_ia32cap_addr_delta:
 .quad OPENSSL_ia32cap_P-OPENSSL_ia32cap_addr_delta
+.Lboringssl_got_delta:
+	.quad _GLOBAL_OFFSET_TABLE_-.Lboringssl_got_delta
 .type BORINGSSL_bcm_text_hash, @object
 .size BORINGSSL_bcm_text_hash, 32
 BORINGSSL_bcm_text_hash: