[gem5-dev] Change in gem5/gem5[master]: mem: Add a helper function to get a word of variable length
Andreas Sandberg has submitted this change and it was merged. ( https://gem5-review.googlesource.com/9761 ) Change subject: mem: Add a helper function to get a word of variable length .. mem: Add a helper function to get a word of variable length There are many devices that need to handle reads/writes of different word sizes. A common pattern is a switch statement that check for the size of a packet and then calls the corresponding Packet::(get|set) methods. Simplify this by implementing Packet::(get|set)UintX helper functions. The getter reads a word of the size specified in the packet and the specified endianness. The word is then zero-extended to 64 bits. Conversely, the setter truncates the word down to the size required in the packet and then byte-swaps it to the desired endianness. Change-Id: I2f0c27fe3903abf3859bea13b07c7f5f0fb0809f Signed-off-by: Andreas SandbergReviewed-by: Nikos Nikoleris Reviewed-on: https://gem5-review.googlesource.com/9761 Maintainer: Nikos Nikoleris --- M src/mem/packet.cc M src/mem/packet.hh 2 files changed, 56 insertions(+), 2 deletions(-) Approvals: Nikos Nikoleris: Looks good to me, approved; Looks good to me, approved diff --git a/src/mem/packet.cc b/src/mem/packet.cc index ffda3d5..7a81cdb 100644 --- a/src/mem/packet.cc +++ b/src/mem/packet.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2017 ARM Limited + * Copyright (c) 2011-2018 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -56,6 +56,7 @@ #include "base/cprintf.hh" #include "base/logging.hh" #include "base/trace.hh" +#include "mem/packet_access.hh" using namespace std; @@ -364,6 +365,45 @@ return sender_state; } +uint64_t +Packet::getUintX(ByteOrder endian) const +{ +switch(getSize()) { + case 1: +return (uint64_t)get(endian); + case 2: +return (uint64_t)get(endian); + case 4: +return (uint64_t)get(endian); + case 8: +return (uint64_t)get(endian); + default: +panic("%i isn't a supported word size.\n", getSize()); +} +} + +void +Packet::setUintX(uint64_t w, ByteOrder endian) +{ +switch(getSize()) { + case 1: +set((uint8_t)w, endian); +break; + case 2: +set((uint16_t)w, endian); +break; + case 4: +set((uint32_t)w, endian); +break; + case 8: +set((uint64_t)w, endian); +break; + default: +panic("%i isn't a supported word size.\n", getSize()); +} + +} + void Packet::print(ostream , const int verbosity, const string ) const { diff --git a/src/mem/packet.hh b/src/mem/packet.hh index b5b882c..a4eeabe 100644 --- a/src/mem/packet.hh +++ b/src/mem/packet.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 ARM Limited + * Copyright (c) 2012-2018 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -1068,6 +1068,20 @@ template void set(T v); + +/** + * Get the data in the packet byte swapped from the specified + * endianness and zero-extended to 64 bits. + */ +uint64_t getUintX(ByteOrder endian) const; + +/** + * Set the value in the word w after truncating it to the length + * of the packet and then byteswapping it to the desired + * endianness. + */ +void setUintX(uint64_t w, ByteOrder endian); + /** * Copy data into the packet from the provided pointer. */ -- To view, visit https://gem5-review.googlesource.com/9761 To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings Gerrit-Project: public/gem5 Gerrit-Branch: master Gerrit-Change-Id: I2f0c27fe3903abf3859bea13b07c7f5f0fb0809f Gerrit-Change-Number: 9761 Gerrit-PatchSet: 2 Gerrit-Owner: Andreas Sandberg Gerrit-Reviewer: Andreas Sandberg Gerrit-Reviewer: Nikos Nikoleris Gerrit-MessageType: merged ___ gem5-dev mailing list gem5-dev@gem5.org http://m5sim.org/mailman/listinfo/gem5-dev
[gem5-dev] Change in gem5/gem5[master]: mem: Add a helper function to get a word of variable length
Hello Nikos Nikoleris, I'd like you to do a code review. Please visit https://gem5-review.googlesource.com/9761 to review the following change. Change subject: mem: Add a helper function to get a word of variable length .. mem: Add a helper function to get a word of variable length There are many devices that need to handle reads/writes of different word sizes. A common pattern is a switch statement that check for the size of a packet and then calls the corresponding Packet::(get|set) methods. Simplify this by implementing Packet::(get|set)UintX helper functions. The getter reads a word of the size specified in the packet and the specified endianness. The word is then zero-extended to 64 bits. Conversely, the setter truncates the word down to the size required in the packet and then byte-swaps it to the desired endianness. Change-Id: I2f0c27fe3903abf3859bea13b07c7f5f0fb0809f Signed-off-by: Andreas SandbergReviewed-by: Nikos Nikoleris --- M src/mem/packet.cc M src/mem/packet.hh 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/mem/packet.cc b/src/mem/packet.cc index ffda3d5..7a81cdb 100644 --- a/src/mem/packet.cc +++ b/src/mem/packet.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2017 ARM Limited + * Copyright (c) 2011-2018 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -56,6 +56,7 @@ #include "base/cprintf.hh" #include "base/logging.hh" #include "base/trace.hh" +#include "mem/packet_access.hh" using namespace std; @@ -364,6 +365,45 @@ return sender_state; } +uint64_t +Packet::getUintX(ByteOrder endian) const +{ +switch(getSize()) { + case 1: +return (uint64_t)get(endian); + case 2: +return (uint64_t)get(endian); + case 4: +return (uint64_t)get(endian); + case 8: +return (uint64_t)get(endian); + default: +panic("%i isn't a supported word size.\n", getSize()); +} +} + +void +Packet::setUintX(uint64_t w, ByteOrder endian) +{ +switch(getSize()) { + case 1: +set((uint8_t)w, endian); +break; + case 2: +set((uint16_t)w, endian); +break; + case 4: +set((uint32_t)w, endian); +break; + case 8: +set((uint64_t)w, endian); +break; + default: +panic("%i isn't a supported word size.\n", getSize()); +} + +} + void Packet::print(ostream , const int verbosity, const string ) const { diff --git a/src/mem/packet.hh b/src/mem/packet.hh index b5b882c..a4eeabe 100644 --- a/src/mem/packet.hh +++ b/src/mem/packet.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 ARM Limited + * Copyright (c) 2012-2018 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -1068,6 +1068,20 @@ template void set(T v); + +/** + * Get the data in the packet byte swapped from the specified + * endianness and zero-extended to 64 bits. + */ +uint64_t getUintX(ByteOrder endian) const; + +/** + * Set the value in the word w after truncating it to the length + * of the packet and then byteswapping it to the desired + * endianness. + */ +void setUintX(uint64_t w, ByteOrder endian); + /** * Copy data into the packet from the provided pointer. */ -- To view, visit https://gem5-review.googlesource.com/9761 To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings Gerrit-Project: public/gem5 Gerrit-Branch: master Gerrit-Change-Id: I2f0c27fe3903abf3859bea13b07c7f5f0fb0809f Gerrit-Change-Number: 9761 Gerrit-PatchSet: 1 Gerrit-Owner: Andreas Sandberg Gerrit-Reviewer: Nikos Nikoleris Gerrit-MessageType: newchange ___ gem5-dev mailing list gem5-dev@gem5.org http://m5sim.org/mailman/listinfo/gem5-dev