forked from mirrors/gecko-dev
		
	 8ea790a391
			
		
	
	
		8ea790a391
		
	
	
	
	
		
			
			Chromium's Linux sandboxing code needs some architecture-specific files for ARM and ARM64 that we don't currently include in our partial import. These are copied from Chromium tag 81.0.4044.138 (matching the latest import of the rest of security/sandbox/chromium) without changes. Differential Revision: https://phabricator.services.mozilla.com/D89994
		
			
				
	
	
		
			51 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2017 The Chromium Authors. All rights reserved.
 | |
| // Use of this source code is governed by a BSD-style license that can be
 | |
| // found in the LICENSE file.
 | |
| 
 | |
| #ifndef BASE_NUMERICS_SAFE_CONVERSIONS_ARM_IMPL_H_
 | |
| #define BASE_NUMERICS_SAFE_CONVERSIONS_ARM_IMPL_H_
 | |
| 
 | |
| #include <cassert>
 | |
| #include <limits>
 | |
| #include <type_traits>
 | |
| 
 | |
| #include "base/numerics/safe_conversions_impl.h"
 | |
| 
 | |
| namespace base {
 | |
| namespace internal {
 | |
| 
 | |
| // Fast saturation to a destination type.
 | |
| template <typename Dst, typename Src>
 | |
| struct SaturateFastAsmOp {
 | |
|   static constexpr bool is_supported =
 | |
|       std::is_signed<Src>::value && std::is_integral<Dst>::value &&
 | |
|       std::is_integral<Src>::value &&
 | |
|       IntegerBitsPlusSign<Src>::value <= IntegerBitsPlusSign<int32_t>::value &&
 | |
|       IntegerBitsPlusSign<Dst>::value <= IntegerBitsPlusSign<int32_t>::value &&
 | |
|       !IsTypeInRangeForNumericType<Dst, Src>::value;
 | |
| 
 | |
|   __attribute__((always_inline)) static Dst Do(Src value) {
 | |
|     int32_t src = value;
 | |
|     typename std::conditional<std::is_signed<Dst>::value, int32_t,
 | |
|                               uint32_t>::type result;
 | |
|     if (std::is_signed<Dst>::value) {
 | |
|       asm("ssat %[dst], %[shift], %[src]"
 | |
|           : [dst] "=r"(result)
 | |
|           : [src] "r"(src), [shift] "n"(IntegerBitsPlusSign<Dst>::value <= 32
 | |
|                                             ? IntegerBitsPlusSign<Dst>::value
 | |
|                                             : 32));
 | |
|     } else {
 | |
|       asm("usat %[dst], %[shift], %[src]"
 | |
|           : [dst] "=r"(result)
 | |
|           : [src] "r"(src), [shift] "n"(IntegerBitsPlusSign<Dst>::value < 32
 | |
|                                             ? IntegerBitsPlusSign<Dst>::value
 | |
|                                             : 31));
 | |
|     }
 | |
|     return static_cast<Dst>(result);
 | |
|   }
 | |
| };
 | |
| 
 | |
| }  // namespace internal
 | |
| }  // namespace base
 | |
| 
 | |
| #endif  // BASE_NUMERICS_SAFE_CONVERSIONS_ARM_IMPL_H_
 |