//===--- ByteSwap.swift ---------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // This test checks performance of Swift byte swap. // rdar://problem/22151907 import Foundation import TestsUtils public let ByteSwap = BenchmarkInfo( name: "ByteSwap", runFunction: run_ByteSwap, tags: [.validation, .algorithm]) // a naive O(n) implementation of byteswap. @inline(never) func byteswap_n(_ a: UInt64) -> UInt64 { #if swift(>=4) return ((a & 0x00000000000000FF) &<< 56) | ((a & 0x000000000000FF00) &<< 40) | ((a & 0x0000000000FF0000) &<< 24) | ((a & 0x00000000FF000000) &<< 8) | ((a & 0x000000FF00000000) &>> 8) | ((a & 0x0000FF0000000000) &>> 24) | ((a & 0x00FF000000000000) &>> 40) | ((a & 0xFF00000000000000) &>> 56) #else return ((a & 0x00000000000000FF) << 56) | ((a & 0x000000000000FF00) << 40) | ((a & 0x0000000000FF0000) << 24) | ((a & 0x00000000FF000000) << 8) | ((a & 0x000000FF00000000) >> 8) | ((a & 0x0000FF0000000000) >> 24) | ((a & 0x00FF000000000000) >> 40) | ((a & 0xFF00000000000000) >> 56) #endif } // a O(logn) implementation of byteswap. @inline(never) func byteswap_logn(_ a: UInt64) -> UInt64 { var a = a a = (a & 0x00000000FFFFFFFF) << 32 | (a & 0xFFFFFFFF00000000) >> 32 a = (a & 0x0000FFFF0000FFFF) << 16 | (a & 0xFFFF0000FFFF0000) >> 16 a = (a & 0x00FF00FF00FF00FF) << 8 | (a & 0xFF00FF00FF00FF00) >> 8 return a } @inline(never) public func run_ByteSwap(_ N: Int) { var s: UInt64 = 0 for _ in 1...10000*N { // Check some results. let x : UInt64 = UInt64(getInt(0)) s = s &+ byteswap_logn(byteswap_n(x &+ 2457)) &+ byteswap_logn(byteswap_n(x &+ 9129)) &+ byteswap_logn(byteswap_n(x &+ 3333)) } CheckResults(s == (2457 &+ 9129 &+ 3333) &* 10000 &* N) }