diff --git a/agb/src/agbabi/memcpy.s b/agb/src/agbabi/memcpy.s index 08a88b41..b043c325 100644 --- a/agb/src/agbabi/memcpy.s +++ b/agb/src/agbabi/memcpy.s @@ -15,17 +15,13 @@ */ .arm - .align 4 + .align 2 .section .iwram.__aeabi_memcpy, "ax", %progbits .global __agbabi_memcpy __agbabi_memcpy: .global __aeabi_memcpy __aeabi_memcpy: - // Handle <= 2 byte copies byte-by-byte - cmp r2, #2 - ble .Lcopy1 - // Check pointer alignment eor r3, r1, r0 // JoaoBapt carry & sign bit test @@ -34,9 +30,13 @@ __aeabi_memcpy: bcs .Lcopy2 .Lcopy4: + // Handle <= 2 byte copies byte-by-byte + cmp r2, #2 + ble .Lcopy1 // Copy half and byte head rsb r3, r0, #4 + // JoaoBapt carry & sign bit test movs r3, r3, lsl #31 ldrmib r3, [r1], #1 strmib r3, [r0], #1 @@ -73,6 +73,7 @@ __aeabi_memcpy4: bhs .LcopyWords // Copy half and byte tail + // JoaoBapt carry & sign bit test movs r3, r2, lsl #31 ldrcsh r3, [r1], #2 strcsh r3, [r0], #2 @@ -83,6 +84,7 @@ __aeabi_memcpy4: .Lcopy2: // Copy byte head tst r0, #1 + cmpne r2, #0 ldrneb r3, [r1], #1 strneb r3, [r0], #1 subne r2, r2, #1 diff --git a/agb/src/agbabi/memset.s b/agb/src/agbabi/memset.s index 1ce85f5b..be51ced2 100644 --- a/agb/src/agbabi/memset.s +++ b/agb/src/agbabi/memset.s @@ -16,7 +16,7 @@ */ .arm - .balign 4 + .align 2 .section .iwram.__aeabi_memset, "ax", %progbits .global __aeabi_memclr @@ -37,6 +37,7 @@ __aeabi_memset: // Handle <= 2 byte set byte-by-byte cmp r1, #2 bgt .LskipShortHead + // JoaoBapt carry & sign bit test movs r1, r1, lsl #31 // Set byte and half strmib r2, [r0], #1 @@ -45,8 +46,8 @@ __aeabi_memset: bx lr .LskipShortHead: - // JoaoBapt carry & sign bit test rsb r3, r0, #4 + // JoaoBapt carry & sign bit test movs r3, r3, lsl #31 // Set half and byte head strmib r2, [r0], #1 @@ -101,6 +102,7 @@ __agbabi_wordset4: bhs .LsetWords // Set half and byte tail + // JoaoBapt carry & sign bit test movs r3, r1, lsl #31 strcsh r2, [r0], #2 strmib r2, [r0]