VCD for power

This commit is contained in:
fares 2019-11-21 23:25:51 -05:00
commit c4d315dfed
37 changed files with 30538 additions and 820290 deletions

View file

@ -34,7 +34,7 @@ PROJECT=saxpy
all: $(PROJECT).dump $(PROJECT).hex
lib$(PROJECT).a: kernel.cl
POCL_DEBUG=all POCL_DEBUG_LLVM_PASSES=1 LD_LIBRARY_PATH=$(RISCV_TOOL_PATH)/lib:$(POCL_CC_PATH)/lib $(POCL_CC_PATH)/bin/poclcc -o kernel.pocl kernel.cl
POCL_DEBUG=all POCL_DEBUG_LLVM_PASSES=1 LD_LIBRARY_PATH=$(RISCV_TOOL_PATH)/lib:$(POCL_CC_PATH)/lib $(POCL_CC_PATH)/bin/poclcc -o lib$(PROJECT).a kernel.cl
$(PROJECT).elf: main.cc lib$(PROJECT).a
$(CXX) $(CXXFLAGS) -I$(POCL_RT_PATH)/include -L$(POCL_RT_PATH)/lib/static -L. $(VX_SRCS) main.cc -Wl,--whole-archive -l$(PROJECT) -Wl,--no-whole-archive $(LIBS) -o $(PROJECT).elf

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load diff

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -34,7 +34,7 @@ PROJECT=sfilter
all: $(PROJECT).dump $(PROJECT).hex
lib$(PROJECT).a: kernel.cl
POCL_DEBUG=all POCL_DEBUG_LLVM_PASSES=1 LD_LIBRARY_PATH=$(RISCV_TOOL_PATH)/lib:$(POCL_CC_PATH)/lib $(POCL_CC_PATH)/bin/poclcc -o kernel.pocl kernel.cl
POCL_DEBUG=all POCL_DEBUG_LLVM_PASSES=1 LD_LIBRARY_PATH=$(RISCV_TOOL_PATH)/lib:$(POCL_CC_PATH)/lib $(POCL_CC_PATH)/bin/poclcc -o lib$(PROJECT).a kernel.cl
$(PROJECT).elf: main.cc lib$(PROJECT).a
$(CXX) $(CXXFLAGS) -I$(POCL_RT_PATH)/include -L$(POCL_RT_PATH)/lib/static -L. $(VX_SRCS) main.cc -Wl,--whole-archive -l$(PROJECT) -Wl,--no-whole-archive $(LIBS) -o $(PROJECT).elf

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -34,7 +34,7 @@ PROJECT=sgemm
all: $(PROJECT).dump $(PROJECT).hex
lib$(PROJECT).a: kernel.cl
POCL_DEBUG=all POCL_DEBUG_LLVM_PASSES=1 LD_LIBRARY_PATH=$(RISCV_TOOL_PATH)/lib:$(POCL_CC_PATH)/lib $(POCL_CC_PATH)/bin/poclcc -o kernel.pocl kernel.cl
POCL_DEBUG=all POCL_DEBUG_LLVM_PASSES=1 LD_LIBRARY_PATH=$(RISCV_TOOL_PATH)/lib:$(POCL_CC_PATH)/lib $(POCL_CC_PATH)/bin/poclcc -o lib$(PROJECT).a kernel.cl
$(PROJECT).elf: main.cc lib$(PROJECT).a
$(CXX) $(CXXFLAGS) -I$(POCL_RT_PATH)/include -L$(POCL_RT_PATH)/lib/static -L. $(VX_SRCS) main.cc -Wl,--whole-archive -l$(PROJECT) -Wl,--no-whole-archive $(LIBS) -o $(PROJECT).elf

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load diff

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -381,15 +381,7 @@ Instruction *WordDecoder::decode(const std::vector<Byte> &v, Size &idx) {
imeed = 0 | (bits_10_1 << 1) | (bit_11 << 11) | (bits_19_12 << 12) | (bit_20 << 20);
// cout << "Immediate src: " << hex << imeed << "\n";
// cout << "bit 20 = " << bit_20 << '\n';
// if (bit_20 == 1)
// {
// imeed = imeed * -1;
// }
inst.setSrcImm(signExt(imeed, 21, j_immed_mask));
inst.setSrcImm(signExt(imeed, 20, j_immed_mask));
usedImm = true;
break;
defualt:

View file

@ -1,6 +1,6 @@
echo start > results.txt
# echo ../kernel/vortex_test.hex
# ./harptool -E -a rv32i --core ../runtime/mains/simple/vx_simple_main.hex -s -b 1> emulator.debug
./harptool -E -a rv32i --core ../benchmarks/opencl/sgemm/sgemm.hex -s -b 1> emulator.debug
./harptool -E -a rv32i --core ../runtime/mains/simple/vx_simple_main.hex -s -b 1> emulator.debug
# ./harptool -E -a rv32i --core ../benchmarks/opencl/sgemm/sgemm.hex -s -b 1> emulator.debug
# ./harptool -E -a rv32i --core ../runtime/mains/vector_test/vx_vector_main.hex -s -b 1> emulator.debug

View file

@ -12,7 +12,7 @@
// `define ONLY
// `define SYN 1
//`define ASIC 1
// `define ASIC 1
`define NUM_BARRIERS 4

View file

@ -63,14 +63,40 @@ module VX_writeback (
wire zero = 0;
wire[`NT-1:0][31:0] use_wb_data;
reg prev_is_mem;
always @(posedge clk, posedge reset) begin
if (reset)
begin
prev_is_mem = 0;
end begin
prev_is_mem = mem_wb && !no_slot_mem;
end
end
VX_generic_register #(.N(39 + `NW_M1 + 1 + `NT*33)) wb_register(
.clk (clk),
.reset(reset),
.stall(zero),
.flush(zero),
.in ({VX_writeback_tempp.write_data, VX_writeback_tempp.wb_valid, VX_writeback_tempp.rd, VX_writeback_tempp.wb, VX_writeback_tempp.wb_warp_num, VX_writeback_tempp.wb_pc}),
.out ({VX_writeback_inter.write_data, VX_writeback_inter.wb_valid, VX_writeback_inter.rd, VX_writeback_inter.wb, VX_writeback_inter.wb_warp_num, VX_writeback_inter.wb_pc})
.out ({use_wb_data , VX_writeback_inter.wb_valid, VX_writeback_inter.rd, VX_writeback_inter.wb, VX_writeback_inter.wb_warp_num, VX_writeback_inter.wb_pc})
);
`ifdef SYN
assign VX_writeback_inter.write_data = prev_is_mem ? VX_writeback_tempp.write_data : use_wb_data;
`else
assign VX_writeback_inter.write_data = use_wb_data;
`endif
endmodule // VX_writeback
endmodule // VX_writeback

View file

@ -78,7 +78,9 @@ SRC = \
../../models/memory/cln28hpm/rf2_128x128_wm1/rf2_128x128_wm1.v \
../../models/memory/cln28hpm/rf2_256x128_wm1/rf2_256x128_wm1.v \
../../models/memory/cln28hpm/rf2_256x19_wm0/rf2_256x19_wm0.v \
../../models/memory/cln28hpm/rf2_32x128_wm1/rf2_32x128_wm1.v
../../models/memory/cln28hpm/rf2_32x128_wm1/rf2_32x128_wm1.v \
../../models/memory/cln28hpm/rf2_32x19_wm0/rf2_32x19_wm0.v
# ../../models/memory/cln28hpc/rf2_32x128_wm1/rf2_32x128_wm1.v
# vortex_dpi.h

View file

@ -1,10 +1,13 @@
COMP = /home/fares/dev/riscv-gnu-toolchain-vector/drops/bin/riscv32-unknown-elf-gcc
COMP = /home/priya/dev/riscv_vec/riscv-gnu/bin/riscv32-unknown-elf-gcc
CC_FLAGS = -ffreestanding -O0 -Wl,--gc-sections -nostartfiles -nostdlib -nostartfiles -nodefaultlibs -Wl,-Bstatic,-T,../vortex_link.ld -march=rv32imv -mabi=ilp32
DMP = /home/fares/dev/riscv-gnu-toolchain-vector/drops/bin/riscv32-unknown-elf-objdump
CPY = /home/fares/dev/riscv-gnu-toolchain-vector/drops/bin/riscv32-unknown-elf-objcopy
#DMP = /home/fares/dev/riscv-gnu-toolchain-vector/drops/bin/riscv32-unknown-elf-objdump
#CPY = /home/fares/dev/riscv-gnu-toolchain-vector/drops/bin/riscv32-unknown-elf-objcopy
DMP = /home/priya/dev/riscv_vec/riscv-gnu/bin/riscv32-unknown-elf-objdump
CPY = /home/priya/dev/riscv_vec/riscv-gnu/bin/riscv32-unknown-elf-objcopy
# VX_STR = ../../startup/vx_start.s
@ -18,7 +21,8 @@ VX_API = ../../vx_api/vx_api.c
VX_TEST = ../../tests/tests.c
VX_FIO = ../../fileio/fileio.s
VX_VEC = vx_vec.s
LIBS = /home/fares/dev/riscv-gnu-toolchain-vector/drops/riscv32-unknown-elf/lib/libc.a /home/fares/dev/riscv-gnu-toolchain-vector/drops/riscv32-unknown-elf/lib/libstdc++.a -static-libgcc -lgcc
#LIBS = /home/fares/dev/riscv-gnu-toolchain-vector/drops/riscv32-unknown-elf/lib/libc.a /home/fares/dev/riscv-gnu-toolchain-vector/drops/riscv32-unknown-elf/lib/libstdc++.a -static-libgcc -lgcc
LIBS = /home/priya/dev/riscv_vec/riscv-gnu/riscv32-unknown-elf/lib/libc.a /home/priya/dev/riscv_vec/riscv-gnu/riscv32-unknown-elf/lib/libstdc++.a -static-libgcc -lgcc
VX_MAIN = vx_vector_main

View file

@ -4,4 +4,19 @@
.type vx_vec_test, @function
.global vx_vec_test
vx_vec_test:
li a0, 2
vsetvli t0, a0, e32, m1
li a0, 10
sw a0, 0(a1)
sw a0, 32(a1)
vlw.v v1, (a1)
li a2, 1
sw a2, 0(a3)
li a2, 0
sw a2, 32(a3)
vlw.v v0, (a3)
vmor.mm v0, v0, v3
vadd.vv v1, v1, v1, v0.t
vsw.v v1, (a1)
vlw.v v5, (a1)
ret

File diff suppressed because it is too large Load diff

BIN
runtime/mains/vector_test/vx_vector_main.elf Normal file → Executable file

Binary file not shown.

View file

@ -1,224 +1,290 @@
:0200000480007A
:100000009705000093854507130540006B10B50068
:10001000EF004006130510006B00050017250000D7
:100020001305C5D917260000130686D93306A64046
:1000300093050000EF00806B170500001305855B3A
:10004000EF00C056EF00C060130540006B000500D4
:08005000EF0080526F00C05662
:10005800B70700009387070063880700370500800B
:100068001305055F6F00005467800000130540000A
:100078006B0005009721000093814110F3261002C0
:100088009396A601732600029315A6001316260060
:1000980037F1FF6F3301B1403301D1403301C10063
:1000A800F326100263860600130500006B000500A6
:1000B8006780000067800000130101FD232681028C
:1000C80013040103232EA4FC232CB4FC232AC4FC10
:1000D8008327C4FD83A707002326F4FE832744FD56
:1000E8002322F4FE832744FE03C707008327C4FEA8
:1000F8002380E7008327C4FE93871700032744FE65
:10010800034717002380E7008327C4FE938727004F
:10011800032744FE034727002380E7008327C4FE04
:1001280093873700032744FE034737002380E700FF
:100138008327C4FE938747002326F4FE232404FE66
:100148006F004003832784FE032784FDB307F7006D
:1001580003C707008327C4FE2380E7008327C4FE64
:10016800938717002326F4FE832784FE93871700BE
:100178002324F4FE032784FE832744FDE344F7FC8D
:100188008327C4FD0327C4FE23A0E7001300000053
:100198000324C1021301010367800000130101FD5C
:1001A8002326810213040103232EA4FC232CB4FC70
:1001B8008327C4FD83A707002326F4FE832744FE74
:1001C8002320F4FE8327C4FE03C70700832704FE09
:1001D8002380E700832704FE938717000327C4FEC4
:1001E800034717002380E700832704FE938727002F
:1001F8000327C4FE034727002380E700832704FE64
:10020800938737000327C4FE034737002380E7009E
:100218008327C4FE938747002326F4FE232404FE85
:100228006F004003832784FE032784FDB307F7008C
:100238000327C4FE034707002380E7008327C4FE83
:10024800938717002326F4FE832784FE93871700DD
:100258002324F4FE032784FE832744FEE344F7FCAB
:100268008327C4FD0327C4FE23A0E7001300000072
:100278000324C1021301010367800000130101FF79
:100288002326810013040101130000000324C10088
:100298001301010167800000130101FE232E810074
:1002A800130401022326A4FE2324B4FE832784FE1C
:1002B8003727000023A2E7009307000013850700F3
:1002C8000324C1011301010267800000130101FE2C
:1002D800232E8100130401022326A4FE9307100095
:1002E800138507000324C101130101026780000080
:1002F800130101FF232681001304010113000000EC
:100308000324C1001301010167800000130101FFEC
:100318002326810013040101130000000324C100F7
:100328001301010167800000130101FD23268102EA
:1003380013040103232EA4FC232CB4FC232AC4FC9D
:10034800B70701002324F4FE232604FE6F00C00231
:100358008327C4FE032784FDB307F70083C707007C
:1003680013870700832784FE23A0E7008327C4FEA2
:10037800938717002326F4FE0327C4FE832744FD32
:10038800E348F7FC832744FD138507000324C102D3
:100398001301010367800000130101FD2326810278
:1003A80013040103232EA4FC8327C4FD63D807008C
:1003B8008327C4FDB307F040232EF4FC0327C4FDB4
:1003C800B73700009387078063D8E700B737000086
:1003D80093870780232EF4FC83A701C32326F4FE0A
:1003E80003A701C38327C4FD3307F70023A8E1C28D
:1003F8008327C4FE138507000324C10213010103E8
:1004080067800000130101FE232E1100232C8100B8
:10041800130401022326A4FE13050000EF00400E7A
:10042800130000008320C10103248101130101028C
:1004380067800000130101FF2326810013040101D6
:10044800130000000324C1001301010167800000AC
:10045800130101FF2326810013040101130000008A
:100468000324C1001301010167800000130101FF8B
:10047800232611002324810013040101EF00C00A80
:1004880093070500138507008320C100032481001A
:100498001301010167800000130101FF2326810079
:1004A80013040101130000000324C100130101011A
:1004B80067800000130101FF232681001304010156
:1004C80083A781C39386170023ACD1C21385070085
:1004D8000324C1001301010167800000130101FF1B
:1004E8002326810013040101130000000324C10026
:1004F80013010101678000006B10B50067800000E0
:100508006B000500678000006B40B5006780000045
:100518006B200500678000006B30000067800000DA
:1005280073251002678000007325000267800000B1
:10053800130540006B000500F32610029396F600A1
:10054800732600029315A6001316260037F1FF6FD5
:100558003301B1403301D1403301C100F326100209
:1005680063860600130500006B0005006780000025
:10057800130101FF23261100232481001304010124
:1005880013051000EFF0DFF7EFF0DFB21300000003
:10059800138507008320C100032481001301010192
:1005A800678000009305050093060000130600000D
:1005B800130500006F00C020130101FF9305000020
:1005C800232481002326110013040500EF00C0280E
:1005D80003A581C28327C50363840700E78007005A
:1005E80013050400EFF01FE2130101FF232481002B
:1005F8002322910037240080B72400809387C49772
:100608001304C4973304F4402326110013542440E0
:1006180063020402931424009384C4FFB384F40097
:1006280083A704001304F4FF9384C4FFE780070042
:10063800E31804FE8320C1000324810083244100C1
:100648001301010167800000130101FF23248100C9
:1006580023202101372400803729008093078497BD
:10066800130989973309F9402326110023229100A1
:100678001359294063000902130484979304000066
:10068800832704009384140013044400E7800700C0
:10069800E31899FE37240080372900809307849750
:1006A8001309C9973309F94013592940630009020E
:1006B8001304849793040000832704009384140090
:1006C80013044400E7800700E31899FE8320C10063
:1006D800032481008324410003290100130101013F
:1006E800678000001303F00013070500637EC30250
:1006F8009377F7006390070A63920508937606FFDD
:100708001376F600B386E6002320B7002322B7004D
:100718002324B7002326B70013070701E366D7FE93
:100728006314060067800000B306C3409396260052
:1007380097020000B38656006780C6002307B700FB
:10074800A306B7002306B700A305B7002305B70023
:10075800A304B7002304B700A303B7002303B7001B
:10076800A302B7002302B700A301B7002301B70013
:10077800A300B7002300B7006780000093F5F50FCA
:1007880093968500B3E5D50093960501B3E5D500AA
:100798006FF0DFF69396270097020000B3865600A5
:1007A80093820000E78006FA93800200938707FF90
:1007B8003307F7403306F600E378C3F66FF0DFF34C
:1007C80003A781C283278714638C070403A7470004
:1007D8001308F001634EE8061318270063060502A4
:1007E800338307012324C30883A88718130610003E
:1007F8003316E600B3E8C80023A417192324D3103E
:10080800930620006304D5021307170023A2E7000C
:10081800B387070123A4B700130500006780000011
:100828009307C7142324F7146FF05FFA83A6C71839
:100838001307170023A2E70033E6C60023A6C7184C
:10084800B387070123A4B7001305000067800000E1
:100858001305F0FF67800000130101FD23248101C7
:1008680003AC81C2232E3101232C4101232A5101DB
:1008780023286101232611022324810223229102C5
:100888002320210323267101930A0500138B0500F9
:10089800130A10009309F0FF03298C146308090256
:1008A800832449001384F4FF6342040293942400D0
:1008B800B304990063040B0483A74410638067059D
:1008C8001304F4FF9384C4FFE31634FF8320C102AA
:1008D8000324810283244102032901028329C101DF
:1008E800032A8101832A4101032B0101832BC100C3
:1008F800032C81001301010367800000832749004E
:1009080083A644009387F7FF638A870423A2040021
:10091800E38806FA8327891833178A00832B49004E
:10092800B377F700639E0700E78006008327490036
:10093800E39477F783278C14E38427F96FF0DFF5C6
:100948008327C91883A544083377F700631C070079
:1009580013850A00E78006006FF05FFD23228900F7
:100968006FF01FFB13850500E78006006FF01FFC82
:041978005800008093
:10198000000000006C1C0080D41C00803C1D008006
:101990000000000000000000000000000000000047
:1019A0000000000000000000000000000000000037
:1019B0000000000000000000000000000000000027
:1019C0000000000000000000000000000000000017
:1019D0000000000000000000000000000000000007
:1019E00000000000000000000000000000000000F7
:1019F00000000000000000000000000000000000E7
:101A000000000000000000000000000000000000D6
:101A100000000000000000000000000000000000C6
:101A200000000000000000000100000000000000B5
:101A30000E33CDAB34126DE6ECDE05000B0000007A
:101A40000000000000000000000000000000000096
:101A50000000000000000000000000000000000086
:101A60000000000000000000000000000000000076
:101A70000000000000000000000000000000000066
:101A80000000000000000000000000000000000056
:101A90000000000000000000000000000000000046
:101AA0000000000000000000000000000000000036
:101AB0000000000000000000000000000000000026
:101AC0000000000000000000000000000000000016
:101AD0000000000000000000000000000000000006
:101AE00000000000000000000000000000000000F6
:101AF00000000000000000000000000000000000E6
:101B000000000000000000000000000000000000D5
:101B100000000000000000000000000000000000C5
:101B200000000000000000000000000000000000B5
:101B300000000000000000000000000000000000A5
:101B40000000000000000000000000000000000095
:101B50000000000000000000000000000000000085
:101B60000000000000000000000000000000000075
:101B70000000000000000000000000000000000065
:101B80000000000000000000000000000000000055
:101B90000000000000000000000000000000000045
:101BA0000000000000000000000000000000000035
:101BB0000000000000000000000000000000000025
:101BC0000000000000000000000000000000000015
:101BD0000000000000000000000000000000000005
:101BE00000000000000000000000000000000000F5
:101BF00000000000000000000000000000000000E5
:101C000000000000000000000000000000000000D4
:101C100000000000000000000000000000000000C4
:101C200000000000000000000000000000000000B4
:101C300000000000000000000000000000000000A4
:101C40000000000000000000000000000000000094
:101C50000000000000000000000000000000000084
:101C60000000000000000000000000000000000074
:101C70000000000000000000000000000000000064
:101C80000000000000000000000000000000000054
:101C90000000000000000000000000000000000044
:101CA0000000000000000000000000000000000034
:101CB0000000000000000000000000000000000024
:101CC0000000000000000000000000000000000014
:101CD0000000000000000000000000000000000004
:101CE00000000000000000000000000000000000F4
:101CF00000000000000000000000000000000000E4
:101D000000000000000000000000000000000000D3
:101D100000000000000000000000000000000000C3
:101D200000000000000000000000000000000000B3
:101D300000000000000000000000000000000000A3
:101D40000000000000000000000000000000000093
:101D50000000000000000000000000000000000083
:101D60000000000000000000000000000000000073
:101D70000000000000000000000000000000000063
:101D80000000000000000000000000000000000053
:101D90000000000000000000000000000000000043
:081DA00000000000000000003B
:101DA8008019008000000070000000100000002072
:10000000970500009385C506130540006B10B500E9
:10001000EF00C005130510006B000500138581C3B8
:100020001386C1C33306A64093050000EF00501F9E
:10003000171500001305458FEF00900AEF0090148C
:10004000130540006B000500EF00D0056F00900A1B
:10005000B707000093870700638807003715008003
:10006000130545926F00D00767800000130540001C
:100070006B0005009711000093814179F32610026F
:100080009396A601732600029315A6001316260068
:1000900037F1FF6F3301B1403301D1403301C1006B
:1000A000F326100263860600130500006B000500AE
:1000B0006780000013052000D77285001305A0009B
:1000C00023A0A50023A0A50287E0051213061000B7
:1000D00023A0C6001306000023A0C60207E00612F4
:1000E00057A0016AD7801000A7E0050287E2051239
:1000F00067800000130101FD232681021304010320
:10010000232EA4FC232CB4FC232AC4FC8327C4FD87
:1001100083A707002326F4FE930744FD2322F4FE61
:10012000832744FE03C707008327C4FE2380E7001C
:100130008327C4FE93871700032744FE0347170055
:100140002380E7008327C4FE93872700032744FE0C
:10015000034727002380E7008327C4FE93873700E7
:10016000032744FE034737002380E7008327C4FEAC
:10017000938747002326F4FE232404FE6F004003E8
:10018000832784FE032784FDB307F70003C7070016
:100190008327C4FE2380E7008327C4FE93871700CC
:1001A0002326F4FE832784FE938717002324F4FE7E
:1001B000832744FD032784FEE344F7FC8327C4FE22
:1001C0002320F4FE832704FE93F73700032704FE61
:1001D000B307F7002320F4FE832704FE2326F4FE52
:1001E0008327C4FD0327C4FE23A0E70013000000FB
:1001F0000324C1021301010367800000130101FC05
:10020000232E8102130401042326A4FC2324B4FC1E
:100210008327C4FC83A707002326F4FE9307C4FDAD
:100220002322F4FE8327C4FE03C70700832744FE6E
:100230002380E700832744FE938717000327C4FE2B
:10024000034717002380E700832744FE9387270096
:100250000327C4FE034727002380E700832744FECB
:10026000938737000327C4FE034737002380E70046
:100270008327C4FE938747002326F4FE232404FE2D
:100280006F004003832784FE032784FCB307F70035
:100290000327C4FE034707002380E7008327C4FE2B
:1002A000938717002326F4FE832784FE9387170085
:1002B0002324F4FE8327C4FD032784FEE344F7FCD4
:1002C0008327C4FE2320F4FE832704FE93F7370020
:1002D000032704FEB307F7002320F4FE832704FE60
:1002E0002326F4FE8327C4FC0327C4FE23A0E700D3
:1002F000130000000324C103130101046780000000
:10030000130101FF232681001304010113000000E3
:100310000324C1001301010167800000130101FEE5
:10032000232E8100130401022326A4FE2324B4FEFD
:10033000832784FE3727000023A2E70093070000ED
:10034000138507000324C101130101026780000027
:10035000130101FE232E1100232C8100130401023E
:100360002326A4FEB71700801385C7CEEF00C04F29
:1003700093071000138507008320C1010324810126
:100380001301010267800000130101FD2326110201
:100390002324810213040103232EA4FC232CB4FC88
:1003A000232AC4FCB70700712326F4FEB7070072A6
:1003B0002324F4FE930730002322F4FE130744FEA7
:1003C0009307C4FE1306400093050700138507003A
:1003D000EFF05FD21307C4FD9307C4FE130640007D
:1003E0009305070013850700EFF0DFD0130784FDA6
:1003F0009307C4FE1306400093050700138507000A
:10040000EFF05FCF130744FD9307C4FE13064000CF
:100410009305070013850700EFF0DFCD83A7C1C266
:10042000E7800700130704FE930784FE9305070087
:1004300013850700EFF09FDC832704FE1385070078
:100440008320C1020324810213010103678000009D
:10045000130101FD23261102232481021304010349
:10046000232EA4FC232CB4FC232AC4FCB707007160
:100470002324F4FEB70700722326F4FE93074000FE
:100480002322F4FE130744FE930784FE1306400064
:100490009305070013850700EFF0DFC51307C4FDC0
:1004A000930784FE13064000930507001385070099
:1004B000EFF05FC4130784FD930784FE130640002A
:1004C0009305070013850700EFF0DFC2130744FD13
:1004D000930784FE13064000930507001385070069
:1004E000EFF05FC183A7C1C2E7800700832744FD07
:1004F000138507008320C102032481021301010335
:1005000067800000130101FD2326110223248102CC
:1005100013040103232EA4FC232CB4FC232AC4FCC3
:10052000B70700712326F4FE930750002324F4FE3E
:10053000130784FE9307C4FE1306400093050700CB
:1005400013850700EFF01FBB1307C4FD9307C4FE1C
:10055000130640009305070013850700EFF09FB9CD
:100560009307C4FE032644FD832584FD13850700FD
:10057000EFF05FB883A7C1C2E7800700832744FD7F
:10058000138507008320C1020324810213010103A4
:1005900067800000130101FD23268102130401037B
:1005A000232EA4FC8327C4FD63D807008327C4FD42
:1005B000B307F040232EF4FC0327C4FDB737000037
:1005C0009387078063D8E700B737000093870780D9
:1005D000232EF4FC83A701C32326F4FE03A701C343
:1005E0008327C4FD3307F70023A8E1C28327C4FE95
:1005F000138507000324C102130101036780000073
:10060000130101FE232E1100232C8100130401028B
:100610002326A4FE13050000EF00001E13000000B7
:100620008320C101032481011301010267800000BE
:10063000130101FD23261102232481021304010367
:10064000232EA4FC232CB4FC232AC4FCB70700717E
:100650002326F4FEB70700722324F4FE93077000EC
:100660002322F4FE130744FE9307C4FE1306400042
:100670009305070013850700EFF0DFA71307C4FDFC
:100680009307C4FE13064000930507001385070077
:10069000EFF05FA6130784FD9307C4FE1306400026
:1006A0009305070013850700EFF0DFA4130744FD4F
:1006B0009307C4FE13064000930507001385070047
:1006C000EFF05FA383A7C1C2E7800700130704FE12
:1006D000930784FE9305070013850700EFF01FB210
:1006E000832704FE138507008320C10203248102AF
:1006F0001301010367800000130101FF232611008D
:100700002324810013040101B7170080138507D04B
:10071000EF008015130000008320C1000324810036
:100720001301010167800000130101FF232611005E
:100730002324810013040101EF00800E93070500BC
:10074000138507008320C1000324810013010101E8
:1007500067800000130101FF23261100232481007C
:1007600013040101B7170080138547D2EF00C00FB3
:10077000130000008320C100032481001301010144
:1007800067800000130101FF23261100232481004C
:1007900013040101B7170080138587D4EF00C00C44
:1007A00083A781C39386170023ACD1C213850700AA
:1007B0008320C10003248100130101016780000030
:1007C000130101FF232611002324810013040101DA
:1007D000B7170080138547D7EF000009130000000A
:1007E0008320C10003248100130101016780000000
:1007F0006B10B500678000006B000500678000008B
:100800006B40B500678000006B200500678000002A
:100810006B300000678000007325100267800000C5
:100820007325000267800000130540006B0005007F
:10083000F32610029396F600732600029315A60085
:100840001316260037F1FF6F3301B1403301D14059
:100850003301C100F3261002638606001305000071
:100860006B00050067800000130141FF2320110089
:100870002322B1008345050063880500EF00C00115
:10088000130515006FF01FFF832001008325410031
:100890001301C10067800000B702010023A0B2006D
:1008A00067800000130101FF23261100232481002B
:1008B0001304010113051000EFF01FF4EFF08FFF98
:1008C00013050000EFF05FF313000000138507002D
:1008D0008320C1000324810013010101678000000F
:1008E00093050500930600001306000013050000A1
:1008F0006F00C020130101FF930500002324810035
:100900002326110013040500EF00C02803A581C2AF
:100910008327C50363840700E780070013050400ED
:10092000EFF01FCE130101FF232481002322910049
:1009300037140080B71400809387440013044400E8
:100940003304F440232611001354244063020402AC
:10095000931424009384C4FFB384F40083A7040099
:100960001304F4FF9384C4FFE7800700E31804FE38
:100970008320C1000324810083244100130101016D
:1009800067800000130101FF23248100232021013F
:1009900037140080371900809307040013090900F9
:1009A0003309F940232611002322910013592940CD
:1009B0006300090213040400930400008327040069
:1009C0009384140013044400E7800700E31899FEA1
:1009D0003714008037190080930704001309490079
:1009E0003309F94013592940630009021304040034
:1009F000930400008327040093841400130444002C
:100A0000E7800700E31899FE8320C10003248100DA
:100A100083244100032901001301010167800000C4
:100A20001303F00013070500637EC3029377F700FA
:100A30006390070A63920508937606FF1376F60023
:100A4000B386E6002320B7002322B7002324B70093
:100A50002326B70013070701E366D7FE63140600D9
:100A600067800000B306C3409396260097020000FB
:100A7000B38656006780C6002307B700A306B700F9
:100A80002306B700A305B7002305B700A304B700EA
:100A90002304B700A303B7002303B700A302B700E2
:100AA0002302B700A301B7002301B700A300B700DA
:100AB0002300B7006780000093F5F50F939685003B
:100AC000B3E5D50093960501B3E5D5006FF0DFF6E9
:100AD0009396270097020000B38656009382000089
:100AE000E78006FA93800200938707FF3307F740F9
:100AF0003306F600E378C3F66FF0DFF303A781C295
:100B000083278714638C070403A747001308F001A9
:100B1000634EE806131827006306050233830701B6
:100B20002324C30883A88718130610003316E60091
:100B3000B3E8C80023A417192324D3109306200078
:100B40006304D5021307170023A2E700B387070148
:100B500023A4B70013050000678000009307C714A3
:100B60002324F7146FF05FFA83A6C7181307170042
:100B700023A2E70033E6C60023A6C718B387070100
:100B800023A4B70013050000678000001305F0FFE1
:100B900067800000130101FD2324810103AC81C2A1
:100BA000232E3101232C4101232A510123286101E5
:100BB00023261102232481022322910223202103D0
:100BC00023267101930A0500138B0500130A1000F8
:100BD0009309F0FF03298C14630809028324490058
:100BE0001384F4FF6342040293942400B304990035
:100BF00063040B0483A74410638067051304F4FFA8
:100C00009384C4FFE31634FF8320C10203248102CE
:100C100083244102032901028329C101032A81019E
:100C2000832A4101032B0101832BC100032C810086
:100C300013010103678000008327490083A6440055
:100C40009387F7FF638A870423A20400E38806FAE8
:100C50008327891833178A00832B4900B377F7005D
:100C6000639E0700E780060083274900E39477F737
:100C700083278C14E38427F96FF0DFF58327C918E5
:100C800083A544083377F700631C070013850A0027
:100C9000E78006006FF05FFD232289006FF01FFBE5
:0C0CA00013850500E78006006FF01FFCC4
:100CAC003000000031000000320000003300000072
:100CBC003400000035000000360000003700000052
:100CCC0038000000390000006100000062000000E4
:100CDC006300000064000000650000006600000076
:100CEC0048656C6C6F2066726F6D205F6973617400
:100CFC0074790A004552524F523A205F6B696C6C02
:100D0C00206E6F742079657420696D706C656D65EB
:100D1C006E7465640A0000004552524F523A205FCF
:100D2C00756E6C696E6B206E6F74207965742069BA
:100D3C006D706C656D656E7465640A004552524F3A
:100D4C00523A205F67657474696D656F666461798A
:100D5C00206E6F742079657420696D706C656D659B
:100D6C006E7465640A0000004552524F523A205F7F
:100D7C006C696E6B206E6F742079657420696D7070
:0A0D8C006C656D656E7465640A0005
:04100000500000801C
:1010080000000000F41200805C130080C41300800C
:1010180000000000000000000000000000000000C8
:1010280000000000000000000000000000000000B8
:1010380000000000000000000000000000000000A8
:101048000000000000000000000000000000000098
:101058000000000000000000000000000000000088
:101068000000000000000000000000000000000078
:101078000000000000000000000000000000000068
:101088000000000000000000000000000000000058
:101098000000000000000000000000000000000048
:1010A8000000000000000000010000000000000037
:1010B8000E33CDAB34126DE6ECDE05000B000000FC
:1010C8000000000000000000000000000000000018
:1010D8000000000000000000000000000000000008
:1010E80000000000000000000000000000000000F8
:1010F80000000000000000000000000000000000E8
:1011080000000000000000000000000000000000D7
:1011180000000000000000000000000000000000C7
:1011280000000000000000000000000000000000B7
:1011380000000000000000000000000000000000A7
:101148000000000000000000000000000000000097
:101158000000000000000000000000000000000087
:101168000000000000000000000000000000000077
:101178000000000000000000000000000000000067
:101188000000000000000000000000000000000057
:101198000000000000000000000000000000000047
:1011A8000000000000000000000000000000000037
:1011B8000000000000000000000000000000000027
:1011C8000000000000000000000000000000000017
:1011D8000000000000000000000000000000000007
:1011E80000000000000000000000000000000000F7
:1011F80000000000000000000000000000000000E7
:1012080000000000000000000000000000000000D6
:1012180000000000000000000000000000000000C6
:1012280000000000000000000000000000000000B6
:1012380000000000000000000000000000000000A6
:101248000000000000000000000000000000000096
:101258000000000000000000000000000000000086
:101268000000000000000000000000000000000076
:101278000000000000000000000000000000000066
:101288000000000000000000000000000000000056
:101298000000000000000000000000000000000046
:1012A8000000000000000000000000000000000036
:1012B8000000000000000000000000000000000026
:1012C8000000000000000000000000000000000016
:1012D8000000000000000000000000000000000006
:1012E80000000000000000000000000000000000F6
:1012F80000000000000000000000000000000000E6
:1013080000000000000000000000000000000000D5
:1013180000000000000000000000000000000000C5
:1013280000000000000000000000000000000000B5
:1013380000000000000000000000000000000000A5
:101348000000000000000000000000000000000095
:101358000000000000000000000000000000000085
:101368000000000000000000000000000000000075
:101378000000000000000000000000000000000065
:101388000000000000000000000000000000000055
:101398000000000000000000000000000000000045
:1013A8000000000000000000000000000000000035
:1013B8000000000000000000000000000000000025
:1013C8000000000000000000000000000000000015
:1013D8000000000000000000000000000000000005
:1013E80000000000000000000000000000000000F5
:1013F80000000000000000000000000000000000E5
:1014080000000000000000000000000000000000D4
:1014180000000000000000000000000000000000C4
:081428000000000000000000BC
:101430000810008000000070000000100000002074
:040000058000000077
:00000001FF

View file

@ -640,7 +640,7 @@ Warp::Warp(Core *c, Word id) :
core(c), pc(0x80000000), interruptEnable(true),
supervisorMode(true), activeThreads(0), reg(0), pred(0),
shadowReg(core->a.getNRegs()), shadowPReg(core->a.getNPRegs()), id(id),
spawned(false), steps(0), insts(0), loads(0), stores(0)
spawned(false), steps(0), insts(0), loads(0), stores(0), VLEN(96)
{
D(3, "Creating a new thread with PC: " << hex << this->pc << '\n');
/* Build the register file. */

View file

@ -53,6 +53,8 @@ WordDecoder::WordDecoder(const ArchDef &arch) {
opcode_s = 7;
reg_s = 5;
func3_s = 3;
mop_s = 3;
vmask_s = 1;
shift_opcode = 0;
shift_rd = opcode_s;
@ -63,6 +65,13 @@ WordDecoder::WordDecoder(const ArchDef &arch) {
shift_j_u_immed = opcode_s + reg_s;
shift_s_b_immed = opcode_s + reg_s + func3_s + reg_s + reg_s;
shift_i_immed = opcode_s + reg_s + func3_s + reg_s;
shift_vset_immed = opcode_s + reg_s + func3_s + reg_s;
shift_vmask = opcode_s + reg_s + func3_s + reg_s + reg_s;
shift_vmop = opcode_s + reg_s + func3_s + reg_s + reg_s + vmask_s;
shift_vnf = opcode_s + reg_s + func3_s + reg_s + reg_s + vmask_s + mop_s;
shift_func6 = opcode_s + reg_s + func3_s + reg_s + reg_s + 1;
shift_vset = opcode_s + reg_s + func3_s + reg_s + reg_s + 6;
reg_mask = 0x1f;
func3_mask = 0x7;
@ -73,6 +82,8 @@ WordDecoder::WordDecoder(const ArchDef &arch) {
b_immed_mask = 0x1fff;
u_immed_mask = 0xfffff;
j_immed_mask = 0xfffff;
v_immed_mask = 0x7ff;
func6_mask = 0x3f;
}
@ -208,14 +219,91 @@ Instruction *WordDecoder::decode(const std::vector<Byte> &v, Size &idx, trace_in
imeed = 0 | (bits_10_1 << 1) | (bit_11 << 11) | (bits_19_12 << 12) | (bit_20 << 20);
inst.setSrcImm(signExt(imeed, 21, j_immed_mask));
inst.setSrcImm(signExt(imeed, 20, j_immed_mask));
usedImm = true;
trace_inst->valid_inst = true;
trace_inst->rd = ((code>>shift_rd) & reg_mask);
break;
defualt:
case InstType::V_TYPE:
cout << "Entered here: instr type = vector" << op << endl;
switch(op) {
case Opcode::VSET_ARITH: //TODO: arithmetic ops
inst.setDestReg((code>>shift_rd) & reg_mask);
inst.setSrcReg((code>>shift_rs1) & reg_mask);
func3 = (code>>shift_func3) & func3_mask;
inst.setFunc3 (func3);
cout << "Entered here: instr type = vector" << endl;
if(func3 == 7) {
cout << "Entered here: imm instr";
inst.setVsetImm(!(code>>shift_vset));
if(inst.getVsetImm()) {
Word immed = (code>>shift_rs2) & v_immed_mask;
D(3, "immed" << immed);
inst.setSrcImm(immed); //TODO
inst.setvlmul(immed & 0x3);
D(3, "lmul " << (immed & 0x3));
inst.setvediv((immed>>4) & 0x3);
D(3, "ediv " << ((immed>>4) & 0x3));
inst.setvsew((immed>>2) & 0x3);
D(3, "sew " << ((immed>>2) & 0x3));
}
else {
inst.setSrcReg((code>>shift_rs2) & reg_mask);
trace_inst->rs2 = ((code>>shift_rs2) & reg_mask);
}
trace_inst->valid_inst = true;
trace_inst->rs1 = ((code>>shift_rs1) & reg_mask);
trace_inst->rd = ((code>>shift_rd) & reg_mask);
} else {
inst.setSrcReg((code>>shift_rs2) & reg_mask);
inst.setVmask((code>>shift_vmask) & 0x1);
inst.setFunc6((code>>shift_func6) & func6_mask);
trace_inst->valid_inst = true;
trace_inst->rs1 = ((code>>shift_rs1) & reg_mask);
trace_inst->rs2 = ((code>>shift_rs2) & reg_mask);
trace_inst->rd = ((code>>shift_rd) & reg_mask);
}
break;
case Opcode::VL:
D(3, "vector load instr");
inst.setDestReg((code>>shift_rd) & reg_mask);
inst.setSrcReg((code>>shift_rs1) & reg_mask);
inst.setVlsWidth((code>>shift_func3) & func3_mask);
inst.setSrcReg((code>>shift_rs2) & reg_mask);
inst.setVmask((code>>shift_vmask));
inst.setVmop((code>>shift_vmop) && func3_mask);
inst.setVnf((code>>shift_vnf) && func3_mask);
trace_inst->valid_inst = true;
trace_inst->rs1 = ((code>>shift_rs1) & reg_mask);
trace_inst->rd = ((code>>shift_rd) & reg_mask);
trace_inst->rs2 = ((code>>shift_rs2) & reg_mask);
break;
case Opcode::VS:
inst.setVs3((code>>shift_rd) & reg_mask);
inst.setSrcReg((code>>shift_rs1) & reg_mask);
inst.setVlsWidth((code>>shift_func3) & func3_mask);
inst.setSrcReg((code>>shift_rs2) & reg_mask);
inst.setVmask((code>>shift_vmask));
inst.setVmop((code>>shift_vmop) && func3_mask);
inst.setVnf((code>>shift_vnf) && func3_mask);
trace_inst->valid_inst = true;
trace_inst->rs1 = ((code>>shift_rs1) & reg_mask);
trace_inst->rd = ((code>>shift_rd) & reg_mask);
trace_inst->rs2 = ((code>>shift_rs2) & reg_mask);
break;
}
break;
default:
cout << "Unrecognized argument class in word decoder.\n";
exit(1);
}

View file

@ -37,6 +37,8 @@ namespace Harp {
public:
Reg(): cpuId(0), regNum(0), val(0) {}
Reg(Word c, Word n): cpuId(c), regNum(n), val(0) {}
Reg(Word c, Word n, T v): cpuId(c), regNum(n), val(v) {}
Reg &operator=(T r) { if (regNum) {val = r; doWrite();} return *this; }
@ -47,9 +49,10 @@ namespace Harp {
val &= mask;
}
T val;
private:
Word cpuId, regNum;
T val;
// T val;
#ifdef EMU_INSTRUMENTATION
/* Access size here is 8, representing the register size of 64-bit cores. */
@ -86,6 +89,14 @@ namespace Harp {
Word pc;
};
struct vtype
{
int vill;
int vediv;
int vsew;
int vlmul;
};
class Warp;
class Core {
@ -172,6 +183,13 @@ namespace Harp {
std::vector<Word> shadowReg;
std::vector<bool> shadowPReg;
//Vector CSR
struct vtype vtype; //both of them are XLEN WIDE
int vl; //both of them are XLEN WIDE
Word VLEN; //Total vector length
std::vector<std::vector<Reg<char*>>> vreg; // 32 vector registers
bool interruptEnable, shadowInterruptEnable, supervisorMode,
shadowSupervisorMode, spawned;

View file

@ -5,14 +5,14 @@
#define __DEBUG_H
// #define USE_DEBUG 9
#define USE_DEBUG -1
#define USE_DEBUG 3
#ifdef USE_DEBUG
#include <iostream>
#define D(lvl, x) do { \
using namespace std; \
if ((lvl) <= USE_DEBUG) { \
if ((lvl) == USE_DEBUG) { \
cout << "DEBUG " << __FILE__ << ':' << dec << __LINE__ << ": " \
<< x << endl; \
} \

View file

@ -60,11 +60,15 @@ namespace Harp {
Size inst_s, opcode_s, reg_s, func3_s;
Size shift_opcode, shift_rd, shift_rs1, shift_rs2, shift_func3, shift_func7;
Size shift_j_u_immed, shift_s_b_immed, shift_i_immed;
//Vector
Size shift_vset, shift_vset_immed, shift_vmask, shift_vmop, shift_vnf, shift_func6;
Size vmask_s, mop_s;
Word reg_mask, func3_mask, func7_mask, opcode_mask, i_immed_mask,
s_immed_mask, b_immed_mask, u_immed_mask, j_immed_mask;
s_immed_mask, b_immed_mask, u_immed_mask, j_immed_mask, v_immed_mask, func6_mask;
};

View file

@ -81,7 +81,7 @@ namespace Harp {
bool sign(d < 0);
bool inf(isinf(d)), zero(d == 0.0);
bool inf(std::isinf(d)), zero(d == 0.0);
int exp;
if (!inf && !zero) exp = floor(log2(fabs(d)));

View file

@ -6,6 +6,7 @@
#include <map>
#include <iostream>
#include <math.h>
#include "types.h"
#include "trace.h"
@ -29,10 +30,13 @@ namespace Harp {
TRAP = 0x7f,
FENCE = 0x0f,
PJ_INST = 0x7b,
GPGPU = 0x6b
GPGPU = 0x6b,
VSET_ARITH = 0x57,
VL = 0x7,
VS = 0x27,
};
enum InstType { N_TYPE, R_TYPE, I_TYPE, S_TYPE, B_TYPE, U_TYPE, J_TYPE};
enum InstType { N_TYPE, R_TYPE, I_TYPE, S_TYPE, B_TYPE, U_TYPE, J_TYPE, V_TYPE};
// We build a table of instruction information out of this.
struct InstTableEntry_t {
@ -58,7 +62,10 @@ namespace Harp {
{Opcode::TRAP, {"TRAP" , true , false, false, false, InstType::I_TYPE }},
{Opcode::FENCE, {"fence" , true , false, false, false, InstType::I_TYPE }},
{Opcode::PJ_INST, {"pred j", true , false, false, false, InstType::R_TYPE }},
{Opcode::GPGPU, {"gpgpu" , false, false, false, false, InstType::R_TYPE }}
{Opcode::GPGPU, {"gpgpu" , false, false, false, false, InstType::R_TYPE }},
{Opcode::VSET_ARITH, {"vsetvl" , false, false, false, false, InstType::V_TYPE }},
{Opcode::VL, {"vl" , false, false, false, false, InstType::V_TYPE }},
{Opcode::VS, {"vs" , false, false, false, false, InstType::V_TYPE }}
};
static const Size MAX_REG_SOURCES(3);
@ -94,6 +101,16 @@ namespace Harp {
Word *setSrcImm () { immsrcPresent = true; immsrc = 0xa5; return &immsrc;}
void setSrcImm (Word srcImm) { immsrcPresent = true; immsrc = srcImm; }
void setImmRef (Ref &r) { refLiteral = &r; }
void setVsetImm (Word vset_imm) { if(vset_imm) vsetImm = true; else vsetImm = false; }
void setVlsWidth (Word width) { vlsWidth = width; }
void setVmop( Word mop) { vMop = mop; }
void setVnf(Word nf) { vNf = nf; }
void setVmask(Word mask) { vmask = mask; }
void setVs3(Word vs) { vs3 = vs; }
void setvlmul(Word lmul) { vlmul = pow(2, lmul); }
void setvsew(Word sew) { vsew = pow(2, 3+sew); }
void setvediv(Word ediv) { vediv = pow(2,ediv); }
void setFunc6(Word func6) { this->func6 = func6; }
/* Getters used by encoders. */
Opcode getOpcode() const { return op; }
@ -111,6 +128,16 @@ namespace Harp {
Word getImm() const { return immsrc; }
bool hasRefLiteral() const { return refLiteral != NULL; }
Ref *getRefLiteral() const { return refLiteral; }
bool getVsetImm() const { return vsetImm; }
Word getVlsWidth() const { return vlsWidth; }
Word getVmop() const { return vMop; }
Word getvNf() const { return vNf; }
bool getVmask() const { return vmask; }
Word getVs3() const { return vs3; }
Word getvlmul() const { return vlmul; }
Word getvsew() const { return vsew; }
Word getvediv() const { return vediv; }
/* Getters used as table lookup. */
bool hasRelImm() const { return (*(instTable.find(op))).second.relAddress; }
@ -129,6 +156,10 @@ namespace Harp {
RegNum rdest, pdest;
Ref *refLiteral;
//Vector
bool vsetImm, vmask;
Word vlsWidth, vMop, vNf, vs3, vlmul, vsew, vediv, func6;
public:

View file

@ -358,12 +358,14 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
}
bool is_vec = false;
Size nextActiveThreads = c.activeThreads;
Size wordSz = c.core->a.getWordSize();
Word nextPc = c.pc;
Word VLMAX;
c.memAccesses.clear();
@ -1085,6 +1087,918 @@ void Instruction::executeOn(Warp &c, trace_inst_t * trace_inst) {
cout << "ERROR: UNSUPPORTED GPGPU INSTRUCTION " << *this << "\n";
}
break;
case VSET_ARITH:
D(3,"VSET_ARITH");
is_vec = true;
switch(func3) {
case 0: // vector-vector
switch(func6)
{
case 0:
{
is_vec = true;
D(3, "Addition " << rsrc[0] << " " << rsrc[1] << " Dest:" << rdest);
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
vector<Reg<char *>> mask = c.vreg[0];
if (c.vtype.vsew == 8)
{
for (uint8_t i = 0; i < c.vl; i++)
{
uint8_t *mask_ptr = (uint8_t*) mask[i].val;
uint8_t value = (*mask_ptr & 0x1);
if(vmask || (!vmask && value)){
uint8_t * first_ptr = (uint8_t *) vr1[i].val;
uint8_t * second_ptr = (uint8_t *) vr2[i].val;
uint8_t result = *first_ptr + *second_ptr;
cout << "Adding " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
}
} else if (c.vtype.vsew == 16)
{
for (uint16_t i = 0; i < c.vl; i++)
{
uint16_t *mask_ptr = (uint16_t*) mask[i].val;
uint16_t value = (*mask_ptr & 0x1);
if(vmask || (!vmask && value)){
uint16_t * first_ptr = (uint16_t *) vr1[i].val;
uint16_t * second_ptr = (uint16_t *) vr2[i].val;
uint16_t result = *first_ptr + *second_ptr;
cout << "Adding " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
}
} else if (c.vtype.vsew == 32)
{
cout << "Doing 32 bit vector addition\n";
for (Word i = 0; i < c.vl; i++)
{
int *mask_ptr = (int*) mask[i].val;
int value = (*mask_ptr & 0x1);
if(vmask || (!vmask && value)){
int * first_ptr = (int *) vr1[i].val;
int * second_ptr = (int *) vr2[i].val;
int result = *first_ptr + *second_ptr;
cout << "Adding " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
int * result_ptr = (int *) vd[i].val;
*result_ptr = result;
}
}
}
D(3, "Vector Register state after addition:");
for(int i=0; i < c.vreg.size(); i++)
for(int j=0; j< c.vreg[0].size(); j++)
{
if (c.vtype.vsew == 8)
{
uint8_t * ptr_val = (uint8_t *) c.vreg[i][j].val;
std::cout << "reg[" << i << "][" << j << "] = " << *ptr_val << std::endl;
} else if (c.vtype.vsew == 16)
{
uint16_t * ptr_val = (uint16_t *) c.vreg[i][j].val;
std::cout << "reg[" << i << "][" << j << "] = " << *ptr_val << std::endl;
} else if (c.vtype.vsew == 32)
{
uint32_t * ptr_val = (uint32_t *) c.vreg[i][j].val;
std::cout << "reg[" << i << "][" << j << "] = " << *ptr_val << std::endl;
}
}
}
break;
case 24: //vmseq
{
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
uint8_t result = (*first_ptr == *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
uint16_t *second_ptr = (uint16_t *)vr2[i].val;
uint16_t result = (*first_ptr == *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
uint32_t result = (*first_ptr == *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 25: //vmsne
{
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
uint8_t result = (*first_ptr != *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
uint16_t *second_ptr = (uint16_t *)vr2[i].val;
uint16_t result = (*first_ptr != *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
uint32_t result = (*first_ptr != *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 26: //vmsltu
{
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
uint8_t result = (*first_ptr < *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
uint16_t *second_ptr = (uint16_t *)vr2[i].val;
uint16_t result = (*first_ptr < *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
uint32_t result = (*first_ptr < *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 27: //vmslt
{
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(int8_t i = 0; i < c.vl; i++){
int8_t *first_ptr = (int8_t *)vr1[i].val;
int8_t *second_ptr = (int8_t *)vr2[i].val;
int8_t result = (*first_ptr < *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
int8_t * result_ptr = (int8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(int16_t i = 0; i < c.vl; i++){
int16_t *first_ptr = (int16_t *)vr1[i].val;
int16_t *second_ptr = (int16_t *)vr2[i].val;
int16_t result = (*first_ptr < *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
int16_t * result_ptr = (int16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(int32_t i = 0; i < c.vl; i++){
int32_t *first_ptr = (int32_t *)vr1[i].val;
int32_t *second_ptr = (int32_t *)vr2[i].val;
int32_t result = (*first_ptr < *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
int32_t * result_ptr = (int32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 28: //vmsleu
{
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
uint8_t result = (*first_ptr <= *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
uint16_t *second_ptr = (uint16_t *)vr2[i].val;
uint16_t result = (*first_ptr <= *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
uint32_t result = (*first_ptr <= *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 29: //vmsle
{
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(int8_t i = 0; i < c.vl; i++){
int8_t *first_ptr = (int8_t *)vr1[i].val;
int8_t *second_ptr = (int8_t *)vr2[i].val;
int8_t result = (*first_ptr <= *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
int8_t * result_ptr = (int8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(int16_t i = 0; i < c.vl; i++){
int16_t *first_ptr = (int16_t *)vr1[i].val;
int16_t *second_ptr = (int16_t *)vr2[i].val;
int16_t result = (*first_ptr <= *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
int16_t * result_ptr = (int16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(int32_t i = 0; i < c.vl; i++){
int32_t *first_ptr = (int32_t *)vr1[i].val;
int32_t *second_ptr = (int32_t *)vr2[i].val;
int32_t result = (*first_ptr <= *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
int32_t * result_ptr = (int32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 30: //vmsgtu
{
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
uint8_t result = (*first_ptr > *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
uint16_t *second_ptr = (uint16_t *)vr2[i].val;
uint16_t result = (*first_ptr > *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
uint32_t result = (*first_ptr > *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 31: //vmsgt
{
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(int8_t i = 0; i < c.vl; i++){
int8_t *first_ptr = (int8_t *)vr1[i].val;
int8_t *second_ptr = (int8_t *)vr2[i].val;
int8_t result = (*first_ptr > *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
int8_t * result_ptr = (int8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(int16_t i = 0; i < c.vl; i++){
int16_t *first_ptr = (int16_t *)vr1[i].val;
int16_t *second_ptr = (int16_t *)vr2[i].val;
int16_t result = (*first_ptr > *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
int16_t * result_ptr = (int16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(int32_t i = 0; i < c.vl; i++){
int32_t *first_ptr = (int32_t *)vr1[i].val;
int32_t *second_ptr = (int32_t *)vr2[i].val;
int32_t result = (*first_ptr > *second_ptr) ? 1 : 0;
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
int32_t * result_ptr = (int32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
}
break;
case 2:
{
switch(func6){
case 24: //vmandnot
{
D(3, "vmandnot");
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
uint8_t first_value = (*first_ptr & 0x1);
uint8_t second_value = (*second_ptr & 0x1);
uint8_t result = (first_value & !second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
uint16_t *second_ptr = (uint16_t *)vr2[i].val;
uint16_t first_value = (*first_ptr & 0x1);
uint16_t second_value = (*second_ptr & 0x1);
uint16_t result = (first_value & !second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
uint32_t first_value = (*first_ptr & 0x1);
uint32_t second_value = (*second_ptr & 0x1);
uint32_t result = (first_value & !second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 25: //vmand
{
D(3, "vmand");
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
uint8_t first_value = (*first_ptr & 0x1);
uint8_t second_value = (*second_ptr & 0x1);
uint8_t result = (first_value & second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
uint16_t *second_ptr = (uint16_t *)vr2[i].val;
uint16_t first_value = (*first_ptr & 0x1);
uint16_t second_value = (*second_ptr & 0x1);
uint16_t result = (first_value & second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
uint32_t first_value = (*first_ptr & 0x1);
uint32_t second_value = (*second_ptr & 0x1);
uint32_t result = (first_value & second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 26: //vmor
{
D(3, "vmor");
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
uint8_t first_value = (*first_ptr & 0x1);
uint8_t second_value = (*second_ptr & 0x1);
uint8_t result = (first_value | second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
uint16_t *second_ptr = (uint16_t *)vr2[i].val;
uint16_t first_value = (*first_ptr & 0x1);
uint16_t second_value = (*second_ptr & 0x1);
uint16_t result = (first_value | second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
uint32_t first_value = (*first_ptr & 0x1);
uint32_t second_value = (*second_ptr & 0x1);
uint32_t result = (first_value | second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 27: //vmxor
{
D(3, "vmxor");
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
uint8_t first_value = (*first_ptr & 0x1);
uint8_t second_value = (*second_ptr & 0x1);
uint8_t result = (first_value ^ second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
uint16_t *second_ptr = (uint16_t *)vr2[i].val;
uint16_t first_value = (*first_ptr & 0x1);
uint16_t second_value = (*second_ptr & 0x1);
uint16_t result = (first_value ^ second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
uint32_t first_value = (*first_ptr & 0x1);
uint32_t second_value = (*second_ptr & 0x1);
uint32_t result = (first_value ^ second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 28: //vmornot
{
D(3, "vmornot");
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
uint8_t first_value = (*first_ptr & 0x1);
uint8_t second_value = (*second_ptr & 0x1);
uint8_t result = (first_value | !second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
uint16_t *second_ptr = (uint16_t *)vr2[i].val;
uint16_t first_value = (*first_ptr & 0x1);
uint16_t second_value = (*second_ptr & 0x1);
uint16_t result = (first_value | !second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
uint32_t first_value = (*first_ptr & 0x1);
uint32_t second_value = (*second_ptr & 0x1);
uint32_t result = (first_value | !second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 29: //vmnand
{
D(3, "vmnand");
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
uint8_t first_value = (*first_ptr & 0x1);
uint8_t second_value = (*second_ptr & 0x1);
uint8_t result = !(first_value & second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
uint16_t *second_ptr = (uint16_t *)vr2[i].val;
uint16_t first_value = (*first_ptr & 0x1);
uint16_t second_value = (*second_ptr & 0x1);
uint16_t result = !(first_value & second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
uint32_t first_value = (*first_ptr & 0x1);
uint32_t second_value = (*second_ptr & 0x1);
uint32_t result = !(first_value & second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 30: //vmnor
{
D(3, "vmnor");
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
uint8_t first_value = (*first_ptr & 0x1);
uint8_t second_value = (*second_ptr & 0x1);
uint8_t result = !(first_value | second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
uint16_t *second_ptr = (uint16_t *)vr2[i].val;
uint16_t first_value = (*first_ptr & 0x1);
uint16_t second_value = (*second_ptr & 0x1);
uint16_t result = !(first_value | second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
uint32_t first_value = (*first_ptr & 0x1);
uint32_t second_value = (*second_ptr & 0x1);
uint32_t result = !(first_value | second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
case 31: //vmxnor
{
D(3, "vmxnor");
vector<Reg<char *>> vr1 = c.vreg[rsrc[0]];
vector<Reg<char *>> vr2 = c.vreg[rsrc[1]];
vector<Reg<char *>> vd = c.vreg[rdest];
if(c.vtype.vsew == 8){
for(uint8_t i = 0; i < c.vl; i++){
uint8_t *first_ptr = (uint8_t *)vr1[i].val;
uint8_t *second_ptr = (uint8_t *)vr2[i].val;
uint8_t first_value = (*first_ptr & 0x1);
uint8_t second_value = (*second_ptr & 0x1);
uint8_t result = !(first_value ^ second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint8_t * result_ptr = (uint8_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 16) {
for(uint16_t i = 0; i < c.vl; i++){
uint16_t *first_ptr = (uint16_t *)vr1[i].val;
uint16_t *second_ptr = (uint16_t *)vr2[i].val;
uint16_t first_value = (*first_ptr & 0x1);
uint16_t second_value = (*second_ptr & 0x1);
uint16_t result = !(first_value ^ second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint16_t * result_ptr = (uint16_t *) vd[i].val;
*result_ptr = result;
}
} else if(c.vtype.vsew == 32) {
for(uint32_t i = 0; i < c.vl; i++){
uint32_t *first_ptr = (uint32_t *)vr1[i].val;
uint32_t *second_ptr = (uint32_t *)vr2[i].val;
uint32_t first_value = (*first_ptr & 0x1);
uint32_t second_value = (*second_ptr & 0x1);
uint32_t result = !(first_value ^ second_value);
cout << "Comparing " << *first_ptr << " + " << *second_ptr << " = " << result << '\n';
uint32_t * result_ptr = (uint32_t *) vd[i].val;
*result_ptr = result;
}
}
}
break;
}
}
break;
case 7:
{
is_vec = true;
c.vtype.vill = 0; //TODO
c.vtype.vediv = vediv;
c.vtype.vsew = vsew;
c.vtype.vlmul = vlmul;
D(3, "lmul:" << vlmul << " sew:" << vsew << " ediv: " << vediv);
Word VLMAX = (vlmul * c.VLEN)/vsew;
if(reg[rsrc[0]] <= VLMAX){
c.vl = reg[rsrc[0]];
}
if(reg[rsrc[0]] >= (2*VLMAX)) {
c.vl = VLMAX;
}
reg[rdest] = c.vl;
D(3, "VL:" << reg[rdest]);
Word regNum(0);
for (int j = 0; j < 32; j++)
{
c.vreg.push_back(vector<Reg<char*>>());
for (int i = 0; i < (c.VLEN/vsew); ++i)
{
int * elem_ptr = (int *) malloc(vsew/8);
for (int f = 0; f < (vsew/32); f++) elem_ptr[f] = 0;
c.vreg[j].push_back(Reg<char*>(c.id, regNum++, (char *) elem_ptr));
}
}
}
break;
}
break;
case VL:
{
is_vec = true;
D(3, "Executing vector load");
VLMAX = (c.vtype.vlmul * c.VLEN)/c.vtype.vsew;
D(3, "lmul: " << c.vtype.vlmul << " VLEN:" << c.VLEN << "sew: " << c.vtype.vsew);
D(3, "src: " << rsrc[0] << " " << reg[rsrc[0]]);
D(3, "dest" << rdest);
D(3, "width" << vlsWidth);
vector<Reg<char *>> vd = c.vreg[rdest];
switch(vlsWidth) {
case 6: //load word and unit strided (not checking for unit stride)
for(Word i = 0; i < c.vl; i++) {
memAddr = ((reg[rsrc[0]]) & 0xFFFFFFFC) + i*c.vtype.vsew;
data_read = c.core->mem.read(memAddr, c.supervisorMode);
D(3, "Data read " << data_read);
int * result_ptr = (int *) vd[i].val;
*result_ptr = data_read;
//trace_inst->is_lw = true;
//trace_inst->mem_addresses[t] = memAddr;
}
for(Word i = c.vl; i < VLMAX; i++){
int * result_ptr = (int *) vd[i].val;
*result_ptr = 0;
}
D(3, "Vector Register state after addition:");
for(int i=0; i < c.vreg.size(); i++)
for(int j=0; j< c.vreg[0].size(); j++)
{
if (c.vtype.vsew == 8)
{
uint8_t * ptr_val = (uint8_t *) c.vreg[i][j].val;
std::cout << "reg[" << i << "][" << j << "] = " << *ptr_val << std::endl;
} else if (c.vtype.vsew == 16)
{
uint16_t * ptr_val = (uint16_t *) c.vreg[i][j].val;
std::cout << "reg[" << i << "][" << j << "] = " << *ptr_val << std::endl;
} else if (c.vtype.vsew == 32)
{
uint32_t * ptr_val = (uint32_t *) c.vreg[i][j].val;
std::cout << "reg[" << i << "][" << j << "] = " << *ptr_val << std::endl;
}
}
break;
}
}
break;
case VS:
is_vec = true;
VLMAX = (c.vtype.vlmul * c.VLEN)/c.vtype.vsew;
for(Word i = 0; i < c.vl; i++) {
++c.stores;
memAddr = reg[rsrc[0]] + i*c.vtype.vsew;
std::cout << "STORE MEM ADDRESS: " << std::hex << memAddr << "\n";
//trace_inst->is_sw = true;
//trace_inst->mem_addresses[t] = memAddr;
switch (vlsWidth)
{
case 6: //store word and unit strided (not checking for unit stride)
{
uint32_t * ptr_val = (uint32_t *) c.vreg[vs3][i].val;
c.core->mem.write(memAddr, *ptr_val, c.supervisorMode, 4);
D(3, "store: " << memAddr << " value:" << *ptr_val);
}
break;
default:
cout << "ERROR: UNSUPPORTED S INST\n";
exit(1);
}
c.memAccesses.push_back(Warp::MemAccess(true, memAddr));
}
break;
default:
cout << "pc: " << hex << (c.pc-4) << "\n";
cout << "aERROR: Unsupported instruction: " << *this << "\n" << flush;

View file

@ -3,4 +3,4 @@ echo start > results.txt
# echo ../kernel/vortex_test.hex
make
printf "Fasten your seatbelts ladies and gentelmen!!\n\n\n\n"
cd obj_dir && ./Vcache_simX -E -a rv32i --core /home/fares/Desktop/Vortex/runtime/mains/simple/vx_simple_main.hex -s -b 1> emulator.debug
cd obj_dir && ./Vcache_simX -E -a rv32i --core ../../runtime/mains/simple/vx_simple_main.hex -s -b 1> emulator.debug