Skip to content

Commit 69ea987

Browse files
authored
Merge pull request #41 from Rainb0wSkeppy/main
sign extend signed variables (only on x86_64)
2 parents 892c9b5 + 8166abf commit 69ea987

File tree

6 files changed

+131
-86
lines changed

6 files changed

+131
-86
lines changed

source/backends/arm64.d

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,22 @@ class BackendARM64 : CompilerBackend {
6161
}
6262

6363
// built in integer types
64-
types ~= Type("u8", 1);
65-
types ~= Type("i8", 1);
66-
types ~= Type("u16", 2);
67-
types ~= Type("i16", 2);
68-
types ~= Type("u32", 4);
69-
types ~= Type("i32", 4);
70-
types ~= Type("u64", 8);
71-
types ~= Type("i64", 8);
72-
types ~= Type("addr", 8);
73-
types ~= Type("size", 8);
74-
types ~= Type("usize", 8);
75-
types ~= Type("cell", 8);
76-
types ~= Type("bool", 8);
64+
types ~= Type("u8", 1, false);
65+
types ~= Type("i8", 1, true);
66+
types ~= Type("u16", 2, false);
67+
types ~= Type("i16", 2, true);
68+
types ~= Type("u32", 4, false);
69+
types ~= Type("i32", 4, true);
70+
types ~= Type("u64", 8, false);
71+
types ~= Type("i64", 8, true);
72+
types ~= Type("addr", 8, false);
73+
types ~= Type("size", 8, true);
74+
types ~= Type("usize", 8, false);
75+
types ~= Type("cell", 8, false);
76+
types ~= Type("bool", 8, false);
7777

7878
// built in structs
79-
types ~= Type("Array", 24, true, [
79+
types ~= Type("Array", 24, false, true, [
8080
StructEntry(UsedType(GetType("usize"), false), "length", false, 8, 0),
8181
StructEntry(UsedType(GetType("usize"), false), "memberSize", false, 8, 8),
8282
StructEntry(UsedType(GetType("addr"), false), "elements", false, 8, 16)
@@ -86,7 +86,7 @@ class BackendARM64 : CompilerBackend {
8686
NewConst("Array.elements", 16);
8787
NewConst("Array.sizeOf", 8 * 3);
8888

89-
types ~= Type("Exception", 24 + 8, true, [
89+
types ~= Type("Exception", 24 + 8, false, true, [
9090
StructEntry(UsedType(GetType("bool"), false), "error", false, 8, 0),
9191
StructEntry(UsedType(GetType("Array"), false), "msg", false, 8 * 3, 8)
9292
]);

source/backends/lua.d

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,14 @@ class BackendLua : CompilerBackend {
5454
addrSize = 1;
5555

5656
// built in integer types
57-
types ~= Type("addr", 1);
58-
types ~= Type("size", 1);
59-
types ~= Type("usize", 1);
60-
types ~= Type("cell", 1);
61-
types ~= Type("bool", 1);
57+
types ~= Type("addr", 1, false);
58+
types ~= Type("size", 1, true);
59+
types ~= Type("usize", 1, false);
60+
types ~= Type("cell", 1, false);
61+
types ~= Type("bool", 1, false);
6262

6363
// built in structs
64-
types ~= Type("Array", 3, true, [
64+
types ~= Type("Array", 3, false, true, [
6565
StructEntry(UsedType(GetType("usize"), false), "length", false, 1, 0),
6666
StructEntry(UsedType(GetType("usize"), false), "memberSize", false, 1, 1),
6767
StructEntry(UsedType(GetType("addr"), false), "elements", false, 1, 2)
@@ -71,7 +71,7 @@ class BackendLua : CompilerBackend {
7171
NewConst("Array.elements", 2);
7272
NewConst("Array.sizeOf", 3);
7373

74-
types ~= Type("Exception", 3 + 1, true, [
74+
types ~= Type("Exception", 3 + 1, false, true, [
7575
StructEntry(UsedType(GetType("bool"), false), "error", false, 1, 0),
7676
StructEntry(UsedType(GetType("Array"), false), "msg", false, 3, 1)
7777
]);

source/backends/rm86.d

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,18 @@ class BackendRM86 : CompilerBackend {
4141
addrSize = 2;
4242
defaultOS = "dos";
4343

44-
types ~= Type("u8", 1);
45-
types ~= Type("i8", 1);
46-
types ~= Type("u16", 2);
47-
types ~= Type("i16", 2);
48-
types ~= Type("addr", 2);
49-
types ~= Type("size", 2);
50-
types ~= Type("usize", 2);
51-
types ~= Type("cell", 2);
52-
types ~= Type("bool", 2);
44+
types ~= Type("u8", 1, false);
45+
types ~= Type("i8", 1, true);
46+
types ~= Type("u16", 2, false);
47+
types ~= Type("i16", 2, true);
48+
types ~= Type("addr", 2, false);
49+
types ~= Type("size", 2, true);
50+
types ~= Type("usize", 2, false);
51+
types ~= Type("cell", 2, false);
52+
types ~= Type("bool", 2, false);
5353

5454
// built in structs
55-
types ~= Type("Array", 6, true, [
55+
types ~= Type("Array", 6, false, true, [
5656
StructEntry(UsedType(GetType("usize"), false), "length", false, 2, 0),
5757
StructEntry(UsedType(GetType("usize"), false), "memberSize", false, 2, 2),
5858
StructEntry(UsedType(GetType("addr"), false), "elements", false, 2, 4)
@@ -62,7 +62,7 @@ class BackendRM86 : CompilerBackend {
6262
NewConst("Array.elements", 4);
6363
NewConst("Array.sizeOf", 2 * 3);
6464

65-
types ~= Type("Exception", 6 + 2, true, [
65+
types ~= Type("Exception", 6 + 2, false, true, [
6666
StructEntry(UsedType(GetType("bool"), false), "error", false, 2, 0),
6767
StructEntry(UsedType(GetType("Array"), false), "msg", false, 6, 2)
6868
]);

source/backends/uxn.d

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,18 @@ class BackendUXN : CompilerBackend {
3838

3939
addrSize = 2;
4040

41-
types ~= Type("u8", 1);
42-
types ~= Type("i8", 1);
43-
types ~= Type("u16", 2);
44-
types ~= Type("i16", 2);
45-
types ~= Type("addr", 2);
46-
types ~= Type("size", 2);
47-
types ~= Type("usize", 2);
48-
types ~= Type("cell", 2);
49-
types ~= Type("bool", 2);
41+
types ~= Type("u8", 1, false);
42+
types ~= Type("i8", 1, true);
43+
types ~= Type("u16", 2, false);
44+
types ~= Type("i16", 2, true);
45+
types ~= Type("addr", 2, false);
46+
types ~= Type("size", 2, true);
47+
types ~= Type("usize", 2, false);
48+
types ~= Type("cell", 2, false);
49+
types ~= Type("bool", 2, false);
5050

5151
// built in structs
52-
types ~= Type("Array", 6, true, [
52+
types ~= Type("Array", 6, false, true, [
5353
StructEntry(UsedType(GetType("usize"), false), "length", false, 2, 0),
5454
StructEntry(UsedType(GetType("usize"), false), "memberSize", false, 2, 2),
5555
StructEntry(UsedType(GetType("addr"), false), "elements", false, 2, 4)
@@ -59,7 +59,7 @@ class BackendUXN : CompilerBackend {
5959
NewConst("Array.elements", 4);
6060
NewConst("Array.sizeOf", 2 * 3);
6161

62-
types ~= Type("Exception", 6 + 2, true, [
62+
types ~= Type("Exception", 6 + 2, false, true, [
6363
StructEntry(UsedType(GetType("bool"), false), "error", false, 2, 0),
6464
StructEntry(UsedType(GetType("Array"), false), "msg", false, 6, 0)
6565
]);

source/backends/x86_64.d

Lines changed: 85 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,22 @@ class BackendX86_64 : CompilerBackend {
7171
}
7272

7373
// built in integer types
74-
types ~= Type("u8", 1);
75-
types ~= Type("i8", 1);
76-
types ~= Type("u16", 2);
77-
types ~= Type("i16", 2);
78-
types ~= Type("u32", 4);
79-
types ~= Type("i32", 4);
80-
types ~= Type("u64", 8);
81-
types ~= Type("i64", 8);
82-
types ~= Type("addr", 8);
83-
types ~= Type("size", 8);
84-
types ~= Type("usize", 8);
85-
types ~= Type("cell", 8);
86-
types ~= Type("bool", 8);
74+
types ~= Type("u8", 1, false);
75+
types ~= Type("i8", 1, true);
76+
types ~= Type("u16", 2, false);
77+
types ~= Type("i16", 2, true);
78+
types ~= Type("u32", 4, false);
79+
types ~= Type("i32", 4, true);
80+
types ~= Type("u64", 8, false);
81+
types ~= Type("i64", 8, true);
82+
types ~= Type("addr", 8, false);
83+
types ~= Type("size", 8, true);
84+
types ~= Type("usize", 8, false);
85+
types ~= Type("cell", 8, false);
86+
types ~= Type("bool", 8, false);
8787

8888
// built in structs
89-
types ~= Type("Array", 24, true, [
89+
types ~= Type("Array", 24, false, true, [
9090
StructEntry(UsedType(GetType("usize"), false), "length", false, 8, 0),
9191
StructEntry(UsedType(GetType("usize"), false), "memberSize", false, 8, 8),
9292
StructEntry(UsedType(GetType("addr"), false), "elements", false, 8, 16)
@@ -96,7 +96,7 @@ class BackendX86_64 : CompilerBackend {
9696
NewConst("Array.elements", 16);
9797
NewConst("Array.sizeOf", 8 * 3);
9898

99-
types ~= Type("Exception", 24 + 8, true, [
99+
types ~= Type("Exception", 24 + 8, false, true, [
100100
StructEntry(UsedType(GetType("bool"), false), "error", false, 8, 0),
101101
StructEntry(UsedType(GetType("Array"), false), "msg", false, 24, 8)
102102
]);
@@ -531,7 +531,7 @@ class BackendX86_64 : CompilerBackend {
531531
bool deref = false
532532
) {
533533
if (size == 0) {
534-
size = var.type.Size();
534+
size = var.type.Size();
535535
}
536536

537537
if (size != 8) {
@@ -543,21 +543,43 @@ class BackendX86_64 : CompilerBackend {
543543
if (deref) {
544544
output ~= format("mov rbx, [%s]\n", symbol);
545545

546-
switch (size) {
547-
case 1: output ~= format("mov al, [rbx + %d]\n", offset); break;
548-
case 2: output ~= format("mov ax, [rbx + %d]\n", offset); break;
549-
case 4: output ~= format("mov eax, [rbx + %d]\n", offset); break;
550-
case 8: output ~= format("mov rax, [rbx + %d]\n", offset); break;
551-
default: Error(node.error, "Bad variable type size");
546+
if (var.type.isSigned) {
547+
switch (size) {
548+
case 1: output ~= format("movsx rax, byte [rbx + %d]\n", offset); break;
549+
case 2: output ~= format("movsx rax, word [rbx + %d]\n", offset); break;
550+
case 4: output ~= format("movsxd rax, dword [rbx + %d]\n", offset); break;
551+
case 8: output ~= format("mov rax, [rbx + %d]\n", offset); break;
552+
default: Error(node.error, "Bad variable type size");
553+
}
554+
}
555+
else {
556+
switch (size) {
557+
case 1: output ~= format("mov al, [rbx + %d]\n", offset); break;
558+
case 2: output ~= format("mov ax, [rbx + %d]\n", offset); break;
559+
case 4: output ~= format("mov eax, [rbx + %d]\n", offset); break;
560+
case 8: output ~= format("mov rax, [rbx + %d]\n", offset); break;
561+
default: Error(node.error, "Bad variable type size");
562+
}
552563
}
553564
}
554565
else {
555-
switch (size) {
556-
case 1: output ~= format("mov al, [%s + %d]\n", symbol, offset); break;
557-
case 2: output ~= format("mov ax, [%s + %d]\n", symbol, offset); break;
558-
case 4: output ~= format("mov eax, [%s + %d]\n", symbol, offset); break;
559-
case 8: output ~= format("mov rax, [%s + %d]\n", symbol, offset); break;
560-
default: Error(node.error, "Bad variable type size");
566+
if (var.type.isSigned) {
567+
switch (size) {
568+
case 1: output ~= format("movsx rax, byte [%s + %d]\n", symbol, offset); break;
569+
case 2: output ~= format("movsx rax, word [%s + %d]\n", symbol, offset); break;
570+
case 4: output ~= format("movsxd rax, dword [%s + %d]\n", symbol, offset); break;
571+
case 8: output ~= format("mov rax, [%s + %d]\n", symbol, offset); break;
572+
default: Error(node.error, "Bad variable type size");
573+
}
574+
}
575+
else {
576+
switch (size) {
577+
case 1: output ~= format("mov al, [%s + %d]\n", symbol, offset); break;
578+
case 2: output ~= format("mov ax, [%s + %d]\n", symbol, offset); break;
579+
case 4: output ~= format("mov eax, [%s + %d]\n", symbol, offset); break;
580+
case 8: output ~= format("mov rax, [%s + %d]\n", symbol, offset); break;
581+
default: Error(node.error, "Bad variable type size");
582+
}
561583
}
562584
}
563585

@@ -570,7 +592,7 @@ class BackendX86_64 : CompilerBackend {
570592
bool deref = false
571593
) {
572594
if (size == 0) {
573-
size = var.type.Size();
595+
size = var.type.Size();
574596
}
575597

576598
if (size != 8) {
@@ -580,21 +602,43 @@ class BackendX86_64 : CompilerBackend {
580602
if (deref) {
581603
output ~= format("mov rbx, [rsp + %d]\n", var.offset);
582604

583-
switch (size) {
584-
case 1: output ~= format("mov al, [rbx + %d]\n", offset); break;
585-
case 2: output ~= format("mov ax, [rbx + %d]\n", offset); break;
586-
case 4: output ~= format("mov eax, [rbx + %d]\n", offset); break;
587-
case 8: output ~= format("mov rax, [rbx + %d]\n", offset); break;
588-
default: Error(node.error, "Bad variable type size");
605+
if (var.type.isSigned) {
606+
switch (size) {
607+
case 1: output ~= format("movsx rax, byte [rbx + %d]\n", offset); break;
608+
case 2: output ~= format("movsx rax, word [rbx + %d]\n", offset); break;
609+
case 4: output ~= format("movsxd rax, dword [rbx + %d]\n", offset); break;
610+
case 8: output ~= format("mov rax, [rbx + %d]\n", offset); break;
611+
default: Error(node.error, "Bad variable type size");
612+
}
613+
}
614+
else {
615+
switch (size) {
616+
case 1: output ~= format("mov al, [rbx + %d]\n", offset); break;
617+
case 2: output ~= format("mov ax, [rbx + %d]\n", offset); break;
618+
case 4: output ~= format("mov eax, [rbx + %d]\n", offset); break;
619+
case 8: output ~= format("mov rax, [rbx + %d]\n", offset); break;
620+
default: Error(node.error, "Bad variable type size");
621+
}
589622
}
590623
}
591624
else {
592-
switch (size) {
593-
case 1: output ~= format("mov al, [rsp + %d]\n", offset + var.offset); break;
594-
case 2: output ~= format("mov ax, [rsp + %d]\n", offset + var.offset); break;
595-
case 4: output ~= format("mov eax, [rsp + %d]\n", offset + var.offset); break;
596-
case 8: output ~= format("mov rax, [rsp + %d]\n", offset + var.offset); break;
597-
default: Error(node.error, "Bad variable type size");
625+
if (var.type.isSigned) {
626+
switch (size) {
627+
case 1: output ~= format("movsx rax, byte [rsp + %d]\n", offset + var.offset); break;
628+
case 2: output ~= format("movsx rax, word [rsp + %d]\n", offset + var.offset); break;
629+
case 4: output ~= format("movsxd rax, dword [rsp + %d]\n", offset + var.offset); break;
630+
case 8: output ~= format("mov rax, [rsp + %d]\n", offset + var.offset); break;
631+
default: Error(node.error, "Bad variable type size");
632+
}
633+
}
634+
else {
635+
switch (size) {
636+
case 1: output ~= format("mov al, [rsp + %d]\n", offset + var.offset); break;
637+
case 2: output ~= format("mov ax, [rsp + %d]\n", offset + var.offset); break;
638+
case 4: output ~= format("mov eax, [rsp + %d]\n", offset + var.offset); break;
639+
case 8: output ~= format("mov rax, [rsp + %d]\n", offset + var.offset); break;
640+
default: Error(node.error, "Bad variable type size");
641+
}
598642
}
599643
}
600644

source/compiler.d

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ struct StructVariable {
3434
struct Type {
3535
string name;
3636
ulong size;
37+
bool isSigned;
3738
bool isStruct;
3839
StructEntry[] structure;
3940
bool hasInit;
@@ -209,7 +210,7 @@ class CompilerBackend {
209210
}
210211

211212
NewConst(format("%s.sizeOf", node.name), offset);
212-
types ~= Type(node.name, offset, true, entries);
213+
types ~= Type(node.name, offset, false, true, entries);
213214

214215
foreach (ref me ; copiesOfMe) {
215216
*me = UsedType(types[$ - 1], true);

0 commit comments

Comments
 (0)