Changeset 104239 in vbox
- Timestamp:
- Apr 8, 2024 9:33:56 PM (10 months ago)
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl-arm64.S
r104238 r104239 701 701 sar_64 iemAImpl_sar_u64_amd, 0 702 702 703 704 /* 705 * Rotate Left. 706 */ 707 708 /* uint32_t iemAImpl_rol_u8( uint32_t fEFlagsIn, uint8_t *pu8Dst, uint8_t cShift); */ 709 /* uint32_t iemAImpl_rol_u16(uint32_t fEFlagsIn, uint16_t *pu16Dst, uint8_t cShift); */ 710 /* uint32_t iemAImpl_rol_u32(uint32_t fEFlagsIn, uint16_t *pu32Dst, uint8_t cShift); */ 711 .macro ROL_8_16_32, a_Name, a_cBits, a_fIntelFlags, a_LdStSuff 712 ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT) 713 BEGINPROC_HIDDEN \a_Name 714 .cfi_startproc 715 716 /* Do we need to rotate anything at all? */ 717 and w2, w2, #0x1f 718 cbz w2, 99f 719 720 /* 721 * Do the shifting 722 */ 723 .ifne \a_cBits < 32 724 and w2, w2, #(\a_cBits - 1) 725 neg w3, w2 726 and w3, w3, #(\a_cBits - 1) 727 ldr\a_LdStSuff w8, [x1] 728 lslv w9, w8, w2 729 lsrv w10, w8, w3 730 orr w9, w9, w10 731 str\a_LdStSuff w9, [x1] 732 and w9, w9, #(RT_BIT_32(\a_cBits) - 1) 733 .else 734 neg w3, w2 /* the count is MODed by the data size, so this is safe. */ 735 ldr\a_LdStSuff w8, [x1] 736 rorv w9, w8, w3 737 str\a_LdStSuff w9, [x1] 738 .endif 739 740 /* 741 * Calculate EFLAGS - only CF and OF. 742 */ 743 bfi w0, w9, #0, #1 /* CF = last bit rotated around */ 744 745 .ifne \a_fIntelFlags 746 /* Intel: OF = first rotate step: fEfl |= X86_EFL_GET_OF_ ## cOpBits(uDst ^ (uDst << 1)); */ 747 eor w11, w8, w8, LSL #1 748 lsr w11, w11, #(\a_cBits - 1) 749 bfi w0, w11, #X86_EFL_OF_BIT, #1 750 .else 751 /* AMD: OF = last rotate step: fEfl |= ((uResult >> (cOpBits - 1)) ^ fCarry) << X86_EFL_OF_BIT; */ 752 eor w11, w0, w9, LSR #(\a_cBits - 1) 753 bfi w0, w11, #X86_EFL_OF_BIT, #1 754 .endif 755 756 99: 757 ret 758 .cfi_endproc 759 .endm 760 761 ROL_8_16_32 iemAImpl_rol_u8, 8, 1, b 762 ROL_8_16_32 iemAImpl_rol_u8_intel, 8, 1, b 763 ROL_8_16_32 iemAImpl_rol_u8_amd, 8, 0, b 764 765 ROL_8_16_32 iemAImpl_rol_u16, 16, 1, h 766 ROL_8_16_32 iemAImpl_rol_u16_intel, 16, 1, h 767 ROL_8_16_32 iemAImpl_rol_u16_amd, 16, 0, h 768 769 ROL_8_16_32 iemAImpl_rol_u32, 32, 1, 770 ROL_8_16_32 iemAImpl_rol_u32_intel, 32, 1, 771 ROL_8_16_32 iemAImpl_rol_u32_amd, 32, 0, 772 773 /** @todo this is slightly slower than the C version (release) on an M2. Investigate why. */ 774 /* uint32_t iemAImpl_rol_u64(uint32_t fEFlagsIn, uint16_t *pu64Dst, uint8_t cShift); */ 775 .macro ROL_64, a_Name, a_fIntelFlags 776 ALIGNCODE(IEM_AIMPL_FUNCTION_ALIGNMENT) 777 BEGINPROC_HIDDEN \a_Name 778 .cfi_startproc 779 780 /* Do we need to shift anything at all? */ 781 and w2, w2, #0x3f 782 cbz w2, 99f 783 784 /* 785 * Do the shifting 786 */ 787 neg w3, w2 788 ldr x8, [x1] 789 rorv x9, x8, x3 790 str x9, [x1] 791 792 /* 793 * Calculate EFLAGS - only CF and OF. 794 */ 795 bfi w0, w9, #0, #1 /* CF = last bit rotated around */ 796 797 .ifne \a_fIntelFlags 798 /* Intel: OF = first rotate step: fEfl |= X86_EFL_GET_OF_ ## cOpBits(uDst ^ (uDst << 1)); */ 799 eor x11, x8, x8, LSL #1 800 lsr x11, x11, #(64 - 1) 801 bfi w0, w11, #X86_EFL_OF_BIT, #1 802 .else 803 /* AMD: OF = last rotate step: fEfl |= ((uResult >> (cOpBits - 1)) ^ fCarry) << X86_EFL_OF_BIT; */ 804 eor x11, x0, x9, LSR #(64 - 1) 805 bfi w0, w11, #X86_EFL_OF_BIT, #1 806 .endif 807 808 99: 809 ret 810 .cfi_endproc 811 .endm 812 813 ROL_64 iemAImpl_rol_u64, 1 814 ROL_64 iemAImpl_rol_u64_intel, 1 815 ROL_64 iemAImpl_rol_u64_amd, 0 816 -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r104238 r104239 3116 3116 } 3117 3117 3118 #if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 3118 #ifndef RT_ARCH_ARM64 3119 3120 # if !defined(RT_ARCH_AMD64) || defined(IEM_WITHOUT_ASSEMBLY) 3119 3121 EMIT_ROL(64, uint64_t, RT_NOTHING, 1, ASMRotateLeftU64) 3120 # endif3122 # endif 3121 3123 EMIT_ROL(64, uint64_t, _intel, 1, ASMRotateLeftU64) 3122 3124 EMIT_ROL(64, uint64_t, _amd, 0, ASMRotateLeftU64) 3123 3125 3124 # if (!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)) || defined(IEM_WITHOUT_ASSEMBLY)3126 # if (!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)) || defined(IEM_WITHOUT_ASSEMBLY) 3125 3127 EMIT_ROL(32, uint32_t, RT_NOTHING, 1, ASMRotateLeftU32) 3126 # endif3128 # endif 3127 3129 EMIT_ROL(32, uint32_t, _intel, 1, ASMRotateLeftU32) 3128 3130 EMIT_ROL(32, uint32_t, _amd, 0, ASMRotateLeftU32) … … 3132 3134 return (uValue << cShift) | (uValue >> (16 - cShift)); 3133 3135 } 3134 # if (!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)) || defined(IEM_WITHOUT_ASSEMBLY)3136 # if (!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)) || defined(IEM_WITHOUT_ASSEMBLY) 3135 3137 EMIT_ROL(16, uint16_t, RT_NOTHING, 1, iemAImpl_rol_u16_hlp) 3136 # endif3138 # endif 3137 3139 EMIT_ROL(16, uint16_t, _intel, 1, iemAImpl_rol_u16_hlp) 3138 3140 EMIT_ROL(16, uint16_t, _amd, 0, iemAImpl_rol_u16_hlp) … … 3142 3144 return (uValue << cShift) | (uValue >> (8 - cShift)); 3143 3145 } 3144 # if (!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)) || defined(IEM_WITHOUT_ASSEMBLY)3146 # if (!defined(RT_ARCH_X86) && !defined(RT_ARCH_AMD64)) || defined(IEM_WITHOUT_ASSEMBLY) 3145 3147 EMIT_ROL(8, uint8_t, RT_NOTHING, 1, iemAImpl_rol_u8_hlp) 3146 # endif3148 # endif 3147 3149 EMIT_ROL(8, uint8_t, _intel, 1, iemAImpl_rol_u8_hlp) 3148 3150 EMIT_ROL(8, uint8_t, _amd, 0, iemAImpl_rol_u8_hlp) 3149 3151 3152 #endif /* !RT_ARCH_ARM64 */ 3150 3153 3151 3154 /*
Note:
See TracChangeset
for help on using the changeset viewer.