-
Notifications
You must be signed in to change notification settings - Fork 54
/
Copy path2.m4
55 lines (45 loc) · 1.04 KB
/
2.m4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
.global _start
.text
define(`regidx', `eval($1 + 16)')
define(`numreg', `format(x%d, regidx($1))')
define(`gen_load', `dnl
lw numreg($1),dnl
format(%d(x1), eval($1 * 4))
ifelse($1, 0, `', `gen_load(decr($1))')')
define(`gen_store', `dnl
sw numreg($1),dnl
format(%d(x1), eval($1 * 4))
ifelse($1, 0, `', `gen_store(decr($1))')')
dnl $1: start
dnl x1: current minimum index
dnl x2: current minimum value
define(`gen_cmp_and_set', `
bgeu numreg($1), x2, 1f
li x1, regidx($1)
mv x2, numreg($1)
1: ifelse($1, 15, `', `gen_cmp_and_set(incr($1))')')
dnl $1: start
define(`cmp_and_select', `dnl
li x1, regidx($1)
mv x2, numreg($1)
gen_cmp_and_set($1)
slli x1, x1, 7
lla x4, 1f
li x5, 0x18013 // addi zero, x3, 0
or x5, x5, x1
sw x5, 0(x4)
fence.i
addi x3, numreg($1), 0
addi numreg($1), x2, 0
1: addi zero, x3, 0')
define(`gen_sort_seq', `
cmp_and_select($1)
ifelse($1, 15, `', `gen_sort_seq(incr($1))')')
_start:
li x1, 0xf80
gen_load(15)
gen_sort_seq(0)
li x1, 0xfc0
gen_store(15)
_end:
j _end