-; Copyright (C) 2012-2017 Free Software Foundation, Inc.
+; Copyright (C) 2012-2024 Free Software Foundation, Inc.
; Contributed by Red Hat.
;
; This file is free software; you can redistribute it and/or modify it
.text
+ .section .text.__mspabi_srai_n
.macro _srai n
.global __mspabi_srai_\n
__mspabi_srai_\n:
RRA.W R12
.endm
-/* Logical Right Shift - R12 -> R12 */
+/* Arithmetic Right Shift - R12 -> R12. */
_srai 15
_srai 14
_srai 13
RET
#endif
+ .section .text.__mspabi_srai
1: ADD.W #-1,R13
RRA.W R12,R12
.global __mspabi_srai
RET
#endif
-/* Logical Right Shift - R12:R13 -> R12:R13 */
+#ifdef __MSP430X__
+ .section .text.__gnu_mspabi_srap
+1: ADDA #-1,R13
+ RRAX.A R12,R12
+ .global __gnu_mspabi_srap
+__gnu_mspabi_srap:
+ CMP #0,R13
+ JNZ 1b
+#ifdef __MSP430X_LARGE__
+ RETA
+#else
+ RET
+#endif /* __MSP430X_LARGE__ */
+#endif /* __MSP430X__ */
+
+/* Arithmetic Right Shift - R12:R13 -> R12:R13. */
+ .section .text.__mspabi_sral_n
.macro _sral n
.global __mspabi_sral_\n
__mspabi_sral_\n:
RET
#endif
+ .section .text.__mspabi_sral
1: ADD.W #-1,R14
RRA.W R13
RRC.W R12
#else
RET
#endif
+
+/* Arithmetic Right Shift - R8:R11 -> R12:R15
+ A 64-bit argument would normally be passed in R12:R15, but __mspabi_srall has
+ special conventions, so the 64-bit value to shift is passed in R8:R11.
+ According to the MSPABI, the shift amount is a 64-bit value in R12:R15, but
+ we only use the low word in R12. */
+
+ .section .text.__mspabi_srall
+ .global __mspabi_srall
+__mspabi_srall:
+ MOV R11, R15 ; Free up R11 first
+ MOV R12, R11 ; Save the shift amount in R11
+ MOV R10, R14
+ MOV R9, R13
+ MOV R8, R12
+ CMP #0, R11
+ JNZ 1f
+#ifdef __MSP430X_LARGE__
+ RETA
+#else
+ RET
+#endif
+1:
+ RRA R15
+ RRC R14
+ RRC R13
+ RRC R12
+ ADD #-1,R11
+ JNZ 1b
+#ifdef __MSP430X_LARGE__
+ RETA
+#else
+ RET
+#endif