| OLD | NEW |
| 1 # ARMv7 Instruction Encodings | 1 # ARMv7 Instruction Encodings |
| 2 # | 2 # |
| 3 # This table is derived from the "ARM Architecture Reference Manual, ARMv7-A | 3 # This table is derived from the "ARM Architecture Reference Manual, ARMv7-A |
| 4 # and ARMv7-R edition" and is used here with the permission of ARM Limited. | 4 # and ARMv7-R edition" and is used here with the permission of ARM Limited. |
| 5 # Reproduction for purposes other than the development and distribution of | 5 # Reproduction for purposes other than the development and distribution of |
| 6 # Native Client may require the explicit permission of ARM Limited. | 6 # Native Client may require the explicit permission of ARM Limited. |
| 7 | 7 |
| 8 # This file defines the Native Client "instruction classes" assigned to every | 8 # This file defines the Native Client "instruction classes" assigned to every |
| 9 # possible ARMv7 instruction encoding. It is organized into a series of tables, | 9 # possible ARMv7 instruction encoding. It is organized into a series of tables, |
| 10 # and directly parallels the ARM Architecture Reference Manual cited above. | 10 # and directly parallels the ARM Architecture Reference Manual cited above. |
| (...skipping 3494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3505 rule := VRECPE; | 3505 rule := VRECPE; |
| 3506 | " 10x1x = *V2RM_IF32 | 3506 | " 10x1x = *V2RM_IF32 |
| 3507 pattern := 111100111d11ss11dddd010f1qm0mmmm; | 3507 pattern := 111100111d11ss11dddd010f1qm0mmmm; |
| 3508 rule := VRSQRTE; | 3508 rule := VRSQRTE; |
| 3509 | " 11xxx = *V2RM_CVT_F2I | 3509 | " 11xxx = *V2RM_CVT_F2I |
| 3510 pattern := 111100111d11ss11dddd011ppqm0mmmm; | 3510 pattern := 111100111d11ss11dddd011ppqm0mmmm; |
| 3511 rule := VCVT; | 3511 rule := VCVT; |
| 3512 | else: = Undefined | 3512 | else: = Undefined |
| 3513 +-- | 3513 +-- |
| 3514 | 3514 |
| 3515 # TODO(karl): Add uses to corresponding classes. | |
| 3516 +-- simd_dp_1imm (See Section A7.4.6) | 3515 +-- simd_dp_1imm (See Section A7.4.6) |
| 3517 *V1RI | 3516 *V1RI |
| 3518 { i(24), D(22), imm3(18:16), Vd(15:12), cmode(11:8), Q(6), op(5), imm4(3:0) } | 3517 { i(24), D(22), imm3(18:16), Vd(15:12), cmode(11:8), Q(6), op(5), imm4(3:0) } |
| 3519 baseline := Vector1RegisterImmediate; | 3518 baseline := Vector1RegisterImmediate; |
| 3520 imm64 := AdvSIMDExpandImm(op, cmode, i:imm3:imm4); | 3519 imm64 := AdvSIMDExpandImm(op, cmode, i:imm3:imm4); |
| 3521 d := D:Vd; regs := 1 if Q=0 else 2; | 3520 d := D:Vd; regs := 1 if Q=0 else 2; |
| 3521 # TODO(karl): Add vector defs/uses etc. |
| 3522 defs := {}; |
| 3523 uses := {}; |
| 3522 arch := ASIMD; | 3524 arch := ASIMD; |
| 3523 *V1RI_MOV *V1RI | 3525 *V1RI_MOV *V1RI |
| 3524 baseline := Vector1RegisterImmediate_MOV; | 3526 baseline := Vector1RegisterImmediate_MOV; |
| 3525 single_register := false; | 3527 single_register := false; |
| 3526 safety := op=0 & cmode(0)=1 & cmode(3:2)=~11 => DECODER_ERROR & | 3528 safety := op=0 & cmode(0)=1 & cmode(3:2)=~11 => DECODER_ERROR & |
| 3527 op=1 & cmode=~1110 => DECODER_ERROR & | 3529 op=1 & cmode=~1110 => DECODER_ERROR & |
| 3528 Q=1 & Vd(0)=1 => UNDEFINED; | 3530 Q=1 & Vd(0)=1 => UNDEFINED; |
| 3529 *V1RI_BIT *V1RI | 3531 *V1RI_BIT *V1RI |
| 3530 baseline := Vector1RegisterImmediate_BIT; | 3532 baseline := Vector1RegisterImmediate_BIT; |
| 3531 safety := cmode(0)=0 | cmode(3:2)=11 => DECODER_ERROR & | 3533 safety := cmode(0)=0 | cmode(3:2)=11 => DECODER_ERROR & |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3565 rule := VBIC_immediate; | 3567 rule := VBIC_immediate; |
| 3566 | " 110x = *V1RI_MVN | 3568 | " 110x = *V1RI_MVN |
| 3567 pattern := 1111001i1d000mmmddddcccc0q11mmmm; | 3569 pattern := 1111001i1d000mmmddddcccc0q11mmmm; |
| 3568 rule := VMVN_immediate; | 3570 rule := VMVN_immediate; |
| 3569 | " 1110 = *V1RI_MOV | 3571 | " 1110 = *V1RI_MOV |
| 3570 pattern := 1111001m1d000mmmddddcccc0qp1mmmm; | 3572 pattern := 1111001m1d000mmmddddcccc0qp1mmmm; |
| 3571 rule := VMOV_immediate_A1; | 3573 rule := VMOV_immediate_A1; |
| 3572 | " 1111 = Undefined | 3574 | " 1111 = Undefined |
| 3573 +-- | 3575 +-- |
| 3574 | 3576 |
| 3575 # TODO(karl): Add uses to corresponding classes. | |
| 3576 +-- advanced_simd_element_or_structure_load_store_instructions (See Section A7.7
) | 3577 +-- advanced_simd_element_or_structure_load_store_instructions (See Section A7.7
) |
| 3577 *VLSM | 3578 *VLSM |
| 3578 { D(22), Rn(19:16), Vd(15:12), type(11:8), size(7:6), align(5:4), Rm(3:0) } | 3579 { D(22), Rn(19:16), Vd(15:12), type(11:8), size(7:6), align(5:4), Rm(3:0) } |
| 3579 baseline := VectorLoadStoreMultiple; | 3580 baseline := VectorLoadStoreMultiple; |
| 3580 alignment := 1 if align=00 else 4 << align; | 3581 alignment := 1 if align=00 else 4 << align; |
| 3581 ebytes := 1 << size; esize := 8 * ebytes; elements := 8 / ebytes; | 3582 ebytes := 1 << size; esize := 8 * ebytes; elements := 8 / ebytes; |
| 3582 d := D:Vd; n := Rn; m := Rm; | 3583 d := D:Vd; n := Rn; m := Rm; |
| 3583 wback := (m != Pc); register_index := (m != Pc & m != Sp); | 3584 wback := (m != Pc); register_index := (m != Pc & m != Sp); |
| 3584 base := n; | 3585 base := n; |
| 3586 # TODO(karl): Add vector defs/uses etc. |
| 3585 # defs ignores FPRs. It only models GPRs and conditions. | 3587 # defs ignores FPRs. It only models GPRs and conditions. |
| 3586 defs := { base } if wback else {}; | 3588 defs := { base } if wback else {}; |
| 3587 # Note: register_index defines if Rm is used (rather than a small constant). | 3589 # Note: register_index defines if Rm is used (rather than a small constant). |
| 3588 small_imm_base_wb := not register_index; | 3590 small_imm_base_wb := not register_index; |
| 3589 # uses ignores FPRs. It only models GPRs. | 3591 # uses ignores FPRs. It only models GPRs. |
| 3590 uses := { m if wback else None , n }; | 3592 uses := { m if wback else None , n }; |
| 3591 arch := ASIMD; | 3593 arch := ASIMD; |
| 3592 *VLSM1 *VLSM | 3594 *VLSM1 *VLSM |
| 3593 baseline := VectorLoadStoreMultiple1; | 3595 baseline := VectorLoadStoreMultiple1; |
| 3594 regs := 1 if type=0111 else | 3596 regs := 1 if type=0111 else |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3633 index_align(3:2) if size=01 else | 3635 index_align(3:2) if size=01 else |
| 3634 index_align(3) if size=10 else | 3636 index_align(3) if size=10 else |
| 3635 0; # error value. | 3637 0; # error value. |
| 3636 inc := 1 if size=00 else | 3638 inc := 1 if size=00 else |
| 3637 (1 if index_align(1)=0 else 2) if size=01 else | 3639 (1 if index_align(1)=0 else 2) if size=01 else |
| 3638 (1 if index_align(2)=0 else 2) if size=10 else | 3640 (1 if index_align(2)=0 else 2) if size=10 else |
| 3639 0; # error value. | 3641 0; # error value. |
| 3640 d := D:Vd; n := Rn; m := Rm; | 3642 d := D:Vd; n := Rn; m := Rm; |
| 3641 wback := (m != Pc); register_index := (m != Pc & m != Sp); | 3643 wback := (m != Pc); register_index := (m != Pc & m != Sp); |
| 3642 base := n; | 3644 base := n; |
| 3645 # TODO(karl): Add vector defs/uses etc. |
| 3643 # defs ignores FPRs. It only models GPRs and conditions. | 3646 # defs ignores FPRs. It only models GPRs and conditions. |
| 3644 defs := { base } if wback else {}; | 3647 defs := { base } if wback else {}; |
| 3645 # Note: register_index defines if Rm is used (rather than a small constant). | 3648 # Note: register_index defines if Rm is used (rather than a small constant). |
| 3646 small_imm_base_wb := not register_index; | 3649 small_imm_base_wb := not register_index; |
| 3647 # uses ignores FPRs. It only models GPRs. | 3650 # uses ignores FPRs. It only models GPRs. |
| 3648 uses := { m if wback else None , n }; | 3651 uses := { m if wback else None , n }; |
| 3649 arch := ASIMD; | 3652 arch := ASIMD; |
| 3650 *VLSS1 *VLSS | 3653 *VLSS1 *VLSS |
| 3651 baseline := VectorLoadStoreSingle1; | 3654 baseline := VectorLoadStoreSingle1; |
| 3652 alignment := 1 if size=00 else | 3655 alignment := 1 if size=00 else |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3690 safety := size=11 => UNDEFINED & | 3693 safety := size=11 => UNDEFINED & |
| 3691 size=10 & index_align(1:0)=11 => UNDEFINED & | 3694 size=10 & index_align(1:0)=11 => UNDEFINED & |
| 3692 n == Pc | d4 > 31 => UNPREDICTABLE; | 3695 n == Pc | d4 > 31 => UNPREDICTABLE; |
| 3693 *VLSA | 3696 *VLSA |
| 3694 { D(22), Rn(19:16), Vd(15:12), size(7:6), T(5), a(4), Rm(3:0) } | 3697 { D(22), Rn(19:16), Vd(15:12), size(7:6), T(5), a(4), Rm(3:0) } |
| 3695 baseline := VectorLoadSingleAllLanes; | 3698 baseline := VectorLoadSingleAllLanes; |
| 3696 ebytes := 1 << size; elements := 8 / ebytes; | 3699 ebytes := 1 << size; elements := 8 / ebytes; |
| 3697 d := D:Vd; n := Rn; m := Rm; | 3700 d := D:Vd; n := Rn; m := Rm; |
| 3698 wback := (m != Pc); register_index := (m != Pc & m != Sp); | 3701 wback := (m != Pc); register_index := (m != Pc & m != Sp); |
| 3699 base := n; | 3702 base := n; |
| 3703 # TODO(karl): Add vector defs/uses etc. |
| 3700 # defs ignores FPRs. It only models GPRs and conditions. | 3704 # defs ignores FPRs. It only models GPRs and conditions. |
| 3701 defs := { base } if wback else {}; | 3705 defs := { base } if wback else {}; |
| 3702 # Note: register_index defines if Rm is used (rather than a small constant). | 3706 # Note: register_index defines if Rm is used (rather than a small constant). |
| 3703 small_imm_base_wb := not register_index; | 3707 small_imm_base_wb := not register_index; |
| 3704 # uses ignores FPRs. It only models GPRs. | 3708 # uses ignores FPRs. It only models GPRs. |
| 3705 uses := { m if wback else None , n }; | 3709 uses := { m if wback else None , n }; |
| 3706 arch := ASIMD; | 3710 arch := ASIMD; |
| 3707 *VLS1A *VLSA | 3711 *VLS1A *VLSA |
| 3708 baseline := VectorLoadSingle1AllLanes; | 3712 baseline := VectorLoadSingle1AllLanes; |
| 3709 alignment := 1 if a=0 else ebytes; | 3713 alignment := 1 if a=0 else ebytes; |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3804 rule := VLD3_single_3_element_structure_to_all_lanes; | 3808 rule := VLD3_single_3_element_structure_to_all_lanes; |
| 3805 | " " 0x11 = *VLSS4 | 3809 | " " 0x11 = *VLSS4 |
| 3806 pattern := 111101001d10nnnnddddss11aaaammmm; | 3810 pattern := 111101001d10nnnnddddss11aaaammmm; |
| 3807 rule := VLD4_single_4_element_structure_to_one_lane; | 3811 rule := VLD4_single_4_element_structure_to_one_lane; |
| 3808 | " " 1011 " | 3812 | " " 1011 " |
| 3809 | " " 1111 = *VLS4A | 3813 | " " 1111 = *VLS4A |
| 3810 pattern := 111101001d10nnnndddd1111sstammmm; | 3814 pattern := 111101001d10nnnndddd1111sstammmm; |
| 3811 rule := VLD4_single_4_element_structure_to_all_lanes; | 3815 rule := VLD4_single_4_element_structure_to_all_lanes; |
| 3812 | else: = Undefined | 3816 | else: = Undefined |
| 3813 +-- | 3817 +-- |
| OLD | NEW |