OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 3452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3463 } | 3463 } |
3464 } | 3464 } |
3465 | 3465 |
3466 | 3466 |
3467 void Simulator::DecodeSpecialCondition(Instruction* instr) { | 3467 void Simulator::DecodeSpecialCondition(Instruction* instr) { |
3468 switch (instr->SpecialValue()) { | 3468 switch (instr->SpecialValue()) { |
3469 case 5: | 3469 case 5: |
3470 if ((instr->Bits(18, 16) == 0) && (instr->Bits(11, 6) == 0x28) && | 3470 if ((instr->Bits(18, 16) == 0) && (instr->Bits(11, 6) == 0x28) && |
3471 (instr->Bit(4) == 1)) { | 3471 (instr->Bit(4) == 1)) { |
3472 // vmovl signed | 3472 // vmovl signed |
3473 int Vd = (instr->Bit(22) << 4) | instr->VdValue(); | 3473 if ((instr->VdValue() & 1) != 0) UNIMPLEMENTED(); |
| 3474 int Vd = (instr->Bit(22) << 3) | (instr->VdValue() >> 1); |
3474 int Vm = (instr->Bit(5) << 4) | instr->VmValue(); | 3475 int Vm = (instr->Bit(5) << 4) | instr->VmValue(); |
3475 int imm3 = instr->Bits(21, 19); | 3476 int imm3 = instr->Bits(21, 19); |
3476 if ((imm3 != 1) && (imm3 != 2) && (imm3 != 4)) UNIMPLEMENTED(); | 3477 if ((imm3 != 1) && (imm3 != 2) && (imm3 != 4)) UNIMPLEMENTED(); |
3477 int esize = 8 * imm3; | 3478 int esize = 8 * imm3; |
3478 int elements = 64 / esize; | 3479 int elements = 64 / esize; |
3479 int8_t from[8]; | 3480 int8_t from[8]; |
3480 get_d_register(Vm, reinterpret_cast<uint64_t*>(from)); | 3481 get_d_register(Vm, reinterpret_cast<uint64_t*>(from)); |
3481 int16_t to[8]; | 3482 int16_t to[8]; |
3482 int e = 0; | 3483 int e = 0; |
3483 while (e < elements) { | 3484 while (e < elements) { |
3484 to[e] = from[e]; | 3485 to[e] = from[e]; |
3485 e++; | 3486 e++; |
3486 } | 3487 } |
3487 set_q_register(Vd, reinterpret_cast<uint64_t*>(to)); | 3488 set_q_register(Vd, reinterpret_cast<uint64_t*>(to)); |
3488 } else { | 3489 } else { |
3489 UNIMPLEMENTED(); | 3490 UNIMPLEMENTED(); |
3490 } | 3491 } |
3491 break; | 3492 break; |
3492 case 7: | 3493 case 7: |
3493 if ((instr->Bits(18, 16) == 0) && (instr->Bits(11, 6) == 0x28) && | 3494 if ((instr->Bits(18, 16) == 0) && (instr->Bits(11, 6) == 0x28) && |
3494 (instr->Bit(4) == 1)) { | 3495 (instr->Bit(4) == 1)) { |
3495 // vmovl unsigned | 3496 // vmovl unsigned |
3496 int Vd = (instr->Bit(22) << 4) | instr->VdValue(); | 3497 if ((instr->VdValue() & 1) != 0) UNIMPLEMENTED(); |
| 3498 int Vd = (instr->Bit(22) << 3) | (instr->VdValue() >> 1); |
3497 int Vm = (instr->Bit(5) << 4) | instr->VmValue(); | 3499 int Vm = (instr->Bit(5) << 4) | instr->VmValue(); |
3498 int imm3 = instr->Bits(21, 19); | 3500 int imm3 = instr->Bits(21, 19); |
3499 if ((imm3 != 1) && (imm3 != 2) && (imm3 != 4)) UNIMPLEMENTED(); | 3501 if ((imm3 != 1) && (imm3 != 2) && (imm3 != 4)) UNIMPLEMENTED(); |
3500 int esize = 8 * imm3; | 3502 int esize = 8 * imm3; |
3501 int elements = 64 / esize; | 3503 int elements = 64 / esize; |
3502 uint8_t from[8]; | 3504 uint8_t from[8]; |
3503 get_d_register(Vm, reinterpret_cast<uint64_t*>(from)); | 3505 get_d_register(Vm, reinterpret_cast<uint64_t*>(from)); |
3504 uint16_t to[8]; | 3506 uint16_t to[8]; |
3505 int e = 0; | 3507 int e = 0; |
3506 while (e < elements) { | 3508 while (e < elements) { |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3850 uintptr_t address = *stack_slot; | 3852 uintptr_t address = *stack_slot; |
3851 set_register(sp, current_sp + sizeof(uintptr_t)); | 3853 set_register(sp, current_sp + sizeof(uintptr_t)); |
3852 return address; | 3854 return address; |
3853 } | 3855 } |
3854 | 3856 |
3855 } } // namespace v8::internal | 3857 } } // namespace v8::internal |
3856 | 3858 |
3857 #endif // USE_SIMULATOR | 3859 #endif // USE_SIMULATOR |
3858 | 3860 |
3859 #endif // V8_TARGET_ARCH_ARM | 3861 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |