@@ -35,6 +35,12 @@ ifeq ($(QEMU_ARCH),riscv32)
3535MICROPY_HEAP_SIZE ?= 143360
3636FROZEN_MANIFEST ?= "require('unittest'); freeze('test-frzmpy', ('frozen_asm_rv32.py', 'frozen_const.py', 'frozen_viper.py', 'native_frozen_align.py'))"
3737endif
38+ ifeq ($(QEMU_ARCH ) ,riscv64)
39+ MICROPY_HEAP_SIZE ?= 204800
40+ FROZEN_MANIFEST ?= "require('unittest'); freeze('test-frzmpy', ('frozen_const.py',))"
41+ endif
42+
43+ MICROPY_FLOAT_IMPL ?= float
3844
3945# include py core make definitions
4046include $(TOP ) /py/py.mk
@@ -44,6 +50,20 @@ GIT_SUBMODULES += lib/berkeley-db-1.xx
4450
4551CFLAGS += -DMICROPY_HEAP_SIZE=$(MICROPY_HEAP_SIZE )
4652
53+ ifeq ($(MICROPY_FLOAT_IMPL ) ,double)
54+ CFLAGS += -DMICROPY_FLOAT_IMPL=MICROPY_FLOAT_IMPL_DOUBLE
55+ else ifeq ($(MICROPY_FLOAT_IMPL),float)
56+ CFLAGS += -DMICROPY_FLOAT_IMPL=MICROPY_FLOAT_IMPL_FLOAT -fsingle-precision-constant
57+ else
58+ CFLAGS += -DMICROPY_FLOAT_IMPL=MICROPY_FLOAT_IMPL_NONE
59+ endif
60+
61+ ifeq ($(SUPPORTS_HARDWARE_FP_SINGLE ) ,1)
62+ CFLAGS += -DMICROPY_HW_FPU=1
63+ else ifeq ($(SUPPORTS_HARDWARE_FP_DOUBLE),1)
64+ CFLAGS += -DMICROPY_HW_FPU=1
65+ endif
66+
4767# ###############################################################################
4868# ARM specific settings
4969
@@ -57,6 +77,7 @@ LIBS = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
5777SRC_C += \
5878 mcu/arm/errorhandler.c \
5979 mcu/arm/startup.c \
80+ mcu/arm/systick.c \
6081 shared/runtime/semihosting_arm.c \
6182
6283endif
@@ -94,6 +115,39 @@ SRC_BOARD_O += mcu/rv32/entrypoint.o
94115
95116endif
96117
118+ # ###############################################################################
119+ # RISC-V 64-bit specific settings
120+
121+ ifeq ($(QEMU_ARCH ) ,riscv64)
122+
123+ CROSS_COMPILE ?= riscv64-unknown-elf-
124+
125+ GCC_VERSION = $(word 1, $(subst ., , $(shell $(CC ) -dumpversion) ) )
126+
127+ RV64_ABI = lp64
128+
129+ QEMU_ARGS += -bios none
130+
131+ # GCC 10 and lower do not recognise the Zicsr extension in the architecture name.
132+ ifeq ($(shell test $(GCC_VERSION ) -le 10; echo $$? ) ,0)
133+ RV64_ARCH ?= rv64imac
134+ else
135+ # Recent GCC versions explicitly require to declare extensions.
136+ RV64_ARCH ?= rv64imac_zicsr
137+ endif
138+
139+ AFLAGS += -mabi=$(RV64_ABI ) -march=$(RV64_ARCH )
140+ CFLAGS += $(AFLAGS ) -mcmodel=medany
141+ LDFLAGS += -mabi=$(RV64_ABI ) -march=$(RV64_ARCH ) -Wl,-EL -mcmodel=medany
142+
143+ SRC_C += \
144+ mcu/rv64/interrupts.c \
145+ mcu/rv64/startup.c \
146+
147+ SRC_BOARD_O += mcu/rv64/entrypoint.o
148+
149+ endif
150+
97151# ###############################################################################
98152# Project specific settings and compiler/linker flags
99153
@@ -140,7 +194,7 @@ CFLAGS += $(SPECS_FRAGMENT)
140194LDFLAGS += $(SPECS_FRAGMENT )
141195endif
142196
143- RUN_TESTS_FULL_ARGS = -t execpty:"$(QEMU_SYSTEM ) $(QEMU_ARGS ) -serial pty -kernel ../ports/qemu/$< " $(RUN_TESTS_ARGS )
197+ RUN_TESTS_FULL_ARGS = -t execpty:"$(QEMU_SYSTEM ) $(QEMU_ARGS ) -serial pty -kernel ../ports/qemu/$< " --mpy-cross-flags=' $( MPY_CROSS_FLAGS ) ' $(RUN_TESTS_ARGS )
144198
145199# ###############################################################################
146200# Source files and libraries
@@ -156,21 +210,34 @@ SRC_C += \
156210 shared/runtime/stdout_helpers.c \
157211 shared/runtime/sys_stdio_mphal.c \
158212
159- LIB_SRC_C += $(SRC_LIB_LIBM_C )
160- LIB_SRC_C += $(SRC_LIB_LIBM_SQRT_SW_C )
213+ ifeq ($(MICROPY_FLOAT_IMPL ) ,double)
214+ LIBM_SRC_C += $(SRC_LIB_LIBM_DBL_C )
215+ ifeq ($(SUPPORTS_HARDWARE_FP_DOUBLE ) ,1)
216+ LIBM_SRC_C += $(SRC_LIB_LIBM_DBL_SQRT_HW_C )
217+ else
218+ LIBM_SRC_C += $(SRC_LIB_LIBM_DBL_SQRT_SW_C )
219+ endif
220+ else
221+ LIBM_SRC_C += $(SRC_LIB_LIBM_C )
222+ ifeq ($(SUPPORTS_HARDWARE_FP_SINGLE ) ,1)
223+ LIBM_SRC_C += $(SRC_LIB_LIBM_SQRT_HW_C )
224+ else
225+ LIBM_SRC_C += $(SRC_LIB_LIBM_SQRT_SW_C )
226+ endif
227+ endif
161228
162229OBJ += $(PY_O )
163230OBJ += $(addprefix $(BUILD ) /, $(SRC_C:.c=.o ) )
164231OBJ += $(addprefix $(BUILD ) /, $(SRC_BOARD_O ) )
165- OBJ += $(addprefix $(BUILD ) /, $(LIB_SRC_C :.c=.o ) )
232+ OBJ += $(addprefix $(BUILD ) /, $(LIBM_SRC_C :.c=.o ) )
166233
167234# List of sources for qstr extraction
168- SRC_QSTR += $(SRC_C ) $(LIB_SRC_C )
235+ SRC_QSTR += $(SRC_C ) $(LIBM_SRC_C )
169236
170237# ###############################################################################
171238# Main targets
172239
173- all : $(BUILD ) /firmware.elf
240+ all : $(OBJ )
174241
175242.PHONY : repl
176243repl : $(BUILD ) /firmware.elf
@@ -196,7 +263,7 @@ test_natmod: $(BUILD)/firmware.elf
196263 $(eval DIRNAME=ports/$(notdir $(CURDIR ) ) )
197264 cd $(TOP ) /tests && \
198265 for natmod in btree deflate framebuf heapq random_basic re; do \
199- ./run-natmodtests.py -p -d execpty:" $( QEMU_SYSTEM) $( QEMU_ARGS) -serial pty -kernel ../$( DIRNAME) /$<" $(RUN_TESTS_EXTRA ) extmod/$$ natmod* .py; \
266+ ./run-natmodtests.py -t execpty:" $( QEMU_SYSTEM) $( QEMU_ARGS) -serial pty -kernel ../$( DIRNAME) /$<" $(RUN_TESTS_EXTRA ) extmod/$$ natmod* .py; \
200267 done
201268
202269$(BUILD ) /firmware.elf : $(LDSCRIPT ) $(OBJ )
0 commit comments