2024ǯ07��11��
SoftFloat��̤���ư��Х���3�ˤ��⤽��ñ������ư���������黻�򥽥եȥ��������ߥ�졼����󤹤�ؿ��β�������float�ˤ���٤�
������̤���ư��Х��פȸƤ֤Τ�Ŭ�ڤʤΤ��ϼ���������ޤ��󤬡������餯�ץ�����ޤˤ� ��uint32_t �� 31 �ӥåȱ����եȤ�����硢bit 0 �ʳ������� 0 �ˤʤꡢ0x0 �� 0x1 �Τɤ��餫��ɬ���ʤ�פȤ������ۤβ��꤬���ä��ΤǤϤʤ����Ȼפ�졢�����Ȥϸ¤�ʤ��Ȥ�����̣��̤���ư��Х��Ȥ��ޤ���������ε����Ǥ�
����ѥ���饤�󥿥���ؿ��� C ������ͤ����ƤǤϤʤ��������˥���ѥ���μ����ȷ�ӤĤ�����Ρʥ����������ΰ����ȹͤ�����ˤʤΤǡ��ʤ�Ǥ⤢��ʤΤǤ��礦��
�ǤϤʤ� compiler-rt �δؿ�������פʤΤ����Ȥ������䤬���ޤ�ޤ������ɤ���쥸�����Ϥ�����Ƥ����ͤ���٥����å��˽ñ¤¹ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Õ¤ï¿½ï¿½ï¿½ï¿½Ñ´ï¿½ï¿½ï¿½ï¿½Æ°ï¿½ï¿½Ã¤Æ¤ï¿½ï¿½ë¤«ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½×¤Ê¤è¤¦ï¿½Ç¤ï¿½ï¿½ï¿½ï¿½Ê¤É¤È¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½Æ½ï¿½ï¿½ï¿½é¤»ï¿½Æ¤ï¿½ï¿½Þ¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä´ï¿½Ù¤Þ¤ï¿½ï¿½ï¿½ï¿½ï¿½
���⤽������� __ltsf2 ���ϤäƤ���Τ� float ���Τ褦�ǡ����Τޤ� uint32_t �ǰ��äƤϤ����ʤ��Τ��⤷��ޤ���
RISC-V Calling Conventions
https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-cc.adoc
Integer Calling Convention�Ĥޤꥳ��ѥ����󥿥���ؿ��Ǥ��뤫�ɤ����Ȥ�̵�ط��ǡ�SoftFloat �Υ����ɤ��������Ͻ��� RISC-V �θƤӽФ��������������򤷤Ƥ��ʤ����Ȥ���ȯ�����Ƥ��ޤ����Ĥޤ� float �ǤϤʤ� uint32_t ��Ȥä���ư�����������ߥ�졼�����ؿ�������������Ȥ������Ǥ�����uint32_t �ǤϤʤ� float ��������Ƥ���С���� 32 bit ��̤����ʤΤǡ�����ĥ���ꤷ����Ŭ���ϤǤ��ʤ��Ϥ��Ǥ���
The base integer calling convention provides eight argument registers, a0-a7, the first two of which are also used to return values.
Scalars that are at most XLEN bits wide are passed in a single argument register, or on the stack by value if none is available. When passed in registers or on the stack, integer scalars narrower than XLEN bits are widened according to the sign of their type up to 32 bits, then sign-extended to XLEN bits. When passed in registers or on the stack, floating-point types narrower than XLEN bits are widened to XLEN bits, with the upper bits undefined.
�ʰʲ���RV64I = XLEN �� 64 ������Ȥ���������
RISC-V �������ƤӽФ�����
����Ū�������ƤӽФ�����Ǥ� a0-a7 �� 8 �Ĥδؿ������쥸��������Ѥ����ǽ�� 2 �ġ�a0��a1�ˤ�����ͤˤ����Ѥ���롣64 bit �ޤǤΥ������ͤ�ñ��Υ쥸�����Ǵؿ����Ϥ���롣�쥸������Â��ʤ����ϥ����å�������Ϥ�����롣
64 bit �ʲ������������������ͤ��쥸�����������å����Ϥ��줿�Ȥ������˱����� 32 bit �ޤdz�ĥ���졢���θ� 64 bit ������ĥ����롣64 bit �ʲ�����ư������������= float�ˤ��쥸�����������å����Ϥ��줿���ξ�� 32 bit ��̤�����
�ºݤ˳�ǧ���Ƥߤޤ�����
����ε�����������ư���ʤ��ä������ɤ��Ͽ���ޤ���
int __ltsf2(uint32_t a, uint32_t b) { int aSign = a >> 31; int bSign = b >> 31; if (aSign != bSign) return -1; return 1; }���Υ����ɤ���ϰʲ��Τ褦�ʡ�31 bit Ʊ�Τ���ӤΤϤ��ʤΤˡ�����ĥ���ꤷ�� 63 bit �ܤ���Ӥ��Ƥ���Ȥ��������ɤ��Фޤ�����
__ltsf2: xor a0, a1, a0 srai a0, a0, 63 ori a0, a0, 1 ret�����Ƥ��ξ��Ϥ���Ǥ�����ʤ�ư���ΤǤ���������ε����Ǹ��ڤ����褦�ˡ�cimagf() ���������줿������ĥ���줿�ͤ����äƤ����������ư���ޤ��󡣡ʤ����Ƥ��ξ�� float �Ǥ�����ĥ����ޤ�����̤����ʤΤ� cimagf() ����������������ĥ���줿�ͤ��������ͤǤ�����
������ compiler-rt �δؿ��ϡ������å��˥ץå��夷�Ƥ��뤫��ǤϤʤ��������������� float ��������Ƥ��뤫�������ư���Τ����Ȥ������Ȥ�狼��ޤ�����
compiler-rt �Τ�����򻲹ͤˤ��ơ��ʲ��Τ褦�˥����ɤ������ޤ�����
$ cat lt_float.c #include <stdint.h> static __inline uint32_t toUINT32(float x) { const union { float f; uint32_t i; } rep = {.f = x}; return rep.i; } int __ltsf2(float x, float y) { uint32_t a = toUINT32(x); uint32_t b = toUINT32(y); int aSign = a >> 31; int bSign = b >> 31; if (aSign != bSign) return -1; return 1; }��Ŭ���򤫤��Ƥ������ư���ޤ�����
$ clang $CLANG_CFLAGS -g -O2 test_complex_main.c test_complex.c lt_float.c $PTHREAD_STUBS $QEMU_LDFLAGS $CLANG_LDFLAGS $ /c/msys64/ucrt64/bin/qemu-system-riscv64.exe -M virt -m 2G -nographic -semihosting -bios none -kernel a.out -2.000000 < 0 -> true�������줿�����ɤϰʲ��Τ褦�ˡ������� bit 31 ����Ӥ��Ƥ��ޤ���
__ltsf2: xor a0, a1, a0 sraiw a0, a0, 31 ori a0, a0, 1 retunion ���Υ����å��ѿ����äƤ��뤫���٤��ʤ�ΤǤϡĤȻפ��ޤ������������˱Ƥ����̵����Ŭ�����줿�����ɤ��ФƤ��ޤ���