diff --git a/src/main.rs b/src/main.rs index 46bbe93..0dfa6ac 100644 --- a/src/main.rs +++ b/src/main.rs @@ -98,7 +98,7 @@ fn main() { println!("VM Starting Up"); let mut vm = VMRV32I::new(); - let size = vm.load_prog("./test/test.bin"); + let size = vm.load_prog("./test/c_test.bin"); vm.dump_prog(size); vm.dispatch(); } diff --git a/src/system/bus.rs b/src/system/bus.rs index 198a058..7cd525f 100644 --- a/src/system/bus.rs +++ b/src/system/bus.rs @@ -1,7 +1,7 @@ pub const DRAM_BASE: u32 = 0x80000000; -use crate::system::rv32; use crate::system::ram; +use crate::system::rv32; pub struct Bus { memory: ram::RAM, @@ -9,92 +9,84 @@ pub struct Bus { impl Bus { pub fn new() -> Bus { - Bus { memory: ram::RAM::new() } + Bus { + memory: ram::RAM::new(), + } } pub fn load_8(&mut self, address: rv32::XLen) -> rv32::Byte { match address { - DRAM_BASE.. => { - self.memory.read_8(address) - } + DRAM_BASE.. => self.memory.read_8(address), _ => { - println!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); + panic!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); rv32::Byte::default() - }, + } } } pub fn load_16(&mut self, address: rv32::XLen) -> rv32::HalfWord { match address { - DRAM_BASE.. => { - self.memory.read_16(address) - } + DRAM_BASE.. => self.memory.read_16(address), _ => { - println!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); + panic!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); rv32::HalfWord::default() - }, + } } } pub fn load_32(&mut self, address: rv32::XLen) -> rv32::Word { match address { - DRAM_BASE.. => { - self.memory.read_32(address) - } + DRAM_BASE.. => self.memory.read_32(address), _ => { - println!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); + panic!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); rv32::Word::default() - }, + } } } pub fn load_64(&mut self, address: rv32::XLen) -> rv32::DoubleWord { match address { - DRAM_BASE.. => { - self.memory.read_64(address) - } + DRAM_BASE.. => self.memory.read_64(address), _ => { - println!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); + panic!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); rv32::DoubleWord::default() - }, + } } } pub fn store_8(&mut self, address: rv32::XLen, data: rv32::Byte) { match address { - DRAM_BASE.. => { - self.memory.write_8(address, data) - }, + DRAM_BASE.. => self.memory.write_8(address, data), _ => { - println!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); - }, + panic!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); + } } } - pub fn store_16(&mut self, address: rv32::XLen, data: rv32::HalfWord) { match address { + DRAM_BASE.. => self.memory.write_16(address, data), _ => { - println!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); - }, + panic!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); + } } } - pub fn store_32(&mut self, address: rv32::XLen, data: rv32::Word) { match address { + DRAM_BASE.. => self.memory.write_32(address, data), _ => { - println!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); - }, + panic!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); + } } } - pub fn store_64(&mut self, address: rv32::XLen, data: rv32::DoubleWord) { match address { + DRAM_BASE.. => self.memory.write_64(address, data), _ => { - println!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); - }, + panic!("VM > BUS > Peripheral at 0x{:08x} does not exist", address); + } } } } diff --git a/src/system/ram.rs b/src/system/ram.rs index cba81ce..6ad0144 100644 --- a/src/system/ram.rs +++ b/src/system/ram.rs @@ -59,4 +59,33 @@ impl RAM { let address = (address - bus::DRAM_BASE) as usize; memory[address] = data; } + + pub fn write_16(&mut self, address: rv32::XLen, data: rv32::HalfWord) { + let memory = &mut self.0; + let address = (address - bus::DRAM_BASE) as usize; + memory[address] = (data & 0xFF) as rv32::Byte; + memory[address + 1] = ((data >> 8) & 0xFF) as rv32::Byte; + } + + pub fn write_32(&mut self, address: rv32::XLen, data: rv32::Word) { + let memory = &mut self.0; + let address = (address - bus::DRAM_BASE) as usize; + memory[address] = (data & 0xFF) as rv32::Byte; + memory[address + 1] = ((data >> 8) & 0xFF) as rv32::Byte; + memory[address + 2] = ((data >> 16) & 0xFF) as rv32::Byte; + memory[address + 3] = ((data >> 24) & 0xFF) as rv32::Byte; + } + + pub fn write_64(&mut self, address: rv32::XLen, data: rv32::DoubleWord) { + let memory = &mut self.0; + let address = (address - bus::DRAM_BASE) as usize; + memory[address] = (data & 0xFF) as rv32::Byte; + memory[address + 1] = ((data >> 8) & 0xFF) as rv32::Byte; + memory[address + 2] = ((data >> 16) & 0xFF) as rv32::Byte; + memory[address + 3] = ((data >> 24) & 0xFF) as rv32::Byte; + memory[address + 4] = ((data >> 32) & 0xFF) as rv32::Byte; + memory[address + 5] = ((data >> 40) & 0xFF) as rv32::Byte; + memory[address + 6] = ((data >> 48) & 0xFF) as rv32::Byte; + memory[address + 7] = ((data >> 56) & 0xFF) as rv32::Byte; + } } diff --git a/test/Makefile b/test/Makefile index 8a6ae6c..9454199 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,10 +1,14 @@ -TARGET=test +TARGET=c_test GCC_PREFIX=riscv32-unknown-elf all: build assemble: - $(GCC_PREFIX)-gcc -S $(TARGET).c + $(GCC_PREFIX)-gcc -Wl,-Ttext=0x0 -nostdlib -march=rv64i -mabi=lp64 -o $(TARGET) $(TARGET).c + $(GCC_PREFIX)-objdump -t $(TARGET) > $(TARGET).map + $(GCC_PREFIX)-objdump -d -M no-aliases $(TARGET) > $(TARGET).lst + $(GCC_PREFIX)-objcopy -O binary $(TARGET) $(TARGET).bin + $(GCC_PREFIX)-objcopy -O ihex $(TARGET) $(TARGET).hex build: $(GCC_PREFIX)-gcc -Wl,-Ttext=0x0 -nostdlib -march=rv64i -mabi=lp64 -o $(TARGET) $(TARGET).S diff --git a/test/c_test b/test/c_test new file mode 100644 index 0000000..4eb41af Binary files /dev/null and b/test/c_test differ diff --git a/test/c_test.bin b/test/c_test.bin new file mode 100644 index 0000000..684f659 Binary files /dev/null and b/test/c_test.bin differ diff --git a/test/c_test.c b/test/c_test.c new file mode 100644 index 0000000..5b93b77 --- /dev/null +++ b/test/c_test.c @@ -0,0 +1,12 @@ +int fib(int n); + +int main() { + return fib(10); // Calculate the 10th fibonacci number. +} + +int fib(int n) { + if (n == 0 || n == 1) + return n; + else + return (fib(n - 1) + fib(n - 2)); +} diff --git a/test/c_test.hex b/test/c_test.hex new file mode 100644 index 0000000..30f4ac5 --- /dev/null +++ b/test/c_test.hex @@ -0,0 +1,14 @@ +:10000000130101FF23341100233081001304010187 +:100010001305A000EF00C00193070500138507003A +:100020008330810003340100130101016780000067 +:10003000130101FD2334110223308102233C91007E +:100040001304010393070500232EF4FC8327C4FD4A +:100050009B870700638A07008327C4FD1B8707006F +:10006000930710006316F7008327C4FD6F00000498 +:100070008327C4FD9B87F7FF9B8707001385070035 +:10008000EFF01FFB93070500938407008327C4FD4F +:100090009B87E7FF9B87070013850700EFF05FF959 +:1000A00093070500BB87F4009B87070013850700B3 +:1000B000833081020334010283348101130101037F +:0400C0006780000055 +:00000001FF diff --git a/test/c_test.lst b/test/c_test.lst new file mode 100644 index 0000000..00ad8aa --- /dev/null +++ b/test/c_test.lst @@ -0,0 +1,58 @@ + +c_test: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: + 0: ff010113 addi sp,sp,-16 + 4: 00113423 sd ra,8(sp) + 8: 00813023 sd s0,0(sp) + c: 01010413 addi s0,sp,16 + 10: 00a00513 addi a0,zero,10 + 14: 01c000ef jal ra,30 + 18: 00050793 addi a5,a0,0 + 1c: 00078513 addi a0,a5,0 + 20: 00813083 ld ra,8(sp) + 24: 00013403 ld s0,0(sp) + 28: 01010113 addi sp,sp,16 + 2c: 00008067 jalr zero,0(ra) + +0000000000000030 : + 30: fd010113 addi sp,sp,-48 + 34: 02113423 sd ra,40(sp) + 38: 02813023 sd s0,32(sp) + 3c: 00913c23 sd s1,24(sp) + 40: 03010413 addi s0,sp,48 + 44: 00050793 addi a5,a0,0 + 48: fcf42e23 sw a5,-36(s0) + 4c: fdc42783 lw a5,-36(s0) + 50: 0007879b addiw a5,a5,0 + 54: 00078a63 beq a5,zero,68 + 58: fdc42783 lw a5,-36(s0) + 5c: 0007871b addiw a4,a5,0 + 60: 00100793 addi a5,zero,1 + 64: 00f71663 bne a4,a5,70 + 68: fdc42783 lw a5,-36(s0) + 6c: 0400006f jal zero,ac + 70: fdc42783 lw a5,-36(s0) + 74: fff7879b addiw a5,a5,-1 + 78: 0007879b addiw a5,a5,0 + 7c: 00078513 addi a0,a5,0 + 80: fb1ff0ef jal ra,30 + 84: 00050793 addi a5,a0,0 + 88: 00078493 addi s1,a5,0 + 8c: fdc42783 lw a5,-36(s0) + 90: ffe7879b addiw a5,a5,-2 + 94: 0007879b addiw a5,a5,0 + 98: 00078513 addi a0,a5,0 + 9c: f95ff0ef jal ra,30 + a0: 00050793 addi a5,a0,0 + a4: 00f487bb addw a5,s1,a5 + a8: 0007879b addiw a5,a5,0 + ac: 00078513 addi a0,a5,0 + b0: 02813083 ld ra,40(sp) + b4: 02013403 ld s0,32(sp) + b8: 01813483 ld s1,24(sp) + bc: 03010113 addi sp,sp,48 + c0: 00008067 jalr zero,0(ra) diff --git a/test/c_test.map b/test/c_test.map new file mode 100644 index 0000000..ad3349a --- /dev/null +++ b/test/c_test.map @@ -0,0 +1,20 @@ + +c_test: file format elf64-littleriscv + +SYMBOL TABLE: +0000000000000000 l d .text 0000000000000000 .text +0000000000000000 l d .comment 0000000000000000 .comment +0000000000000000 l d .riscv.attributes 0000000000000000 .riscv.attributes +0000000000000000 l df *ABS* 0000000000000000 c_test.c +00000000000018c4 g *ABS* 0000000000000000 __global_pointer$ +00000000000010c4 g .text 0000000000000000 __SDATA_BEGIN__ +0000000000000000 *UND* 0000000000000000 _start +00000000000010c8 g .text 0000000000000000 __BSS_END__ +00000000000010c4 g .text 0000000000000000 __bss_start +0000000000000000 g F .text 0000000000000030 main +00000000000010c4 g .text 0000000000000000 __DATA_BEGIN__ +00000000000010c4 g .text 0000000000000000 _edata +00000000000010c8 g .text 0000000000000000 _end +0000000000000030 g F .text 0000000000000094 fib + + diff --git a/test/fib.bin b/test/fib.bin new file mode 100644 index 0000000..684f659 Binary files /dev/null and b/test/fib.bin differ diff --git a/test/fibonacci b/test/fibonacci new file mode 100644 index 0000000..88bb4c9 Binary files /dev/null and b/test/fibonacci differ diff --git a/test/fibonacci.bin b/test/fibonacci.bin new file mode 100644 index 0000000..a7de0e7 Binary files /dev/null and b/test/fibonacci.bin differ diff --git a/test/fibonacci.hex b/test/fibonacci.hex new file mode 100644 index 0000000..4644523 --- /dev/null +++ b/test/fibonacci.hex @@ -0,0 +1,15 @@ +:10000000130101FE232E1100232C8100232A9100CD +:10001000130401022326A4FE0327C4FE9307100045 +:1000200063C6E7008327C4FE6F0000038327C4FE76 +:100030009387F7FF13850700EFF09FFC93040500FB +:100040008327C4FE9387E7FF13850700EFF05FFB6C +:1000500093070500B387F400138507008320C101CF +:100060000324810183244101130101026780000000 +:10007000130101FE232E8100130401022326A4FE96 +:100080008327C4FE138507000324C1011301010265 +:1000900067800000130101FE232E1100232C810034 +:1000A00013040102930720012326F4FE0325C4FE56 +:1000B000EFF01FF59307050013850700EFF05FFBD6 +:1000C0002324A4FE832784FE138507008320C10117 +:0C00D0000324810113010102678000007D +:00000001FF diff --git a/test/fibonacci.lst b/test/fibonacci.lst new file mode 100644 index 0000000..52d8fe0 --- /dev/null +++ b/test/fibonacci.lst @@ -0,0 +1,66 @@ + +fibonacci: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : + 0: fe010113 addi sp,sp,-32 + 4: 00112e23 sw ra,28(sp) + 8: 00812c23 sw s0,24(sp) + c: 00912a23 sw s1,20(sp) + 10: 02010413 addi s0,sp,32 + 14: fea42623 sw a0,-20(s0) + 18: fec42703 lw a4,-20(s0) + 1c: 00100793 addi a5,zero,1 + 20: 00e7c663 blt a5,a4,2c + 24: fec42783 lw a5,-20(s0) + 28: 0300006f jal zero,58 + 2c: fec42783 lw a5,-20(s0) + 30: fff78793 addi a5,a5,-1 + 34: 00078513 addi a0,a5,0 + 38: fc9ff0ef jal ra,0 + 3c: 00050493 addi s1,a0,0 + 40: fec42783 lw a5,-20(s0) + 44: ffe78793 addi a5,a5,-2 + 48: 00078513 addi a0,a5,0 + 4c: fb5ff0ef jal ra,0 + 50: 00050793 addi a5,a0,0 + 54: 00f487b3 add a5,s1,a5 + 58: 00078513 addi a0,a5,0 + 5c: 01c12083 lw ra,28(sp) + 60: 01812403 lw s0,24(sp) + 64: 01412483 lw s1,20(sp) + 68: 02010113 addi sp,sp,32 + 6c: 00008067 jalr zero,0(ra) + +0000000000000070 : + 70: fe010113 addi sp,sp,-32 + 74: 00812e23 sw s0,28(sp) + 78: 02010413 addi s0,sp,32 + 7c: fea42623 sw a0,-20(s0) + 80: fec42783 lw a5,-20(s0) + 84: 00078513 addi a0,a5,0 + 88: 01c12403 lw s0,28(sp) + 8c: 02010113 addi sp,sp,32 + 90: 00008067 jalr zero,0(ra) + +0000000000000094
: + 94: fe010113 addi sp,sp,-32 + 98: 00112e23 sw ra,28(sp) + 9c: 00812c23 sw s0,24(sp) + a0: 02010413 addi s0,sp,32 + a4: 01200793 addi a5,zero,18 + a8: fef42623 sw a5,-20(s0) + ac: fec42503 lw a0,-20(s0) + b0: f51ff0ef jal ra,0 + b4: 00050793 addi a5,a0,0 + b8: 00078513 addi a0,a5,0 + bc: fb5ff0ef jal ra,70 + c0: fea42423 sw a0,-24(s0) + c4: fe842783 lw a5,-24(s0) + c8: 00078513 addi a0,a5,0 + cc: 01c12083 lw ra,28(sp) + d0: 01812403 lw s0,24(sp) + d4: 02010113 addi sp,sp,32 + d8: 00008067 jalr zero,0(ra) diff --git a/test/fibonacci.map b/test/fibonacci.map new file mode 100644 index 0000000..693c385 --- /dev/null +++ b/test/fibonacci.map @@ -0,0 +1,21 @@ + +fibonacci: file format elf64-littleriscv + +SYMBOL TABLE: +0000000000000000 l d .text 0000000000000000 .text +0000000000000000 l d .comment 0000000000000000 .comment +0000000000000000 l d .riscv.attributes 0000000000000000 .riscv.attributes +0000000000000000 l df *ABS* 0000000000000000 fibonacci.c +00000000000018dc g *ABS* 0000000000000000 __global_pointer$ +00000000000010dc g .text 0000000000000000 __SDATA_BEGIN__ +0000000000000070 g F .text 0000000000000024 return_function +0000000000000000 *UND* 0000000000000000 _start +00000000000010e0 g .text 0000000000000000 __BSS_END__ +00000000000010dc g .text 0000000000000000 __bss_start +0000000000000094 g F .text 0000000000000048 main +00000000000010dc g .text 0000000000000000 __DATA_BEGIN__ +00000000000010dc g .text 0000000000000000 _edata +00000000000010e0 g .text 0000000000000000 _end +0000000000000000 g F .text 0000000000000070 fib + + diff --git a/test/test b/test/test index 4d3720b..3d926de 100755 Binary files a/test/test and b/test/test differ diff --git a/test/test.S b/test/test.S index 25a9534..d8f5ed9 100644 --- a/test/test.S +++ b/test/test.S @@ -1,11 +1,236 @@ -addi x2, x0, 0x69 -lui x3, 0xB00B5 -bne x2, x3, main -lui x1, 0x420 - +.file "binary_search.c" + .option nopic + .text + .align 2 + .globl binary_search + .type binary_search, @function +binary_search: + addi sp,sp,-48 + sw ra,44(sp) + sw s0,40(sp) + addi s0,sp,48 + sw a0,-36(s0) + sw a1,-40(s0) + sw a2,-44(s0) + sw a3,-48(s0) + lw a4,-48(s0) + lw a5,-44(s0) + sub a5,a4,a5 + srli a4,a5,31 + add a5,a4,a5 + srai a5,a5,1 + mv a4,a5 + lw a5,-44(s0) + add a5,a5,a4 + sw a5,-20(s0) + lw a4,-44(s0) + lw a5,-48(s0) + ble a4,a5,.L2 + li a5,-1 + j .L3 +.L2: + lw a5,-20(s0) + slli a5,a5,2 + lw a4,-36(s0) + add a5,a4,a5 + lw a5,0(a5) + lw a4,-40(s0) + bne a4,a5,.L4 + lw a5,-20(s0) + j .L3 +.L4: + lw a5,-20(s0) + slli a5,a5,2 + lw a4,-36(s0) + add a5,a4,a5 + lw a5,0(a5) + lw a4,-40(s0) + bge a4,a5,.L5 + lw a5,-20(s0) + addi a5,a5,-1 + mv a3,a5 + lw a2,-44(s0) + lw a1,-40(s0) + lw a0,-36(s0) + call binary_search + mv a5,a0 + j .L3 +.L5: + lw a5,-20(s0) + addi a5,a5,1 + lw a3,-48(s0) + mv a2,a5 + lw a1,-40(s0) + lw a0,-36(s0) + call binary_search + mv a5,a0 +.L3: + mv a0,a5 + lw ra,44(sp) + lw s0,40(sp) + addi sp,sp,48 + jr ra + .size binary_search, .-binary_search + .align 2 + .globl search + .type search, @function +search: + addi sp,sp,-32 + sw ra,28(sp) + sw s0,24(sp) + addi s0,sp,32 + sw a0,-20(s0) + sw a1,-24(s0) + sw a2,-28(s0) + lw a5,-28(s0) + addi a5,a5,-1 + mv a3,a5 + li a2,0 + lw a1,-24(s0) + lw a0,-20(s0) + call binary_search + mv a5,a0 + mv a0,a5 + lw ra,28(sp) + lw s0,24(sp) + addi sp,sp,32 + jr ra + .size search, .-search + .align 2 + .globl sort + .type sort, @function +sort: + addi sp,sp,-48 + sw s0,44(sp) + addi s0,sp,48 + sw a0,-36(s0) + sw a1,-40(s0) + sw zero,-20(s0) + j .L9 +.L13: + sw zero,-24(s0) + j .L10 +.L12: + lw a5,-24(s0) + addi a5,a5,1 + slli a5,a5,2 + lw a4,-36(s0) + add a5,a4,a5 + lw a4,0(a5) + lw a5,-24(s0) + slli a5,a5,2 + lw a3,-36(s0) + add a5,a3,a5 + lw a5,0(a5) + bge a4,a5,.L11 + lw a5,-24(s0) + slli a5,a5,2 + lw a4,-36(s0) + add a5,a4,a5 + lw a5,0(a5) + sw a5,-28(s0) + lw a5,-24(s0) + addi a5,a5,1 + slli a5,a5,2 + lw a4,-36(s0) + add a4,a4,a5 + lw a5,-24(s0) + slli a5,a5,2 + lw a3,-36(s0) + add a5,a3,a5 + lw a4,0(a4) + sw a4,0(a5) + lw a5,-24(s0) + addi a5,a5,1 + slli a5,a5,2 + lw a4,-36(s0) + add a5,a4,a5 + lw a4,-28(s0) + sw a4,0(a5) +.L11: + lw a5,-24(s0) + addi a5,a5,1 + sw a5,-24(s0) +.L10: + lw a4,-40(s0) + lw a5,-20(s0) + sub a5,a4,a5 + addi a5,a5,-1 + lw a4,-24(s0) + blt a4,a5,.L12 + lw a5,-20(s0) + addi a5,a5,1 + sw a5,-20(s0) +.L9: + lw a5,-40(s0) + addi a5,a5,-1 + lw a4,-20(s0) + blt a4,a5,.L13 + nop + mv a0,a5 + lw s0,44(sp) + addi sp,sp,48 + jr ra + .size sort, .-sort + .section .rodata + .align 2 +.LC0: + .word 0 + .word 6 + .word 8 + .word 4 + .word 3 + .word 9 + .word 7 + .word 5 + .text + .align 2 + .globl main + .type main, @function main: - addi x1, x0, 0x69 - lui x8, 0x80000 - lw x9, 0x0(x8) - # addi x8, x8, 1 - # sw x8, 0x80000000 + addi sp,sp,-64 + sw ra,60(sp) + sw s0,56(sp) + addi s0,sp,64 + lui a5,%hi(.LC0) + lw a7,%lo(.LC0)(a5) + addi a4,a5,%lo(.LC0) + lw a6,4(a4) + addi a4,a5,%lo(.LC0) + lw a0,8(a4) + addi a4,a5,%lo(.LC0) + lw a1,12(a4) + addi a4,a5,%lo(.LC0) + lw a2,16(a4) + addi a4,a5,%lo(.LC0) + lw a3,20(a4) + addi a4,a5,%lo(.LC0) + lw a4,24(a4) + addi a5,a5,%lo(.LC0) + lw a5,28(a5) + sw a7,-52(s0) + sw a6,-48(s0) + sw a0,-44(s0) + sw a1,-40(s0) + sw a2,-36(s0) + sw a3,-32(s0) + sw a4,-28(s0) + sw a5,-24(s0) + addi a5,s0,-52 + li a1,8 + mv a0,a5 + call sort + addi a5,s0,-52 + li a2,8 + li a1,9 + mv a0,a5 + call search + sw a0,-20(s0) + lw a5,-20(s0) + mv a0,a5 + lw ra,60(sp) + lw s0,56(sp) + addi sp,sp,64 + jr ra + .size main, .-main + .ident "GCC: (GNU) 7.2.0" diff --git a/test/test.bin b/test/test.bin index 488dac0..2d63fee 100755 Binary files a/test/test.bin and b/test/test.bin differ diff --git a/test/test.hex b/test/test.hex index a52b6cc..12fc73f 100644 --- a/test/test.hex +++ b/test/test.hex @@ -1,3 +1,51 @@ -:1000000013019006B7510BB063143100B7004200E2 -:0C00100093009006370400808324040055 +:10000000130101FD2326110223248102130401039D +:10001000232EA4FC232CB4FC232AC4FC2328D4FCC8 +:10002000032704FD832744FDB307F74013D7F701E7 +:10003000B307F70093D7174013870700832744FDC2 +:10004000B387E7002326F4FE032744FD832704FD3E +:1000500063D6E7009307F0FF6F0080088327C4FE94 +:10006000939727000327C4FDB307F70083A7070072 +:10007000032784FD6316F7008327C4FE6F00400644 +:100080008327C4FE939727000327C4FDB307F70017 +:1000900083A70700032784FD6354F7028327C4FE68 +:1000A0009387F7FF93860700032644FD832584FD8D +:1000B0000325C4FDEFF0DFF4930705006F00400255 +:1000C0008327C4FE93871700832604FD1386070049 +:1000D000832584FD0325C4FDEFF09FF293070500FF +:1000E000138507008320C102032481021301010349 +:1000F00067800000130101FE232E1100232C8100D4 +:10010000130401022326A4FE2324B4FE2322C4FEEA +:10011000832744FE9387F7FF9386070013060000AA +:10012000832584FE0325C4FEEFF09FED93070500B1 +:10013000138507008320C1010324810113010102FB +:1001400067800000130101FD2326810213040103CF +:10015000232EA4FC232CB4FC232604FE6F00C00C29 +:10016000232404FE6F00000A832784FE9387170070 +:10017000939727000327C4FDB307F70003A70700E1 +:10018000832784FE939727008326C4FDB387F60058 +:1001900083A707006352F706832784FE93972700FF +:1001A0000327C4FDB307F70083A707002322F4FE4B +:1001B000832784FE93871700939727000327C4FDA6 +:1001C0003307F700832784FE939727008326C4FD17 +:1001D000B387F6000327070023A0E700832784FEE8 +:1001E00093871700939727000327C4FDB307F700F1 +:1001F000032744FE23A0E700832784FE938717008C +:100200002324F4FE032784FD8327C4FEB307F740AD +:100210009387F7FF032784FEE348F7F48327C4FEA0 +:10022000938717002326F4FE832784FD9387F7FF27 +:100230000327C4FEE346F7F213000000138507000E +:100240000324C1021301010367800000130101FCB4 +:10025000232E1102232C8102130401048328802FF2 +:100260001307802F032847001307802F03258700DB +:100270001307802F8325C7001307802F032607014C +:100280001307802F832647011307802F0327870139 +:100290009307802F83A7C701232614FD232804FD7D +:1002A000232AA4FC232CB4FC232EC4FC2320D4FE3C +:1002B0002322E4FE2324F4FE9307C4FC930580006C +:1002C00013850700EFF01FE89307C4FC13068000B6 +:1002D0009305900013850700EFF0DFE12326A4FECD +:1002E0008327C4FE138507008320C10303248103F1 +:0802F000130101046780000006 +:1002F80000000000060000000800000004000000E4 +:1003080003000000090000000700000005000000CD :00000001FF diff --git a/test/test.lst b/test/test.lst index 3e9c15d..6205866 100644 --- a/test/test.lst +++ b/test/test.lst @@ -4,13 +4,200 @@ test: file format elf64-littleriscv Disassembly of section .text: -0000000000000000 : - 0: 06900113 addi sp,zero,105 - 4: b00b51b7 lui gp,0xb00b5 - 8: 00311463 bne sp,gp,10
- c: 004200b7 lui ra,0x420 +0000000000000000 : + 0: fd010113 addi sp,sp,-48 + 4: 02112623 sw ra,44(sp) + 8: 02812423 sw s0,40(sp) + c: 03010413 addi s0,sp,48 + 10: fca42e23 sw a0,-36(s0) + 14: fcb42c23 sw a1,-40(s0) + 18: fcc42a23 sw a2,-44(s0) + 1c: fcd42823 sw a3,-48(s0) + 20: fd042703 lw a4,-48(s0) + 24: fd442783 lw a5,-44(s0) + 28: 40f707b3 sub a5,a4,a5 + 2c: 01f7d713 srli a4,a5,0x1f + 30: 00f707b3 add a5,a4,a5 + 34: 4017d793 srai a5,a5,0x1 + 38: 00078713 addi a4,a5,0 + 3c: fd442783 lw a5,-44(s0) + 40: 00e787b3 add a5,a5,a4 + 44: fef42623 sw a5,-20(s0) + 48: fd442703 lw a4,-44(s0) + 4c: fd042783 lw a5,-48(s0) + 50: 00e7d663 bge a5,a4,5c + 54: fff00793 addi a5,zero,-1 + 58: 0880006f jal zero,e0 + 5c: fec42783 lw a5,-20(s0) + 60: 00279793 slli a5,a5,0x2 + 64: fdc42703 lw a4,-36(s0) + 68: 00f707b3 add a5,a4,a5 + 6c: 0007a783 lw a5,0(a5) + 70: fd842703 lw a4,-40(s0) + 74: 00f71663 bne a4,a5,80 + 78: fec42783 lw a5,-20(s0) + 7c: 0640006f jal zero,e0 + 80: fec42783 lw a5,-20(s0) + 84: 00279793 slli a5,a5,0x2 + 88: fdc42703 lw a4,-36(s0) + 8c: 00f707b3 add a5,a4,a5 + 90: 0007a783 lw a5,0(a5) + 94: fd842703 lw a4,-40(s0) + 98: 02f75463 bge a4,a5,c0 + 9c: fec42783 lw a5,-20(s0) + a0: fff78793 addi a5,a5,-1 + a4: 00078693 addi a3,a5,0 + a8: fd442603 lw a2,-44(s0) + ac: fd842583 lw a1,-40(s0) + b0: fdc42503 lw a0,-36(s0) + b4: f4dff0ef jal ra,0 + b8: 00050793 addi a5,a0,0 + bc: 0240006f jal zero,e0 + c0: fec42783 lw a5,-20(s0) + c4: 00178793 addi a5,a5,1 + c8: fd042683 lw a3,-48(s0) + cc: 00078613 addi a2,a5,0 + d0: fd842583 lw a1,-40(s0) + d4: fdc42503 lw a0,-36(s0) + d8: f29ff0ef jal ra,0 + dc: 00050793 addi a5,a0,0 + e0: 00078513 addi a0,a5,0 + e4: 02c12083 lw ra,44(sp) + e8: 02812403 lw s0,40(sp) + ec: 03010113 addi sp,sp,48 + f0: 00008067 jalr zero,0(ra) -0000000000000010
: - 10: 06900093 addi ra,zero,105 - 14: 80000437 lui s0,0x80000 - 18: 00042483 lw s1,0(s0) # ffffffff80000000 <__global_pointer$+0xffffffff7fffe7e4> +00000000000000f4 : + f4: fe010113 addi sp,sp,-32 + f8: 00112e23 sw ra,28(sp) + fc: 00812c23 sw s0,24(sp) + 100: 02010413 addi s0,sp,32 + 104: fea42623 sw a0,-20(s0) + 108: feb42423 sw a1,-24(s0) + 10c: fec42223 sw a2,-28(s0) + 110: fe442783 lw a5,-28(s0) + 114: fff78793 addi a5,a5,-1 + 118: 00078693 addi a3,a5,0 + 11c: 00000613 addi a2,zero,0 + 120: fe842583 lw a1,-24(s0) + 124: fec42503 lw a0,-20(s0) + 128: ed9ff0ef jal ra,0 + 12c: 00050793 addi a5,a0,0 + 130: 00078513 addi a0,a5,0 + 134: 01c12083 lw ra,28(sp) + 138: 01812403 lw s0,24(sp) + 13c: 02010113 addi sp,sp,32 + 140: 00008067 jalr zero,0(ra) + +0000000000000144 : + 144: fd010113 addi sp,sp,-48 + 148: 02812623 sw s0,44(sp) + 14c: 03010413 addi s0,sp,48 + 150: fca42e23 sw a0,-36(s0) + 154: fcb42c23 sw a1,-40(s0) + 158: fe042623 sw zero,-20(s0) + 15c: 0cc0006f jal zero,228 + 160: fe042423 sw zero,-24(s0) + 164: 0a00006f jal zero,204 + 168: fe842783 lw a5,-24(s0) + 16c: 00178793 addi a5,a5,1 + 170: 00279793 slli a5,a5,0x2 + 174: fdc42703 lw a4,-36(s0) + 178: 00f707b3 add a5,a4,a5 + 17c: 0007a703 lw a4,0(a5) + 180: fe842783 lw a5,-24(s0) + 184: 00279793 slli a5,a5,0x2 + 188: fdc42683 lw a3,-36(s0) + 18c: 00f687b3 add a5,a3,a5 + 190: 0007a783 lw a5,0(a5) + 194: 06f75263 bge a4,a5,1f8 + 198: fe842783 lw a5,-24(s0) + 19c: 00279793 slli a5,a5,0x2 + 1a0: fdc42703 lw a4,-36(s0) + 1a4: 00f707b3 add a5,a4,a5 + 1a8: 0007a783 lw a5,0(a5) + 1ac: fef42223 sw a5,-28(s0) + 1b0: fe842783 lw a5,-24(s0) + 1b4: 00178793 addi a5,a5,1 + 1b8: 00279793 slli a5,a5,0x2 + 1bc: fdc42703 lw a4,-36(s0) + 1c0: 00f70733 add a4,a4,a5 + 1c4: fe842783 lw a5,-24(s0) + 1c8: 00279793 slli a5,a5,0x2 + 1cc: fdc42683 lw a3,-36(s0) + 1d0: 00f687b3 add a5,a3,a5 + 1d4: 00072703 lw a4,0(a4) + 1d8: 00e7a023 sw a4,0(a5) + 1dc: fe842783 lw a5,-24(s0) + 1e0: 00178793 addi a5,a5,1 + 1e4: 00279793 slli a5,a5,0x2 + 1e8: fdc42703 lw a4,-36(s0) + 1ec: 00f707b3 add a5,a4,a5 + 1f0: fe442703 lw a4,-28(s0) + 1f4: 00e7a023 sw a4,0(a5) + 1f8: fe842783 lw a5,-24(s0) + 1fc: 00178793 addi a5,a5,1 + 200: fef42423 sw a5,-24(s0) + 204: fd842703 lw a4,-40(s0) + 208: fec42783 lw a5,-20(s0) + 20c: 40f707b3 sub a5,a4,a5 + 210: fff78793 addi a5,a5,-1 + 214: fe842703 lw a4,-24(s0) + 218: f4f748e3 blt a4,a5,168 + 21c: fec42783 lw a5,-20(s0) + 220: 00178793 addi a5,a5,1 + 224: fef42623 sw a5,-20(s0) + 228: fd842783 lw a5,-40(s0) + 22c: fff78793 addi a5,a5,-1 + 230: fec42703 lw a4,-20(s0) + 234: f2f746e3 blt a4,a5,160 + 238: 00000013 addi zero,zero,0 + 23c: 00078513 addi a0,a5,0 + 240: 02c12403 lw s0,44(sp) + 244: 03010113 addi sp,sp,48 + 248: 00008067 jalr zero,0(ra) + +000000000000024c
: + 24c: fc010113 addi sp,sp,-64 + 250: 02112e23 sw ra,60(sp) + 254: 02812c23 sw s0,56(sp) + 258: 04010413 addi s0,sp,64 + 25c: 2f802883 lw a7,760(zero) # 2f8 + 260: 2f800713 addi a4,zero,760 + 264: 00472803 lw a6,4(a4) + 268: 2f800713 addi a4,zero,760 + 26c: 00872503 lw a0,8(a4) + 270: 2f800713 addi a4,zero,760 + 274: 00c72583 lw a1,12(a4) + 278: 2f800713 addi a4,zero,760 + 27c: 01072603 lw a2,16(a4) + 280: 2f800713 addi a4,zero,760 + 284: 01472683 lw a3,20(a4) + 288: 2f800713 addi a4,zero,760 + 28c: 01872703 lw a4,24(a4) + 290: 2f800793 addi a5,zero,760 + 294: 01c7a783 lw a5,28(a5) + 298: fd142623 sw a7,-52(s0) + 29c: fd042823 sw a6,-48(s0) + 2a0: fca42a23 sw a0,-44(s0) + 2a4: fcb42c23 sw a1,-40(s0) + 2a8: fcc42e23 sw a2,-36(s0) + 2ac: fed42023 sw a3,-32(s0) + 2b0: fee42223 sw a4,-28(s0) + 2b4: fef42423 sw a5,-24(s0) + 2b8: fcc40793 addi a5,s0,-52 + 2bc: 00800593 addi a1,zero,8 + 2c0: 00078513 addi a0,a5,0 + 2c4: e81ff0ef jal ra,144 + 2c8: fcc40793 addi a5,s0,-52 + 2cc: 00800613 addi a2,zero,8 + 2d0: 00900593 addi a1,zero,9 + 2d4: 00078513 addi a0,a5,0 + 2d8: e1dff0ef jal ra,f4 + 2dc: fea42623 sw a0,-20(s0) + 2e0: fec42783 lw a5,-20(s0) + 2e4: 00078513 addi a0,a5,0 + 2e8: 03c12083 lw ra,60(sp) + 2ec: 03812403 lw s0,56(sp) + 2f0: 04010113 addi sp,sp,64 + 2f4: 00008067 jalr zero,0(ra) diff --git a/test/test.map b/test/test.map index b451ca3..108457f 100644 --- a/test/test.map +++ b/test/test.map @@ -3,16 +3,21 @@ test: file format elf64-littleriscv SYMBOL TABLE: 0000000000000000 l d .text 0000000000000000 .text +00000000000002f8 l d .rodata 0000000000000000 .rodata +0000000000000000 l d .comment 0000000000000000 .comment 0000000000000000 l d .riscv.attributes 0000000000000000 .riscv.attributes -0000000000000000 l df *ABS* 0000000000000000 ccA8a8we.o -0000000000000010 l .text 0000000000000000 main -000000000000181c g *ABS* 0000000000000000 __global_pointer$ -000000000000101c g .text 0000000000000000 __SDATA_BEGIN__ +0000000000000000 l df *ABS* 0000000000000000 binary_search.c +0000000000001b18 g *ABS* 0000000000000000 __global_pointer$ +00000000000000f4 g F .text 0000000000000050 search +0000000000001318 g .rodata 0000000000000000 __SDATA_BEGIN__ +0000000000000144 g F .text 0000000000000108 sort 0000000000000000 *UND* 0000000000000000 _start -0000000000001020 g .text 0000000000000000 __BSS_END__ -000000000000101c g .text 0000000000000000 __bss_start -000000000000101c g .text 0000000000000000 __DATA_BEGIN__ -000000000000101c g .text 0000000000000000 _edata -0000000000001020 g .text 0000000000000000 _end +0000000000001318 g .rodata 0000000000000000 __BSS_END__ +0000000000001318 g .rodata 0000000000000000 __bss_start +000000000000024c g F .text 00000000000000ac main +0000000000001318 g .rodata 0000000000000000 __DATA_BEGIN__ +0000000000001318 g .rodata 0000000000000000 _edata +0000000000001318 g .rodata 0000000000000000 _end +0000000000000000 g F .text 00000000000000f4 binary_search