@@ -6680,6 +6680,8 @@ PP_wrapped(pp_reverse, 0, 1)
66806680 } else {
66816681 STRLEN i = 0 ;
66826682 STRLEN j = len ;
6683+ U32 u32_1 , u32_2 ;
6684+ U16 u16_1 , u16_2 ;
66836685 char * outp = SvPVX (TARG );
66846686 /* Take a chunk of bytes from the front and from the
66856687 * back, reverse the bytes in each and and swap the
@@ -6688,30 +6690,47 @@ PP_wrapped(pp_reverse, 0, 1)
66886690 * into bswap instructions by the compiler.
66896691 */
66906692#ifdef HAS_QUAD
6693+ U64 u64_1 , u64_2 ;
66916694 while (j - i >= 16 ) {
6692- * (U64 * )(outp + i ) = _swab_64_ ( * (U64 * )(src + j - 8 ) );
6693- * (U64 * )(outp + j - 8 ) = _swab_64_ ( * (U64 * )(src + i ) );
6695+ memcpy (& u64_1 , src + j - 8 , 8 );
6696+ memcpy (& u64_2 , src + i , 8 );
6697+ u64_1 = _swab_64_ (u64_1 );
6698+ u64_2 = _swab_64_ (u64_2 );
6699+ memcpy (outp + j - 8 , & u64_2 , 8 );
6700+ memcpy (outp + i , & u64_1 , 8 );
66946701 i += 8 ;
66956702 j -= 8 ;
66966703 }
66976704
66986705 if (j - i >= 8 ) {
6699- * (U32 * )(outp + i ) = _swab_32_ ( * (U32 * )(src + j - 4 ) );
6700- * (U32 * )(outp + j - 4 ) = _swab_32_ ( * (U32 * )(src + i ) );
6706+ memcpy (& u32_1 , src + j - 4 , 4 );
6707+ memcpy (& u32_2 , src + i , 4 );
6708+ u32_1 = _swab_32_ (u32_1 );
6709+ u32_2 = _swab_32_ (u32_2 );
6710+ memcpy (outp + j - 4 , & u32_2 , 4 );
6711+ memcpy (outp + i , & u32_1 , 4 );
67016712 i += 4 ;
67026713 j -= 4 ;
67036714 }
67046715#else
67056716 while (j - i >= 8 ) {
6706- * (U32 * )(outp + i ) = _swab_32_ ( * (U32 * )(src + j - 4 ) );
6707- * (U32 * )(outp + j - 4 ) = _swab_32_ ( * (U32 * )(src + i ) );
6717+ memcpy (& u32_1 , src + j - 4 , 4 );
6718+ memcpy (& u32_2 , src + i , 4 );
6719+ u32_1 = _swab_32_ (u32_1 );
6720+ u32_2 = _swab_32_ (u32_2 );
6721+ memcpy (outp + j - 4 , & u32_2 , 4 );
6722+ memcpy (outp + i , & u32_1 , 4 );
67086723 i += 4 ;
67096724 j -= 4 ;
67106725 }
67116726#endif
67126727 if (j - i >= 4 ) {
6713- * (U16 * )(outp + i ) = _swab_16_ ( * (U16 * )(src + j - 2 ) );
6714- * (U16 * )(outp + j - 2 ) = _swab_16_ ( * (U16 * )(src + i ) );
6728+ memcpy (& u16_1 , src + j - 2 , 2 );
6729+ memcpy (& u16_2 , src + i , 2 );
6730+ u16_1 = _swab_32_ (u16_1 );
6731+ u16_2 = _swab_32_ (u16_2 );
6732+ memcpy (outp + j - 2 , & u16_2 , 2 );
6733+ memcpy (outp + i , & u16_1 , 2 );
67156734 i += 2 ;
67166735 j -= 2 ;
67176736 }
@@ -6761,40 +6780,51 @@ PP_wrapped(pp_reverse, 0, 1)
67616780 }
67626781 STRLEN i = 0 ;
67636782 STRLEN j = len ;
6783+ U32 u32_1 , u32_2 ;
6784+ U16 u16_1 , u16_2 ;
67646785 /* Reverse the buffer in place, in chunks where possible */
67656786#ifdef HAS_QUAD
6787+ U64 u64_1 , u64_2 ;
67666788 while (j - i >= 16 ) {
6767- U64 lchunk = _swab_64_ ( * (U64 * )(up + j - 8 ) );
6768- U64 rchunk = _swab_64_ ( * (U64 * )(up + i ) );
6769- * (U64 * )(up + i ) = lchunk ;
6770- * (U64 * )(up + j - 8 ) = rchunk ;
6789+ memcpy (& u64_1 , up + j - 8 , 8 );
6790+ memcpy (& u64_2 , up + i , 8 );
6791+ u64_1 = _swab_64_ (u64_1 );
6792+ u64_2 = _swab_64_ (u64_2 );
6793+ memcpy (up + j - 8 , & u64_2 , 8 );
6794+ memcpy (up + i , & u64_1 , 8 );
67716795 i += 8 ;
67726796 j -= 8 ;
67736797 }
67746798
67756799 if (j - i >= 8 ) {
6776- U32 lchunk = _swab_32_ ( * (U32 * )(up + j - 4 ) );
6777- U32 rchunk = _swab_32_ ( * (U32 * )(up + i ) );
6778- * (U32 * )(up + i ) = lchunk ;
6779- * (U32 * )(up + j - 4 ) = rchunk ;
6800+ memcpy (& u32_1 , up + j - 4 , 4 );
6801+ memcpy (& u32_2 , up + i , 4 );
6802+ u32_1 = _swab_32_ (u32_1 );
6803+ u32_2 = _swab_32_ (u32_2 );
6804+ memcpy (up + j - 4 , & u32_2 , 4 );
6805+ memcpy (up + i , & u32_1 , 4 );
67806806 i += 4 ;
67816807 j -= 4 ;
67826808 }
67836809#else
67846810 while (j - i >= 8 ) {
6785- U32 lchunk = _swab_32_ ( * (U32 * )(up + j - 4 ) );
6786- U32 rchunk = _swab_32_ ( * (U32 * )(up + i ) );
6787- * (U32 * )(up + i ) = lchunk ;
6788- * (U32 * )(up + j - 4 ) = rchunk ;
6811+ memcpy (& u32_1 , up + j - 4 , 4 );
6812+ memcpy (& u32_2 , up + i , 4 );
6813+ u32_1 = _swab_32_ (u32_1 );
6814+ u32_2 = _swab_32_ (u32_2 );
6815+ memcpy (up + j - 4 , & u32_2 , 4 );
6816+ memcpy (up + i , & u32_1 , 4 );
67896817 i += 4 ;
67906818 j -= 4 ;
67916819 }
67926820#endif
67936821 if (j - i >= 4 ) {
6794- U16 lchunk = _swab_16_ ( * (U16 * )(up + j - 2 ) );
6795- U16 rchunk = _swab_16_ ( * (U16 * )(up + i ) );
6796- * (U16 * )(up + i ) = lchunk ;
6797- * (U16 * )(up + j - 2 ) = rchunk ;
6822+ memcpy (& u16_1 , up + j - 2 , 2 );
6823+ memcpy (& u16_2 , up + i , 2 );
6824+ u16_1 = _swab_32_ (u16_1 );
6825+ u16_2 = _swab_32_ (u16_2 );
6826+ memcpy (up + j - 4 , & u16_2 , 2 );
6827+ memcpy (up + i , & u16_1 , 2 );
67986828 i += 2 ;
67996829 j -= 2 ;
68006830 }
0 commit comments