blob: e8c5aa60453c9a2892f7b58cbb9054f2bfdb564b [file] [log] [blame]
//===--- DoubleWidthDivision.swift ----------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2018 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 division using DoubleWidth.
// FIXME: This needs to be disabled with an #if because it runs into pathological
// compile time and code size problems.
// [SR-6947] DoubleWidth compile time.
// import Foundation
import TestsUtils
public let DoubleWidthDivision = BenchmarkInfo(
name: "DoubleWidthDivision",
runFunction: disabled,
tags: [.validation, .algorithm]
)
public func disabled(_ N: Int) {}
#if false
private typealias Int128 = DoubleWidth<Int64>
private typealias Int256 = DoubleWidth<Int128>
private typealias Int512 = DoubleWidth<Int256>
private typealias Int1024 = DoubleWidth<Int512>
@inline(never)
public func run_DoubleWidthDivision(_ N: Int) {
var sum = 0
for _ in 1...5*N {
let (q, r) =
(Int128(Int64.max) * 16)
.quotientAndRemainder(dividingBy: numericCast(getInt(16)))
sum += Int(q * r)
let (q1, r1) =
(40 as Int128).dividingFullWidth(
(high: numericCast(getInt(0)), low: numericCast(getInt(240))))
sum += Int(q1 * r1)
let x =
DoubleWidth<DoubleWidth<DoubleWidth<Int8>>>(
Int64.max / numericCast(getInt(4)))
let y = DoubleWidth<DoubleWidth<Int8>>(Int32.max)
let (q2, r2) = y.dividingFullWidth((x.high, x.low))
sum += Int(q2 - r2)
let xx = Int1024(x)
let yy = Int512(y)
let (q3, r3) = yy.dividingFullWidth((xx.high, xx.low))
sum -= Int(q3 - r3)
}
CheckResults(sum == 0)
}
#endif