ScaledNumber.cpp (276479) | ScaledNumber.cpp (280031) |
---|---|
1//==- lib/Support/ScaledNumber.cpp - Support for scaled numbers -*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// Implementation of some scaled number algorithms. 11// 12//===----------------------------------------------------------------------===// 13 14#include "llvm/Support/ScaledNumber.h" | 1//==- lib/Support/ScaledNumber.cpp - Support for scaled numbers -*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// Implementation of some scaled number algorithms. 11// 12//===----------------------------------------------------------------------===// 13 14#include "llvm/Support/ScaledNumber.h" |
15 | |
16#include "llvm/ADT/APFloat.h" 17#include "llvm/Support/Debug.h" 18 19using namespace llvm; 20using namespace llvm::ScaledNumbers; 21 22std::pair<uint64_t, int16_t> ScaledNumbers::multiply64(uint64_t LHS, 23 uint64_t RHS) { --- 140 unchanged lines hidden (view full) --- 164 assert(E <= ScaledNumbers::MaxScale); 165 166 // Find a new E, but don't let it increase past MaxScale. 167 int LeadingZeros = ScaledNumberBase::countLeadingZeros64(D); 168 int NewE = std::min(ScaledNumbers::MaxScale, E + 63 - LeadingZeros); 169 int Shift = 63 - (NewE - E); 170 assert(Shift <= LeadingZeros); 171 assert(Shift == LeadingZeros || NewE == ScaledNumbers::MaxScale); | 15#include "llvm/ADT/APFloat.h" 16#include "llvm/Support/Debug.h" 17 18using namespace llvm; 19using namespace llvm::ScaledNumbers; 20 21std::pair<uint64_t, int16_t> ScaledNumbers::multiply64(uint64_t LHS, 22 uint64_t RHS) { --- 140 unchanged lines hidden (view full) --- 163 assert(E <= ScaledNumbers::MaxScale); 164 165 // Find a new E, but don't let it increase past MaxScale. 166 int LeadingZeros = ScaledNumberBase::countLeadingZeros64(D); 167 int NewE = std::min(ScaledNumbers::MaxScale, E + 63 - LeadingZeros); 168 int Shift = 63 - (NewE - E); 169 assert(Shift <= LeadingZeros); 170 assert(Shift == LeadingZeros || NewE == ScaledNumbers::MaxScale); |
171 assert(Shift >= 0 && Shift < 64 && "undefined behavior"); |
|
172 D <<= Shift; 173 E = NewE; 174 175 // Check for a denormal. 176 unsigned AdjustedE = E + 16383; 177 if (!(D >> 63)) { 178 assert(E == ScaledNumbers::MaxScale); 179 AdjustedE = 0; --- 35 unchanged lines hidden (view full) --- 215 E -= Shift; 216 217 if (!E) 218 Above0 = D; 219 } 220 } else if (E > -64) { 221 Above0 = D >> -E; 222 Below0 = D << (64 + E); | 172 D <<= Shift; 173 E = NewE; 174 175 // Check for a denormal. 176 unsigned AdjustedE = E + 16383; 177 if (!(D >> 63)) { 178 assert(E == ScaledNumbers::MaxScale); 179 AdjustedE = 0; --- 35 unchanged lines hidden (view full) --- 215 E -= Shift; 216 217 if (!E) 218 Above0 = D; 219 } 220 } else if (E > -64) { 221 Above0 = D >> -E; 222 Below0 = D << (64 + E); |
223 } else if (E == -64) { 224 // Special case: shift by 64 bits is undefined behavior. 225 Below0 = D; |
|
223 } else if (E > -120) { 224 Below0 = D >> (-E - 64); 225 Extra = D << (128 + E); 226 ExtraShift = -64 - E; 227 } 228 229 // Fall back on APFloat for very small and very large numbers. 230 if (!Above0 && !Below0) --- 89 unchanged lines hidden --- | 226 } else if (E > -120) { 227 Below0 = D >> (-E - 64); 228 Extra = D << (128 + E); 229 ExtraShift = -64 - E; 230 } 231 232 // Fall back on APFloat for very small and very large numbers. 233 if (!Above0 && !Below0) --- 89 unchanged lines hidden --- |