OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 /* | 7 /* |
8 * Hand-written Ragel machines and actions used in validator and decoding. | 8 * Hand-written Ragel machines and actions used in validator and decoding. |
9 * | 9 * |
10 * Note: this file includes many different machines which are supposed to be | 10 * Note: this file includes many different machines which are supposed to be |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 VEX_RX = b_xx1_xxxxx @vex_prefix2; | 243 VEX_RX = b_xx1_xxxxx @vex_prefix2; |
244 VEX_RB = b_x1x_xxxxx @vex_prefix2; | 244 VEX_RB = b_x1x_xxxxx @vex_prefix2; |
245 VEX_XB = b_1xx_xxxxx @vex_prefix2; | 245 VEX_XB = b_1xx_xxxxx @vex_prefix2; |
246 VEX_RXB = b_xxx_xxxxx @vex_prefix2; | 246 VEX_RXB = b_xxx_xxxxx @vex_prefix2; |
247 }%% | 247 }%% |
248 | 248 |
249 %%{ | 249 %%{ |
250 machine modrm_actions_ia32; | 250 machine modrm_actions_ia32; |
251 | 251 |
252 action modrm_only_base { | 252 action modrm_only_base { |
253 SET_DISP_TYPE(DISPNONE); | 253 SET_DISPLACEMNT_FORMAT(DISPNONE); |
254 SET_MODRM_BASE(RMFromModRM(*current_position)); | 254 SET_MODRM_BASE(RMFromModRM(*current_position)); |
255 SET_MODRM_INDEX(NO_REG); | 255 SET_MODRM_INDEX(NO_REG); |
256 SET_MODRM_SCALE(0); | 256 SET_MODRM_SCALE(0); |
257 } | 257 } |
258 action modrm_base_disp { | 258 action modrm_base_disp { |
259 SET_MODRM_BASE(RMFromModRM(*current_position)); | 259 SET_MODRM_BASE(RMFromModRM(*current_position)); |
260 SET_MODRM_INDEX(NO_REG); | 260 SET_MODRM_INDEX(NO_REG); |
261 SET_MODRM_SCALE(0); | 261 SET_MODRM_SCALE(0); |
262 } | 262 } |
263 action modrm_pure_disp { | 263 action modrm_pure_disp { |
264 // Case where ModRM.mod = 00 and ModRM.r/m = 101. | 264 // Case where ModRM.mod = 00 and ModRM.r/m = 101. |
265 SET_MODRM_BASE(NO_REG); | 265 SET_MODRM_BASE(NO_REG); |
266 SET_MODRM_INDEX(NO_REG); | 266 SET_MODRM_INDEX(NO_REG); |
267 SET_MODRM_SCALE(0); | 267 SET_MODRM_SCALE(0); |
268 } | 268 } |
269 action modrm_pure_index { | 269 action modrm_pure_index { |
270 SET_DISP_TYPE(DISPNONE); | 270 SET_DISPLACEMNT_FORMAT(DISPNONE); |
271 SET_MODRM_BASE(NO_REG); | 271 SET_MODRM_BASE(NO_REG); |
272 SET_MODRM_INDEX(index_registers[IndexFromSIB(*current_position)]); | 272 SET_MODRM_INDEX(index_registers[IndexFromSIB(*current_position)]); |
273 SET_MODRM_SCALE(ScaleFromSIB(*current_position)); | 273 SET_MODRM_SCALE(ScaleFromSIB(*current_position)); |
274 } | 274 } |
275 action modrm_parse_sib { | 275 action modrm_parse_sib { |
276 SET_DISP_TYPE(DISPNONE); | 276 SET_DISPLACEMNT_FORMAT(DISPNONE); |
277 SET_MODRM_BASE(BaseFromSIB(*current_position)); | 277 SET_MODRM_BASE(BaseFromSIB(*current_position)); |
278 SET_MODRM_INDEX(index_registers[IndexFromSIB(*current_position)]); | 278 SET_MODRM_INDEX(index_registers[IndexFromSIB(*current_position)]); |
279 SET_MODRM_SCALE(ScaleFromSIB(*current_position)); | 279 SET_MODRM_SCALE(ScaleFromSIB(*current_position)); |
280 } | 280 } |
281 }%% | 281 }%% |
282 | 282 |
283 %%{ | 283 %%{ |
284 machine modrm_actions_amd64; | 284 machine modrm_actions_amd64; |
285 | 285 |
286 action modrm_only_base { | 286 action modrm_only_base { |
287 SET_DISP_TYPE(DISPNONE); | 287 SET_DISPLACEMNT_FORMAT(DISPNONE); |
288 SET_MODRM_BASE(BaseFromSIB(*current_position) | | 288 SET_MODRM_BASE(BaseFromSIB(*current_position) | |
289 BaseExtentionFromREX(GET_REX_PREFIX()) | | 289 BaseExtentionFromREX(GET_REX_PREFIX()) | |
290 BaseExtentionFromVEX(GET_VEX_PREFIX2())); | 290 BaseExtentionFromVEX(GET_VEX_PREFIX2())); |
291 SET_MODRM_INDEX(NO_REG); | 291 SET_MODRM_INDEX(NO_REG); |
292 SET_MODRM_SCALE(0); | 292 SET_MODRM_SCALE(0); |
293 } | 293 } |
294 action modrm_base_disp { | 294 action modrm_base_disp { |
295 SET_MODRM_BASE(BaseFromSIB(*current_position) | | 295 SET_MODRM_BASE(BaseFromSIB(*current_position) | |
296 BaseExtentionFromREX(GET_REX_PREFIX()) | | 296 BaseExtentionFromREX(GET_REX_PREFIX()) | |
297 BaseExtentionFromVEX(GET_VEX_PREFIX2())); | 297 BaseExtentionFromVEX(GET_VEX_PREFIX2())); |
298 SET_MODRM_INDEX(NO_REG); | 298 SET_MODRM_INDEX(NO_REG); |
299 SET_MODRM_SCALE(0); | 299 SET_MODRM_SCALE(0); |
300 } | 300 } |
301 action modrm_pure_disp { | 301 action modrm_pure_disp { |
302 // Case where ModRM.mod = 00 and ModRM.r/m = 101. | 302 // Case where ModRM.mod = 00 and ModRM.r/m = 101. |
303 // In 64-bit mode it corresponds to RIP-relative addressing. | 303 // In 64-bit mode it corresponds to RIP-relative addressing. |
304 SET_MODRM_BASE(REG_RIP); | 304 SET_MODRM_BASE(REG_RIP); |
305 SET_MODRM_INDEX(NO_REG); | 305 SET_MODRM_INDEX(NO_REG); |
306 SET_MODRM_SCALE(0); | 306 SET_MODRM_SCALE(0); |
307 } | 307 } |
308 action modrm_pure_index { | 308 action modrm_pure_index { |
309 SET_DISP_TYPE(DISPNONE); | 309 SET_DISPLACEMNT_FORMAT(DISPNONE); |
310 SET_MODRM_BASE(NO_REG); | 310 SET_MODRM_BASE(NO_REG); |
311 SET_MODRM_INDEX(index_registers[IndexFromSIB(*current_position) | | 311 SET_MODRM_INDEX(index_registers[IndexFromSIB(*current_position) | |
312 IndexExtentionFromREX(GET_REX_PREFIX()) | | 312 IndexExtentionFromREX(GET_REX_PREFIX()) | |
313 IndexExtentionFromVEX(GET_VEX_PREFIX2())]); | 313 IndexExtentionFromVEX(GET_VEX_PREFIX2())]); |
314 SET_MODRM_SCALE(ScaleFromSIB(*current_position)); | 314 SET_MODRM_SCALE(ScaleFromSIB(*current_position)); |
315 } | 315 } |
316 action modrm_parse_sib { | 316 action modrm_parse_sib { |
317 SET_DISP_TYPE(DISPNONE); | 317 SET_DISPLACEMNT_FORMAT(DISPNONE); |
318 SET_MODRM_BASE(BaseFromSIB(*current_position) | | 318 SET_MODRM_BASE(BaseFromSIB(*current_position) | |
319 BaseExtentionFromREX(GET_REX_PREFIX()) | | 319 BaseExtentionFromREX(GET_REX_PREFIX()) | |
320 BaseExtentionFromVEX(GET_VEX_PREFIX2())); | 320 BaseExtentionFromVEX(GET_VEX_PREFIX2())); |
321 SET_MODRM_INDEX(index_registers[IndexFromSIB(*current_position) | | 321 SET_MODRM_INDEX(index_registers[IndexFromSIB(*current_position) | |
322 IndexExtentionFromREX(GET_REX_PREFIX()) | | 322 IndexExtentionFromREX(GET_REX_PREFIX()) | |
323 IndexExtentionFromVEX(GET_VEX_PREFIX2())]); | 323 IndexExtentionFromVEX(GET_VEX_PREFIX2())]); |
324 SET_MODRM_SCALE(ScaleFromSIB(*current_position)); | 324 SET_MODRM_SCALE(ScaleFromSIB(*current_position)); |
325 } | 325 } |
326 }%% | 326 }%% |
327 | 327 |
(...skipping 21 matching lines...) Expand all Loading... |
349 opcode_0 = b_xx_000_xxx; | 349 opcode_0 = b_xx_000_xxx; |
350 opcode_1 = b_xx_001_xxx; | 350 opcode_1 = b_xx_001_xxx; |
351 opcode_2 = b_xx_010_xxx; | 351 opcode_2 = b_xx_010_xxx; |
352 opcode_3 = b_xx_011_xxx; | 352 opcode_3 = b_xx_011_xxx; |
353 opcode_4 = b_xx_100_xxx; | 353 opcode_4 = b_xx_100_xxx; |
354 opcode_5 = b_xx_101_xxx; | 354 opcode_5 = b_xx_101_xxx; |
355 opcode_6 = b_xx_110_xxx; | 355 opcode_6 = b_xx_110_xxx; |
356 opcode_7 = b_xx_111_xxx; | 356 opcode_7 = b_xx_111_xxx; |
357 # Used for segment operations: there only 6 segment registers. | 357 # Used for segment operations: there only 6 segment registers. |
358 opcode_s = (any - b_xx_110_xxx - b_xx_111_xxx); | 358 opcode_s = (any - b_xx_110_xxx - b_xx_111_xxx); |
| 359 # This is used to move operand name detection after first byte of ModRM. |
| 360 opcode_m = (any - b_11_xxx_xxx); |
| 361 opcode_r = b_11_xxx_xxx; |
359 }%% | 362 }%% |
360 | 363 |
361 %%{ | 364 %%{ |
362 # For IA32 validator we do not need modrm-parsing actions. | 365 # For IA32 validator we do not need modrm-parsing actions. |
363 machine modrm_parsing_ia32_validator; | 366 machine modrm_parsing_ia32_validator; |
364 | 367 |
365 operand_sib_base_index = | 368 operand_sib_base_index = |
366 (b_00_xxx_100 . (any - b_xx_xxx_101)) | | 369 (b_00_xxx_100 . (any - b_xx_xxx_101)) | |
367 (b_01_xxx_100 . any . disp8) | | 370 (b_01_xxx_100 . any . disp8) | |
368 (b_10_xxx_100 . any . disp32); | 371 (b_10_xxx_100 . any . disp32); |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 SET_OPERAND_NAME(3, RMFromModRM(*current_position) | | 652 SET_OPERAND_NAME(3, RMFromModRM(*current_position) | |
650 BaseExtentionFromREX(GET_REX_PREFIX()) | | 653 BaseExtentionFromREX(GET_REX_PREFIX()) | |
651 BaseExtentionFromVEX(GET_VEX_PREFIX2())); | 654 BaseExtentionFromVEX(GET_VEX_PREFIX2())); |
652 } | 655 } |
653 }%% | 656 }%% |
654 | 657 |
655 %%{ | 658 %%{ |
656 machine displacement_fields_parsing; | 659 machine displacement_fields_parsing; |
657 | 660 |
658 action disp8_operand { | 661 action disp8_operand { |
659 SET_DISP_TYPE(DISP8); | 662 SET_DISPLACEMNT_FORMAT(DISP8); |
660 SET_DISP_PTR(current_position); | 663 SET_DISPLACEMNT_POINTER(current_position); |
661 } | 664 } |
662 action disp32_operand { | 665 action disp32_operand { |
663 SET_DISP_TYPE(DISP32); | 666 SET_DISPLACEMNT_FORMAT(DISP32); |
664 SET_DISP_PTR(current_position - 3); | 667 SET_DISPLACEMNT_POINTER(current_position - 3); |
665 } | 668 } |
666 action disp64_operand { | 669 action disp64_operand { |
667 SET_DISP_TYPE(DISP64); | 670 SET_DISPLACEMNT_FORMAT(DISP64); |
668 SET_DISP_PTR(current_position - 7); | 671 SET_DISPLACEMNT_POINTER(current_position - 7); |
669 } | 672 } |
670 | 673 |
671 # This action is used to mark transitions corresponding to immediates, | 674 # This action is used to mark transitions corresponding to immediates, |
672 # displacements and relative jump targets - stuff that we don't have to | 675 # displacements and relative jump targets - stuff that we don't have to |
673 # enumerate in enumeration tests. | 676 # enumerate in enumeration tests. |
674 # TODO(shcherbina): find appropriate place for this action. | 677 # TODO(shcherbina): find appropriate place for this action. |
675 action any_byte {} | 678 action any_byte {} |
676 | 679 |
677 disp8 = any @disp8_operand $any_byte; | 680 disp8 = any @disp8_operand $any_byte; |
678 disp32 = any{4} @disp32_operand $any_byte; | 681 disp32 = any{4} @disp32_operand $any_byte; |
679 disp64 = any{8} @disp64_operand $any_byte; | 682 disp64 = any{8} @disp64_operand $any_byte; |
680 }%% | 683 }%% |
681 | 684 |
682 %%{ | 685 %%{ |
683 machine immediate_fields_parsing; | 686 machine immediate_fields_parsing; |
684 | 687 |
685 action imm2_operand { | 688 action imm2_operand { |
686 SET_IMM_TYPE(IMM2); | 689 SET_IMMEDIATE_FORMAT(IMM2); |
687 SET_IMM_PTR(current_position); | 690 SET_IMMEDIATE_POINTER(current_position); |
688 } | 691 } |
689 action imm8_operand { | 692 action imm8_operand { |
690 SET_IMM_TYPE(IMM8); | 693 SET_IMMEDIATE_FORMAT(IMM8); |
691 SET_IMM_PTR(current_position); | 694 SET_IMMEDIATE_POINTER(current_position); |
692 } | 695 } |
693 action imm8_second_operand { | 696 action imm8_second_operand { |
694 SET_IMM2_TYPE(IMM8); | 697 SET_SECOND_IMMEDIATE_FORMAT(IMM8); |
695 SET_IMM2_PTR(current_position); | 698 SET_SECOND_IMMEDIATE_POINTER(current_position); |
696 } | 699 } |
697 action imm16_operand { | 700 action imm16_operand { |
698 SET_IMM_TYPE(IMM16); | 701 SET_IMMEDIATE_FORMAT(IMM16); |
699 SET_IMM_PTR(current_position - 1); | 702 SET_IMMEDIATE_POINTER(current_position - 1); |
700 } | 703 } |
701 action imm16_second_operand { | 704 action imm16_second_operand { |
702 SET_IMM2_TYPE(IMM16); | 705 SET_SECOND_IMMEDIATE_FORMAT(IMM16); |
703 SET_IMM2_PTR(current_position - 1); | 706 SET_SECOND_IMMEDIATE_POINTER(current_position - 1); |
704 } | 707 } |
705 action imm32_operand { | 708 action imm32_operand { |
706 SET_IMM_TYPE(IMM32); | 709 SET_IMMEDIATE_FORMAT(IMM32); |
707 SET_IMM_PTR(current_position - 3); | 710 SET_IMMEDIATE_POINTER(current_position - 3); |
708 } | 711 } |
709 action imm32_second_operand { | 712 action imm32_second_operand { |
710 SET_IMM2_TYPE(IMM32); | 713 SET_SECOND_IMMEDIATE_FORMAT(IMM32); |
711 SET_IMM2_PTR(current_position - 3); | 714 SET_SECOND_IMMEDIATE_POINTER(current_position - 3); |
712 } | 715 } |
713 action imm64_operand { | 716 action imm64_operand { |
714 SET_IMM_TYPE(IMM64); | 717 SET_IMMEDIATE_FORMAT(IMM64); |
715 SET_IMM_PTR(current_position - 7); | 718 SET_IMMEDIATE_POINTER(current_position - 7); |
716 } | 719 } |
717 action imm64_second_operand { | 720 action imm64_second_operand { |
718 SET_IMM2_TYPE(IMM64); | 721 SET_SECOND_IMMEDIATE_FORMAT(IMM64); |
719 SET_IMM2_PTR(current_position - 7); | 722 SET_SECOND_IMMEDIATE_POINTER(current_position - 7); |
720 } | 723 } |
721 | 724 |
722 imm8 = any @imm8_operand $any_byte; | 725 imm8 = any @imm8_operand $any_byte; |
723 imm16 = any{2} @imm16_operand $any_byte; | 726 imm16 = any{2} @imm16_operand $any_byte; |
724 imm32 = any{4} @imm32_operand $any_byte; | 727 imm32 = any{4} @imm32_operand $any_byte; |
725 imm64 = any{8} @imm64_operand $any_byte; | 728 imm64 = any{8} @imm64_operand $any_byte; |
726 imm8n2 = any @imm8_second_operand $any_byte; | 729 imm8n2 = any @imm8_second_operand $any_byte; |
727 imm16n2 = any{2} @imm16_second_operand $any_byte; | 730 imm16n2 = any{2} @imm16_second_operand $any_byte; |
728 }%% | 731 }%% |
729 | 732 |
730 %%{ | 733 %%{ |
731 machine relative_fields_decoder_actions; | 734 machine relative_fields_decoder_actions; |
732 | 735 |
733 action rel8_operand { | 736 action rel8_operand { |
734 SET_MODRM_BASE(REG_RIP); | 737 SET_MODRM_BASE(REG_RIP); |
735 SET_MODRM_INDEX(NO_REG); | 738 SET_MODRM_INDEX(NO_REG); |
736 SET_MODRM_SCALE(0); | 739 SET_MODRM_SCALE(0); |
737 SET_DISP_TYPE(DISP8); | 740 SET_DISPLACEMNT_FORMAT(DISP8); |
738 SET_DISP_PTR(current_position); | 741 SET_DISPLACEMNT_POINTER(current_position); |
739 } | 742 } |
740 action rel16_operand { | 743 action rel16_operand { |
741 SET_MODRM_BASE(REG_RIP); | 744 SET_MODRM_BASE(REG_RIP); |
742 SET_MODRM_INDEX(NO_REG); | 745 SET_MODRM_INDEX(NO_REG); |
743 SET_MODRM_SCALE(0); | 746 SET_MODRM_SCALE(0); |
744 SET_DISP_TYPE(DISP16); | 747 SET_DISPLACEMNT_FORMAT(DISP16); |
745 SET_DISP_PTR(current_position - 1); | 748 SET_DISPLACEMNT_POINTER(current_position - 1); |
746 } | 749 } |
747 action rel32_operand { | 750 action rel32_operand { |
748 SET_MODRM_BASE(REG_RIP); | 751 SET_MODRM_BASE(REG_RIP); |
749 SET_MODRM_INDEX(NO_REG); | 752 SET_MODRM_INDEX(NO_REG); |
750 SET_MODRM_SCALE(0); | 753 SET_MODRM_SCALE(0); |
751 SET_DISP_TYPE(DISP32); | 754 SET_DISPLACEMNT_FORMAT(DISP32); |
752 SET_DISP_PTR(current_position - 3); | 755 SET_DISPLACEMNT_POINTER(current_position - 3); |
753 } | 756 } |
754 }%% | 757 }%% |
755 | 758 |
756 %%{ | 759 %%{ |
757 machine relative_fields_validator_actions; | 760 machine relative_fields_validator_actions; |
758 | 761 |
759 # rel8 actions are used in relative jumps with 8-bit offset. | 762 # rel8 actions are used in relative jumps with 8-bit offset. |
760 action rel8_operand { | 763 action rel8_operand { |
761 Rel8Operand(current_position + 1, data, jump_dests, size, | 764 Rel8Operand(current_position + 1, codeblock, jump_dests, size, |
762 &instruction_info_collected); | 765 &instruction_info_collected); |
763 } | 766 } |
764 | 767 |
765 # rel16 actions are used in relative jumps with 16-bit offset. | 768 # rel16 actions are used in relative jumps with 16-bit offset. |
766 # Such instructions should not be included in the validator's DFA, but we can | 769 # Such instructions should not be included in the validator's DFA, but we can |
767 # not just exclude them because they are refenced in relative_fields_parsing | 770 # not just exclude them because they are refenced in relative_fields_parsing |
768 # ragel machine. Ensure compilations error in case of accidental usage. | 771 # ragel machine. Ensure compilations error in case of accidental usage. |
769 action rel16_operand { | 772 action rel16_operand { |
770 #error rel16_operand should never be used in nacl | 773 #error rel16_operand should never be used in nacl |
771 } | 774 } |
772 | 775 |
773 # rel32 actions are used in relative calls and jumps with 32-bit offset. | 776 # rel32 actions are used in relative calls and jumps with 32-bit offset. |
774 action rel32_operand { | 777 action rel32_operand { |
775 Rel32Operand(current_position + 1, data, jump_dests, size, | 778 Rel32Operand(current_position + 1, codeblock, jump_dests, size, |
776 &instruction_info_collected); | 779 &instruction_info_collected); |
777 } | 780 } |
| 781 |
| 782 # Action which marks last byte as not immediate. Most 3DNow! instructions, |
| 783 # some AVX and XOP instructions have this property. |
| 784 # |
| 785 # This action is referenced by decode_x86_32 ragel machine in [autogenerated] |
| 786 # "validator_x86_32_instruction.rl" file. |
| 787 action last_byte_is_not_immediate { |
| 788 instruction_info_collected |= LAST_BYTE_IS_NOT_IMMEDIATE; |
| 789 } |
778 }%% | 790 }%% |
779 | 791 |
780 %%{ | 792 %%{ |
781 machine relative_fields_parsing; | 793 machine relative_fields_parsing; |
782 | 794 |
783 rel8 = any @rel8_operand $any_byte; | 795 rel8 = any @rel8_operand $any_byte; |
784 rel16 = any{2} @rel16_operand $any_byte; | 796 rel16 = any{2} @rel16_operand $any_byte; |
785 rel32 = any{4} @rel32_operand $any_byte; | 797 rel32 = any{4} @rel32_operand $any_byte; |
786 }%% | 798 }%% |
787 | 799 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
843 action att_show_name_suffix_b { SET_ATT_INSTRUCTION_SUFFIX("b"); } | 855 action att_show_name_suffix_b { SET_ATT_INSTRUCTION_SUFFIX("b"); } |
844 action att_show_name_suffix_l { SET_ATT_INSTRUCTION_SUFFIX("l"); } | 856 action att_show_name_suffix_l { SET_ATT_INSTRUCTION_SUFFIX("l"); } |
845 action att_show_name_suffix_ll { SET_ATT_INSTRUCTION_SUFFIX("ll"); } | 857 action att_show_name_suffix_ll { SET_ATT_INSTRUCTION_SUFFIX("ll"); } |
846 action att_show_name_suffix_t { SET_ATT_INSTRUCTION_SUFFIX("t"); } | 858 action att_show_name_suffix_t { SET_ATT_INSTRUCTION_SUFFIX("t"); } |
847 action att_show_name_suffix_s { SET_ATT_INSTRUCTION_SUFFIX("s"); } | 859 action att_show_name_suffix_s { SET_ATT_INSTRUCTION_SUFFIX("s"); } |
848 action att_show_name_suffix_q { SET_ATT_INSTRUCTION_SUFFIX("q"); } | 860 action att_show_name_suffix_q { SET_ATT_INSTRUCTION_SUFFIX("q"); } |
849 action att_show_name_suffix_w { SET_ATT_INSTRUCTION_SUFFIX("w"); } | 861 action att_show_name_suffix_w { SET_ATT_INSTRUCTION_SUFFIX("w"); } |
850 action att_show_name_suffix_x { SET_ATT_INSTRUCTION_SUFFIX("x"); } | 862 action att_show_name_suffix_x { SET_ATT_INSTRUCTION_SUFFIX("x"); } |
851 action att_show_name_suffix_y { SET_ATT_INSTRUCTION_SUFFIX("y"); } | 863 action att_show_name_suffix_y { SET_ATT_INSTRUCTION_SUFFIX("y"); } |
852 }%% | 864 }%% |
OLD | NEW |