mirror of
https://github.com/luau-lang/luau.git
synced 2024-12-13 21:40:43 +00:00
4b267aa5c5
* Added a limit on how many instructions the Compiler can safely produce (reported by @TheGreatSageEqualToHeaven) C++ API Changes: * With work started on read-only and write-only properties, `Property::type` member variable has been replaced with `TypeId type()` and `setType(TypeId)` functions. * New `LazyType` unwrap callback now has a `void` return type, all that's required from the callback is to write into `unwrapped` field. In our work on the new type solver, the following issues were fixed: * Work has started to support https://github.com/Roblox/luau/pull/77 and https://github.com/Roblox/luau/pull/79 * Refinements are no longer applied on l-values, removing some false-positive errors * Improved overload resolution against expected result type * `Frontend::prepareModuleScope` now works in the new solver * Cofinite strings are now comparable And these are the changes in native code generation (JIT): * Fixed MIN_NUM and MAX_NUM constant fold when one of the arguments is NaN * Added constant folding for number conversions and bit operations * Value spilling and rematerialization is now supported on arm64 * Improved FASTCALL2K IR generation to support second argument constant * Added value numbering and load/store propagation optimizations * Added STORE_VECTOR on arm64, completing the IR lowering on this target
56 lines
1 KiB
C++
56 lines
1 KiB
C++
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
|
#pragma once
|
|
|
|
#include <stdint.h>
|
|
|
|
#ifdef _MSC_VER
|
|
#include <intrin.h>
|
|
#endif
|
|
|
|
namespace Luau
|
|
{
|
|
namespace CodeGen
|
|
{
|
|
|
|
inline int countlz(uint32_t n)
|
|
{
|
|
#ifdef _MSC_VER
|
|
unsigned long rl;
|
|
return _BitScanReverse(&rl, n) ? 31 - int(rl) : 32;
|
|
#else
|
|
return n == 0 ? 32 : __builtin_clz(n);
|
|
#endif
|
|
}
|
|
|
|
inline int countrz(uint32_t n)
|
|
{
|
|
#ifdef _MSC_VER
|
|
unsigned long rl;
|
|
return _BitScanForward(&rl, n) ? int(rl) : 32;
|
|
#else
|
|
return n == 0 ? 32 : __builtin_ctz(n);
|
|
#endif
|
|
}
|
|
|
|
inline int lrotate(uint32_t u, int s)
|
|
{
|
|
// MSVC doesn't recognize the rotate form that is UB-safe
|
|
#ifdef _MSC_VER
|
|
return _rotl(u, s);
|
|
#else
|
|
return (u << (s & 31)) | (u >> ((32 - s) & 31));
|
|
#endif
|
|
}
|
|
|
|
inline int rrotate(uint32_t u, int s)
|
|
{
|
|
// MSVC doesn't recognize the rotate form that is UB-safe
|
|
#ifdef _MSC_VER
|
|
return _rotr(u, s);
|
|
#else
|
|
return (u >> (s & 31)) | (u << ((32 - s) & 31));
|
|
#endif
|
|
}
|
|
|
|
} // namespace CodeGen
|
|
} // namespace Luau
|