-
-
Save orange-in-space/479c525c7f5196857e4c57a0a69fbb78 to your computer and use it in GitHub Desktop.
Calculate sine written in CIL practice(CIL/MSILで自前でサインを計算する練習コード><)
This file contains 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 'App' {} | |
// Calculate sine written in CIL practice | |
//(C) orange_in_space | |
//MIT License | |
// | |
//This code is just for practice for me><; | |
// Assemble | |
// >ilasm thisfile.il | |
.method private hidebysig static void Main ( string[] args) cil managed { | |
.entrypoint | |
ldstr "Sin Calc CIL" | |
call void [mscorlib]System.Console::WriteLine(string) | |
//If you want to try with other values, please change here. | |
ldc.r8 1.42 | |
// | |
ldstr "Sin(" | |
call void [mscorlib]System.Console::Write(string) | |
dup | |
call void [mscorlib]System.Console::Write(float64) | |
ldstr ") is" | |
call void [mscorlib]System.Console::WriteLine(string) | |
call float64 Sin(float64) | |
call void [mscorlib]System.Console::WriteLine(float64) | |
ret | |
} | |
.method public static float64 Sin(float64){ | |
ldarg.0 | |
ldarg.0 | |
ldc.i8 3 | |
call float64 TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 5 | |
call float64 TaylorElement(float64,int64) | |
add | |
ldarg.0 | |
ldc.i8 7 | |
call float64 TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 9 | |
call float64 TaylorElement(float64,int64) | |
add | |
ldarg.0 | |
ldc.i8 11 | |
call float64 TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 13 | |
call float64 TaylorElement(float64,int64) | |
add | |
ldarg.0 | |
ldc.i8 15 | |
call float64 TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 17 | |
call float64 TaylorElement(float64,int64) | |
add | |
ldarg.0 | |
ldc.i8 19 | |
call float64 TaylorElement(float64,int64) | |
sub | |
ldarg.0 | |
ldc.i8 21 | |
call float64 TaylorElement(float64,int64) | |
add | |
ret | |
} | |
//TaylorElement(double x,int degree) | |
.method public static float64 TaylorElement(float64,int64){ | |
ldarg.0 | |
ldarg.1 | |
call float64 Pow(float64,int64); | |
ldarg.1 | |
call int64 Factorial(int64) | |
conv.r8 | |
div | |
ret | |
} | |
// pow(double x , int y) | |
.method public static float64 Pow(float64,int64){ | |
.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){ | |
.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