mirror of
https://github.com/ProgramSnail/Lama.git
synced 2025-12-05 22:38:44 +00:00
Prototype of X86_64 migration
This commit is contained in:
parent
3fdc3e7f2a
commit
e77433e51c
21 changed files with 599 additions and 7165 deletions
0
regression/new_test001.input
Normal file
0
regression/new_test001.input
Normal file
10
regression/new_test001.lama
Normal file
10
regression/new_test001.lama
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
fun f (a, b, c, d, e) {
|
||||||
|
var i = d / b;
|
||||||
|
write (a);
|
||||||
|
write (b);
|
||||||
|
write (c);
|
||||||
|
write (d);
|
||||||
|
write (e)
|
||||||
|
}
|
||||||
|
|
||||||
|
f (1, 2, 3, 4, 5)
|
||||||
0
regression/new_test002.input
Normal file
0
regression/new_test002.input
Normal file
15
regression/new_test002.lama
Normal file
15
regression/new_test002.lama
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
fun f (a, b, c, d, e, f, g, h) {
|
||||||
|
var i = 9, j = 10;
|
||||||
|
write (a);
|
||||||
|
write (b);
|
||||||
|
write (c);
|
||||||
|
write (d);
|
||||||
|
write (e);
|
||||||
|
write (f);
|
||||||
|
write (g);
|
||||||
|
write (h);
|
||||||
|
write (i);
|
||||||
|
write (j)
|
||||||
|
}
|
||||||
|
|
||||||
|
f (1, 2, 3, 4, 5, 6, 7, 8)
|
||||||
0
regression/new_test003.input
Normal file
0
regression/new_test003.input
Normal file
18
regression/new_test003.lama
Normal file
18
regression/new_test003.lama
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
fun f (a, b, c, d, e, f, g, h) {
|
||||||
|
fun g (unit) {
|
||||||
|
var tmp1 = 1 + (1 + (1 + (1 + (1 + 1 + (1 + (1 + (1 + (1 + 1 + (1 + (1 + (1 + (1 + 1))))))))))));
|
||||||
|
var tmp2 = (((((((((((((1 + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1;
|
||||||
|
write (a);
|
||||||
|
write (b);
|
||||||
|
write (c);
|
||||||
|
write (d);
|
||||||
|
write (e);
|
||||||
|
write (f);
|
||||||
|
write (g);
|
||||||
|
write (h)
|
||||||
|
}
|
||||||
|
|
||||||
|
g
|
||||||
|
}
|
||||||
|
|
||||||
|
f (1, 2, 3, 4, 5, 6, 7, 8)(0)
|
||||||
5
regression/orig/new_test001.log
Normal file
5
regression/orig/new_test001.log
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
10
regression/orig/new_test002.log
Normal file
10
regression/orig/new_test002.log
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
10
|
||||||
10
regression/orig/new_test003.log
Normal file
10
regression/orig/new_test003.log
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
10
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
> 0
|
0
|
||||||
15
|
15
|
||||||
15
|
15
|
||||||
1
|
1
|
||||||
|
|
|
||||||
BIN
regression/t
BIN
regression/t
Binary file not shown.
|
|
@ -1,14 +0,0 @@
|
||||||
fun f (a,b,c,d,e,f,g,h,i,j) {
|
|
||||||
write(a);
|
|
||||||
write(b);
|
|
||||||
write(c);
|
|
||||||
write(d);
|
|
||||||
write(e);
|
|
||||||
write(f);
|
|
||||||
write(g);
|
|
||||||
write(h);
|
|
||||||
write(i);
|
|
||||||
write(j)
|
|
||||||
}
|
|
||||||
|
|
||||||
f (1,2,3,4,5,6,7,8,9,10)
|
|
||||||
|
|
@ -10,8 +10,6 @@ fun fact (n) {
|
||||||
|
|
||||||
n := read ();
|
n := read ();
|
||||||
|
|
||||||
fun f () {}
|
|
||||||
|
|
||||||
for i := n, i >= 1, i := i-1 do
|
for i := n, i >= 1, i := i-1 do
|
||||||
write (i);
|
write (i);
|
||||||
write (fact (i))
|
write (fact (i))
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,14 @@ fun sort (x) {
|
||||||
for i := 0, i<n, i := i+1 do
|
for i := 0, i<n, i := i+1 do
|
||||||
for j := i+1, j<n, j := j+1 do
|
for j := i+1, j<n, j := j+1 do
|
||||||
if x[j] < x[i] then
|
if x[j] < x[i] then
|
||||||
y := x[i];
|
y := x[i];
|
||||||
x[i] := x[j];
|
x[i] := x[j];
|
||||||
x[j] := y
|
x[j] := y
|
||||||
fi
|
fi
|
||||||
od
|
od
|
||||||
od;
|
od;
|
||||||
|
|
||||||
x
|
x
|
||||||
}
|
}
|
||||||
|
|
||||||
n := read ();
|
n := read ();
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
var n;
|
|
||||||
|
|
||||||
fun sum (l) {
|
fun sum (l) {
|
||||||
case l of
|
case l of
|
||||||
{} -> 0
|
{} -> 0
|
||||||
|
|
@ -23,9 +21,7 @@ fun array_to_list (a) {
|
||||||
l
|
l
|
||||||
}
|
}
|
||||||
|
|
||||||
n := read ();
|
|
||||||
write (sum ({}));
|
write (sum ({}));
|
||||||
write (sum ({1, 2, 3, 4, 5}));
|
write (sum ({1, 2, 3, 4, 5}));
|
||||||
write (sum (1:2:3:4:5:{}));
|
write (sum (1:2:3:4:5:{}));
|
||||||
print_list (array_to_list ([1, 2, 3, 4, 5]))
|
print_list (array_to_list ([1, 2, 3, 4, 5]))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
for i in {1..9}
|
|
||||||
do
|
|
||||||
make test00$i
|
|
||||||
done
|
|
||||||
|
|
||||||
for i in {0..9}
|
|
||||||
do
|
|
||||||
make test01$i
|
|
||||||
done
|
|
||||||
|
|
||||||
for i in {0..9}
|
|
||||||
do
|
|
||||||
make test02$i
|
|
||||||
done
|
|
||||||
|
|
||||||
make test034
|
|
||||||
make test036
|
|
||||||
|
|
||||||
|
|
@ -41,7 +41,7 @@
|
||||||
// # define MINIMUM_HEAP_CAPACITY (8)
|
// # define MINIMUM_HEAP_CAPACITY (8)
|
||||||
// #else
|
// #else
|
||||||
// # define MINIMUM_HEAP_CAPACITY (1 << 2)
|
// # define MINIMUM_HEAP_CAPACITY (1 << 2)
|
||||||
#define MINIMUM_HEAP_CAPACITY (1 << 16)
|
#define MINIMUM_HEAP_CAPACITY (1 << 26)
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
@ -100,7 +100,7 @@ void physically_relocate (memory_chunk *);
|
||||||
// an auxiliary data structure called `extra_roots_pool`.
|
// an auxiliary data structure called `extra_roots_pool`.
|
||||||
// extra_roots_pool is a simple LIFO stack. During `pop` it compares that pop's
|
// extra_roots_pool is a simple LIFO stack. During `pop` it compares that pop's
|
||||||
// argument is equal to the current stack top.
|
// argument is equal to the current stack top.
|
||||||
#define MAX_EXTRA_ROOTS_NUMBER 32
|
#define MAX_EXTRA_ROOTS_NUMBER 4096
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int current_free;
|
int current_free;
|
||||||
|
|
|
||||||
|
|
@ -330,8 +330,8 @@ static void printValue (void *p) {
|
||||||
|
|
||||||
printStringBuf("<closure ");
|
printStringBuf("<closure ");
|
||||||
for (i = 0; i < LEN(a->data_header); i++) {
|
for (i = 0; i < LEN(a->data_header); i++) {
|
||||||
if (i) printValue((void *)((int *)a->contents)[i]);
|
if (i) printValue((void *)((long *)a->contents)[i]);
|
||||||
else printStringBuf("0x%x", (void *)((int *)a->contents)[i]);
|
else printStringBuf("0x%x", (void *)((long *)a->contents)[i]);
|
||||||
if (i != LEN(a->data_header) - 1) printStringBuf(", ");
|
if (i != LEN(a->data_header) - 1) printStringBuf(", ");
|
||||||
}
|
}
|
||||||
printStringBuf(">");
|
printStringBuf(">");
|
||||||
|
|
@ -340,7 +340,7 @@ static void printValue (void *p) {
|
||||||
case ARRAY_TAG: {
|
case ARRAY_TAG: {
|
||||||
printStringBuf("[");
|
printStringBuf("[");
|
||||||
for (i = 0; i < LEN(a->data_header); i++) {
|
for (i = 0; i < LEN(a->data_header); i++) {
|
||||||
printValue((void *)((int *)a->contents)[i]);
|
printValue((void *)((long *)a->contents)[i]);
|
||||||
if (i != LEN(a->data_header) - 1) printStringBuf(", ");
|
if (i != LEN(a->data_header) - 1) printStringBuf(", ");
|
||||||
}
|
}
|
||||||
printStringBuf("]");
|
printStringBuf("]");
|
||||||
|
|
@ -354,8 +354,8 @@ static void printValue (void *p) {
|
||||||
sexp *sb = sa;
|
sexp *sb = sa;
|
||||||
printStringBuf("{");
|
printStringBuf("{");
|
||||||
while (LEN(sb->data_header)) {
|
while (LEN(sb->data_header)) {
|
||||||
printValue((void *)((int *)sb->contents)[0]);
|
printValue((void *)((long *)sb->contents)[0]);
|
||||||
int list_next = ((int *)sb->contents)[1];
|
int list_next = ((long *)sb->contents)[1];
|
||||||
if (!UNBOXED(list_next)) {
|
if (!UNBOXED(list_next)) {
|
||||||
printStringBuf(", ");
|
printStringBuf(", ");
|
||||||
sb = TO_SEXP(list_next);
|
sb = TO_SEXP(list_next);
|
||||||
|
|
@ -368,7 +368,7 @@ static void printValue (void *p) {
|
||||||
if (LEN(a->data_header)) {
|
if (LEN(a->data_header)) {
|
||||||
printStringBuf(" (");
|
printStringBuf(" (");
|
||||||
for (i = 0; i < LEN(sexp_a->data_header); i++) {
|
for (i = 0; i < LEN(sexp_a->data_header); i++) {
|
||||||
printValue((void *)((int *)sexp_a->contents)[i]);
|
printValue((void *)((long *)sexp_a->contents)[i]);
|
||||||
if (i != LEN(sexp_a->data_header) - 1) printStringBuf(", ");
|
if (i != LEN(sexp_a->data_header) - 1) printStringBuf(", ");
|
||||||
}
|
}
|
||||||
printStringBuf(")");
|
printStringBuf(")");
|
||||||
|
|
@ -400,8 +400,8 @@ static void stringcat (void *p) {
|
||||||
sexp *b = (sexp *)a;
|
sexp *b = (sexp *)a;
|
||||||
|
|
||||||
while (LEN(b->data_header)) {
|
while (LEN(b->data_header)) {
|
||||||
stringcat((void *)((int *)b->contents)[0]);
|
stringcat((void *)((long *)b->contents)[0]);
|
||||||
int next_b = ((int *)b->contents)[1];
|
int next_b = ((long *)b->contents)[1];
|
||||||
if (!UNBOXED(next_b)) {
|
if (!UNBOXED(next_b)) {
|
||||||
b = TO_SEXP(next_b);
|
b = TO_SEXP(next_b);
|
||||||
} else break;
|
} else break;
|
||||||
|
|
@ -683,8 +683,8 @@ extern void *Belem (void *p, long i) {
|
||||||
|
|
||||||
switch (TAG(a->data_header)) {
|
switch (TAG(a->data_header)) {
|
||||||
case STRING_TAG: return (void *)BOX((char)a->contents[i]);
|
case STRING_TAG: return (void *)BOX((char)a->contents[i]);
|
||||||
case SEXP_TAG: return (void *)((int *)a->contents)[i + 1];
|
case SEXP_TAG: return (void *)((long *)((sexp *)a)->contents)[i];
|
||||||
default: return (void *)((int *)a->contents)[i];
|
default: return (void *)((long *)a->contents)[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -798,8 +798,8 @@ extern void *Bclosure (int bn, void *entry, ...) {
|
||||||
va_start(args, entry);
|
va_start(args, entry);
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
ai = va_arg(args, int);
|
ai = va_arg(args, size_t);
|
||||||
((int *)r->contents)[i + 1] = ai;
|
((size_t *)r->contents)[i + 1] = ai;
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
@ -825,8 +825,8 @@ extern void *Barray (int bn, ...) {
|
||||||
va_start(args, bn);
|
va_start(args, bn);
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
ai = va_arg(args, int);
|
ai = va_arg(args, long);
|
||||||
((int *)r->contents)[i] = ai;
|
((long *)r->contents)[i] = ai;
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
@ -844,31 +844,31 @@ extern void *Bsexp (int bn, ...) {
|
||||||
int i;
|
int i;
|
||||||
int ai;
|
int ai;
|
||||||
size_t *p;
|
size_t *p;
|
||||||
data *r;
|
sexp *r;
|
||||||
int n = UNBOX(bn);
|
int n = UNBOX(bn);
|
||||||
|
|
||||||
PRE_GC();
|
PRE_GC();
|
||||||
|
|
||||||
int fields_cnt = n - 1;
|
int fields_cnt = n - 1;
|
||||||
r = (data *)alloc_sexp(fields_cnt);
|
r = alloc_sexp(fields_cnt);
|
||||||
((sexp *)r)->tag = 0;
|
r->tag = 0;
|
||||||
|
|
||||||
va_start(args, bn);
|
va_start(args, bn);
|
||||||
|
|
||||||
for (i = 1; i < n; i++) {
|
for (i = 0; i < fields_cnt; i++) {
|
||||||
ai = va_arg(args, int);
|
ai = va_arg(args, long);
|
||||||
p = (size_t *)ai;
|
p = (long *)ai;
|
||||||
((int *)r->contents)[i] = ai;
|
((long *)r->contents)[i] = ai;
|
||||||
}
|
}
|
||||||
|
|
||||||
((sexp *)r)->tag = UNBOX(va_arg(args, int));
|
r->tag = UNBOX(va_arg(args, long));
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
POST_GC();
|
POST_GC();
|
||||||
// printf("bsexp: %ld %p", r->contents, r->contents);
|
// printf("bsexp: %s", de_hash(((sexp *)r)->tag));
|
||||||
// fflush(stdout);
|
// fflush(stdout);
|
||||||
return (void *)r->contents;
|
return (void *)((data *)r)->contents;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern long Btag (void *d, int t, int n) {
|
extern long Btag (void *d, int t, int n) {
|
||||||
|
|
@ -951,11 +951,11 @@ extern void *Bsta (void *v, long i, void *x) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SEXP_TAG: {
|
case SEXP_TAG: {
|
||||||
((int *)x)[UNBOX(i) + 1] = (int)v;
|
((long *)((sexp *)d)->contents)[UNBOX(i)] = (long)v;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
((int *)x)[UNBOX(i)] = (int)v;
|
((long *)x)[UNBOX(i)] = (long)v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
6568
runtime/runtime.s
6568
runtime/runtime.s
File diff suppressed because it is too large
Load diff
|
|
@ -24,7 +24,7 @@
|
||||||
# define DATA_HEADER_SZ (sizeof(size_t) + sizeof(size_t) + sizeof(int))
|
# define DATA_HEADER_SZ (sizeof(size_t) + sizeof(size_t) + sizeof(int))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MEMBER_SIZE sizeof(int)
|
#define MEMBER_SIZE sizeof(long)
|
||||||
|
|
||||||
#define TO_DATA(x) ((data *)((char *)(x)-DATA_HEADER_SZ))
|
#define TO_DATA(x) ((data *)((char *)(x)-DATA_HEADER_SZ))
|
||||||
#define TO_SEXP(x) ((sexp *)((char *)(x)-DATA_HEADER_SZ))
|
#define TO_SEXP(x) ((sexp *)((char *)(x)-DATA_HEADER_SZ))
|
||||||
|
|
@ -68,7 +68,7 @@ typedef struct {
|
||||||
// last bit can be used because due to alignment we can assume that last two bits are always 0's
|
// last bit can be used because due to alignment we can assume that last two bits are always 0's
|
||||||
size_t forward_address;
|
size_t forward_address;
|
||||||
int tag;
|
int tag;
|
||||||
int contents[0];
|
long contents[0];
|
||||||
} sexp;
|
} sexp;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
1017
src/X86.ml
1017
src/X86.ml
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue