Created
May 8, 2024 06:01
-
-
Save orange-in-space/2e2352c0287da522395036bbc381171f to your computer and use it in GitHub Desktop.
Calculate Trigonometry DLL, written in CIL practice(練習で書いた、自前でサインとコサインを計算するDLL><)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.assembly extern mscorlib {} | |
.assembly OrangeTrigonometry {} | |
// Code to calculate Trigonometry DLL, written in CIL practice | |
//(C) orange_in_space | |
//MIT License | |
// | |
//This code is just for practice for me><; | |
// Assemble | |
// >ilasm /DLL OrangeTrigonometry.il | |
.namespace Orange | |
{ | |
.class public Trigonometry | |
{ | |
.method public static float64 Sin(float64){ | |
ldarg.0 | |
ldarg.0 | |
ldc.i8 3 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 5 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
add | |
ldarg.0 | |
ldc.i8 7 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 9 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
add | |
ldarg.0 | |
ldc.i8 11 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 13 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
add | |
ldarg.0 | |
ldc.i8 15 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 17 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
add | |
ldarg.0 | |
ldc.i8 19 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 21 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
add | |
ret | |
} | |
.method public static float64 Cos(float64){ | |
ldc.r8 1 | |
ldarg.0 | |
ldc.i8 2 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 4 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
add | |
ldarg.0 | |
ldc.i8 6 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 8 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
add | |
ldarg.0 | |
ldc.i8 10 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 12 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
add | |
ldarg.0 | |
ldc.i8 14 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 16 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
add | |
ldarg.0 | |
ldc.i8 18 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 20 | |
call float64 Orange.Trigonometry::TaylorElement(float64,int64) | |
add | |
ret | |
} | |
//TaylorElement(double x,int degree) | |
.method public static float64 TaylorElement(float64,int64) cil managed { | |
ldarg.0 | |
ldarg.1 | |
call float64 Orange.Trigonometry::Pow(float64,int64); | |
ldarg.1 | |
call int64 Orange.Trigonometry::Factorial(int64) | |
conv.r8 | |
div | |
ret | |
} | |
// pow(double x , int y) | |
.method public static float64 Pow(float64,int64) cil managed { | |
.locals init ( | |
[0] float64, //var_0 | |
[1] int64 // loopcounter | |
) | |
ldarg.0 | |
stloc.0 | |
ldarg.1 | |
stloc.1 | |
loop_next: | |
ldloc.1 | |
ldc.i8 -1 | |
add | |
//printf debug | |
//dup | |
//call void [mscorlib]System.Console::WriteLine(int64) | |
// | |
dup | |
stloc.1 | |
brfalse loop_end | |
// var_0 * arg_0 | |
ldloc.0 | |
ldarg.0 | |
mul | |
stloc.0 | |
br loop_next | |
loop_end: | |
ldloc.0 | |
ret | |
} | |
.method public static int64 Factorial(int64) cil managed { | |
.locals init ( | |
[0] int64, // result | |
[1] int64 // loop_counter | |
) | |
ldarg.0 | |
brfalse return_Zero //if zero then zero | |
ldc.i8 1 | |
stloc.0 // result =1 | |
ldarg.0 | |
stloc.1 //set loop_counter | |
loop_next: | |
ldloc.1 | |
ldc.i8 -1 | |
add | |
dup | |
stloc.1 | |
brfalse loop_end // loop exit | |
ldloc.0 | |
ldloc.1 | |
ldc.i8 1 | |
add | |
mul // (result * loop_counter+1) | |
stloc.0 | |
br loop_next | |
loop_end: | |
ldloc.0 | |
ret | |
return_Zero: | |
ldc.i8 0 | |
ret | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment