@@ -387,14 +387,25 @@ class BackendARM64 : CompilerBackend {
387
387
output ~= " ldr x9, [x9]\n " ;
388
388
}
389
389
390
- switch (size) {
391
- case 1 : output ~= format(" ldrb w9, [x9, #%d]\n " , offset); break ;
392
- case 2 : output ~= format(" ldrh w9, [x9, #%d]\n " , offset); break ;
393
- case 4 : output ~= format(" ldr w9, [x9, #%d]\n " , offset); break ;
394
- case 8 : output ~= format(" ldr x9, [x9, #%d]\n " , offset); break ;
395
- default : Error (node.error, " Bad variable type size" );
390
+ if (var.type.isSigned) {
391
+ switch (size) {
392
+ case 1 : output ~= format(" ldrsb x9, [x9, #%d]\n " , offset); break ;
393
+ case 2 : output ~= format(" ldrsh x9, [x9, #%d]\n " , offset); break ;
394
+ case 4 : output ~= format(" ldrsw x9, [x9, #%d]\n " , offset); break ;
395
+ case 8 : output ~= format(" ldr x9, [x9, #%d]\n " , offset); break ;
396
+ default : Error (node.error, " Bad variable type size" );
397
+ }
396
398
}
397
-
399
+ else {
400
+ switch (size) {
401
+ case 1 : output ~= format(" ldrb w9, [x9, #%d]\n " , offset); break ;
402
+ case 2 : output ~= format(" ldrh w9, [x9, #%d]\n " , offset); break ;
403
+ case 4 : output ~= format(" ldr w9, [x9, #%d]\n " , offset); break ;
404
+ case 8 : output ~= format(" ldr x9, [x9, #%d]\n " , offset); break ;
405
+ default : Error (node.error, " Bad variable type size" );
406
+ }
407
+ }
408
+
398
409
output ~= " str x9, [x19], #8\n " ;
399
410
}
400
411
@@ -415,12 +426,23 @@ class BackendARM64 : CompilerBackend {
415
426
base = " x20" ;
416
427
}
417
428
418
- switch (size) {
419
- case 1 : output ~= format(" ldrb w9, [%s, #%d]\n " , base, offset); break ;
420
- case 2 : output ~= format(" ldrh w9, [%s, #%d]\n " , base, offset); break ;
421
- case 4 : output ~= format(" ldr w9, [%s, #%d]\n " , base, offset); break ;
422
- case 8 : output ~= format(" ldr x9, [%s, #%d]\n " , base, offset); break ;
423
- default : Error (node.error, " Bad variable type size" );
429
+ if (var.type.isSigned) {
430
+ switch (size) {
431
+ case 1 : output ~= format(" ldrsb x9, [%s, #%d]\n " , base, offset); break ;
432
+ case 2 : output ~= format(" ldrsh x9, [%s, #%d]\n " , base, offset); break ;
433
+ case 4 : output ~= format(" ldrsw x9, [%s, #%d]\n " , base, offset); break ;
434
+ case 8 : output ~= format(" ldr x9, [%s, #%d]\n " , base, offset); break ;
435
+ default : Error (node.error, " Bad variable type size" );
436
+ }
437
+ }
438
+ else {
439
+ switch (size) {
440
+ case 1 : output ~= format(" ldrb w9, [%s, #%d]\n " , base, offset); break ;
441
+ case 2 : output ~= format(" ldrh w9, [%s, #%d]\n " , base, offset); break ;
442
+ case 4 : output ~= format(" ldr w9, [%s, #%d]\n " , base, offset); break ;
443
+ case 8 : output ~= format(" ldr x9, [%s, #%d]\n " , base, offset); break ;
444
+ default : Error (node.error, " Bad variable type size" );
445
+ }
424
446
}
425
447
426
448
output ~= " str x9, [x19], #8\n " ;
0 commit comments