Better handle AVX-512 assembly syntax.

https://boringssl-review.googlesource.com/c/boringssl/+/24945 was mistaken in
that it thought that these AVX-512 assembly extensions were an
instruction-level thing, whereas they actually appear to be an argument-level
modifier.

This change parses them as such and unbreaks some AVX-512 instructions that can
be emitted by compilers with certain combinations of flags.

Change-Id: I9af5a4fec21f55d3198a248c9175252e229c355a
Reviewed-on: https://boringssl-review.googlesource.com/c/32484
Commit-Queue: Adam Langley <agl@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
Reviewed-by: David Benjamin <davidben@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/util/fipstools/delocate/delocate.peg b/util/fipstools/delocate/delocate.peg
index 3dcead2..82a3cb5 100644
--- a/util/fipstools/delocate/delocate.peg
+++ b/util/fipstools/delocate/delocate.peg
@@ -55,9 +55,10 @@
 LocalSymbol <- '.L' [[A-Z.0-9$_]]+
 LocalLabel <- [0-9][0-9$]*
 LocalLabelRef <- [0-9][0-9$]*[bf]
-Instruction <- InstructionName (WS InstructionArg ((WS? ',' WS?) InstructionArg)*)? (WS? '{' InstructionArg '}')*
+Instruction <- InstructionName (WS InstructionArg ((WS? ',' WS?) InstructionArg)*)?
 InstructionName <- [[A-Z]][[A-Z0-9]]* [.+\-]?
-InstructionArg <- IndirectionIndicator? (RegisterOrConstant / LocalLabelRef / TOCRefHigh / TOCRefLow / MemoryRef)
+InstructionArg <- IndirectionIndicator? (RegisterOrConstant / LocalLabelRef / TOCRefHigh / TOCRefLow / MemoryRef) AVX512Token*
+AVX512Token <- WS? '{' '%'? [0-9a-z]* '}'
 TOCRefHigh <- '.TOC.-' ('0b' / ('.L' [a-zA-Z_0-9]+)) "@ha"
 TOCRefLow <- '.TOC.-' ('0b' / ('.L' [a-zA-Z_0-9]+)) "@l"
 IndirectionIndicator <- '*'
diff --git a/util/fipstools/delocate/delocate.peg.go b/util/fipstools/delocate/delocate.peg.go
index f0ad78f..e147943 100644
--- a/util/fipstools/delocate/delocate.peg.go
+++ b/util/fipstools/delocate/delocate.peg.go
@@ -44,6 +44,7 @@
 	ruleInstruction
 	ruleInstructionName
 	ruleInstructionArg
+	ruleAVX512Token
 	ruleTOCRefHigh
 	ruleTOCRefLow
 	ruleIndirectionIndicator
@@ -87,6 +88,7 @@
 	"Instruction",
 	"InstructionName",
 	"InstructionArg",
+	"AVX512Token",
 	"TOCRefHigh",
 	"TOCRefLow",
 	"IndirectionIndicator",
@@ -212,7 +214,7 @@
 type Asm struct {
 	Buffer string
 	buffer []rune
-	rules  [40]func() bool
+	rules  [41]func() bool
 	parse  func(rule ...int) error
 	reset  func()
 	Pretty bool
@@ -2706,7 +2708,7 @@
 			position, tokenIndex = position323, tokenIndex323
 			return false
 		},
-		/* 25 Instruction <- <(InstructionName (WS InstructionArg (WS? ',' WS? InstructionArg)*)? (WS? '{' InstructionArg '}')*)> */
+		/* 25 Instruction <- <(InstructionName (WS InstructionArg (WS? ',' WS? InstructionArg)*)?)> */
 		func() bool {
 			position331, tokenIndex331 := position, tokenIndex
 			{
@@ -2761,34 +2763,6 @@
 					position, tokenIndex = position333, tokenIndex333
 				}
 			l334:
-			l341:
-				{
-					position342, tokenIndex342 := position, tokenIndex
-					{
-						position343, tokenIndex343 := position, tokenIndex
-						if !_rules[ruleWS]() {
-							goto l343
-						}
-						goto l344
-					l343:
-						position, tokenIndex = position343, tokenIndex343
-					}
-				l344:
-					if buffer[position] != rune('{') {
-						goto l342
-					}
-					position++
-					if !_rules[ruleInstructionArg]() {
-						goto l342
-					}
-					if buffer[position] != rune('}') {
-						goto l342
-					}
-					position++
-					goto l341
-				l342:
-					position, tokenIndex = position342, tokenIndex342
-				}
 				add(ruleInstruction, position332)
 			}
 			return true
@@ -2798,762 +2772,784 @@
 		},
 		/* 26 InstructionName <- <(([a-z] / [A-Z]) ([a-z] / [A-Z] / ([0-9] / [0-9]))* ('.' / '+' / '-')?)> */
 		func() bool {
-			position345, tokenIndex345 := position, tokenIndex
+			position341, tokenIndex341 := position, tokenIndex
 			{
-				position346 := position
+				position342 := position
 				{
-					position347, tokenIndex347 := position, tokenIndex
+					position343, tokenIndex343 := position, tokenIndex
 					if c := buffer[position]; c < rune('a') || c > rune('z') {
-						goto l348
+						goto l344
 					}
 					position++
-					goto l347
-				l348:
-					position, tokenIndex = position347, tokenIndex347
+					goto l343
+				l344:
+					position, tokenIndex = position343, tokenIndex343
 					if c := buffer[position]; c < rune('A') || c > rune('Z') {
-						goto l345
+						goto l341
 					}
 					position++
 				}
-			l347:
-			l349:
+			l343:
+			l345:
 				{
-					position350, tokenIndex350 := position, tokenIndex
+					position346, tokenIndex346 := position, tokenIndex
 					{
-						position351, tokenIndex351 := position, tokenIndex
+						position347, tokenIndex347 := position, tokenIndex
 						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l352
+							goto l348
 						}
 						position++
-						goto l351
-					l352:
-						position, tokenIndex = position351, tokenIndex351
+						goto l347
+					l348:
+						position, tokenIndex = position347, tokenIndex347
 						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l353
+							goto l349
 						}
 						position++
-						goto l351
-					l353:
-						position, tokenIndex = position351, tokenIndex351
+						goto l347
+					l349:
+						position, tokenIndex = position347, tokenIndex347
 						{
-							position354, tokenIndex354 := position, tokenIndex
+							position350, tokenIndex350 := position, tokenIndex
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l355
+								goto l351
 							}
 							position++
-							goto l354
-						l355:
-							position, tokenIndex = position354, tokenIndex354
+							goto l350
+						l351:
+							position, tokenIndex = position350, tokenIndex350
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l350
+								goto l346
 							}
 							position++
 						}
-					l354:
+					l350:
 					}
-				l351:
-					goto l349
-				l350:
-					position, tokenIndex = position350, tokenIndex350
+				l347:
+					goto l345
+				l346:
+					position, tokenIndex = position346, tokenIndex346
 				}
 				{
-					position356, tokenIndex356 := position, tokenIndex
+					position352, tokenIndex352 := position, tokenIndex
 					{
-						position358, tokenIndex358 := position, tokenIndex
+						position354, tokenIndex354 := position, tokenIndex
 						if buffer[position] != rune('.') {
-							goto l359
+							goto l355
 						}
 						position++
-						goto l358
-					l359:
-						position, tokenIndex = position358, tokenIndex358
+						goto l354
+					l355:
+						position, tokenIndex = position354, tokenIndex354
 						if buffer[position] != rune('+') {
-							goto l360
-						}
-						position++
-						goto l358
-					l360:
-						position, tokenIndex = position358, tokenIndex358
-						if buffer[position] != rune('-') {
 							goto l356
 						}
 						position++
+						goto l354
+					l356:
+						position, tokenIndex = position354, tokenIndex354
+						if buffer[position] != rune('-') {
+							goto l352
+						}
+						position++
 					}
-				l358:
-					goto l357
-				l356:
-					position, tokenIndex = position356, tokenIndex356
+				l354:
+					goto l353
+				l352:
+					position, tokenIndex = position352, tokenIndex352
 				}
-			l357:
-				add(ruleInstructionName, position346)
+			l353:
+				add(ruleInstructionName, position342)
 			}
 			return true
-		l345:
-			position, tokenIndex = position345, tokenIndex345
+		l341:
+			position, tokenIndex = position341, tokenIndex341
 			return false
 		},
-		/* 27 InstructionArg <- <(IndirectionIndicator? (RegisterOrConstant / LocalLabelRef / TOCRefHigh / TOCRefLow / MemoryRef))> */
+		/* 27 InstructionArg <- <(IndirectionIndicator? (RegisterOrConstant / LocalLabelRef / TOCRefHigh / TOCRefLow / MemoryRef) AVX512Token*)> */
 		func() bool {
-			position361, tokenIndex361 := position, tokenIndex
+			position357, tokenIndex357 := position, tokenIndex
 			{
-				position362 := position
+				position358 := position
 				{
-					position363, tokenIndex363 := position, tokenIndex
+					position359, tokenIndex359 := position, tokenIndex
 					if !_rules[ruleIndirectionIndicator]() {
+						goto l359
+					}
+					goto l360
+				l359:
+					position, tokenIndex = position359, tokenIndex359
+				}
+			l360:
+				{
+					position361, tokenIndex361 := position, tokenIndex
+					if !_rules[ruleRegisterOrConstant]() {
+						goto l362
+					}
+					goto l361
+				l362:
+					position, tokenIndex = position361, tokenIndex361
+					if !_rules[ruleLocalLabelRef]() {
 						goto l363
 					}
-					goto l364
+					goto l361
 				l363:
-					position, tokenIndex = position363, tokenIndex363
-				}
-			l364:
-				{
-					position365, tokenIndex365 := position, tokenIndex
-					if !_rules[ruleRegisterOrConstant]() {
-						goto l366
+					position, tokenIndex = position361, tokenIndex361
+					if !_rules[ruleTOCRefHigh]() {
+						goto l364
 					}
-					goto l365
-				l366:
-					position, tokenIndex = position365, tokenIndex365
-					if !_rules[ruleLocalLabelRef]() {
+					goto l361
+				l364:
+					position, tokenIndex = position361, tokenIndex361
+					if !_rules[ruleTOCRefLow]() {
+						goto l365
+					}
+					goto l361
+				l365:
+					position, tokenIndex = position361, tokenIndex361
+					if !_rules[ruleMemoryRef]() {
+						goto l357
+					}
+				}
+			l361:
+			l366:
+				{
+					position367, tokenIndex367 := position, tokenIndex
+					if !_rules[ruleAVX512Token]() {
 						goto l367
 					}
-					goto l365
+					goto l366
 				l367:
-					position, tokenIndex = position365, tokenIndex365
-					if !_rules[ruleTOCRefHigh]() {
-						goto l368
-					}
-					goto l365
-				l368:
-					position, tokenIndex = position365, tokenIndex365
-					if !_rules[ruleTOCRefLow]() {
-						goto l369
-					}
-					goto l365
-				l369:
-					position, tokenIndex = position365, tokenIndex365
-					if !_rules[ruleMemoryRef]() {
-						goto l361
-					}
+					position, tokenIndex = position367, tokenIndex367
 				}
-			l365:
-				add(ruleInstructionArg, position362)
+				add(ruleInstructionArg, position358)
 			}
 			return true
-		l361:
-			position, tokenIndex = position361, tokenIndex361
+		l357:
+			position, tokenIndex = position357, tokenIndex357
 			return false
 		},
-		/* 28 TOCRefHigh <- <('.' 'T' 'O' 'C' '.' '-' (('0' 'b') / ('.' 'L' ([a-z] / [A-Z] / '_' / [0-9])+)) ('@' ('h' / 'H') ('a' / 'A')))> */
+		/* 28 AVX512Token <- <(WS? '{' '%'? ([0-9] / [a-z])* '}')> */
 		func() bool {
-			position370, tokenIndex370 := position, tokenIndex
+			position368, tokenIndex368 := position, tokenIndex
 			{
-				position371 := position
-				if buffer[position] != rune('.') {
-					goto l370
+				position369 := position
+				{
+					position370, tokenIndex370 := position, tokenIndex
+					if !_rules[ruleWS]() {
+						goto l370
+					}
+					goto l371
+				l370:
+					position, tokenIndex = position370, tokenIndex370
 				}
-				position++
-				if buffer[position] != rune('T') {
-					goto l370
-				}
-				position++
-				if buffer[position] != rune('O') {
-					goto l370
-				}
-				position++
-				if buffer[position] != rune('C') {
-					goto l370
-				}
-				position++
-				if buffer[position] != rune('.') {
-					goto l370
-				}
-				position++
-				if buffer[position] != rune('-') {
-					goto l370
+			l371:
+				if buffer[position] != rune('{') {
+					goto l368
 				}
 				position++
 				{
 					position372, tokenIndex372 := position, tokenIndex
-					if buffer[position] != rune('0') {
-						goto l373
+					if buffer[position] != rune('%') {
+						goto l372
 					}
 					position++
-					if buffer[position] != rune('b') {
-						goto l373
-					}
-					position++
-					goto l372
-				l373:
+					goto l373
+				l372:
 					position, tokenIndex = position372, tokenIndex372
-					if buffer[position] != rune('.') {
-						goto l370
-					}
-					position++
-					if buffer[position] != rune('L') {
-						goto l370
-					}
-					position++
+				}
+			l373:
+			l374:
+				{
+					position375, tokenIndex375 := position, tokenIndex
 					{
 						position376, tokenIndex376 := position, tokenIndex
-						if c := buffer[position]; c < rune('a') || c > rune('z') {
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
 							goto l377
 						}
 						position++
 						goto l376
 					l377:
 						position, tokenIndex = position376, tokenIndex376
-						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l378
-						}
-						position++
-						goto l376
-					l378:
-						position, tokenIndex = position376, tokenIndex376
-						if buffer[position] != rune('_') {
-							goto l379
-						}
-						position++
-						goto l376
-					l379:
-						position, tokenIndex = position376, tokenIndex376
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l370
+						if c := buffer[position]; c < rune('a') || c > rune('z') {
+							goto l375
 						}
 						position++
 					}
 				l376:
-				l374:
-					{
-						position375, tokenIndex375 := position, tokenIndex
-						{
-							position380, tokenIndex380 := position, tokenIndex
-							if c := buffer[position]; c < rune('a') || c > rune('z') {
-								goto l381
-							}
-							position++
-							goto l380
-						l381:
-							position, tokenIndex = position380, tokenIndex380
-							if c := buffer[position]; c < rune('A') || c > rune('Z') {
-								goto l382
-							}
-							position++
-							goto l380
-						l382:
-							position, tokenIndex = position380, tokenIndex380
-							if buffer[position] != rune('_') {
-								goto l383
-							}
-							position++
-							goto l380
-						l383:
-							position, tokenIndex = position380, tokenIndex380
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l375
-							}
-							position++
-						}
-					l380:
-						goto l374
-					l375:
-						position, tokenIndex = position375, tokenIndex375
-					}
+					goto l374
+				l375:
+					position, tokenIndex = position375, tokenIndex375
 				}
-			l372:
-				if buffer[position] != rune('@') {
-					goto l370
+				if buffer[position] != rune('}') {
+					goto l368
 				}
 				position++
-				{
-					position384, tokenIndex384 := position, tokenIndex
-					if buffer[position] != rune('h') {
-						goto l385
-					}
-					position++
-					goto l384
-				l385:
-					position, tokenIndex = position384, tokenIndex384
-					if buffer[position] != rune('H') {
-						goto l370
-					}
-					position++
-				}
-			l384:
-				{
-					position386, tokenIndex386 := position, tokenIndex
-					if buffer[position] != rune('a') {
-						goto l387
-					}
-					position++
-					goto l386
-				l387:
-					position, tokenIndex = position386, tokenIndex386
-					if buffer[position] != rune('A') {
-						goto l370
-					}
-					position++
-				}
-			l386:
-				add(ruleTOCRefHigh, position371)
+				add(ruleAVX512Token, position369)
 			}
 			return true
-		l370:
-			position, tokenIndex = position370, tokenIndex370
+		l368:
+			position, tokenIndex = position368, tokenIndex368
 			return false
 		},
-		/* 29 TOCRefLow <- <('.' 'T' 'O' 'C' '.' '-' (('0' 'b') / ('.' 'L' ([a-z] / [A-Z] / '_' / [0-9])+)) ('@' ('l' / 'L')))> */
+		/* 29 TOCRefHigh <- <('.' 'T' 'O' 'C' '.' '-' (('0' 'b') / ('.' 'L' ([a-z] / [A-Z] / '_' / [0-9])+)) ('@' ('h' / 'H') ('a' / 'A')))> */
 		func() bool {
-			position388, tokenIndex388 := position, tokenIndex
+			position378, tokenIndex378 := position, tokenIndex
 			{
-				position389 := position
+				position379 := position
 				if buffer[position] != rune('.') {
-					goto l388
+					goto l378
 				}
 				position++
 				if buffer[position] != rune('T') {
-					goto l388
+					goto l378
 				}
 				position++
 				if buffer[position] != rune('O') {
-					goto l388
+					goto l378
 				}
 				position++
 				if buffer[position] != rune('C') {
-					goto l388
+					goto l378
 				}
 				position++
 				if buffer[position] != rune('.') {
-					goto l388
+					goto l378
 				}
 				position++
 				if buffer[position] != rune('-') {
-					goto l388
+					goto l378
 				}
 				position++
 				{
-					position390, tokenIndex390 := position, tokenIndex
+					position380, tokenIndex380 := position, tokenIndex
 					if buffer[position] != rune('0') {
-						goto l391
+						goto l381
 					}
 					position++
 					if buffer[position] != rune('b') {
-						goto l391
+						goto l381
 					}
 					position++
-					goto l390
-				l391:
-					position, tokenIndex = position390, tokenIndex390
+					goto l380
+				l381:
+					position, tokenIndex = position380, tokenIndex380
 					if buffer[position] != rune('.') {
-						goto l388
+						goto l378
 					}
 					position++
 					if buffer[position] != rune('L') {
-						goto l388
+						goto l378
 					}
 					position++
 					{
-						position394, tokenIndex394 := position, tokenIndex
+						position384, tokenIndex384 := position, tokenIndex
 						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l395
+							goto l385
 						}
 						position++
-						goto l394
-					l395:
-						position, tokenIndex = position394, tokenIndex394
+						goto l384
+					l385:
+						position, tokenIndex = position384, tokenIndex384
 						if c := buffer[position]; c < rune('A') || c > rune('Z') {
+							goto l386
+						}
+						position++
+						goto l384
+					l386:
+						position, tokenIndex = position384, tokenIndex384
+						if buffer[position] != rune('_') {
+							goto l387
+						}
+						position++
+						goto l384
+					l387:
+						position, tokenIndex = position384, tokenIndex384
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l378
+						}
+						position++
+					}
+				l384:
+				l382:
+					{
+						position383, tokenIndex383 := position, tokenIndex
+						{
+							position388, tokenIndex388 := position, tokenIndex
+							if c := buffer[position]; c < rune('a') || c > rune('z') {
+								goto l389
+							}
+							position++
+							goto l388
+						l389:
+							position, tokenIndex = position388, tokenIndex388
+							if c := buffer[position]; c < rune('A') || c > rune('Z') {
+								goto l390
+							}
+							position++
+							goto l388
+						l390:
+							position, tokenIndex = position388, tokenIndex388
+							if buffer[position] != rune('_') {
+								goto l391
+							}
+							position++
+							goto l388
+						l391:
+							position, tokenIndex = position388, tokenIndex388
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l383
+							}
+							position++
+						}
+					l388:
+						goto l382
+					l383:
+						position, tokenIndex = position383, tokenIndex383
+					}
+				}
+			l380:
+				if buffer[position] != rune('@') {
+					goto l378
+				}
+				position++
+				{
+					position392, tokenIndex392 := position, tokenIndex
+					if buffer[position] != rune('h') {
+						goto l393
+					}
+					position++
+					goto l392
+				l393:
+					position, tokenIndex = position392, tokenIndex392
+					if buffer[position] != rune('H') {
+						goto l378
+					}
+					position++
+				}
+			l392:
+				{
+					position394, tokenIndex394 := position, tokenIndex
+					if buffer[position] != rune('a') {
+						goto l395
+					}
+					position++
+					goto l394
+				l395:
+					position, tokenIndex = position394, tokenIndex394
+					if buffer[position] != rune('A') {
+						goto l378
+					}
+					position++
+				}
+			l394:
+				add(ruleTOCRefHigh, position379)
+			}
+			return true
+		l378:
+			position, tokenIndex = position378, tokenIndex378
+			return false
+		},
+		/* 30 TOCRefLow <- <('.' 'T' 'O' 'C' '.' '-' (('0' 'b') / ('.' 'L' ([a-z] / [A-Z] / '_' / [0-9])+)) ('@' ('l' / 'L')))> */
+		func() bool {
+			position396, tokenIndex396 := position, tokenIndex
+			{
+				position397 := position
+				if buffer[position] != rune('.') {
+					goto l396
+				}
+				position++
+				if buffer[position] != rune('T') {
+					goto l396
+				}
+				position++
+				if buffer[position] != rune('O') {
+					goto l396
+				}
+				position++
+				if buffer[position] != rune('C') {
+					goto l396
+				}
+				position++
+				if buffer[position] != rune('.') {
+					goto l396
+				}
+				position++
+				if buffer[position] != rune('-') {
+					goto l396
+				}
+				position++
+				{
+					position398, tokenIndex398 := position, tokenIndex
+					if buffer[position] != rune('0') {
+						goto l399
+					}
+					position++
+					if buffer[position] != rune('b') {
+						goto l399
+					}
+					position++
+					goto l398
+				l399:
+					position, tokenIndex = position398, tokenIndex398
+					if buffer[position] != rune('.') {
+						goto l396
+					}
+					position++
+					if buffer[position] != rune('L') {
+						goto l396
+					}
+					position++
+					{
+						position402, tokenIndex402 := position, tokenIndex
+						if c := buffer[position]; c < rune('a') || c > rune('z') {
+							goto l403
+						}
+						position++
+						goto l402
+					l403:
+						position, tokenIndex = position402, tokenIndex402
+						if c := buffer[position]; c < rune('A') || c > rune('Z') {
+							goto l404
+						}
+						position++
+						goto l402
+					l404:
+						position, tokenIndex = position402, tokenIndex402
+						if buffer[position] != rune('_') {
+							goto l405
+						}
+						position++
+						goto l402
+					l405:
+						position, tokenIndex = position402, tokenIndex402
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
 							goto l396
 						}
 						position++
-						goto l394
-					l396:
-						position, tokenIndex = position394, tokenIndex394
-						if buffer[position] != rune('_') {
-							goto l397
-						}
-						position++
-						goto l394
-					l397:
-						position, tokenIndex = position394, tokenIndex394
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l388
-						}
-						position++
 					}
-				l394:
-				l392:
+				l402:
+				l400:
 					{
-						position393, tokenIndex393 := position, tokenIndex
+						position401, tokenIndex401 := position, tokenIndex
 						{
-							position398, tokenIndex398 := position, tokenIndex
+							position406, tokenIndex406 := position, tokenIndex
 							if c := buffer[position]; c < rune('a') || c > rune('z') {
-								goto l399
+								goto l407
 							}
 							position++
-							goto l398
-						l399:
-							position, tokenIndex = position398, tokenIndex398
+							goto l406
+						l407:
+							position, tokenIndex = position406, tokenIndex406
 							if c := buffer[position]; c < rune('A') || c > rune('Z') {
-								goto l400
+								goto l408
 							}
 							position++
-							goto l398
-						l400:
-							position, tokenIndex = position398, tokenIndex398
+							goto l406
+						l408:
+							position, tokenIndex = position406, tokenIndex406
 							if buffer[position] != rune('_') {
+								goto l409
+							}
+							position++
+							goto l406
+						l409:
+							position, tokenIndex = position406, tokenIndex406
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
 								goto l401
 							}
 							position++
-							goto l398
-						l401:
-							position, tokenIndex = position398, tokenIndex398
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l393
-							}
-							position++
 						}
-					l398:
-						goto l392
-					l393:
-						position, tokenIndex = position393, tokenIndex393
+					l406:
+						goto l400
+					l401:
+						position, tokenIndex = position401, tokenIndex401
 					}
 				}
-			l390:
+			l398:
 				if buffer[position] != rune('@') {
-					goto l388
+					goto l396
 				}
 				position++
 				{
-					position402, tokenIndex402 := position, tokenIndex
+					position410, tokenIndex410 := position, tokenIndex
 					if buffer[position] != rune('l') {
-						goto l403
+						goto l411
 					}
 					position++
-					goto l402
-				l403:
-					position, tokenIndex = position402, tokenIndex402
+					goto l410
+				l411:
+					position, tokenIndex = position410, tokenIndex410
 					if buffer[position] != rune('L') {
-						goto l388
+						goto l396
 					}
 					position++
 				}
-			l402:
-				add(ruleTOCRefLow, position389)
+			l410:
+				add(ruleTOCRefLow, position397)
 			}
 			return true
-		l388:
-			position, tokenIndex = position388, tokenIndex388
+		l396:
+			position, tokenIndex = position396, tokenIndex396
 			return false
 		},
-		/* 30 IndirectionIndicator <- <'*'> */
+		/* 31 IndirectionIndicator <- <'*'> */
 		func() bool {
-			position404, tokenIndex404 := position, tokenIndex
+			position412, tokenIndex412 := position, tokenIndex
 			{
-				position405 := position
+				position413 := position
 				if buffer[position] != rune('*') {
-					goto l404
+					goto l412
 				}
 				position++
-				add(ruleIndirectionIndicator, position405)
+				add(ruleIndirectionIndicator, position413)
 			}
 			return true
-		l404:
-			position, tokenIndex = position404, tokenIndex404
+		l412:
+			position, tokenIndex = position412, tokenIndex412
 			return false
 		},
-		/* 31 RegisterOrConstant <- <((('%' ([a-z] / [A-Z]) ([a-z] / [A-Z] / ([0-9] / [0-9]))*) / ('$'? ((Offset Offset) / Offset))) !('f' / 'b' / ':' / '(' / '+' / '-'))> */
+		/* 32 RegisterOrConstant <- <((('%' ([a-z] / [A-Z]) ([a-z] / [A-Z] / ([0-9] / [0-9]))*) / ('$'? ((Offset Offset) / Offset))) !('f' / 'b' / ':' / '(' / '+' / '-'))> */
 		func() bool {
-			position406, tokenIndex406 := position, tokenIndex
+			position414, tokenIndex414 := position, tokenIndex
 			{
-				position407 := position
+				position415 := position
 				{
-					position408, tokenIndex408 := position, tokenIndex
+					position416, tokenIndex416 := position, tokenIndex
 					if buffer[position] != rune('%') {
-						goto l409
+						goto l417
 					}
 					position++
 					{
-						position410, tokenIndex410 := position, tokenIndex
+						position418, tokenIndex418 := position, tokenIndex
 						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l411
-						}
-						position++
-						goto l410
-					l411:
-						position, tokenIndex = position410, tokenIndex410
-						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l409
-						}
-						position++
-					}
-				l410:
-				l412:
-					{
-						position413, tokenIndex413 := position, tokenIndex
-						{
-							position414, tokenIndex414 := position, tokenIndex
-							if c := buffer[position]; c < rune('a') || c > rune('z') {
-								goto l415
-							}
-							position++
-							goto l414
-						l415:
-							position, tokenIndex = position414, tokenIndex414
-							if c := buffer[position]; c < rune('A') || c > rune('Z') {
-								goto l416
-							}
-							position++
-							goto l414
-						l416:
-							position, tokenIndex = position414, tokenIndex414
-							{
-								position417, tokenIndex417 := position, tokenIndex
-								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l418
-								}
-								position++
-								goto l417
-							l418:
-								position, tokenIndex = position417, tokenIndex417
-								if c := buffer[position]; c < rune('0') || c > rune('9') {
-									goto l413
-								}
-								position++
-							}
-						l417:
-						}
-					l414:
-						goto l412
-					l413:
-						position, tokenIndex = position413, tokenIndex413
-					}
-					goto l408
-				l409:
-					position, tokenIndex = position408, tokenIndex408
-					{
-						position419, tokenIndex419 := position, tokenIndex
-						if buffer[position] != rune('$') {
 							goto l419
 						}
 						position++
-						goto l420
+						goto l418
 					l419:
-						position, tokenIndex = position419, tokenIndex419
+						position, tokenIndex = position418, tokenIndex418
+						if c := buffer[position]; c < rune('A') || c > rune('Z') {
+							goto l417
+						}
+						position++
 					}
+				l418:
 				l420:
 					{
 						position421, tokenIndex421 := position, tokenIndex
-						if !_rules[ruleOffset]() {
+						{
+							position422, tokenIndex422 := position, tokenIndex
+							if c := buffer[position]; c < rune('a') || c > rune('z') {
+								goto l423
+							}
+							position++
 							goto l422
-						}
-						if !_rules[ruleOffset]() {
+						l423:
+							position, tokenIndex = position422, tokenIndex422
+							if c := buffer[position]; c < rune('A') || c > rune('Z') {
+								goto l424
+							}
+							position++
 							goto l422
+						l424:
+							position, tokenIndex = position422, tokenIndex422
+							{
+								position425, tokenIndex425 := position, tokenIndex
+								if c := buffer[position]; c < rune('0') || c > rune('9') {
+									goto l426
+								}
+								position++
+								goto l425
+							l426:
+								position, tokenIndex = position425, tokenIndex425
+								if c := buffer[position]; c < rune('0') || c > rune('9') {
+									goto l421
+								}
+								position++
+							}
+						l425:
 						}
-						goto l421
 					l422:
+						goto l420
+					l421:
 						position, tokenIndex = position421, tokenIndex421
-						if !_rules[ruleOffset]() {
-							goto l406
-						}
 					}
-				l421:
-				}
-			l408:
-				{
-					position423, tokenIndex423 := position, tokenIndex
+					goto l416
+				l417:
+					position, tokenIndex = position416, tokenIndex416
 					{
-						position424, tokenIndex424 := position, tokenIndex
-						if buffer[position] != rune('f') {
-							goto l425
-						}
-						position++
-						goto l424
-					l425:
-						position, tokenIndex = position424, tokenIndex424
-						if buffer[position] != rune('b') {
-							goto l426
-						}
-						position++
-						goto l424
-					l426:
-						position, tokenIndex = position424, tokenIndex424
-						if buffer[position] != rune(':') {
+						position427, tokenIndex427 := position, tokenIndex
+						if buffer[position] != rune('$') {
 							goto l427
 						}
 						position++
-						goto l424
+						goto l428
 					l427:
-						position, tokenIndex = position424, tokenIndex424
-						if buffer[position] != rune('(') {
-							goto l428
-						}
-						position++
-						goto l424
-					l428:
-						position, tokenIndex = position424, tokenIndex424
-						if buffer[position] != rune('+') {
-							goto l429
-						}
-						position++
-						goto l424
-					l429:
-						position, tokenIndex = position424, tokenIndex424
-						if buffer[position] != rune('-') {
-							goto l423
-						}
-						position++
+						position, tokenIndex = position427, tokenIndex427
 					}
-				l424:
-					goto l406
-				l423:
-					position, tokenIndex = position423, tokenIndex423
-				}
-				add(ruleRegisterOrConstant, position407)
-			}
-			return true
-		l406:
-			position, tokenIndex = position406, tokenIndex406
-			return false
-		},
-		/* 32 MemoryRef <- <((SymbolRef BaseIndexScale) / SymbolRef / (Offset* BaseIndexScale) / (SegmentRegister Offset BaseIndexScale) / (SegmentRegister BaseIndexScale) / (SegmentRegister Offset) / BaseIndexScale)> */
-		func() bool {
-			position430, tokenIndex430 := position, tokenIndex
-			{
-				position431 := position
-				{
-					position432, tokenIndex432 := position, tokenIndex
-					if !_rules[ruleSymbolRef]() {
-						goto l433
-					}
-					if !_rules[ruleBaseIndexScale]() {
-						goto l433
-					}
-					goto l432
-				l433:
-					position, tokenIndex = position432, tokenIndex432
-					if !_rules[ruleSymbolRef]() {
-						goto l434
-					}
-					goto l432
-				l434:
-					position, tokenIndex = position432, tokenIndex432
-				l436:
+				l428:
 					{
-						position437, tokenIndex437 := position, tokenIndex
+						position429, tokenIndex429 := position, tokenIndex
 						if !_rules[ruleOffset]() {
+							goto l430
+						}
+						if !_rules[ruleOffset]() {
+							goto l430
+						}
+						goto l429
+					l430:
+						position, tokenIndex = position429, tokenIndex429
+						if !_rules[ruleOffset]() {
+							goto l414
+						}
+					}
+				l429:
+				}
+			l416:
+				{
+					position431, tokenIndex431 := position, tokenIndex
+					{
+						position432, tokenIndex432 := position, tokenIndex
+						if buffer[position] != rune('f') {
+							goto l433
+						}
+						position++
+						goto l432
+					l433:
+						position, tokenIndex = position432, tokenIndex432
+						if buffer[position] != rune('b') {
+							goto l434
+						}
+						position++
+						goto l432
+					l434:
+						position, tokenIndex = position432, tokenIndex432
+						if buffer[position] != rune(':') {
+							goto l435
+						}
+						position++
+						goto l432
+					l435:
+						position, tokenIndex = position432, tokenIndex432
+						if buffer[position] != rune('(') {
+							goto l436
+						}
+						position++
+						goto l432
+					l436:
+						position, tokenIndex = position432, tokenIndex432
+						if buffer[position] != rune('+') {
 							goto l437
 						}
-						goto l436
+						position++
+						goto l432
 					l437:
-						position, tokenIndex = position437, tokenIndex437
+						position, tokenIndex = position432, tokenIndex432
+						if buffer[position] != rune('-') {
+							goto l431
+						}
+						position++
 					}
-					if !_rules[ruleBaseIndexScale]() {
-						goto l435
-					}
-					goto l432
-				l435:
-					position, tokenIndex = position432, tokenIndex432
-					if !_rules[ruleSegmentRegister]() {
-						goto l438
-					}
-					if !_rules[ruleOffset]() {
-						goto l438
-					}
-					if !_rules[ruleBaseIndexScale]() {
-						goto l438
-					}
-					goto l432
-				l438:
-					position, tokenIndex = position432, tokenIndex432
-					if !_rules[ruleSegmentRegister]() {
-						goto l439
-					}
-					if !_rules[ruleBaseIndexScale]() {
-						goto l439
-					}
-					goto l432
-				l439:
-					position, tokenIndex = position432, tokenIndex432
-					if !_rules[ruleSegmentRegister]() {
-						goto l440
-					}
-					if !_rules[ruleOffset]() {
-						goto l440
-					}
-					goto l432
-				l440:
-					position, tokenIndex = position432, tokenIndex432
-					if !_rules[ruleBaseIndexScale]() {
-						goto l430
-					}
+				l432:
+					goto l414
+				l431:
+					position, tokenIndex = position431, tokenIndex431
 				}
-			l432:
-				add(ruleMemoryRef, position431)
+				add(ruleRegisterOrConstant, position415)
 			}
 			return true
-		l430:
-			position, tokenIndex = position430, tokenIndex430
+		l414:
+			position, tokenIndex = position414, tokenIndex414
 			return false
 		},
-		/* 33 SymbolRef <- <((Offset* '+')? (LocalSymbol / SymbolName) Offset* ('@' Section Offset*)?)> */
+		/* 33 MemoryRef <- <((SymbolRef BaseIndexScale) / SymbolRef / (Offset* BaseIndexScale) / (SegmentRegister Offset BaseIndexScale) / (SegmentRegister BaseIndexScale) / (SegmentRegister Offset) / BaseIndexScale)> */
 		func() bool {
-			position441, tokenIndex441 := position, tokenIndex
+			position438, tokenIndex438 := position, tokenIndex
 			{
-				position442 := position
+				position439 := position
 				{
-					position443, tokenIndex443 := position, tokenIndex
-				l445:
-					{
-						position446, tokenIndex446 := position, tokenIndex
-						if !_rules[ruleOffset]() {
-							goto l446
-						}
-						goto l445
-					l446:
-						position, tokenIndex = position446, tokenIndex446
-					}
-					if buffer[position] != rune('+') {
-						goto l443
-					}
-					position++
-					goto l444
-				l443:
-					position, tokenIndex = position443, tokenIndex443
-				}
-			l444:
-				{
-					position447, tokenIndex447 := position, tokenIndex
-					if !_rules[ruleLocalSymbol]() {
-						goto l448
-					}
-					goto l447
-				l448:
-					position, tokenIndex = position447, tokenIndex447
-					if !_rules[ruleSymbolName]() {
+					position440, tokenIndex440 := position, tokenIndex
+					if !_rules[ruleSymbolRef]() {
 						goto l441
 					}
-				}
-			l447:
-			l449:
-				{
-					position450, tokenIndex450 := position, tokenIndex
-					if !_rules[ruleOffset]() {
-						goto l450
+					if !_rules[ruleBaseIndexScale]() {
+						goto l441
 					}
-					goto l449
-				l450:
-					position, tokenIndex = position450, tokenIndex450
+					goto l440
+				l441:
+					position, tokenIndex = position440, tokenIndex440
+					if !_rules[ruleSymbolRef]() {
+						goto l442
+					}
+					goto l440
+				l442:
+					position, tokenIndex = position440, tokenIndex440
+				l444:
+					{
+						position445, tokenIndex445 := position, tokenIndex
+						if !_rules[ruleOffset]() {
+							goto l445
+						}
+						goto l444
+					l445:
+						position, tokenIndex = position445, tokenIndex445
+					}
+					if !_rules[ruleBaseIndexScale]() {
+						goto l443
+					}
+					goto l440
+				l443:
+					position, tokenIndex = position440, tokenIndex440
+					if !_rules[ruleSegmentRegister]() {
+						goto l446
+					}
+					if !_rules[ruleOffset]() {
+						goto l446
+					}
+					if !_rules[ruleBaseIndexScale]() {
+						goto l446
+					}
+					goto l440
+				l446:
+					position, tokenIndex = position440, tokenIndex440
+					if !_rules[ruleSegmentRegister]() {
+						goto l447
+					}
+					if !_rules[ruleBaseIndexScale]() {
+						goto l447
+					}
+					goto l440
+				l447:
+					position, tokenIndex = position440, tokenIndex440
+					if !_rules[ruleSegmentRegister]() {
+						goto l448
+					}
+					if !_rules[ruleOffset]() {
+						goto l448
+					}
+					goto l440
+				l448:
+					position, tokenIndex = position440, tokenIndex440
+					if !_rules[ruleBaseIndexScale]() {
+						goto l438
+					}
 				}
+			l440:
+				add(ruleMemoryRef, position439)
+			}
+			return true
+		l438:
+			position, tokenIndex = position438, tokenIndex438
+			return false
+		},
+		/* 34 SymbolRef <- <((Offset* '+')? (LocalSymbol / SymbolName) Offset* ('@' Section Offset*)?)> */
+		func() bool {
+			position449, tokenIndex449 := position, tokenIndex
+			{
+				position450 := position
 				{
 					position451, tokenIndex451 := position, tokenIndex
-					if buffer[position] != rune('@') {
-						goto l451
-					}
-					position++
-					if !_rules[ruleSection]() {
-						goto l451
-					}
 				l453:
 					{
 						position454, tokenIndex454 := position, tokenIndex
@@ -3564,452 +3560,503 @@
 					l454:
 						position, tokenIndex = position454, tokenIndex454
 					}
+					if buffer[position] != rune('+') {
+						goto l451
+					}
+					position++
 					goto l452
 				l451:
 					position, tokenIndex = position451, tokenIndex451
 				}
 			l452:
-				add(ruleSymbolRef, position442)
-			}
-			return true
-		l441:
-			position, tokenIndex = position441, tokenIndex441
-			return false
-		},
-		/* 34 BaseIndexScale <- <('(' RegisterOrConstant? WS? (',' WS? RegisterOrConstant WS? (',' [0-9]+)?)? ')')> */
-		func() bool {
-			position455, tokenIndex455 := position, tokenIndex
-			{
-				position456 := position
-				if buffer[position] != rune('(') {
-					goto l455
-				}
-				position++
 				{
-					position457, tokenIndex457 := position, tokenIndex
-					if !_rules[ruleRegisterOrConstant]() {
-						goto l457
+					position455, tokenIndex455 := position, tokenIndex
+					if !_rules[ruleLocalSymbol]() {
+						goto l456
 					}
-					goto l458
-				l457:
-					position, tokenIndex = position457, tokenIndex457
+					goto l455
+				l456:
+					position, tokenIndex = position455, tokenIndex455
+					if !_rules[ruleSymbolName]() {
+						goto l449
+					}
 				}
-			l458:
+			l455:
+			l457:
+				{
+					position458, tokenIndex458 := position, tokenIndex
+					if !_rules[ruleOffset]() {
+						goto l458
+					}
+					goto l457
+				l458:
+					position, tokenIndex = position458, tokenIndex458
+				}
 				{
 					position459, tokenIndex459 := position, tokenIndex
-					if !_rules[ruleWS]() {
+					if buffer[position] != rune('@') {
 						goto l459
 					}
+					position++
+					if !_rules[ruleSection]() {
+						goto l459
+					}
+				l461:
+					{
+						position462, tokenIndex462 := position, tokenIndex
+						if !_rules[ruleOffset]() {
+							goto l462
+						}
+						goto l461
+					l462:
+						position, tokenIndex = position462, tokenIndex462
+					}
 					goto l460
 				l459:
 					position, tokenIndex = position459, tokenIndex459
 				}
 			l460:
+				add(ruleSymbolRef, position450)
+			}
+			return true
+		l449:
+			position, tokenIndex = position449, tokenIndex449
+			return false
+		},
+		/* 35 BaseIndexScale <- <('(' RegisterOrConstant? WS? (',' WS? RegisterOrConstant WS? (',' [0-9]+)?)? ')')> */
+		func() bool {
+			position463, tokenIndex463 := position, tokenIndex
+			{
+				position464 := position
+				if buffer[position] != rune('(') {
+					goto l463
+				}
+				position++
 				{
-					position461, tokenIndex461 := position, tokenIndex
+					position465, tokenIndex465 := position, tokenIndex
+					if !_rules[ruleRegisterOrConstant]() {
+						goto l465
+					}
+					goto l466
+				l465:
+					position, tokenIndex = position465, tokenIndex465
+				}
+			l466:
+				{
+					position467, tokenIndex467 := position, tokenIndex
+					if !_rules[ruleWS]() {
+						goto l467
+					}
+					goto l468
+				l467:
+					position, tokenIndex = position467, tokenIndex467
+				}
+			l468:
+				{
+					position469, tokenIndex469 := position, tokenIndex
 					if buffer[position] != rune(',') {
-						goto l461
+						goto l469
 					}
 					position++
 					{
-						position463, tokenIndex463 := position, tokenIndex
+						position471, tokenIndex471 := position, tokenIndex
 						if !_rules[ruleWS]() {
-							goto l463
+							goto l471
 						}
-						goto l464
-					l463:
-						position, tokenIndex = position463, tokenIndex463
+						goto l472
+					l471:
+						position, tokenIndex = position471, tokenIndex471
 					}
-				l464:
+				l472:
 					if !_rules[ruleRegisterOrConstant]() {
-						goto l461
+						goto l469
 					}
 					{
-						position465, tokenIndex465 := position, tokenIndex
+						position473, tokenIndex473 := position, tokenIndex
 						if !_rules[ruleWS]() {
-							goto l465
+							goto l473
 						}
-						goto l466
-					l465:
-						position, tokenIndex = position465, tokenIndex465
+						goto l474
+					l473:
+						position, tokenIndex = position473, tokenIndex473
 					}
-				l466:
+				l474:
 					{
-						position467, tokenIndex467 := position, tokenIndex
+						position475, tokenIndex475 := position, tokenIndex
 						if buffer[position] != rune(',') {
-							goto l467
+							goto l475
 						}
 						position++
 						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l467
+							goto l475
 						}
 						position++
-					l469:
+					l477:
 						{
-							position470, tokenIndex470 := position, tokenIndex
+							position478, tokenIndex478 := position, tokenIndex
 							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l470
+								goto l478
 							}
 							position++
-							goto l469
-						l470:
-							position, tokenIndex = position470, tokenIndex470
+							goto l477
+						l478:
+							position, tokenIndex = position478, tokenIndex478
 						}
-						goto l468
-					l467:
-						position, tokenIndex = position467, tokenIndex467
+						goto l476
+					l475:
+						position, tokenIndex = position475, tokenIndex475
 					}
-				l468:
-					goto l462
-				l461:
-					position, tokenIndex = position461, tokenIndex461
+				l476:
+					goto l470
+				l469:
+					position, tokenIndex = position469, tokenIndex469
 				}
-			l462:
+			l470:
 				if buffer[position] != rune(')') {
-					goto l455
+					goto l463
 				}
 				position++
-				add(ruleBaseIndexScale, position456)
+				add(ruleBaseIndexScale, position464)
 			}
 			return true
-		l455:
-			position, tokenIndex = position455, tokenIndex455
+		l463:
+			position, tokenIndex = position463, tokenIndex463
 			return false
 		},
-		/* 35 Operator <- <('+' / '-')> */
+		/* 36 Operator <- <('+' / '-')> */
 		func() bool {
-			position471, tokenIndex471 := position, tokenIndex
+			position479, tokenIndex479 := position, tokenIndex
 			{
-				position472 := position
+				position480 := position
 				{
-					position473, tokenIndex473 := position, tokenIndex
+					position481, tokenIndex481 := position, tokenIndex
 					if buffer[position] != rune('+') {
-						goto l474
+						goto l482
 					}
 					position++
-					goto l473
-				l474:
-					position, tokenIndex = position473, tokenIndex473
-					if buffer[position] != rune('-') {
-						goto l471
-					}
-					position++
-				}
-			l473:
-				add(ruleOperator, position472)
-			}
-			return true
-		l471:
-			position, tokenIndex = position471, tokenIndex471
-			return false
-		},
-		/* 36 Offset <- <('+'? '-'? (('0' ('b' / 'B') ('0' / '1')+) / ('0' ('x' / 'X') ([0-9] / [0-9] / ([a-f] / [A-F]))+) / [0-9]+))> */
-		func() bool {
-			position475, tokenIndex475 := position, tokenIndex
-			{
-				position476 := position
-				{
-					position477, tokenIndex477 := position, tokenIndex
-					if buffer[position] != rune('+') {
-						goto l477
-					}
-					position++
-					goto l478
-				l477:
-					position, tokenIndex = position477, tokenIndex477
-				}
-			l478:
-				{
-					position479, tokenIndex479 := position, tokenIndex
+					goto l481
+				l482:
+					position, tokenIndex = position481, tokenIndex481
 					if buffer[position] != rune('-') {
 						goto l479
 					}
 					position++
-					goto l480
-				l479:
-					position, tokenIndex = position479, tokenIndex479
-				}
-			l480:
-				{
-					position481, tokenIndex481 := position, tokenIndex
-					if buffer[position] != rune('0') {
-						goto l482
-					}
-					position++
-					{
-						position483, tokenIndex483 := position, tokenIndex
-						if buffer[position] != rune('b') {
-							goto l484
-						}
-						position++
-						goto l483
-					l484:
-						position, tokenIndex = position483, tokenIndex483
-						if buffer[position] != rune('B') {
-							goto l482
-						}
-						position++
-					}
-				l483:
-					{
-						position487, tokenIndex487 := position, tokenIndex
-						if buffer[position] != rune('0') {
-							goto l488
-						}
-						position++
-						goto l487
-					l488:
-						position, tokenIndex = position487, tokenIndex487
-						if buffer[position] != rune('1') {
-							goto l482
-						}
-						position++
-					}
-				l487:
-				l485:
-					{
-						position486, tokenIndex486 := position, tokenIndex
-						{
-							position489, tokenIndex489 := position, tokenIndex
-							if buffer[position] != rune('0') {
-								goto l490
-							}
-							position++
-							goto l489
-						l490:
-							position, tokenIndex = position489, tokenIndex489
-							if buffer[position] != rune('1') {
-								goto l486
-							}
-							position++
-						}
-					l489:
-						goto l485
-					l486:
-						position, tokenIndex = position486, tokenIndex486
-					}
-					goto l481
-				l482:
-					position, tokenIndex = position481, tokenIndex481
-					if buffer[position] != rune('0') {
-						goto l491
-					}
-					position++
-					{
-						position492, tokenIndex492 := position, tokenIndex
-						if buffer[position] != rune('x') {
-							goto l493
-						}
-						position++
-						goto l492
-					l493:
-						position, tokenIndex = position492, tokenIndex492
-						if buffer[position] != rune('X') {
-							goto l491
-						}
-						position++
-					}
-				l492:
-					{
-						position496, tokenIndex496 := position, tokenIndex
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l497
-						}
-						position++
-						goto l496
-					l497:
-						position, tokenIndex = position496, tokenIndex496
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l498
-						}
-						position++
-						goto l496
-					l498:
-						position, tokenIndex = position496, tokenIndex496
-						{
-							position499, tokenIndex499 := position, tokenIndex
-							if c := buffer[position]; c < rune('a') || c > rune('f') {
-								goto l500
-							}
-							position++
-							goto l499
-						l500:
-							position, tokenIndex = position499, tokenIndex499
-							if c := buffer[position]; c < rune('A') || c > rune('F') {
-								goto l491
-							}
-							position++
-						}
-					l499:
-					}
-				l496:
-				l494:
-					{
-						position495, tokenIndex495 := position, tokenIndex
-						{
-							position501, tokenIndex501 := position, tokenIndex
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l502
-							}
-							position++
-							goto l501
-						l502:
-							position, tokenIndex = position501, tokenIndex501
-							if c := buffer[position]; c < rune('0') || c > rune('9') {
-								goto l503
-							}
-							position++
-							goto l501
-						l503:
-							position, tokenIndex = position501, tokenIndex501
-							{
-								position504, tokenIndex504 := position, tokenIndex
-								if c := buffer[position]; c < rune('a') || c > rune('f') {
-									goto l505
-								}
-								position++
-								goto l504
-							l505:
-								position, tokenIndex = position504, tokenIndex504
-								if c := buffer[position]; c < rune('A') || c > rune('F') {
-									goto l495
-								}
-								position++
-							}
-						l504:
-						}
-					l501:
-						goto l494
-					l495:
-						position, tokenIndex = position495, tokenIndex495
-					}
-					goto l481
-				l491:
-					position, tokenIndex = position481, tokenIndex481
-					if c := buffer[position]; c < rune('0') || c > rune('9') {
-						goto l475
-					}
-					position++
-				l506:
-					{
-						position507, tokenIndex507 := position, tokenIndex
-						if c := buffer[position]; c < rune('0') || c > rune('9') {
-							goto l507
-						}
-						position++
-						goto l506
-					l507:
-						position, tokenIndex = position507, tokenIndex507
-					}
 				}
 			l481:
-				add(ruleOffset, position476)
+				add(ruleOperator, position480)
 			}
 			return true
-		l475:
-			position, tokenIndex = position475, tokenIndex475
+		l479:
+			position, tokenIndex = position479, tokenIndex479
 			return false
 		},
-		/* 37 Section <- <([a-z] / [A-Z] / '@')+> */
+		/* 37 Offset <- <('+'? '-'? (('0' ('b' / 'B') ('0' / '1')+) / ('0' ('x' / 'X') ([0-9] / [0-9] / ([a-f] / [A-F]))+) / [0-9]+))> */
 		func() bool {
-			position508, tokenIndex508 := position, tokenIndex
+			position483, tokenIndex483 := position, tokenIndex
 			{
-				position509 := position
+				position484 := position
 				{
-					position512, tokenIndex512 := position, tokenIndex
-					if c := buffer[position]; c < rune('a') || c > rune('z') {
-						goto l513
+					position485, tokenIndex485 := position, tokenIndex
+					if buffer[position] != rune('+') {
+						goto l485
 					}
 					position++
-					goto l512
-				l513:
-					position, tokenIndex = position512, tokenIndex512
-					if c := buffer[position]; c < rune('A') || c > rune('Z') {
-						goto l514
-					}
-					position++
-					goto l512
-				l514:
-					position, tokenIndex = position512, tokenIndex512
-					if buffer[position] != rune('@') {
-						goto l508
-					}
-					position++
+					goto l486
+				l485:
+					position, tokenIndex = position485, tokenIndex485
 				}
-			l512:
-			l510:
+			l486:
 				{
-					position511, tokenIndex511 := position, tokenIndex
+					position487, tokenIndex487 := position, tokenIndex
+					if buffer[position] != rune('-') {
+						goto l487
+					}
+					position++
+					goto l488
+				l487:
+					position, tokenIndex = position487, tokenIndex487
+				}
+			l488:
+				{
+					position489, tokenIndex489 := position, tokenIndex
+					if buffer[position] != rune('0') {
+						goto l490
+					}
+					position++
+					{
+						position491, tokenIndex491 := position, tokenIndex
+						if buffer[position] != rune('b') {
+							goto l492
+						}
+						position++
+						goto l491
+					l492:
+						position, tokenIndex = position491, tokenIndex491
+						if buffer[position] != rune('B') {
+							goto l490
+						}
+						position++
+					}
+				l491:
+					{
+						position495, tokenIndex495 := position, tokenIndex
+						if buffer[position] != rune('0') {
+							goto l496
+						}
+						position++
+						goto l495
+					l496:
+						position, tokenIndex = position495, tokenIndex495
+						if buffer[position] != rune('1') {
+							goto l490
+						}
+						position++
+					}
+				l495:
+				l493:
+					{
+						position494, tokenIndex494 := position, tokenIndex
+						{
+							position497, tokenIndex497 := position, tokenIndex
+							if buffer[position] != rune('0') {
+								goto l498
+							}
+							position++
+							goto l497
+						l498:
+							position, tokenIndex = position497, tokenIndex497
+							if buffer[position] != rune('1') {
+								goto l494
+							}
+							position++
+						}
+					l497:
+						goto l493
+					l494:
+						position, tokenIndex = position494, tokenIndex494
+					}
+					goto l489
+				l490:
+					position, tokenIndex = position489, tokenIndex489
+					if buffer[position] != rune('0') {
+						goto l499
+					}
+					position++
+					{
+						position500, tokenIndex500 := position, tokenIndex
+						if buffer[position] != rune('x') {
+							goto l501
+						}
+						position++
+						goto l500
+					l501:
+						position, tokenIndex = position500, tokenIndex500
+						if buffer[position] != rune('X') {
+							goto l499
+						}
+						position++
+					}
+				l500:
+					{
+						position504, tokenIndex504 := position, tokenIndex
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l505
+						}
+						position++
+						goto l504
+					l505:
+						position, tokenIndex = position504, tokenIndex504
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l506
+						}
+						position++
+						goto l504
+					l506:
+						position, tokenIndex = position504, tokenIndex504
+						{
+							position507, tokenIndex507 := position, tokenIndex
+							if c := buffer[position]; c < rune('a') || c > rune('f') {
+								goto l508
+							}
+							position++
+							goto l507
+						l508:
+							position, tokenIndex = position507, tokenIndex507
+							if c := buffer[position]; c < rune('A') || c > rune('F') {
+								goto l499
+							}
+							position++
+						}
+					l507:
+					}
+				l504:
+				l502:
+					{
+						position503, tokenIndex503 := position, tokenIndex
+						{
+							position509, tokenIndex509 := position, tokenIndex
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l510
+							}
+							position++
+							goto l509
+						l510:
+							position, tokenIndex = position509, tokenIndex509
+							if c := buffer[position]; c < rune('0') || c > rune('9') {
+								goto l511
+							}
+							position++
+							goto l509
+						l511:
+							position, tokenIndex = position509, tokenIndex509
+							{
+								position512, tokenIndex512 := position, tokenIndex
+								if c := buffer[position]; c < rune('a') || c > rune('f') {
+									goto l513
+								}
+								position++
+								goto l512
+							l513:
+								position, tokenIndex = position512, tokenIndex512
+								if c := buffer[position]; c < rune('A') || c > rune('F') {
+									goto l503
+								}
+								position++
+							}
+						l512:
+						}
+					l509:
+						goto l502
+					l503:
+						position, tokenIndex = position503, tokenIndex503
+					}
+					goto l489
+				l499:
+					position, tokenIndex = position489, tokenIndex489
+					if c := buffer[position]; c < rune('0') || c > rune('9') {
+						goto l483
+					}
+					position++
+				l514:
 					{
 						position515, tokenIndex515 := position, tokenIndex
-						if c := buffer[position]; c < rune('a') || c > rune('z') {
-							goto l516
+						if c := buffer[position]; c < rune('0') || c > rune('9') {
+							goto l515
 						}
 						position++
-						goto l515
-					l516:
+						goto l514
+					l515:
 						position, tokenIndex = position515, tokenIndex515
-						if c := buffer[position]; c < rune('A') || c > rune('Z') {
-							goto l517
-						}
-						position++
-						goto l515
-					l517:
-						position, tokenIndex = position515, tokenIndex515
-						if buffer[position] != rune('@') {
-							goto l511
-						}
-						position++
 					}
-				l515:
-					goto l510
-				l511:
-					position, tokenIndex = position511, tokenIndex511
 				}
-				add(ruleSection, position509)
+			l489:
+				add(ruleOffset, position484)
 			}
 			return true
-		l508:
-			position, tokenIndex = position508, tokenIndex508
+		l483:
+			position, tokenIndex = position483, tokenIndex483
 			return false
 		},
-		/* 38 SegmentRegister <- <('%' ([c-g] / 's') ('s' ':'))> */
+		/* 38 Section <- <([a-z] / [A-Z] / '@')+> */
 		func() bool {
-			position518, tokenIndex518 := position, tokenIndex
+			position516, tokenIndex516 := position, tokenIndex
 			{
-				position519 := position
-				if buffer[position] != rune('%') {
-					goto l518
-				}
-				position++
+				position517 := position
 				{
 					position520, tokenIndex520 := position, tokenIndex
-					if c := buffer[position]; c < rune('c') || c > rune('g') {
+					if c := buffer[position]; c < rune('a') || c > rune('z') {
 						goto l521
 					}
 					position++
 					goto l520
 				l521:
 					position, tokenIndex = position520, tokenIndex520
-					if buffer[position] != rune('s') {
-						goto l518
+					if c := buffer[position]; c < rune('A') || c > rune('Z') {
+						goto l522
+					}
+					position++
+					goto l520
+				l522:
+					position, tokenIndex = position520, tokenIndex520
+					if buffer[position] != rune('@') {
+						goto l516
 					}
 					position++
 				}
 			l520:
-				if buffer[position] != rune('s') {
+			l518:
+				{
+					position519, tokenIndex519 := position, tokenIndex
+					{
+						position523, tokenIndex523 := position, tokenIndex
+						if c := buffer[position]; c < rune('a') || c > rune('z') {
+							goto l524
+						}
+						position++
+						goto l523
+					l524:
+						position, tokenIndex = position523, tokenIndex523
+						if c := buffer[position]; c < rune('A') || c > rune('Z') {
+							goto l525
+						}
+						position++
+						goto l523
+					l525:
+						position, tokenIndex = position523, tokenIndex523
+						if buffer[position] != rune('@') {
+							goto l519
+						}
+						position++
+					}
+				l523:
 					goto l518
+				l519:
+					position, tokenIndex = position519, tokenIndex519
+				}
+				add(ruleSection, position517)
+			}
+			return true
+		l516:
+			position, tokenIndex = position516, tokenIndex516
+			return false
+		},
+		/* 39 SegmentRegister <- <('%' ([c-g] / 's') ('s' ':'))> */
+		func() bool {
+			position526, tokenIndex526 := position, tokenIndex
+			{
+				position527 := position
+				if buffer[position] != rune('%') {
+					goto l526
+				}
+				position++
+				{
+					position528, tokenIndex528 := position, tokenIndex
+					if c := buffer[position]; c < rune('c') || c > rune('g') {
+						goto l529
+					}
+					position++
+					goto l528
+				l529:
+					position, tokenIndex = position528, tokenIndex528
+					if buffer[position] != rune('s') {
+						goto l526
+					}
+					position++
+				}
+			l528:
+				if buffer[position] != rune('s') {
+					goto l526
 				}
 				position++
 				if buffer[position] != rune(':') {
-					goto l518
+					goto l526
 				}
 				position++
-				add(ruleSegmentRegister, position519)
+				add(ruleSegmentRegister, position527)
 			}
 			return true
-		l518:
-			position, tokenIndex = position518, tokenIndex518
+		l526:
+			position, tokenIndex = position526, tokenIndex526
 			return false
 		},
 	}
diff --git a/util/fipstools/delocate/testdata/x86_64-Basic/in.s b/util/fipstools/delocate/testdata/x86_64-Basic/in.s
index 89e8aaf..c54756b 100644
--- a/util/fipstools/delocate/testdata/x86_64-Basic/in.s
+++ b/util/fipstools/delocate/testdata/x86_64-Basic/in.s
@@ -38,6 +38,9 @@
 	vpxor   %xmm4,%xmm3,%xmm3
 	vmovdqu8        %ymm1,%ymm6{%k1}{z}
 	vmovdqu8        %ymm2,%ymm4{%k3}
+	vpcmpneqq       .LCPI508_30(%rip){1to8}, %zmm1, %k0
+	vmovdqu64       -88(%rbx), %zmm0 {%k1}
+	vmovdqu64       352(%rsp,%rbx), %ymm1 {%k1}
 	.byte   0xf3,0xc3
 	movq %rax, %rbx # Comments can be on the same line as an instruction.
 .L3: # Or on the same line as a label.
diff --git a/util/fipstools/delocate/testdata/x86_64-Basic/out.s b/util/fipstools/delocate/testdata/x86_64-Basic/out.s
index 02a6025..b76fd3f 100644
--- a/util/fipstools/delocate/testdata/x86_64-Basic/out.s
+++ b/util/fipstools/delocate/testdata/x86_64-Basic/out.s
@@ -43,6 +43,9 @@
 	vpxor   %xmm4,%xmm3,%xmm3
 	vmovdqu8        %ymm1,%ymm6{%k1}{z}
 	vmovdqu8        %ymm2,%ymm4{%k3}
+	vpcmpneqq       .LCPI508_30(%rip){1to8}, %zmm1, %k0
+	vmovdqu64       -88(%rbx), %zmm0 {%k1}
+	vmovdqu64       352(%rsp,%rbx), %ymm1 {%k1}
 	.byte   0xf3,0xc3
 	movq %rax, %rbx # Comments can be on the same line as an instruction.
 .L3: