51 Commits

Author SHA1 Message Date
b3a6dd48d0 Fix incorrect attribute placement on fixed::operator/
Function attributes should be placed in the function declaration, not
definition.
2024-08-03 16:15:17 -06:00
5e4c492894 Replace fixed point multiplication with C++ implementation
Fixed point multiplication used an ARM inline assembly routine. This was
fast, but unfortunately, caused some odd attempted inlining problems
when used from Thumb-mode code. This commit replaces this assembly
routine with a C++ implementation that performs equal or better than the
assembly routine in most cases. The C++ implementation is slightly
slower when called from Thumb-mode code because GCC inlines the
operation instead of calling a standalone ARM-mode routine placed in
IWRAM. The performance tradeoff is acceptable though because of the
fixes, portability, and ARM-mode performance improvements it provides.
2024-08-03 16:08:22 -06:00
cc7c346f84 Add fixed point assignment operators 2024-08-02 23:27:13 -06:00
8d23f2cf09 Fix fixed point number compilation failures during attempted inlining
Currently, some fixed point operations (notably multiplication) fail to
compile when used in Thumb-mode routines. This occurs because GCC
attempts to inline the operation into the Thumb-mode routine, but the
operation uses ARM-mode only instructions. This commit adds the ".arm"
directive into the inline assembly of the implementation, which informs
GCC that the assembly uses ARM-mode instructions and prevents inlining.
As a result, fixed point numbers can be used from both ARM-mode and
Thumb-mode code without issues! Usage in ARM-mode should still be
preferred for optimal performance though.
2024-08-02 22:10:39 -06:00
5fced73f46 Add fixed point number unary negation operator 2024-08-02 22:07:04 -06:00
233512f5b4 Add initial vector4 implementation 2024-07-30 11:49:07 -06:00
2181557d9d Remove conditional fixed point number inlining
Caused issues with ODR rule violations. Now fixed point numbers should
only be used in ARM-mode. Attempting to use them in Thumb-mode will
cause a compilation failure. This commit also moves operator/ into IWRAM
on the GBA.
2024-07-30 11:45:08 -06:00
62da9d03c1 Add GBA section target macros 2024-07-30 11:43:21 -06:00
64763adf47 Add fixed point subtraction 2024-07-29 22:47:37 -06:00
9561686585 Optimize and expand fixed point number implementation
Before this commit, fixed point multiplication was implemented using an
assembly routine in a separate translation unit. This commit implements
this routine directly using inline assembly. By doing so, these
operations can be inlined when called from ARM code. Fixed point
division is implemented as well, along with various documentation and
style improvements.
2024-07-28 19:24:47 -06:00
f2862f7c96 Add log::stream_type typedef
This addition is useful when an explicit template instantiation of
operator<< is needed, for example, when logging from an ARM mode
function. Example usage:

template mtl::log::stream_type& mtl::log::stream_type::operator<<
<uint16_t>(uint16_t);

ARM_MODE void foo(int16_t x) {
	mtl::log::debug << x; // Without the explicit template
	instantiation, an ODR violation would occur.
}
2024-07-28 18:08:21 -06:00
45a1690032 Remove implicit inline attribute from ALWAYS_INLINE target option
May cause issues when multiple non-standard attributes are used.
Standard attributes must come before all non-standard attributes.
2024-07-27 18:17:42 -06:00
4778b477ec Add architecture specific target option macros
These macros are defined in target.hpp. This commit adds the macros:

NOINLINE - Never inline the function
ALWAYS_INLINE - Force the function to be inlined (also adds the inline
attribute to the function)

TARGET_ARM_MODE - Compile all future functions in ARM mode until
TARGET_END_MODE is reached. No-op if not compiling for ARM.
TARGET_THUMB_MODE - Compile all future functions in thumb mode until
TARGET_END_MODE is reached. No-op if not compiling for ARM.
TARGET_END_MODE - Undo the last TARGET_*_MODE option.

ARM_MODE - Compile this function in ARM mode.
THUMB_MODE - Compile this function in thumb mode.
2024-07-27 17:52:39 -06:00
1af4b652b8 Add initial queue implementation 2024-07-26 11:03:08 -06:00
c48e03dc26 Add initial vector implementation 2024-07-25 22:55:47 -06:00
3bba697698 Completely rewrite FSM implementation
Previously, each FSM class could only have one instance because of the
use of globals. This new implementation only uses memory allocated on
the stack, so multiple instances can be created at once. Dynamic
allocation is still unused. Additionally, this approach uses a more
logical separation between the FSM, states, and events.
2024-07-21 21:55:13 -06:00
03eaef3f48 Add default constructor to string_view 2024-06-22 16:43:45 -06:00
f87111abbf Add ability to disable logging
If MTL_LOGGING_DISABLED is defined, logging is disabled. Otherwise, it
is enabled.
2024-06-19 19:36:26 -06:00
68dd09d561 Add additional documentation for log 2024-06-19 19:32:46 -06:00
f354b2d733 Change log level to use an enum instead of uint 2024-06-19 19:29:45 -06:00
4dd979ef54 Change basic_string_stream to not clear the buffer on flush
If the buffer is cleared when flushed, the class does not function
correctly as a string builder. For example, if a string is built with a
newline inside, everything before the newline will be cleared and the
string will be incomplete. Clearing the buffer on flush only makes sense
for applications such as logging or writting to a file.
2024-04-10 08:46:21 -06:00
82f60f4767 Refactor string_stream and string_streamx, and provide ENDL selection
option

This commit refactors string_stream and string_streamx into a common
basic_string_stream template class. When the EXT template == true, the
string_streamx formatting options are enabled, they default to disabled.
These options are enabled at compile time, and do not affect performance
when they are disabled. By implementing the two streams in this manner,
duplicated code is removed.

This commit also adds the ENDL template paramter. When ENDL is set to
zero, no endline character is printed when piping mtl::endl. Otherwise,
the character is printed. Defaults to '\n'. This allows logging on the
GBA to handle mtl::endl correctly and not print two newlines on the MGBA
emulator.
2024-04-10 08:39:30 -06:00
554c88f7f2 Fix udiv100000 and udiv1000000000 ASM macros changing the source
register
2024-04-04 04:18:36 -06:00
d1155befdb Fix inaccurate implementation of udiv100000 and udiv1000000000
Both assembly macros failed when given large numbers ending in 9. For
example, udiv100000 of 3999999999 produced 40000 instead of 39999.
Similarly, udiv1000000000 of 3999999999 produced 4 instead of 3.

Both of the previous implementations failed the Granlund-Montgomery
integer division algorithm. This commit replaces these macros with the
correct implementation generated by clang for a constant integer
division. I do not understand how this implementation works. All other
macros do pass the Granlund-Montgomery algorithm.
2024-04-01 19:45:51 -06:00
1b48b5ec80 Change common to_string implementations to use snprintf instead of itoa 2024-03-27 00:59:39 -06:00
3efafa84c2 Add log 2024-03-27 00:32:54 -06:00
ec934592bc Add string_streamx
string_streamx is a string_stream with additional formatting options.
Currently the only extra option is the ability to expand strings to a
length using a fill character, along with left/right justification. More
options similar to std::stringstream may be added in the future. These
extra options do come at a performance cost, and string_stream should be
preferred unless the extra options are absolutely needed.
2024-03-26 23:06:58 -06:00
c4f2b74e99 Add string_stream 2024-03-25 21:24:28 -06:00
59314b6d95 Add to_string functions for intx, uintx, bool, void* 2024-03-25 21:17:53 -06:00
8499b101e3 Add string_stream pipe modifiers 2024-03-25 21:17:03 -06:00
1159162e50 Change armv4t integer to string conversion to use an unrolled loop
This implementation also writes the digits from left to right instead of
right to left. Using this method we can write the string to the
beginning of the buffer and still avoid reversing the string. It also
has the benefit of being slightly slower than the previous
implementation. The function's signature changed as well because there
is no longer a reason to pass the buffer size or a pointer to output the
start of the string.
2024-03-25 17:13:29 -06:00
b00a52ea9b Add armv4t assembly macros for division by 10^x, x=[1,9] 2024-03-25 17:11:49 -06:00
f41a10939c Add architecture dependent declarations in utility.hpp and add
math/tostring helpers
2024-03-24 21:27:58 -06:00
c4d73a8fde Rename armv4t math macro file 2024-03-24 21:26:43 -06:00
2beab09f7d Add armv4t assembly optimized division and modulo by 10 2024-03-24 00:30:56 -06:00
033f835c0c Add exceptions
Can't use std::exception because it dynamically allocates memory. This
implementation doesn't allocate memory, but also doesn't allow leaving
an exception message.
2024-03-13 00:36:58 -06:00
754c0f6d68 Remove istring::append with template 2024-03-07 21:49:55 -07:00
25a0dab8ea Remove istring::push_back / istring::pop_back 2024-03-07 21:41:15 -07:00
d4b13b36f6 Implement istring comparison operators
Not thoroughly tested.
2024-03-07 21:29:44 -07:00
ef39d535e2 Remove iterators from string and string_view
Iterators could probably be implemented efficiently, but it is not a
priority at the moment. They are removed for the time being.
2024-03-07 19:38:00 -07:00
52d91aa752 Change istring to use string_view for the majority of its operations
The istring and string_view operators have identical implementations. By
changing the istring operators to cast to string_view and use that
implementation instead, the number of redundant implementations is
reduced. This does incurr a small performance penalty, around 15 cycles
when tested on the MGBA Gameboy Advance emulator (uses an armv7tdmi).
When compared to the time operations take, the performance difference is
negligible. Ex. An insertion with two 8 character strings takes around
450 cycles.
2024-03-07 16:28:18 -07:00
98d55c9869 Document istring::insert 2024-03-07 16:09:32 -07:00
232808770f Implement string::copy and string_view::copy 2024-03-07 15:57:29 -07:00
f36d61330d Change string_view to use char_traits instead of custom strlen 2024-03-07 15:55:00 -07:00
c9091951f8 Fix incorrect memcpy 2024-03-07 14:44:17 -07:00
ecac9d2087 Change strings to use string_view instead of const char*
Because the length of a string_view is computed at compile time, it is
faster for simple copies.
2024-03-07 14:25:39 -07:00
913e54252a Add initial string_view implementation 2024-03-07 14:24:10 -07:00
80bff7ca5d Fix incorrect function name in fixed.hpp 2024-03-06 23:49:40 -07:00
34495b580b Add initial fixed point number implementation 2024-03-06 23:42:48 -07:00
be6de4e7e3 Add initial finite state machine implementation 2024-03-06 23:02:00 -07:00