Merge "Implement optimized __swap16md and __swap32md."

This commit is contained in:
Andrew Hsieh
2013-05-16 07:47:11 +00:00
committed by Gerrit Code Review
4 changed files with 115 additions and 3 deletions

View File

@@ -57,7 +57,8 @@ libportable_arch_src_files += \
arch-mips/timer.c \
arch-mips/timerfd.c \
arch-mips/waitpid.c \
arch-mips/fenv.c
arch-mips/fenv.c \
arch-mips/md_swap.c
libportable_arch_src_files += \
arch-mips/_setjmp.S \
@@ -69,7 +70,8 @@ endif
ifeq ($(TARGET_ARCH),arm)
libportable_arch_src_files += \
arch-arm/unwind.c \
arch-arm/fenv.c
arch-arm/fenv.c \
arch-arm/md_swap.c
endif
ifeq ($(TARGET_ARCH),x86)
@@ -79,7 +81,8 @@ libportable_arch_src_files += \
arch-x86/ioctl.c \
arch-x86/open.c \
arch-x86/stat.c \
arch-x86/fenv.c
arch-x86/fenv.c \
arch-x86/md_swap.c
endif
LOCAL_SRC_FILES := \

View File

@@ -0,0 +1,40 @@
/*
* Copyright 2013, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <portability.h>
#include <sys/types.h>
/*
* REV and REV16 weren't available on ARM5 or ARM4.
*/
#if !defined __ARM_ARCH_5__ && !defined __ARM_ARCH_5T__ && \
!defined __ARM_ARCH_5TE__ && !defined __ARM_ARCH_5TEJ__ && \
!defined __ARM_ARCH_4T__ && !defined __ARM_ARCH_4__
uint16_t WRAP(__swap16md)(uint16_t x) {
register uint16_t _x = (x);
__asm volatile ("rev16 %0, %0" : "+l" (_x));
return _x;
}
uint32_t WRAP(__swap32md)(uint32_t x) {
register uint32_t _x = (x);
__asm volatile ("rev %0, %0" : "+l" (_x));
return _x;
}
#endif

View File

@@ -0,0 +1,38 @@
/*
* Copyright 2013, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <portability.h>
#include <sys/types.h>
#include <endian.h>
#if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
uint16_t WRAP(__swap16md)(uint16_t x) {
register uint16_t _x = x;
register uint16_t _r;
__asm volatile ("wsbh %0, %1" : "=r" (_r) : "r" (_x));
return _r;
}
uint32_t WRAP(__swap32md)(uint32_t x) {
register uint32_t _x = x;
register uint32_t _r;
__asm volatile ("wsbh %0, %1; rotr %0, %0, 16" : "=r" (_r) : "r" (_x));
return _r;
}
#endif

View File

@@ -0,0 +1,31 @@
/*
* Copyright 2013, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <portability.h>
#include <sys/types.h>
uint16_t WRAP(__swap16md)(uint16_t x) {
register uint16_t _x = (x);
__asm volatile ("rorw $8, %w0" : "+r" (_x));
return _x;
}
uint32_t WRAP(__swap32md)(uint32_t x) {
register uint32_t _x = (x);
__asm volatile ("bswap %0" : "+r" (_x));
return _x;
}