Lioncash
d0274f412a
safe_ops: Avoid signed overflow in Negate()
...
Negation of values such as -9223372036854775808 can't be represented in
signed equivalents (such as long long), leading to signed overflow.
Therefore, we can just invert bits and add 1 to perform this behavior
with unsigned arithmetic.
2020-04-22 20:46:21 +01:00
MerryMage
1dbe9d95e6
FPRoundInt: Final FPRound based on new sign
...
While this shouldn't change any of the results in theory, it's just logically more consistent
2020-04-22 20:46:21 +01:00
MerryMage
b228694012
IR: Implement FPRoundInt
2020-04-22 20:46:20 +01:00
MerryMage
e24054f4d7
fp: Implement FPRoundInt
2020-04-22 20:46:20 +01:00
MerryMage
f876e4afa2
fp: Implement FPProcessNaN
2020-04-22 20:46:20 +01:00
MerryMage
591adee443
fp/info: Add DefaultNaN
2020-04-22 20:46:20 +01:00
MerryMage
797e18cd97
fp: Move FPToFixed to its own file
2020-04-22 20:46:20 +01:00
Lioncash
9f8a44c982
cast_util: Remove unnecessary typename
...
Given we use std::aligned_storage_t, we don't need to specify
typename here. If we used std::aligned_storage, then we would need to.
2020-04-22 20:46:19 +01:00
MerryMage
9571269552
fp/op: Implement FPToFixed
2020-04-22 20:46:19 +01:00
MerryMage
8087e8df05
mantissa_util: Implement ResidualErrorOnRightShift
...
Accurately calculate residual error that is shifted out
2020-04-22 20:46:19 +01:00
MerryMage
8668d61881
fp/unpacked: Implement FPRound
2020-04-22 20:46:19 +01:00
MerryMage
7360a2579b
mp: Implement metaprogramming library
2020-04-22 20:46:19 +01:00
MerryMage
4ab029c114
fp: Implement FPUnpack
2020-04-22 20:46:19 +01:00
MerryMage
4875658917
fp: Implement FPProcessException
2020-04-22 20:46:19 +01:00
MerryMage
3cb98e1560
fp: Move fp_util to fp/util
2020-04-22 20:46:19 +01:00
MerryMage
c41a38b13e
fp: Add FPSR
2020-04-22 20:46:19 +01:00
MerryMage
66381352f3
fp: Add FPInfo
...
Provides information about floating-point format for various bit sizes
2020-04-22 20:46:19 +01:00
MerryMage
d21659152c
safe_ops: Implement safe shifting operations
...
Implement shifiting operations that perform consistently across architectures
without running into undefined or implemented-defined behaviour.
2020-04-22 20:46:19 +01:00
MerryMage
b00fe23b91
bit_util: Implement MostSignificantBit
2020-04-22 20:46:19 +01:00
MerryMage
95ad0d0a66
bit_util: Use Ones to implement Bits
2020-04-22 20:46:19 +01:00
MerryMage
62b640b2fa
bit_util: Add ClearBit and ModifyBit
2020-04-22 20:46:19 +01:00
MerryMage
8651c2d10e
u128: Implement u128
...
For when we need a 128-bit integer
2020-04-22 20:46:19 +01:00
MerryMage
d875c08ebf
fp: Extract common RoundingMode enum
2020-04-22 20:46:18 +01:00
MerryMage
5503ff28c3
llvm_disassemble: Allow disassembly of invalid AArch64 instructions
2020-04-22 20:46:18 +01:00
MerryMage
8c90fcf58e
IR: Implement FPMulAdd
2020-04-22 20:46:18 +01:00
Lioncash
b312d28295
ir: Add an opcode for doing an SM4 lookup table query
2020-04-22 20:46:17 +01:00
MerryMage
be907a61f7
math_util: rvalue references for std::forward
2020-04-22 20:46:16 +01:00
Lioncash
ade595e377
bit_util: Do nothing in RotateRight if the rotation amount is zero
...
Without this sanitizing it's possible to perform a shift with a shift
amount that's the same size as the type being shifted. This actually
occurs when decoding ORR variants.
We could get fancier here and make this branchless, but we don't
really use RotateRight in any performance intensive areas.
2020-04-22 20:46:15 +01:00
MerryMage
07520f32c3
backend_x64: Accurately handle NaNs
2020-04-22 20:46:14 +01:00
MerryMage
e97581d063
fuzz_with_unicorn: Print AArch64 disassembly
2020-04-22 20:46:14 +01:00
MerryMage
b062266b8e
emit_x64_vector: More explicit lambda decay
2020-04-22 20:46:14 +01:00
MerryMage
afe16fa0f3
cast_util: Add BitCast and BitCastPointee
2020-04-22 20:46:13 +01:00
Lioncash
d040920727
Common: Put AES code within its own nested namespace
...
Prevents the functions from potentially clashing with other stuff in Common in the future
2020-04-22 20:46:13 +01:00
Lioncash
40614202e7
A64: Implement AESD
2020-04-22 20:46:13 +01:00
Lioncash
ccef85dbb7
A64: Implement AESE
2020-04-22 20:46:13 +01:00
Lioncash
a5c4fbc783
A64: Implement AESIMC and AESMC
2020-04-22 20:46:13 +01:00
Lioncash
744495e23d
iterator_util: Make Reverse constexpr
...
C++17 makes non-member rbegin(), rend(), crbegin(), and crend() constexpr, allowing this to also be constexpr.
2020-04-22 20:46:12 +01:00
Lioncash
ab9b5fb8aa
Common: Relocate common bits of CRC32
...
Allows the algorithm to be used in any other potential backend.
2020-04-22 20:46:12 +01:00
MerryMage
64761dbc72
scope_exit: Add SCOPE_SUCCESS and SCOPE_EXIT
2020-04-22 20:46:12 +01:00
MerryMage
d7044bc751
assert: Use fmt in ASSERT_MSG
2020-04-22 20:46:12 +01:00
Lioncash
67443efb62
General: Convert multiple namespace specifiers to nested namespace specifiers where applicable
...
Makes namespacing a little less noisy
2020-04-22 20:44:38 +01:00
MerryMage
33bba6028c
bit_util: bug: Infinite loop in HighestSetBit
2020-04-22 20:44:37 +01:00
MerryMage
3caf192f60
A64: Implement DUP (general)
2020-04-22 20:44:37 +01:00
MerryMage
9f57283a30
A64: Implement SBFM, BFM, UBFM
2020-04-22 20:42:45 +01:00
MerryMage
26da149639
imm: compiler bug: MSVC 19.12 with /permissive- flag doesn't support fold expressions
2020-04-22 20:42:45 +01:00
MerryMage
e5ace37560
a64_emit_x64: Call interpreter
2020-04-22 20:42:45 +01:00
MerryMage
cb481a3a48
A64: Implement compare and branch
2020-04-22 20:42:45 +01:00
MerryMage
0641445e51
A64: Implement logical
2020-04-22 20:42:45 +01:00
MerryMage
3141dadea9
Remove UNUSED macro
2020-04-22 20:26:12 +01:00
Mat M
522992965a
Common: Delete Pool's copy constructor and copy/move assignment operators ( #117 )
...
The language defines a copy constructor as:
TypeName(const TypeName&)
so this was just deleting a constructor variant that would catch most cases of attempted copies.
2020-04-22 20:22:01 +01:00
MerryMage
b992e5f8ec
Ranged cache invalidation
...
* Fix clearing code block on a partial invalidation
* Remove unnecessary use of boost::variant
* Code cleanup
2017-09-11 00:11:05 +01:00
Lynn
fd068ed6b8
Ranged cache invalidation
2017-03-20 11:58:25 +00:00
MerryMage
e197b10b96
common: Introduce utility function VisitVariant
...
VisitVariant allows one to use a generic lambda to visit a boost::variant.
This is necessary because boost::visit_variant requires the visitor type
to provide a return type.
2017-02-16 19:30:56 +00:00
MerryMage
3e0e339d98
bit_util: Remove unnecessary include
2017-01-09 22:19:51 +00:00
MerryMage
0d1fa85402
bit_util: Bit<T>(size_t, const T) cannot be constexpr
...
Compound statements are not permitted in constexpr functions in C++14
2016-12-29 10:08:35 +00:00
MerryMage
163b67bf1f
mp: Add support for const member function pointers to FunctionInfo
2016-12-23 11:32:12 +00:00
MerryMage
b23b524b03
bit_util: Add SignExtend implementation with runtime bit_count argument
2016-12-21 19:51:25 +00:00
MerryMage
b178ab3bec
Replace (void)(...); idiom with UNUSED macro
2016-12-15 21:36:05 +00:00
MerryMage
dcc880a002
assert: _a_ expression string shouldn't be part of the format string
...
The expression may contain the % operator.
2016-12-12 07:49:18 +00:00
Mat M
4f7dc81492
mp: Fix static_assert condition ( #46 )
...
Not an issue currently, but this would have prevented type inspection on
the last function parameter.
2016-11-25 22:09:45 +00:00
Mat M
b41de890fb
memory_pool: Deduplicate slab allocation code ( #28 )
2016-09-07 13:20:42 +01:00
Lioncash
c052f9f84c
intrusive_list: Amend doxygen parameter documentation
2016-09-06 22:54:33 -04:00
Lioncash
1c4868ccce
intrusive_list: Correct unused variable
2016-09-06 22:54:25 -04:00
Lioncash
8fb857f9da
intrusive_list: Specify noexcept on swap implementations
...
Necessary to fully satisfy the Swappable concept.
2016-09-06 22:47:55 -04:00
Mat M
7f9a0c3c38
Remove unnecessary explicit includes ( #16 )
2016-09-03 21:48:03 +01:00
Mat M
3e03524658
assert: Use attribute specifier syntax with non MSVC compilers ( #12 )
2016-09-03 12:48:07 +01:00
MerryMage
cc3e7e71aa
bit_util: std::bitset-based BitCount implementation
...
Suggestion by @lioncash.
2016-09-02 22:00:48 +01:00
MerryMage
e8764c129f
bit_util: Implement BitCount portably
2016-09-02 19:05:49 +01:00
Lioncash
f2bf795876
intrusive_list: Interface changes
...
- Remove the root pointer from iterators.
This is unnecessary, since the only way to get a valid iterator is
either from a node itself (it transiently becomes an iterator via the
underlying interface), or through the iterator interface for the list.
This should also result in better code generation, as each increment or
decrement of an iterator is now branchless.
- Remove iterator_to
This is actually a pretty dangerous function, since it would immediately
create an iterator into the list using the given item, even if it's not
actually part of the list. This was only left around due to lack of
type handling around constructors.
- Add other overloads for erase() and remove()
Now handles iterators, pointers, and references.
2016-08-28 20:56:40 +01:00
Lioncash
79545661b3
intrusive_list: De-duplicate some iterator code
...
These increment/decrement variants can just leverage the other
overloads.
2016-08-26 19:15:11 +01:00
Lioncash
0102951bdd
Convert formatting over to fmtlib
2016-08-26 13:13:19 +01:00
MerryMage
e32812cd00
Port x64 backend to xbyak
2016-08-25 16:18:17 +01:00
MerryMage
445aad0639
x64/emitter: Add opBits argument to CVTSI2SS and CVTSI2SD
2016-08-23 21:58:34 +01:00
Lioncash
d5805cc6eb
intrusive_list: Add size querying
...
Since we store pointers and have an interface for iterators
set up, the count is just the distance from the beginning
to the end of the list.
Nice thing is that because of this, basic blocks also get
the ability to have a size count without needing to do anything
directly.
2016-08-23 19:52:09 +01:00
Lioncash
897b776250
string_util: Use C++ attribute specifier for format strings
...
This is also compatible with both clang and GCC
2016-08-23 19:38:48 +01:00
Lioncash
867d345fdc
disassembler: Deduplicate SignStr
...
Also just makes it return a character, rather than a pointer to a
string.
2016-08-23 16:40:33 +01:00
Lioncash
8bed891011
x64 emitter: Fix swapped parameter names
2016-08-23 16:39:38 +01:00
Lioncash
67706c208b
assert: Use false in asserts rather than 0
...
Quiets extended warnings.
2016-08-23 14:31:54 +01:00
Lioncash
46573eb538
intrusive_list: Add insert_before() and insert_after() helper functions
...
Small helpers for inserting nodes before and after an existing one.
insert() is the same as insert_before(), so insert() is just made
to be an alias of this.
2016-08-23 12:38:57 +01:00
MerryMage
a32689c832
x64/emitter: Implement CMPxxSD instructions
2016-08-22 15:54:18 +01:00
Lioncash
226d66dd5b
intrusive_list: satisfy the Swappable concept
2016-08-22 12:38:16 +01:00
Lioncash
2a9fdacc60
intrusive_list: move iterator implementation above list
...
Will make keeping non-member list functions easier to keep together with
the class.
2016-08-22 12:38:16 +01:00
Lioncash
669ffb5f3a
intrusive_list: Add pop_back(), pop_front(), front(), and back() member functions
2016-08-20 21:26:16 +01:00
Lioncash
a8ba15f0d5
intrusive_list: Make Remove and IsEmpty stdlib compatible
...
Makes the name match the standard library equivalents.
C++17 introduces non-member empty() which allows for nicer handling
in generic contexts. May as well make the data structure compatible with
it.
2016-08-19 20:25:18 +01:00
Lioncash
23d190f7b0
intrusive_list: Support inserters
...
Allows std::inserter, std::back_inserter, and std::front_inserter to work
with intrusive lists.
2016-08-19 20:25:17 +01:00
Lioncash
fe9329ef3e
intrusive_list: Add list class type definitions; extend iterator interface
...
Adds type definitions, and extends the list interface to support all
standard library forms of iterator creation.
2016-08-18 23:47:26 +01:00
Lioncash
95a83543f2
intrusive_list: Get rid of unnecessary static_casts
...
The only valid objects to add to the list are those that inherit from
IntrusiveListNode. Therefore anything being added to the list that isn't
inheriting from it will cause compilation to fail.
2016-08-18 23:47:26 +01:00
Lioncash
67509935f6
intrusive_list: Eliminate need for separate const iterator construct
...
This generalizes the regular iterator to be compatible with both use
cases. Passing in the list instance directly isn't needed, because the
only way you'd ever get a valid instantiation of an iterator is from a
list instance itself.
2016-08-18 23:47:26 +01:00
Lioncash
9690d1423d
intrusive_list: explicitly default relevant constructors
2016-08-17 20:46:11 +01:00
Lioncash
9ed9f4c565
mp: Generalize function information retrieval
...
Generalizes MemFnInfo to be compatible with all function types.
Also adds type introspection for arguments, as well as helper templates for the common types supported by all partial specializations.
2016-08-17 10:08:40 +01:00
MerryMage
1029fd27ce
Update documentation (2016-08-12)
2016-08-12 18:17:31 +01:00
MerryMage
94b99f5949
Common: Add an intrusive list implementation; remove use of boost::intrusive::list.
2016-08-06 22:23:01 +01:00
MerryMage
4d127c19dd
Common: Add a memory pool implementation, remove use of boost::pool
2016-08-06 20:41:00 +01:00
MerryMage
8ff414ee0e
Frontend/Decoder: 1. Remove member pointer as a template argument. 2. Sort ARM table such that unconditional instructions are on top.
2016-08-06 20:03:15 +01:00
MerryMage
d31bbd6d14
Common/x64/CpuDetect: Disable MSVC warning for strncpy
2016-08-05 18:44:01 +01:00
MerryMage
d2aeb56503
Common: DEBUG_ASSERTs weren't enabled
2016-08-05 18:43:21 +01:00
Tillmann Karras
61eddbd1fa
Fix Linux build
2016-08-03 00:44:08 +01:00
MerryMage
51448aa06d
More Speed
2016-07-22 23:55:00 +01:00
MerryMage
dfef65d98f
Implement thumb POP instruction
2016-07-18 17:37:48 +01:00
MerryMage
f7e3d7b8d2
Implement Thumb PUSH instruction
2016-07-18 15:11:16 +01:00