Created
November 4, 2014 20:27
-
-
Save censored--/a1d4bea2bd729ea1f0de to your computer and use it in GitHub Desktop.
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
dot_globl :min_caml_read_int | |
label :min_caml_read_int | |
read at | |
sll at, at, 8 | |
read at | |
sll at, at, 8 | |
read at | |
sll at, at, 8 | |
read at | |
add v0, at, zero | |
jr ra | |
dot_globl :min_caml_read_float | |
label :min_caml_read_float | |
read at | |
sll at, at, 8 | |
read at | |
sll at, at, 8 | |
read at | |
sll at, at, 8 | |
read at | |
mtc1 f0, at | |
jr ra | |
dot_globl :min_caml_print_int | |
label :min_caml_print_int | |
srl at, a0, 24 | |
write at | |
srl at, a0, 16 | |
write at | |
srl at, a0, 8 | |
write at | |
write a0 | |
jr ra | |
dot_globl :min_caml_print_char | |
label :min_caml_print_char | |
write a0 | |
jr ra | |
dot_globl :min_caml_create_array | |
label :min_caml_create_array | |
move v0, gp | |
label :create_array_loop | |
bne a0, zero, :create_array_cont | |
jr ra | |
label :create_array_cont | |
sw a1, 0, gp | |
addi gp, gp, 1 | |
subi a0, a0, 1 | |
j :create_array_loop | |
dot_globl :min_caml_fabs | |
label :min_caml_fabs | |
abs.s f0, f0 | |
jr ra | |
.globl :min_caml_create_float_array | |
label :min_caml_create_float_array | |
move v0, gp | |
label :create_float_array_loop | |
bgt a0, zero, :create_float_array_cont | |
jr ra | |
label :create_float_array_cont | |
swc1 f0, 0, gp | |
subi a0, a0, 1 | |
addi gp, gp, 1 | |
j :create_float_array_loop | |
dot_globl :min_caml_sqrt | |
label :min_caml_sqrt | |
mtc1 zero, f1 | |
c.olt f0, f1 #x < 0 | |
bc1t :sqrt_L1 | |
la at, 1056964608 #0.5 | |
mtc1 at, f2 | |
la at, 1069547520 #1.5 | |
mtc1 at, f3 | |
la at, 0x5f375a86 #magic number | |
mtc1 at, f4 | |
mfc1 v0, f0 | |
srl v0, v0, 1 | |
sub v0, at, v0 | |
mtc1 v0, f1 | |
fmul f2, f0, f2 # f2 = 0.5 * f0; | |
fmul f4, f1, f2 # f4 = f1 * f2 | |
fmul f4, f1, f4 | |
fneg f4, f4 | |
fadd f4, f4, f3 # repeat 3 times | |
fmul f1, f1, f4 # f1 *= 1.5 - f1 * f1 * f2; | |
fmul f4, f1, f2 | |
fmul f4, f1, f4 | |
fneg f4, f4 | |
fadd f4, f4, f3 | |
fmul f1, f1, f4 | |
fmul f4, f1, f2 | |
fmul f4, f1, f4 | |
fneg f4, f4 | |
fadd f4, f4, f3 | |
fmul f1, f1, f4 | |
fmul f0, f0, f1 # return f0 * f1; | |
jr ra | |
label :sqrt_L1 | |
fmov f0, f1 | |
jr ra | |
dot_globl :min_caml_floor | |
label :min_caml_floor | |
sw ra, 0, sp | |
swc1 f0, 1, sp | |
addi sp, sp, 2 | |
jal :min_caml_int_of_float | |
move a0, v0 | |
jal :min_caml_float_of_int | |
subi sp, sp, 2 | |
lw ra, 0, sp | |
lwc1 f1, 1, sp | |
c.olt f0, f1 #itof(ftoi f0) < f1 | |
bc1t :floor_return | |
la at, 1065353216 #1.0 | |
mtc1 at, f1 | |
fsub f0, f0, f1 | |
label :floor_return | |
jr ra | |
#pi = 1078530011 (3.141592) | |
#2pi= 1086918619 (6.283185307) | |
dot_globl :min_caml_sin | |
dot_globl :min_caml_cos | |
label :min_caml_sin | |
fabs f1, f0 #f1 = |x| | |
c.ole f1, f0 | |
li v0, 0 | |
bc1t :sin_pos | |
li v0, 1 #v0 = flag | |
label :sin_pos | |
li v1, 1 #v1 = 1 | |
la at, 1086918619 #at = 6.283185307 | |
mtc1 at, f2 | |
c.olt f1, f2 #|x| < 2pi | |
bc1t :sin_L2 | |
label :sin_L1 | |
fsub f1, f1, f2 #|x|=|x|-2pi | |
c.ole f2, f1 #if 2pi < |x| | |
bc1t :sin_L1 | |
label :sin_L2 | |
la at, 1078530011 #at = pi | |
mtc1 at, f2 | |
c.ole f1, f2 #|x| <= pi | |
bc1t :sin_L3 | |
fsub f1, f1, f2 #|x|=|x| - pi | |
sub v0, v1, v0 #flag = 1 - flag | |
label :sin_L3 | |
la at, 1070141403 #1.570796 = pi/2 | |
mtc1 at, f3 | |
c.ole f1, f3 #|x| <= pi/2 | |
bc1t :sin_L4 | |
fsub f1, f2, f1 #|x|=pi-|x| | |
label :sin_L4 | |
la at, 1061752795 #0.785398 = pi/4 | |
mtc1 at, f2 #f3 = pi/4 | |
c.ole f1, f2 #|x| <= pi/4 | |
bc1t :kernel_sin | |
fsub f1, f3, f1 #|x|=pi/2-|x| | |
j :kernel_cos | |
label :min_caml_cos | |
fabs f1, f0 #f1 = |x| | |
li v0, 0 | |
li v1, 1 | |
la at, 1086918619 #at = 6.283185307 | |
mtc1 at, f2 | |
c.olt f1, f2 #|x| < 2pi | |
bc1t :cos_L2 | |
label :cos_L1 | |
fsub f1, f1, f2 #|x|=|x|-2pi | |
c.ole f2, f1 #if 2pi < |x| | |
bc1t :cos_L1 | |
label :cos_L2 | |
la at, 1078530011 #at = pi | |
mtc1 at, f2 | |
c.ole f1, f2 #|x| <= pi | |
bc1t :cos_L3 | |
fsub f1, f1, f2 #|x|=|x|-pi | |
sub v0, v1, v0 #flag = 1 - flag | |
label :cos_L3 | |
la at, 1070141403 #1.570796 = pi/2 | |
mtc1 at, f3 | |
c.ole f1, f3 #|x| <= pi/2 | |
bc1t :cos_L4 | |
fsub f1, f2, f1 #|x|=pi-|x| | |
sub v0, v1, v0 #flag = 1 - flag | |
label :cos_L4 | |
la at, 1061752795 #0.785398 = pi/4 | |
mtc1 at, f2 #f3 = pi/4 | |
c.ole f1, f2 #|x| < pi/4 | |
bc1t :kernel_cos | |
fsub f1, f3, f1 #|x|=pi/2-|x| | |
j :kernel_sin | |
label :kernel_sin | |
la at, 0xbe2aaaac #-0.16666668 | |
mtc1 at, f3 | |
fmul f2, f1, f1 #f2 = x**2 | |
fmov f0, f1 #f0 = x | |
fmul f1, f1, f2 #f1 = x**3 | |
fmul f3, f1, f3 | |
fadd f0, f0, f3 | |
la at, 0x3c088666 #0.008332824 | |
mtc1 at, f3 | |
fmul f1, f1, f2 #f1 = x**5 | |
fmul f3, f1, f3 | |
fadd f0, f0, f3 | |
la at, 0xb94d64b6 #-0.00019587841 | |
mtc1 at, f3 | |
fmul f1, f1, f2 #f1 = x**7 | |
fmul f3, f1, f3 | |
fadd f0, f0, f3 | |
beq v0, zero, :kernel_sin_ret | |
fneg f0, f0 | |
label :kernel_sin_ret | |
jr ra | |
label :kernel_cos | |
la at, 1065353216 #1.0 | |
mtc1 at, f0 #f0 = 1.0 | |
fmul f2, f1, f1 #f2 = x**2,f1 = x | |
la at, 1056964608 #0.5 | |
mtc1 at, f3 | |
fmul f3, f2, f3 #f2 = x**2*0.5 | |
fsub f0, f0, f3 | |
fmul f3, f2, f2 #f1 = x**4 | |
la at, 0x3d2aa789 #0.04166368 | |
mtc1 at, f4 | |
fmul f4, f3, f4 #f4 = x**4*0.0416638 | |
fadd f0, f0, f4 | |
fmul f4, f2, f4 #f4 = x**6 | |
la at, 0xbab38106 | |
mtc1 at, f3 | |
fmul f3, f3, f4 #f3 = 0.001369*x**6 | |
fadd f0, f0, f3 | |
beq v0, zero, :kernel_cos_ret | |
fneg f0, f0 | |
label :kernel_cos_ret | |
jr ra | |
dot_globl :min_caml_atan | |
label :min_caml_atan | |
la at, 1054867456 #at = 0.4375 | |
mtc1 at, f2 | |
fabs f1, f0 #f1 = |x| | |
c.olt f1, f2 #|x| < 0.4375 | |
bc1t :kernel_atan | |
fmov f31, f0 | |
la at, 1075576832 #2.4375 | |
mtc1 at, f2 | |
c.olt f1, f2 #if |x| < 2.4375 | |
bc1t :kernel_atan_elsif | |
label :else_atan | |
finv f0, f1 # f0 = 1/|x| | |
move v0, ra | |
jal :kernel_atan #f0 = atan(1/|x|) | |
la at, 1070141403 #1.570796 = pi/2 | |
mtc1 at, f1 | |
fsub f0, f1, f0 #pi/2 - atan(1/|x|) | |
mtc1 zero, f1 | |
c.olt f1, f31 #0<x | |
bc1t :else_atan_return | |
fneg f0, f0 | |
label :else_atan_return | |
jr v0 | |
label :kernel_atan_elsif #0.4375<=|x|<2.4375 | |
la at, 1065353216 #1.0 | |
mtc1 at, f2 | |
fsub f0, f1, f2 #f0 = |x|-1.0 | |
fadd f1, f1, f2 #f1 = |x|+1.0 | |
fdiv f0, f0, f1 #f0=|x|-1.0/|x|+1.0 | |
move v0, ra | |
jal :kernel_atan #f0=kernel_atan((|x|-1.0)/(|x|+1.0)) | |
la at, 1061752795 #0.785398 = pi/4 | |
mtc1 at, f1 | |
fadd f0, f1, f0 #pi/4+ker(hoge)/fuga | |
mtc1 zero, f1 | |
c.olt f1, f31 #0<x | |
bc1t :kernel_atan_elsif_return | |
fneg f0, f0 | |
label :kernel_atan_elsif_return | |
jr v0 | |
label :kernel_atan | |
la at, 0xbeaaaaaa #-0.3333333 | |
mtc1 at, f2 | |
fmul f3, f0, f0 #f3=x**2 | |
fmul f4, f0, f3 #f4=x**3 | |
fmul f1, f2, f4 #f1=-0.3333333*x**3 | |
fadd f0, f0, f1 #f0=x-0.333333*x**3 | |
la at, 0x3e4ccccd #+0.2 | |
mtc1 at, f2 | |
fmul f4, f3, f4 #f4=x**5=x**2*x**3 | |
fmul f1, f2, r4 #f1=+0.2*x**5 | |
fadd f0, f0, f1 | |
la at, 0xbe124925 #-0.142857142 | |
mtc1 at, f2 | |
fmul f4, f3, f4 #f4=x**7=x**2*x**5 | |
fmul f1, f2, r4 #f1=-0.142857142*x**7 | |
fadd f0, f0, f1 | |
la at, 0x3de38e38 #+0.111111104 | |
mtc1 at, f2 | |
fmul f4, f3, f4 #x**9 | |
fmul f1, f2, r4 | |
fadd f0, f0, f1 | |
la at, 0xbdb7d66e #-0.08976446 | |
mtc1 at, f2 | |
fmul f4, f3, f4 #x**11 | |
fmul f1, f2, r4 | |
fadd f0, f0, f1 | |
la at, 0x3d75e7c5 #+0.060035485 | |
mtc1 at, f2 | |
fmul f4, f3, f4 #x**13 | |
fmul f1, f2, r4 | |
fadd f0, f0, f1 | |
jr ra | |
dot_globl :min_caml_float_of_int | |
label :min_caml_float_of_int #int -> float | |
bgt a0, zero, :float_of_int_pos | |
sub a1, zero, a0 | |
la v1, 0x80000000 | |
j :float_of_int_cont | |
label :float_of_int_pos | |
move a1, a0 | |
move v1, zero | |
label :float_of_int_cont | |
la at, 8388608 #2**23 | |
bgt at, a1, :float_of_int_low | |
label :float_of_int_hi | |
li v0, 0 | |
label :float_of_int_loop | |
sub a1, a1, at #->a1 = a1-8388608 | |
addi v0, v0, 1 #->v0++ | |
bgt a1, at, :float_of_int_loop #a1 > 8388608 | |
la at, 0x4b000000 | |
add v1, at, v1 #f1 = sign*2**23 | |
mtc1 v1, f1 | |
mtc1 zero, f0 | |
label :float_of_int_2_23_loop | |
fadd f0, f1, f0 # f0 = f0 + sign*2**23 | |
subi v0, v0, 1 # v0-- | |
bgt v0, zero, :float_of_int_2_23_loop | |
add a0, a0, v1 #n + sign*0x4b00000000 | |
mtc1 a0, f2 | |
fsub f1, f2, f1 # f0 = f(n) - 8388608 | |
fadd f0, f0, f1 # f(x) = f(m)+f(n) | |
jr ra | |
label :float_of_int_low | |
la at, 0x4b000000 #8388608f | |
add a1, a1, at | |
or a1, a1, v1 #a1 = sign*(|x|+8388608) | |
or at, at, v1 #at = sign*8388608 | |
mtc1 a1, f0 #f0 = v1 | |
mtc1 at, f1 #f1 = at | |
fsub f0, f0, f1 #f0 = x | |
jr ra | |
dot_globl :min_caml_int_of_float | |
label :min_caml_int_of_float #float->int | |
mtc1 zero, f1 | |
c.olt f1, f0 #0 < f0 | |
bc1t :itofpos #itofpos(f0) | |
fneg f0, f0 | |
move v1, ra | |
jal :itofpos #itofpos(-f0) | |
move ra, v1 | |
sub v0, zero, v0 #-itofpos(-f0) | |
jr ra | |
label :itofpos | |
mfc1 at, f0 | |
srl a0, at, 23 #a0 = exponent(f0) | |
sll a1, at, 9 | |
srl a1, a1, 9 | |
la a2, 0x800000 | |
add a1, a1, a2 #a1 = frac(f0) | |
li a2, 149 | |
sub a0, a2, a0 #a0 = 127 - a0 + 22 | |
bgt a0, zero, :itofposfrac | |
sub a0, zero, a0 | |
li at, 31 | |
bgt a0, at, :itof_zero | |
sllv a1, a1, a0 #a1 <<= |a0| | |
j :itofcont | |
label :itof_zero | |
move a1, zero | |
j :itofcont | |
label :itofposfrac | |
li at, 31 | |
bgt a0, at, :itof_zero | |
srlv a1, a1, a0 #a1 >>= a0 | |
label :itofcont | |
addi a1, a1, 1 | |
srl v0, a1, 1 | |
jr ra |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment