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

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

Issue 19978004: Implements Float32x4 and Uint32x4 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/assembler_arm.h ('k') | runtime/vm/intermediate_language_arm.cc » ('j') | 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 "vm/globals.h" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_ARM) 6 #if defined(TARGET_ARCH_ARM)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/simulator.h" 9 #include "vm/simulator.h"
10 #include "vm/runtime_entry.h" 10 #include "vm/runtime_entry.h"
(...skipping 1861 matching lines...) Expand 10 before | Expand all | Expand 10 after
1872 void Assembler::Ror(Register rd, Register rm, Register rs, Condition cond) { 1872 void Assembler::Ror(Register rd, Register rm, Register rs, Condition cond) {
1873 mov(rd, ShifterOperand(rm, ROR, rs), cond); 1873 mov(rd, ShifterOperand(rm, ROR, rs), cond);
1874 } 1874 }
1875 1875
1876 1876
1877 void Assembler::Rrx(Register rd, Register rm, Condition cond) { 1877 void Assembler::Rrx(Register rd, Register rm, Condition cond) {
1878 mov(rd, ShifterOperand(rm, ROR, 0), cond); 1878 mov(rd, ShifterOperand(rm, ROR, 0), cond);
1879 } 1879 }
1880 1880
1881 1881
1882 void Assembler::Vreciprocalqs(QRegister qd, QRegister qm) {
1883 ASSERT(qm != QTMP);
1884 ASSERT(qd != QTMP);
1885
1886 // Reciprocal estimate.
1887 vrecpeqs(qd, qm);
1888 // 2 Newton-Raphson steps.
1889 vrecpsqs(QTMP, qm, qd);
1890 vmulqs(qd, qd, QTMP);
1891 vrecpsqs(QTMP, qm, qd);
1892 vmulqs(qd, qd, QTMP);
1893 }
1894
1895
1896 void Assembler::VreciprocalSqrtqs(QRegister qd, QRegister qm) {
1897 ASSERT(qm != QTMP);
1898 ASSERT(qd != QTMP);
1899
1900 // Reciprocal square root estimate.
1901 vrsqrteqs(qd, qm);
1902 // 2 Newton-Raphson steps. xn+1 = xn * (3 - Q1*xn^2) / 2.
1903 // First step.
1904 vmulqs(QTMP, qd, qd); // QTMP <- xn^2
1905 vrsqrtsqs(QTMP, qm, QTMP); // QTMP <- (3 - Q1*QTMP) / 2.
1906 vmulqs(qd, qd, QTMP); // xn+1 <- xn * QTMP
1907 // Second step.
1908 vmulqs(QTMP, qd, qd);
1909 vrsqrtsqs(QTMP, qm, QTMP);
1910 vmulqs(qd, qd, QTMP);
1911 }
1912
1913
1914 void Assembler::Vsqrtqs(QRegister qd, QRegister qm, QRegister temp) {
1915 ASSERT(temp != QTMP);
1916 ASSERT(qm != QTMP);
1917 ASSERT(qd != QTMP);
1918
1919 if (temp != kNoQRegister) {
1920 vmovq(temp, qm);
1921 qm = temp;
1922 }
1923
1924 VreciprocalSqrtqs(qd, qm);
1925 vmovq(qm, qd);
1926 Vreciprocalqs(qd, qm);
1927 }
1928
1929
1930 void Assembler::Vdivqs(QRegister qd, QRegister qn, QRegister qm) {
1931 ASSERT(qd != QTMP);
1932 ASSERT(qn != QTMP);
1933 ASSERT(qm != QTMP);
1934
1935 Vreciprocalqs(qd, qm);
1936 vmulqs(qd, qn, qd);
1937 }
1938
1939
1882 void Assembler::Branch(const ExternalLabel* label, Condition cond) { 1940 void Assembler::Branch(const ExternalLabel* label, Condition cond) {
1883 LoadImmediate(IP, label->address(), cond); // Address is never patched. 1941 LoadImmediate(IP, label->address(), cond); // Address is never patched.
1884 bx(IP, cond); 1942 bx(IP, cond);
1885 } 1943 }
1886 1944
1887 1945
1888 void Assembler::BranchPatchable(const ExternalLabel* label) { 1946 void Assembler::BranchPatchable(const ExternalLabel* label) {
1889 // Use a fixed size code sequence, since a function prologue may be patched 1947 // Use a fixed size code sequence, since a function prologue may be patched
1890 // with this branch sequence. 1948 // with this branch sequence.
1891 // Contrarily to BranchLinkPatchable, BranchPatchable requires an instruction 1949 // Contrarily to BranchLinkPatchable, BranchPatchable requires an instruction
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after
2536 2594
2537 const char* Assembler::FpuRegisterName(FpuRegister reg) { 2595 const char* Assembler::FpuRegisterName(FpuRegister reg) {
2538 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters)); 2596 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters));
2539 return fpu_reg_names[reg]; 2597 return fpu_reg_names[reg];
2540 } 2598 }
2541 2599
2542 } // namespace dart 2600 } // namespace dart
2543 2601
2544 #endif // defined TARGET_ARCH_ARM 2602 #endif // defined TARGET_ARCH_ARM
2545 2603
OLDNEW
« no previous file with comments | « runtime/vm/assembler_arm.h ('k') | runtime/vm/intermediate_language_arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698