@@ -71,22 +71,22 @@ class BackendX86_64 : CompilerBackend {
71
71
}
72
72
73
73
// 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 );
87
87
88
88
// built in structs
89
- types ~= Type(" Array" , 24 , true , [
89
+ types ~= Type(" Array" , 24 , false , true , [
90
90
StructEntry(UsedType(GetType(" usize" ), false ), " length" , false , 8 , 0 ),
91
91
StructEntry(UsedType(GetType(" usize" ), false ), " memberSize" , false , 8 , 8 ),
92
92
StructEntry(UsedType(GetType(" addr" ), false ), " elements" , false , 8 , 16 )
@@ -96,7 +96,7 @@ class BackendX86_64 : CompilerBackend {
96
96
NewConst(" Array.elements" , 16 );
97
97
NewConst(" Array.sizeOf" , 8 * 3 );
98
98
99
- types ~= Type(" Exception" , 24 + 8 , true , [
99
+ types ~= Type(" Exception" , 24 + 8 , false , true , [
100
100
StructEntry(UsedType(GetType(" bool" ), false ), " error" , false , 8 , 0 ),
101
101
StructEntry(UsedType(GetType(" Array" ), false ), " msg" , false , 24 , 8 )
102
102
]);
@@ -531,7 +531,7 @@ class BackendX86_64 : CompilerBackend {
531
531
bool deref = false
532
532
) {
533
533
if (size == 0 ) {
534
- size = var.type.Size();
534
+ size = var.type.Size();
535
535
}
536
536
537
537
if (size != 8 ) {
@@ -543,21 +543,43 @@ class BackendX86_64 : CompilerBackend {
543
543
if (deref) {
544
544
output ~= format(" mov rbx, [%s]\n " , symbol);
545
545
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
+ }
552
563
}
553
564
}
554
565
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
+ }
561
583
}
562
584
}
563
585
@@ -570,7 +592,7 @@ class BackendX86_64 : CompilerBackend {
570
592
bool deref = false
571
593
) {
572
594
if (size == 0 ) {
573
- size = var.type.Size();
595
+ size = var.type.Size();
574
596
}
575
597
576
598
if (size != 8 ) {
@@ -580,21 +602,43 @@ class BackendX86_64 : CompilerBackend {
580
602
if (deref) {
581
603
output ~= format(" mov rbx, [rsp + %d]\n " , var.offset);
582
604
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
+ }
589
622
}
590
623
}
591
624
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
+ }
598
642
}
599
643
}
600
644
0 commit comments