Path: blob/master/src/hotspot/os_cpu/linux_x86/bytes_linux_x86.hpp
40951 views
/*1* Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#ifndef OS_CPU_LINUX_X86_BYTES_LINUX_X86_HPP25#define OS_CPU_LINUX_X86_BYTES_LINUX_X86_HPP2627#include <byteswap.h>2829// Efficient swapping of data bytes from Java byte30// ordering to native byte ordering and vice versa.31inline u2 Bytes::swap_u2(u2 x) {32#ifdef AMD6433return bswap_16(x);34#else35u2 ret;36__asm__ __volatile__ (37"movw %0, %%ax;"38"xchg %%al, %%ah;"39"movw %%ax, %0"40:"=r" (ret) // output : register 0 => ret41:"0" (x) // input : x => register 042:"ax", "0" // clobbered registers43);44return ret;45#endif // AMD6446}4748inline u4 Bytes::swap_u4(u4 x) {49#ifdef AMD6450return bswap_32(x);51#else52u4 ret;53__asm__ __volatile__ (54"bswap %0"55:"=r" (ret) // output : register 0 => ret56:"0" (x) // input : x => register 057:"0" // clobbered register58);59return ret;60#endif // AMD6461}6263#ifdef AMD6464inline u8 Bytes::swap_u8(u8 x) {65return bswap_64(x);66}67#else68// Helper function for swap_u869inline u8 Bytes::swap_u8_base(u4 x, u4 y) {70return (((u8)swap_u4(x))<<32) | swap_u4(y);71}7273inline u8 Bytes::swap_u8(u8 x) {74return swap_u8_base(*(u4*)&x, *(((u4*)&x)+1));75}76#endif // !AMD647778#endif // OS_CPU_LINUX_X86_BYTES_LINUX_X86_HPP798081