Skip to content

Instantly share code, notes, and snippets.

@censored--
Created November 4, 2014 20:27
Show Gist options
  • Save censored--/a1d4bea2bd729ea1f0de to your computer and use it in GitHub Desktop.
Save censored--/a1d4bea2bd729ea1f0de to your computer and use it in GitHub Desktop.
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