Commit 837ac3f6 authored by Ng Zhi An's avatar Ng Zhi An Committed by Commit Bot

[arm] Fix simulator implementation for vld1

vld1 was calling set_neon_register with the wrong size for register. We
follow the pseudocode implementation in the manual, by splatting the
value into a d register, and writing to the list of registers in a loop.

Bug: chromium:1092059
Change-Id: I2ce594594cd59347c20b88926f8ecc18ef9d5514
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2238506Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
Commit-Queue: Zhi An Ng <zhin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#68297}
parent 33081e58
......@@ -5658,12 +5658,12 @@ void Simulator::DecodeSpecialCondition(Instruction* instr) {
int32_t address = get_register(Rn);
int regs = instr->Bit(5) + 1;
int size = instr->Bits(7, 6);
uint32_t q_data[4];
uint32_t q_data[2];
switch (size) {
case Neon8: {
uint8_t data = ReadBU(address);
uint8_t* dst = reinterpret_cast<uint8_t*>(q_data);
for (int i = 0; i < 16; i++) {
for (int i = 0; i < 8; i++) {
dst[i] = data;
}
break;
......@@ -5671,21 +5671,21 @@ void Simulator::DecodeSpecialCondition(Instruction* instr) {
case Neon16: {
uint16_t data = ReadHU(address);
uint16_t* dst = reinterpret_cast<uint16_t*>(q_data);
for (int i = 0; i < 8; i++) {
for (int i = 0; i < 4; i++) {
dst[i] = data;
}
break;
}
case Neon32: {
uint32_t data = ReadW(address);
for (int i = 0; i < 4; i++) {
for (int i = 0; i < 2; i++) {
q_data[i] = data;
}
break;
}
}
for (int r = 0; r < regs; r++) {
set_neon_register(Vd + r, q_data);
set_neon_register<uint32_t, kDoubleSize>(Vd + r, q_data);
}
if (Rm != 15) {
if (Rm == 13) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment