summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--areals.asm61
-rw-r--r--build_windows_object_files_64.bat10
-rw-r--r--rename_Tn_sections.c140
3 files changed, 195 insertions, 16 deletions
diff --git a/areals.asm b/areals.asm
index 73cfafb..5555800 100644
--- a/areals.asm
+++ b/areals.asm
@@ -1,10 +1,8 @@
-_TEXT segment para 'CODE'
-_TEXT ends
_DATA segment para 'DATA'
_DATA ends
- _TEXT segment
+_T000 segment para 'CODE'
public sin_real
@@ -24,7 +22,7 @@ sin_real:
jbe sin_real_0
ucomisd xmm0,qword ptr real_2_p_53
- jae sin_cos_or_tan_real_too_large ; x>=-2^53
+ jae sin_or_cos_real_too_large ; x>=-2^53
call rem_36825084_pi
@@ -116,7 +114,7 @@ sin_real_n:
jae sin_real_n_0
ucomisd xmm0,qword ptr real_m_2_p_53
- jbe sin_cos_or_tan_real_too_small_or_nan ; x<=-2^53 | NAN
+ jbe sin_or_cos_real_too_small_or_nan ; x<=-2^53 | NAN
call rem_n_36825084_pi
@@ -758,7 +756,7 @@ cos_real:
jbe cos_real_0
ucomisd xmm0,qword ptr real_2_p_53
- jae sin_cos_or_tan_real_too_large ; x>=-2^53
+ jae sin_or_cos_real_too_large ; x>=-2^53
call rem_36825084_pi
@@ -848,7 +846,7 @@ cos_real_n:
jae cos_real_n_0
ucomisd xmm0,qword ptr real_m_2_p_53
- jbe sin_cos_or_tan_real_too_small_or_nan ; x<=-2^53 | NAN
+ jbe sin_or_cos_real_too_small_or_nan ; x<=-2^53 | NAN
call rem_n_36825084_pi
@@ -1216,6 +1214,15 @@ cos_real_m_s:
addsd xmm0,xmm8
ret
+sin_or_cos_real_too_large:
+sin_or_cos_real_too_small_or_nan:
+ subsd xmm0,xmm0
+ ret
+
+_T000 ends
+
+_T001 segment para 'CODE'
+
public tan_real
tan_real:
@@ -1236,7 +1243,7 @@ tan_real:
jbe tan_real_0
ucomisd xmm0,qword ptr real_2_p_53
- jae sin_cos_or_tan_real_too_large ; x>=-2^53
+ jae tan_real_too_large ; x>=-2^53
call rem_36825084_pi
@@ -1344,7 +1351,7 @@ tan_real_n:
jae tan_real_n_0
ucomisd xmm0,qword ptr real_m_2_p_53
- jbe sin_cos_or_tan_real_too_small_or_nan ; x<=-2^53 | NAN
+ jbe tan_real_too_small_or_nan ; x<=-2^53 | NAN
call rem_n_36825084_pi
jmp tan_real_pn_l
@@ -2735,12 +2742,15 @@ tan_real_0_5_n:
movlpd xmm14,qword ptr real_0_5
jmp tan_real_0_5_a_s_0_5_3_pn
-
-sin_cos_or_tan_real_too_large:
-sin_cos_or_tan_real_too_small_or_nan:
+tan_real_too_large:
+tan_real_too_small_or_nan:
subsd xmm0,xmm0
ret
+_T001 ends
+
+_T002 segment para 'CODE'
+
rem_36825084_pi:
movsd xmm1,xmm0
divsd xmm0,qword ptr real_36825084_pi
@@ -2877,6 +2887,9 @@ rem_n_36825084_pi_g3:
psllq xmm6,xmm4
ret
+_T002 ends
+
+_T003 segment para 'CODE'
public asin_real
@@ -3263,6 +3276,9 @@ asin_real_e:
divsd xmm0,xmm0
ret
+_T003 ends
+
+_T004 segment para 'CODE'
public acos_real
@@ -3563,6 +3579,10 @@ acos_real_e:
divsd xmm0,xmm0
ret
+_T004 ends
+
+_T005 segment para 'CODE'
+
public atan_real
atan_real:
@@ -4348,6 +4368,10 @@ atan_real_large:
movlpd xmm0,qword ptr real_pi_d_2
ret
+_T005 ends
+
+_T006 segment para 'CODE'
+
public exp_real
exp_real:
@@ -4795,6 +4819,10 @@ exp_real_3_n_large:
movlpd xmm0,qword ptr real_0_0
ret
+_T006 ends
+
+_T007 segment para 'CODE'
+
public ln_real
ln_real:
@@ -5456,6 +5484,10 @@ ln_real_less_0_or_nan:
ln_real_inf_or_nan:
ret
+_T007 ends
+
+_T008 segment para 'CODE'
+
public log10_real
log10_real:
@@ -6174,6 +6206,9 @@ log10_real_less_0_or_nan:
log10_real_inf_or_nan:
ret
+_T008 ends
+
+_T009 segment para 'CODE'
public pow_real
@@ -7086,7 +7121,7 @@ exp2_underflow:
movlpd xmm0,qword ptr qword ptr real_0_0
ret
-_TEXT ends
+_T009 ends
_DATA segment
diff --git a/build_windows_object_files_64.bat b/build_windows_object_files_64.bat
index 9eff5cb..e069718 100644
--- a/build_windows_object_files_64.bat
+++ b/build_windows_object_files_64.bat
@@ -1,8 +1,12 @@
call "c:\Program Files\Microsoft SDK\SetEnv.bat" /AMD64 /RETAIL
+cl /nologo /O rename_Tn_sections.c
ml64 /nologo /c /Fo _startup0.o _startup0.asm
-ml64 /nologo /c /Fo _startup1.o astartup.asm
-ml64 /nologo /c /DPROFILE /Fo _startup1Profile.o astartup.asm
-ml64 /nologo /c /DPROFILE /DTRACE /Fo _startup1Trace.o astartup.asm
+ml64 /nologo /c /Fo _startup1_.o astartup.asm
+.\rename_Tn_sections _startup1_.o _startup1.o
+ml64 /nologo /c /DPROFILE /Fo _startup1Profile_.o astartup.asm
+.\rename_Tn_sections _startup1Profile_.o _startup1Profile.o
+ml64 /nologo /c /DPROFILE /DTRACE /Fo _startup1Trace_.o astartup.asm
+.\rename_Tn_sections _startup1Trace_.o _startup1Trace.o
cl /nologo /c /O /DWINDOWS /DTIME_PROFILE /DWRITE_HEAP /Fo_startup2.o wcon.c
"C:\Program Files (x86)\Microsoft Visual Studio 8\VC\bin\x86_amd64\ml64.exe" /nologo /c /Fo _startup3.o afileIO3.asm
cl /nologo /c /O /DWINDOWS /DA64 /DTIME_PROFILE /Fo_startup4.o wfileIO3.c
diff --git a/rename_Tn_sections.c b/rename_Tn_sections.c
new file mode 100644
index 0000000..8b20348
--- /dev/null
+++ b/rename_Tn_sections.c
@@ -0,0 +1,140 @@
+
+#include <stdio.h>
+
+int main (int argc,char **argv)
+{
+ FILE *fs,*fd;
+ char header[20];
+ int f_nscns,f_nsyms,f_opthdr,f_symptr;
+ int section_n,symbol_n,offset;
+
+ if (argc!=3){
+ printf ("usage: rename_Tn_sections source_object_file destination_object_file\n");
+ return 1;
+ }
+
+ fs=fopen (argv[1],"rb");
+ if (fs==NULL){
+ printf ("opening file %s failed\n",argv[1]);
+ return 1;
+ }
+
+ fd=fopen (argv[2],"wb");
+ if (fd==NULL){
+ printf ("creating file %s failed\n",argv[2]);
+ return 1;
+ }
+
+ fread (header,1,20,fs);
+ fwrite (header,1,20,fd);
+
+ f_nscns = *(short *)&header[2];
+ f_nsyms = *(int*)&header[12];
+ f_opthdr = *(short*)&header[16];
+ f_symptr = *(int*)&header[8];
+
+ /*
+ printf ("number of sections = %d\n",f_nscns);
+ printf ("number of symbols = %d\n",f_nsyms);
+ printf ("symbol table offset = %d\n",f_symptr);
+ printf ("opthdr = %d\n",f_opthdr);
+ */
+
+ for (section_n=0; section_n<f_nscns; ++section_n){
+ char section_header[40];
+
+ fread (section_header,1,40,fs);
+
+/* printf ("%s\n",section_header); */
+
+ if (section_header[0]=='_' &&
+ section_header[1]=='T' &&
+ (unsigned)(section_header[2]-'0') < 10u &&
+ (unsigned)(section_header[3]-'0') < 10u &&
+ (unsigned)(section_header[4]-'0') < 10u &&
+ section_header[5]=='\0')
+ {
+ section_header[0]='.';
+ section_header[1]='t';
+ section_header[2]='e';
+ section_header[3]='x';
+ section_header[4]='t';
+ }
+
+ fwrite (section_header,1,40,fd);
+ }
+
+ offset = 20 + 40*f_nscns;
+
+ while (offset<f_symptr){
+ int c;
+
+ c=fgetc (fs);
+ fputc (c,fd);
+ ++offset;
+ }
+// fseek (fs,f_symptr,SEEK_SET);
+
+ for (symbol_n=0; symbol_n<f_nsyms; ++symbol_n){
+ char symbol[18];
+ int n_numaux,n_scnum;
+
+ fread (symbol,1,18,fs);
+
+ n_numaux = *(unsigned char*)&symbol[17];
+ n_scnum = *(short*)&symbol[12];
+
+ if (symbol[16]==3 && n_numaux!=0 && n_scnum!=-1){
+ if (*(int*)&symbol[0]!=0){
+ int n;
+
+ for (n=0; n<8; ++n){
+ if (symbol[n]=='\0')
+ break;
+/* printf ("%c",symbol[n]); */
+ }
+
+ if (symbol[0]=='_' &&
+ symbol[1]=='T' &&
+ (unsigned)(symbol[2]-'0') < 10u &&
+ (unsigned)(symbol[3]-'0') < 10u &&
+ (unsigned)(symbol[4]-'0') < 10u &&
+ symbol[5]=='\0')
+ {
+ symbol[0]='.';
+ symbol[1]='t';
+ symbol[2]='e';
+ symbol[3]='x';
+ symbol[4]='t';
+ }
+
+/* printf ("\n"); */
+ } else
+/* printf ("?\n")*/
+ ;
+ }
+
+ fwrite (symbol,1,18,fd);
+
+ while (n_numaux>0){
+ fread (symbol,1,18,fs);
+ fwrite (symbol,1,18,fd);
+ --n_numaux;
+ ++symbol_n;
+ }
+ }
+
+ for (;;){
+ int c;
+
+ c=fgetc (fs);
+ if (c==EOF)
+ break;
+ fputc (c,fd);
+ }
+
+ fclose (fs);
+ fclose (fd);
+
+ return 0;
+}