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

Side by Side Diff: runtime/vm/simulator_arm.cc

Issue 19493004: Adds more SIMD instructions for ARM. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/disassembler_arm.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include <math.h> // for isnan. 5 #include <math.h> // for isnan.
6 #include <setjmp.h> 6 #include <setjmp.h>
7 #include <stdlib.h> 7 #include <stdlib.h>
8 8
9 #include "vm/globals.h" 9 #include "vm/globals.h"
10 #if defined(TARGET_ARCH_ARM) 10 #if defined(TARGET_ARCH_ARM)
(...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 void Simulator::set_qregister(QRegister reg, const simd_value_t& value) { 927 void Simulator::set_qregister(QRegister reg, const simd_value_t& value) {
928 ASSERT((reg >= 0) && (reg < kNumberOfQRegisters)); 928 ASSERT((reg >= 0) && (reg < kNumberOfQRegisters));
929 qregisters_[reg].data_[0] = value.data_[0]; 929 qregisters_[reg].data_[0] = value.data_[0];
930 qregisters_[reg].data_[1] = value.data_[1]; 930 qregisters_[reg].data_[1] = value.data_[1];
931 qregisters_[reg].data_[2] = value.data_[2]; 931 qregisters_[reg].data_[2] = value.data_[2];
932 qregisters_[reg].data_[3] = value.data_[3]; 932 qregisters_[reg].data_[3] = value.data_[3];
933 } 933 }
934 934
935 935
936 void Simulator::get_qregister(QRegister reg, simd_value_t* value) const { 936 void Simulator::get_qregister(QRegister reg, simd_value_t* value) const {
937 ASSERT((reg >= 0) && (reg < kNumberOfQRegisters)); 937 // TODO(zra): Replace this test with an assert after we support
938 *value = qregisters_[reg]; 938 // 16 Q registers.
939 if ((reg >= 0) && (reg < kNumberOfQRegisters)) {
940 *value = qregisters_[reg];
941 }
939 } 942 }
940 943
941 944
942 void Simulator::set_sregister_bits(SRegister reg, int32_t value) { 945 void Simulator::set_sregister_bits(SRegister reg, int32_t value) {
943 ASSERT((reg >= 0) && (reg < kNumberOfSRegisters)); 946 ASSERT((reg >= 0) && (reg < kNumberOfSRegisters));
944 sregisters_[reg] = value; 947 sregisters_[reg] = value;
945 } 948 }
946 949
947 950
948 int32_t Simulator::get_sregister_bits(SRegister reg) const { 951 int32_t Simulator::get_sregister_bits(SRegister reg) const {
(...skipping 2170 matching lines...) Expand 10 before | Expand all | Expand 10 after
3119 // Format(instr, "vmovq 'qd, 'qm"); 3122 // Format(instr, "vmovq 'qd, 'qm");
3120 for (int i = 0; i < 4; i++) { 3123 for (int i = 0; i < 4; i++) {
3121 s8d.data_[i].u = s8m.data_[i].u; 3124 s8d.data_[i].u = s8m.data_[i].u;
3122 } 3125 }
3123 } else { 3126 } else {
3124 // Format(instr, "vorrq 'qd, 'qm"); 3127 // Format(instr, "vorrq 'qd, 'qm");
3125 for (int i = 0; i < 4; i++) { 3128 for (int i = 0; i < 4; i++) {
3126 s8d.data_[i].u = s8n.data_[i].u | s8m.data_[i].u; 3129 s8d.data_[i].u = s8n.data_[i].u | s8m.data_[i].u;
3127 } 3130 }
3128 } 3131 }
3132 } else if ((instr->Bits(8, 4) == 1) && (instr->Bit(4) == 1) &&
3133 (instr->Bits(20, 2) == 0) && (instr->Bits(23, 2) == 0)) {
3134 // Format(instr, "vandq 'qd, 'qn, 'qm");
3135 for (int i = 0; i < 4; i++) {
3136 s8d.data_[i].u = s8n.data_[i].u & s8m.data_[i].u;
3137 }
3129 } else if ((instr->Bits(8, 4) == 15) && (instr->Bit(4) == 0) && 3138 } else if ((instr->Bits(8, 4) == 15) && (instr->Bit(4) == 0) &&
3130 (instr->Bits(20, 2) == 2) && (instr->Bits(23, 2) == 0)) { 3139 (instr->Bits(20, 2) == 2) && (instr->Bits(23, 2) == 0)) {
3131 // Format(instr, "vminqs 'qd, 'qn, 'qm"); 3140 // Format(instr, "vminqs 'qd, 'qn, 'qm");
3132 for (int i = 0; i < 4; i++) { 3141 for (int i = 0; i < 4; i++) {
3133 s8d.data_[i].f = 3142 s8d.data_[i].f =
3134 s8n.data_[i].f <= s8m.data_[i].f ? s8n.data_[i].f : s8m.data_[i].f; 3143 s8n.data_[i].f <= s8m.data_[i].f ? s8n.data_[i].f : s8m.data_[i].f;
3135 } 3144 }
3136 } else if ((instr->Bits(8, 4) == 15) && (instr->Bit(4) == 0) && 3145 } else if ((instr->Bits(8, 4) == 15) && (instr->Bit(4) == 0) &&
3137 (instr->Bits(20, 2) == 0) && (instr->Bits(23, 2) == 0)) { 3146 (instr->Bits(20, 2) == 0) && (instr->Bits(23, 2) == 0)) {
3138 // Format(instr, "vmaxqs 'qd, 'qn, 'qm"); 3147 // Format(instr, "vmaxqs 'qd, 'qn, 'qm");
3139 for (int i = 0; i < 4; i++) { 3148 for (int i = 0; i < 4; i++) {
3140 s8d.data_[i].f = 3149 s8d.data_[i].f =
3141 s8n.data_[i].f >= s8m.data_[i].f ? s8n.data_[i].f : s8m.data_[i].f; 3150 s8n.data_[i].f >= s8m.data_[i].f ? s8n.data_[i].f : s8m.data_[i].f;
3142 } 3151 }
3152 } else if ((instr->Bits(8, 4) == 7) && (instr->Bit(4) == 0) &&
3153 (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 3) &&
3154 (instr->Bit(7) == 0) && (instr->Bits(16, 4) == 9)) {
3155 // Format(instr, "vabsqs 'qd, 'qm");
3156 for (int i = 0; i < 4; i++) {
3157 s8d.data_[i].f = abs(s8m.data_[i].f);
3158 }
3159 } else if ((instr->Bits(8, 4) == 7) && (instr->Bit(4) == 0) &&
3160 (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 3) &&
3161 (instr->Bit(7) == 1) && (instr->Bits(16, 4) == 9)) {
3162 // Format(instr, "vnegqs 'qd, 'qm");
3163 for (int i = 0; i < 4; i++) {
3164 s8d.data_[i].f = -s8m.data_[i].f;
3165 }
3143 } else if ((instr->Bits(7, 5) == 10) && (instr->Bit(4) == 0) && 3166 } else if ((instr->Bits(7, 5) == 10) && (instr->Bit(4) == 0) &&
3144 (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 3) && 3167 (instr->Bits(20, 2) == 3) && (instr->Bits(23, 2) == 3) &&
3145 (instr->Bits(16, 4) == 11)) { 3168 (instr->Bits(16, 4) == 11)) {
3146 // Format(instr, "vrecpeq 'qd, 'qm"); 3169 // Format(instr, "vrecpeq 'qd, 'qm");
3147 for (int i = 0; i < 4; i++) { 3170 for (int i = 0; i < 4; i++) {
3148 s8d.data_[i].f = arm_recip_estimate(s8m.data_[i].f); 3171 s8d.data_[i].f = arm_recip_estimate(s8m.data_[i].f);
3149 } 3172 }
3150 } else if ((instr->Bits(8, 4) == 15) && (instr->Bit(4) == 1) && 3173 } else if ((instr->Bits(8, 4) == 15) && (instr->Bit(4) == 1) &&
3151 (instr->Bits(20, 2) == 0) && (instr->Bits(23, 2) == 0)) { 3174 (instr->Bits(20, 2) == 0) && (instr->Bits(23, 2) == 0)) {
3152 // Format(instr, "vrecpsq 'qd, 'qn, 'qm"); 3175 // Format(instr, "vrecpsq 'qd, 'qn, 'qm");
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
3603 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); 3626 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception));
3604 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); 3627 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace));
3605 buf->Longjmp(); 3628 buf->Longjmp();
3606 } 3629 }
3607 3630
3608 } // namespace dart 3631 } // namespace dart
3609 3632
3610 #endif // !defined(HOST_ARCH_ARM) 3633 #endif // !defined(HOST_ARCH_ARM)
3611 3634
3612 #endif // defined TARGET_ARCH_ARM 3635 #endif // defined TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « runtime/vm/disassembler_arm.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698