Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(496)

Unified Diff: src/s390/simulator-s390.cc

Issue 2045943002: [compiler] [wasm] Introduce Word32/64ReverseBytes as TF Optional Opcode (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Use ByteReverse in simulator Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/compiler/machine-operator.h ('K') | « src/s390/simulator-s390.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/s390/simulator-s390.cc
diff --git a/src/s390/simulator-s390.cc b/src/s390/simulator-s390.cc
index 434fbffcfc53e040be9dafb7e593573090c8b536..a267d697d3b5d7e042ac85a5e3575ff81391990d 100644
--- a/src/s390/simulator-s390.cc
+++ b/src/s390/simulator-s390.cc
@@ -1793,6 +1793,11 @@ uint32_t Simulator::ReadWU(intptr_t addr, Instruction* instr) {
return *ptr;
}
+int64_t Simulator::ReadW64(intptr_t addr, Instruction* instr) {
+ int64_t* ptr = reinterpret_cast<int64_t*>(addr);
+ return *ptr;
+}
+
int32_t Simulator::ReadW(intptr_t addr, Instruction* instr) {
int32_t* ptr = reinterpret_cast<int32_t*>(addr);
return *ptr;
@@ -5558,15 +5563,31 @@ bool Simulator::DecodeSixByteArithmetic(Instruction* instr) {
}
int16_t Simulator::ByteReverse(int16_t hword) {
+#if defined(__GNUC__)
+ return __builtin_bswap16(hword);
+#else
return (hword << 8) | ((hword >> 8) & 0x00ff);
+#endif
}
int32_t Simulator::ByteReverse(int32_t word) {
+#if defined(__GNUC__)
+ return __builtin_bswap32(word);
+#else
int32_t result = word << 24;
result |= (word << 8) & 0x00ff0000;
result |= (word >> 8) & 0x0000ff00;
result |= (word >> 24) & 0x00000ff;
return result;
+#endif
+}
+
+int64_t Simulator::ByteReverse(int64_t dword) {
+#if defined(__GNUC__)
+ return __builtin_bswap64(dword);
+#else
+#error unsupport __builtin_bswap64
+#endif
}
int Simulator::DecodeInstructionOriginal(Instruction* instr) {
@@ -9982,9 +10003,14 @@ EVALUATE(KMAC) {
}
EVALUATE(LRVR) {
- UNIMPLEMENTED();
- USE(instr);
- return 0;
+ DCHECK_OPCODE(LRVR);
+ DECODE_RRE_INSTRUCTION(r1, r2);
+ int32_t r2_val = get_low_register<int32_t>(r2);
+ int32_t r1_val = 0;
+ r1_val = ByteReverse(r2_val);
+
+ set_low_register(r1, r1_val);
+ return length;
}
EVALUATE(CGR) {
@@ -10783,12 +10809,6 @@ EVALUATE(CVBG) {
return 0;
}
-EVALUATE(LRVG) {
- UNIMPLEMENTED();
- USE(instr);
- return 0;
-}
-
EVALUATE(LT) {
DCHECK_OPCODE(LT);
DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
@@ -10885,6 +10905,17 @@ EVALUATE(DSGF) {
return 0;
}
+EVALUATE(LRVG) {
+ DCHECK_OPCODE(LRVG);
+ DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
+ int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
+ int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
+ intptr_t mem_addr = b2_val + x2_val + d2;
+ int64_t mem_val = ReadW64(mem_addr, instr);
+ set_register(r1, ByteReverse(mem_val));
+ return length;
+}
+
EVALUATE(LRV) {
DCHECK_OPCODE(LRV);
DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
@@ -10952,12 +10983,6 @@ EVALUATE(CVDG) {
return 0;
}
-EVALUATE(STRVG) {
- UNIMPLEMENTED();
- USE(instr);
- return 0;
-}
-
EVALUATE(CGF) {
UNIMPLEMENTED();
USE(instr);
@@ -10999,6 +11024,17 @@ EVALUATE(STRV) {
return length;
}
+EVALUATE(STRVG) {
+ DCHECK_OPCODE(STRVG);
+ DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
+ int64_t r1_val = get_register(r1);
+ int64_t x2_val = (x2 == 0) ? 0 : get_register(x2);
+ int64_t b2_val = (b2 == 0) ? 0 : get_register(b2);
+ intptr_t mem_addr = b2_val + x2_val + d2;
+ WriteDW(mem_addr, ByteReverse(r1_val));
+ return length;
+}
+
EVALUATE(STRVH) {
DCHECK_OPCODE(STRVH);
DECODE_RXY_A_INSTRUCTION(r1, x2, b2, d2);
« src/compiler/machine-operator.h ('K') | « src/s390/simulator-s390.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698