From eb5a74770211a1a87e191b9db5523c3a41887fbf Mon Sep 17 00:00:00 2001 From: Pavel Pisa <pisa@cmp.felk.cvut.cz> Date: Tue, 15 Feb 2022 02:29:25 +0100 Subject: [PATCH] seminaries/qtrvsim: update vect-add2 and vect-inc for RISC-V as well. Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz> --- seminaries/qtrvsim/vect-add2/.gitignore | 3 + seminaries/qtrvsim/vect-add2/Makefile | 80 +++++++++++++++++++++++ seminaries/qtrvsim/vect-add2/vect-add2.S | 81 ++++++++++++++++++++++++ seminaries/qtrvsim/vect-inc/.gitignore | 3 + seminaries/qtrvsim/vect-inc/Makefile | 80 +++++++++++++++++++++++ seminaries/qtrvsim/vect-inc/vect-inc.S | 59 +++++++++++++++++ 6 files changed, 306 insertions(+) create mode 100644 seminaries/qtrvsim/vect-add2/.gitignore create mode 100644 seminaries/qtrvsim/vect-add2/Makefile create mode 100644 seminaries/qtrvsim/vect-add2/vect-add2.S create mode 100644 seminaries/qtrvsim/vect-inc/.gitignore create mode 100644 seminaries/qtrvsim/vect-inc/Makefile create mode 100644 seminaries/qtrvsim/vect-inc/vect-inc.S diff --git a/seminaries/qtrvsim/vect-add2/.gitignore b/seminaries/qtrvsim/vect-add2/.gitignore new file mode 100644 index 0000000..9c6bbd1 --- /dev/null +++ b/seminaries/qtrvsim/vect-add2/.gitignore @@ -0,0 +1,3 @@ +*.o +depend +vect-add2 \ No newline at end of file diff --git a/seminaries/qtrvsim/vect-add2/Makefile b/seminaries/qtrvsim/vect-add2/Makefile new file mode 100644 index 0000000..3091c13 --- /dev/null +++ b/seminaries/qtrvsim/vect-add2/Makefile @@ -0,0 +1,80 @@ +ARCH=riscv64-unknown-elf + +SOURCES = vect-add2.S +TARGET_EXE = vect-add2 + +LDFLAGS += -Wl,-Ttext,0x200 -Wl,-Tdata,0x400 + + +CC=$(ARCH)-gcc +CXX=$(ARCH)-g++ +AS=$(ARCH)-as +LD=$(ARCH)-ld +OBJCOPY=$(ARCH)-objcopy + +ARCHFLAGS += -mabi=ilp32 +ARCHFLAGS += -march=rv32i +ARCHFLAGS += -fno-lto + +CFLAGS += -ggdb -Os -Wall +CXXFLAGS+= -ggdb -Os -Wall +AFLAGS += -ggdb +LDFLAGS += -ggdb +LDFLAGS += -nostartfiles +LDFLAGS += -nostdlib +LDFLAGS += -static +#LDFLAGS += -specs=/opt/musl/riscv64-linux-gnu/lib/musl-gcc.specs + +CFLAGS += $(ARCHFLAGS) +CXXFLAGS+= $(ARCHFLAGS) +AFLAGS += $(ARCHFLAGS) +LDFLAGS += $(ARCHFLAGS) + +OBJECTS += $(filter %.o,$(SOURCES:%.S=%.o)) +OBJECTS += $(filter %.o,$(SOURCES:%.c=%.o)) +OBJECTS += $(filter %.o,$(SOURCES:%.cpp=%.o)) + +all : default + +.PHONY : default clean dep all + +%.o:%.S + $(CC) -D__ASSEMBLY__ $(AFLAGS) -c $< -o $@ + +%.o:%.c + $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ + +%.o:%.cpp + $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< + +%.s:%.c + $(CC) $(CFLAGS) $(CPPFLAGS) -S $< -o $@ + +default : $(TARGET_EXE) + +$(TARGET_EXE) : $(OBJECTS) + $(CC) $(LDFLAGS) $^ -o $@ + +dep: depend + +depend: $(SOURCES) $(glob *.h) + echo '# autogenerated dependencies' > depend +ifneq ($(filter %.S,$(SOURCES)),) + $(CC) -D__ASSEMBLY__ $(AFLAGS) -w -E -M $(filter %.S,$(SOURCES)) \ + >> depend +endif +ifneq ($(filter %.c,$(SOURCES)),) + $(CC) $(CFLAGS) $(CPPFLAGS) -w -E -M $(filter %.c,$(SOURCES)) \ + >> depend +endif +ifneq ($(filter %.cpp,$(SOURCES)),) + $(CXX) $(CXXFLAGS) $(CPPFLAGS) -w -E -M $(filter %.cpp,$(SOURCES)) \ + >> depend +endif + +clean: + rm -f *.o *.a $(OBJECTS) $(TARGET_EXE) depend + +#mips-elf-objdump --source -M no-aliases,reg-names=numeric qtmips_binrep + +-include depend diff --git a/seminaries/qtrvsim/vect-add2/vect-add2.S b/seminaries/qtrvsim/vect-add2/vect-add2.S new file mode 100644 index 0000000..e7023dc --- /dev/null +++ b/seminaries/qtrvsim/vect-add2/vect-add2.S @@ -0,0 +1,81 @@ +// Directives to make interresting windows visible +#pragma qtrvsim show registers +#pragma qtrvsim show memory + +.globl _start + +.option norelax + +.text + +// int *pa; +// int *pb; + +_start: +main: +loop: + la x5, vect_a // pa = vec_a + la x6, vect_b // pb = vec_b + addi x8, x0, 16 // int i = 16 +vect_next: // do { + lw x2, 0(x5) // r2 = *pa + lw x3, 0(x6) // r3 = *pb + add x2, x2, x3 // r2 = r2 + r3 + sw x2, 0(x6) // *pa = r2 + + addi x5, x5, 4 // pa++ + addi x6, x6, 4 // pb++ + addi x8, x8, -1 // i-- + bne x8, x0, vect_next // } while (i != 0) + + // stop execution wait for debugger/user + ebreak + // ensure that continuation does not + // interpret random data + beq x0, x0, loop + +.bss + +.org 0x400 + +.data + +vect_a: // int vect_a[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0}; + .word 0x01 + .word 0x02 + .word 0x03 + .word 0x04 + .word 0x05 + .word 0x06 + .word 0x07 + .word 0x08 + .word 0x09 + .word 0x0a + .word 0x0b + .word 0x0c + .word 0x0d + .word 0x0e + .word 0x0f + .word 0x00 + +vect_b: // int vect_b[16] = {16, 32, 48, 64, ...}; + .word 0x10 + .word 0x20 + .word 0x30 + .word 0x40 + .word 0x50 + .word 0x60 + .word 0x70 + .word 0x80 + .word 0x90 + .word 0xa0 + .word 0xb0 + .word 0xc0 + .word 0xd0 + .word 0xe0 + .word 0xf0 + .word 0x00 + +// Specify location to show in memory window +#pragma qtrvsim focus memory vect_a + diff --git a/seminaries/qtrvsim/vect-inc/.gitignore b/seminaries/qtrvsim/vect-inc/.gitignore new file mode 100644 index 0000000..c3f4054 --- /dev/null +++ b/seminaries/qtrvsim/vect-inc/.gitignore @@ -0,0 +1,3 @@ +*.o +depend +vect-inc diff --git a/seminaries/qtrvsim/vect-inc/Makefile b/seminaries/qtrvsim/vect-inc/Makefile new file mode 100644 index 0000000..d7cbd6d --- /dev/null +++ b/seminaries/qtrvsim/vect-inc/Makefile @@ -0,0 +1,80 @@ +ARCH=riscv64-unknown-elf + +SOURCES = vect-inc.S +TARGET_EXE = vect-inc + +LDFLAGS += -Wl,-Ttext,0x200 -Wl,-Tdata,0x400 + + +CC=$(ARCH)-gcc +CXX=$(ARCH)-g++ +AS=$(ARCH)-as +LD=$(ARCH)-ld +OBJCOPY=$(ARCH)-objcopy + +ARCHFLAGS += -mabi=ilp32 +ARCHFLAGS += -march=rv32i +ARCHFLAGS += -fno-lto + +CFLAGS += -ggdb -Os -Wall +CXXFLAGS+= -ggdb -Os -Wall +AFLAGS += -ggdb +LDFLAGS += -ggdb +LDFLAGS += -nostartfiles +LDFLAGS += -nostdlib +LDFLAGS += -static +#LDFLAGS += -specs=/opt/musl/riscv64-linux-gnu/lib/musl-gcc.specs + +CFLAGS += $(ARCHFLAGS) +CXXFLAGS+= $(ARCHFLAGS) +AFLAGS += $(ARCHFLAGS) +LDFLAGS += $(ARCHFLAGS) + +OBJECTS += $(filter %.o,$(SOURCES:%.S=%.o)) +OBJECTS += $(filter %.o,$(SOURCES:%.c=%.o)) +OBJECTS += $(filter %.o,$(SOURCES:%.cpp=%.o)) + +all : default + +.PHONY : default clean dep all + +%.o:%.S + $(CC) -D__ASSEMBLY__ $(AFLAGS) -c $< -o $@ + +%.o:%.c + $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ + +%.o:%.cpp + $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< + +%.s:%.c + $(CC) $(CFLAGS) $(CPPFLAGS) -S $< -o $@ + +default : $(TARGET_EXE) + +$(TARGET_EXE) : $(OBJECTS) + $(CC) $(LDFLAGS) $^ -o $@ + +dep: depend + +depend: $(SOURCES) $(glob *.h) + echo '# autogenerated dependencies' > depend +ifneq ($(filter %.S,$(SOURCES)),) + $(CC) -D__ASSEMBLY__ $(AFLAGS) -w -E -M $(filter %.S,$(SOURCES)) \ + >> depend +endif +ifneq ($(filter %.c,$(SOURCES)),) + $(CC) $(CFLAGS) $(CPPFLAGS) -w -E -M $(filter %.c,$(SOURCES)) \ + >> depend +endif +ifneq ($(filter %.cpp,$(SOURCES)),) + $(CXX) $(CXXFLAGS) $(CPPFLAGS) -w -E -M $(filter %.cpp,$(SOURCES)) \ + >> depend +endif + +clean: + rm -f *.o *.a $(OBJECTS) $(TARGET_EXE) depend + +#mips-elf-objdump --source -M no-aliases,reg-names=numeric qtmips_binrep + +-include depend diff --git a/seminaries/qtrvsim/vect-inc/vect-inc.S b/seminaries/qtrvsim/vect-inc/vect-inc.S new file mode 100644 index 0000000..1146b7c --- /dev/null +++ b/seminaries/qtrvsim/vect-inc/vect-inc.S @@ -0,0 +1,59 @@ +// Directives to make interresting windows visible +#pragma qtrvsim show registers +#pragma qtrvsim show memory + +.globl _start + +.option norelax + +.text + +// int *pa; + +_start: +main: +loop: + la x5, vect_a // pa = vec_a + addi x8, x0, 16 // int i = 16 +vect_next: // do { + lw x2, 0(x5) // r2 = *pa + addi x2, x2, 1 // r2 = r2 + 1 + sw x2, 0(x5) // *pa = r2 + + addi x5, x5, 4 // pa++ + addi x8, x8, -1 // i-- + bne x8, x0, vect_next // } while (i != 0) + + // stop execution wait for debugger/user + ebreak + // ensure that continuation does not + // interpret random data + beq x0, x0, loop + +.bss + +.org 0x400 + +.data + +vect_a: // int vect_a[16] = {1, 2, 3, ...}; + .word 0x01 + .word 0x02 + .word 0x03 + .word 0x04 + .word 0x05 + .word 0x06 + .word 0x07 + .word 0x08 + .word 0x09 + .word 0x0a + .word 0x0b + .word 0x0c + .word 0x0d + .word 0x0e + .word 0x0f + .word 0x00 + +// Specify location to show in memory window +#pragma qtrvsim focus memory vect_a + -- GitLab