14c099b8724abf993262366e2a871004a2777becbMichael J. Spencer//===- SwapByteOrder.h - Generic and optimized byte swaps -------*- C++ -*-===// 24c099b8724abf993262366e2a871004a2777becbMichael J. Spencer// 34c099b8724abf993262366e2a871004a2777becbMichael J. Spencer// The LLVM Compiler Infrastructure 44c099b8724abf993262366e2a871004a2777becbMichael J. Spencer// 54c099b8724abf993262366e2a871004a2777becbMichael J. Spencer// This file is distributed under the University of Illinois Open Source 64c099b8724abf993262366e2a871004a2777becbMichael J. Spencer// License. See LICENSE.TXT for details. 74c099b8724abf993262366e2a871004a2777becbMichael J. Spencer// 84c099b8724abf993262366e2a871004a2777becbMichael J. Spencer//===----------------------------------------------------------------------===// 94c099b8724abf993262366e2a871004a2777becbMichael J. Spencer// 104c099b8724abf993262366e2a871004a2777becbMichael J. Spencer// This file declares generic and optimized functions to swap the byte order of 114c099b8724abf993262366e2a871004a2777becbMichael J. Spencer// an integral type. 124c099b8724abf993262366e2a871004a2777becbMichael J. Spencer// 134c099b8724abf993262366e2a871004a2777becbMichael J. Spencer//===----------------------------------------------------------------------===// 144c099b8724abf993262366e2a871004a2777becbMichael J. Spencer 15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_SUPPORT_SWAPBYTEORDER_H 16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_SUPPORT_SWAPBYTEORDER_H 174c099b8724abf993262366e2a871004a2777becbMichael J. Spencer 181f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 194c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#include <cstddef> 204c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#include <limits> 214c099b8724abf993262366e2a871004a2777becbMichael J. Spencer 224c099b8724abf993262366e2a871004a2777becbMichael J. Spencernamespace llvm { 234c099b8724abf993262366e2a871004a2777becbMichael J. Spencernamespace sys { 244c099b8724abf993262366e2a871004a2777becbMichael J. Spencer 253afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner/// SwapByteOrder_16 - This function returns a byte-swapped representation of 263afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner/// the 16-bit argument. 273afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline uint16_t SwapByteOrder_16(uint16_t value) { 284c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#if defined(_MSC_VER) && !defined(_DEBUG) 294c099b8724abf993262366e2a871004a2777becbMichael J. Spencer // The DLL version of the runtime lacks these functions (bug!?), but in a 304c099b8724abf993262366e2a871004a2777becbMichael J. Spencer // release build they're replaced with BSWAP instructions anyway. 314c099b8724abf993262366e2a871004a2777becbMichael J. Spencer return _byteswap_ushort(value); 324c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#else 334c099b8724abf993262366e2a871004a2777becbMichael J. Spencer uint16_t Hi = value << 8; 344c099b8724abf993262366e2a871004a2777becbMichael J. Spencer uint16_t Lo = value >> 8; 353afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner return Hi | Lo; 364c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#endif 374c099b8724abf993262366e2a871004a2777becbMichael J. Spencer} 384c099b8724abf993262366e2a871004a2777becbMichael J. Spencer 393afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner/// SwapByteOrder_32 - This function returns a byte-swapped representation of 403afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner/// the 32-bit argument. 413afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline uint32_t SwapByteOrder_32(uint32_t value) { 424c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#if defined(__llvm__) || \ 433afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && !defined(__ICC) 444c099b8724abf993262366e2a871004a2777becbMichael J. Spencer return __builtin_bswap32(value); 454c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#elif defined(_MSC_VER) && !defined(_DEBUG) 464c099b8724abf993262366e2a871004a2777becbMichael J. Spencer return _byteswap_ulong(value); 474c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#else 484c099b8724abf993262366e2a871004a2777becbMichael J. Spencer uint32_t Byte0 = value & 0x000000FF; 494c099b8724abf993262366e2a871004a2777becbMichael J. Spencer uint32_t Byte1 = value & 0x0000FF00; 504c099b8724abf993262366e2a871004a2777becbMichael J. Spencer uint32_t Byte2 = value & 0x00FF0000; 514c099b8724abf993262366e2a871004a2777becbMichael J. Spencer uint32_t Byte3 = value & 0xFF000000; 523afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner return (Byte0 << 24) | (Byte1 << 8) | (Byte2 >> 8) | (Byte3 >> 24); 534c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#endif 544c099b8724abf993262366e2a871004a2777becbMichael J. Spencer} 554c099b8724abf993262366e2a871004a2777becbMichael J. Spencer 563afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner/// SwapByteOrder_64 - This function returns a byte-swapped representation of 573afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner/// the 64-bit argument. 583afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline uint64_t SwapByteOrder_64(uint64_t value) { 594c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#if defined(__llvm__) || \ 603afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && !defined(__ICC) 614c099b8724abf993262366e2a871004a2777becbMichael J. Spencer return __builtin_bswap64(value); 624c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#elif defined(_MSC_VER) && !defined(_DEBUG) 634c099b8724abf993262366e2a871004a2777becbMichael J. Spencer return _byteswap_uint64(value); 644c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#else 6592267bb35a75fc83fe3c0302e9fce031a3f817ffChris Lattner uint64_t Hi = SwapByteOrder_32(uint32_t(value)); 6692267bb35a75fc83fe3c0302e9fce031a3f817ffChris Lattner uint32_t Lo = SwapByteOrder_32(uint32_t(value >> 32)); 673afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner return (Hi << 32) | Lo; 683afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner#endif 693afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner} 703afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner 713afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline unsigned char SwapByteOrder(unsigned char C) { return C; } 723afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline signed char SwapByteOrder(signed char C) { return C; } 733afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline char SwapByteOrder(char C) { return C; } 743afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner 753afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline unsigned short SwapByteOrder(unsigned short C) { return SwapByteOrder_16(C); } 763afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline signed short SwapByteOrder( signed short C) { return SwapByteOrder_16(C); } 773afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner 783afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline unsigned int SwapByteOrder(unsigned int C) { return SwapByteOrder_32(C); } 793afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline signed int SwapByteOrder( signed int C) { return SwapByteOrder_32(C); } 803afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner 813afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner#if __LONG_MAX__ == __INT_MAX__ 823afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline unsigned long SwapByteOrder(unsigned long C) { return SwapByteOrder_32(C); } 833afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline signed long SwapByteOrder( signed long C) { return SwapByteOrder_32(C); } 843afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner#elif __LONG_MAX__ == __LONG_LONG_MAX__ 853afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline unsigned long SwapByteOrder(unsigned long C) { return SwapByteOrder_64(C); } 863afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline signed long SwapByteOrder( signed long C) { return SwapByteOrder_64(C); } 873afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner#else 883afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner#error "Unknown long size!" 894c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#endif 901f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer 913afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline unsigned long long SwapByteOrder(unsigned long long C) { 923afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner return SwapByteOrder_64(C); 933afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner} 943afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattnerinline signed long long SwapByteOrder(signed long long C) { 953afc385042fb0d121e9454347f975e4f1a5f5bfdChris Lattner return SwapByteOrder_64(C); 964c099b8724abf993262366e2a871004a2777becbMichael J. Spencer} 974c099b8724abf993262366e2a871004a2777becbMichael J. Spencer 984c099b8724abf993262366e2a871004a2777becbMichael J. Spencer} // end namespace sys 994c099b8724abf993262366e2a871004a2777becbMichael J. Spencer} // end namespace llvm 1004c099b8724abf993262366e2a871004a2777becbMichael J. Spencer 1014c099b8724abf993262366e2a871004a2777becbMichael J. Spencer#endif 102