Skip to content

Instantly share code, notes, and snippets.

@orange-in-space
Created May 8, 2024 06:01
Show Gist options
  • Save orange-in-space/2e2352c0287da522395036bbc381171f to your computer and use it in GitHub Desktop.
Save orange-in-space/2e2352c0287da522395036bbc381171f to your computer and use it in GitHub Desktop.
Calculate Trigonometry DLL, written in CIL practice(練習で書いた、自前でサインとコサインを計算するDLL><)
.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