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

Side by Side Diff: tests/Sk64Test.cpp

Issue 18539004: ARM Skia NEON patches - 04 - Clean SkFixed / SkLONGLONG (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Remove SkLONGLONG + use int64_t where there was an existing long long SkFixed implementation Created 7 years, 4 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 | « tests/MathTest.cpp ('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 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 #include "Test.h" 8 #include "Test.h"
9 #include "SkRandom.h" 9 #include "SkRandom.h"
10 #include <math.h> 10 #include <math.h>
11 11
12 struct BoolTable { 12 struct BoolTable {
13 int8_t zero, pos, neg, toBool, sign; 13 int8_t zero, pos, neg, toBool, sign;
14 }; 14 };
15 15
16 static void bool_table_test(skiatest::Reporter* reporter, 16 static void bool_table_test(skiatest::Reporter* reporter,
17 const Sk64& a, const BoolTable& table) 17 const Sk64& a, const BoolTable& table)
18 { 18 {
19 REPORTER_ASSERT(reporter, a.isZero() != a.nonZero()); 19 REPORTER_ASSERT(reporter, a.isZero() != a.nonZero());
20 20
21 REPORTER_ASSERT(reporter, !a.isZero() == !table.zero); 21 REPORTER_ASSERT(reporter, !a.isZero() == !table.zero);
22 REPORTER_ASSERT(reporter, !a.isPos() == !table.pos); 22 REPORTER_ASSERT(reporter, !a.isPos() == !table.pos);
23 REPORTER_ASSERT(reporter, !a.isNeg() == !table.neg); 23 REPORTER_ASSERT(reporter, !a.isNeg() == !table.neg);
24 REPORTER_ASSERT(reporter, a.getSign() == table.sign); 24 REPORTER_ASSERT(reporter, a.getSign() == table.sign);
25 } 25 }
26 26
27 #ifdef SkLONGLONG
28 static SkLONGLONG asLL(const Sk64& a)
29 {
30 return ((SkLONGLONG)a.fHi << 32) | a.fLo;
31 }
32 #endif
33
34 static void TestSk64(skiatest::Reporter* reporter) { 27 static void TestSk64(skiatest::Reporter* reporter) {
35 enum BoolTests { 28 enum BoolTests {
36 kZero_BoolTest, 29 kZero_BoolTest,
37 kPos_BoolTest, 30 kPos_BoolTest,
38 kNeg_BoolTest 31 kNeg_BoolTest
39 }; 32 };
40 static const BoolTable gBoolTable[] = { 33 static const BoolTable gBoolTable[] = {
41 { 1, 0, 0, 0, 0 }, 34 { 1, 0, 0, 0, 0 },
42 { 0, 1, 0, 1, 1 }, 35 { 0, 1, 0, 1, 1 },
43 { 0, 0, 1, 1, -1 } 36 { 0, 0, 1, 1, -1 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 REPORTER_ASSERT(reporter, a.get32() == aa && b.get32() == bb); 80 REPORTER_ASSERT(reporter, a.get32() == aa && b.get32() == bb);
88 c = a; c.add(bb); 81 c = a; c.add(bb);
89 REPORTER_ASSERT(reporter, c.get32() == aa + bb); 82 REPORTER_ASSERT(reporter, c.get32() == aa + bb);
90 c = a; c.add(-bb); 83 c = a; c.add(-bb);
91 REPORTER_ASSERT(reporter, c.get32() == aa - bb); 84 REPORTER_ASSERT(reporter, c.get32() == aa - bb);
92 c = a; c.add(b); 85 c = a; c.add(b);
93 REPORTER_ASSERT(reporter, c.get32() == aa + bb); 86 REPORTER_ASSERT(reporter, c.get32() == aa + bb);
94 c = a; c.sub(b); 87 c = a; c.sub(b);
95 REPORTER_ASSERT(reporter, c.get32() == aa - bb); 88 REPORTER_ASSERT(reporter, c.get32() == aa - bb);
96 } 89 }
97
98 #ifdef SkLONGLONG
99 for (i = 0; i < 1000; i++)
100 {
101 rand.next64(&a); //a.fHi >>= 1; // avoid overflow
102 rand.next64(&b); //b.fHi >>= 1; // avoid overflow
103
104 if (!(i & 3)) // want to explicitly test these cases
105 {
106 a.fLo = 0;
107 b.fLo = 0;
108 }
109 else if (!(i & 7)) // want to explicitly test these cases
110 {
111 a.fHi = 0;
112 b.fHi = 0;
113 }
114
115 SkLONGLONG aa = asLL(a);
116 SkLONGLONG bb = asLL(b);
117
118 REPORTER_ASSERT(reporter, (a < b) == (aa < bb));
119 REPORTER_ASSERT(reporter, (a <= b) == (aa <= bb));
120 REPORTER_ASSERT(reporter, (a > b) == (aa > bb));
121 REPORTER_ASSERT(reporter, (a >= b) == (aa >= bb));
122 REPORTER_ASSERT(reporter, (a == b) == (aa == bb));
123 REPORTER_ASSERT(reporter, (a != b) == (aa != bb));
124
125 c = a; c.add(b);
126 REPORTER_ASSERT(reporter, asLL(c) == aa + bb);
127 c = a; c.sub(b);
128 REPORTER_ASSERT(reporter, asLL(c) == aa - bb);
129 c = a; c.rsub(b);
130 REPORTER_ASSERT(reporter, asLL(c) == bb - aa);
131 c = a; c.negate();
132 REPORTER_ASSERT(reporter, asLL(c) == -aa);
133
134 int bits = rand.nextU() & 63;
135 c = a; c.shiftLeft(bits);
136 REPORTER_ASSERT(reporter, asLL(c) == (aa << bits));
137 c = a; c.shiftRight(bits);
138 REPORTER_ASSERT(reporter, asLL(c) == (aa >> bits));
139 c = a; c.roundRight(bits);
140
141 SkLONGLONG tmp;
142
143 tmp = aa;
144 if (bits > 0)
145 tmp += (SkLONGLONG)1 << (bits - 1);
146 REPORTER_ASSERT(reporter, asLL(c) == (tmp >> bits));
147
148 c.setMul(a.fHi, b.fHi);
149 tmp = (SkLONGLONG)a.fHi * b.fHi;
150 REPORTER_ASSERT(reporter, asLL(c) == tmp);
151 }
152
153
154 for (i = 0; i < 100000; i++)
155 {
156 Sk64 wide;
157 int32_t denom = rand.nextS();
158
159 while (denom == 0)
160 denom = rand.nextS();
161 wide.setMul(rand.nextS(), rand.nextS());
162 SkLONGLONG check = wide.getLongLong();
163
164 wide.div(denom, Sk64::kTrunc_DivOption);
165 check /= denom;
166 SkLONGLONG w = wide.getLongLong();
167
168 REPORTER_ASSERT(reporter, check == w);
169
170 wide.setMul(rand.nextS(), rand.nextS());
171 wide.abs();
172 denom = wide.getSqrt();
173 int32_t ck = (int32_t)sqrt((double)wide.getLongLong());
174 int diff = denom - ck;
175 REPORTER_ASSERT(reporter, SkAbs32(diff) <= 1);
176
177 wide.setMul(rand.nextS(), rand.nextS());
178 Sk64 dwide;
179 dwide.setMul(rand.nextS(), rand.nextS());
180 SkFixed fixdiv = wide.getFixedDiv(dwide);
181 double dnumer = (double)wide.getLongLong();
182 double ddenom = (double)dwide.getLongLong();
183 double ddiv = dnumer / ddenom;
184 SkFixed dfixdiv;
185 if (ddiv >= (double)SK_MaxS32 / (double)SK_Fixed1)
186 dfixdiv = SK_MaxS32;
187 else if (ddiv <= -(double)SK_MaxS32 / (double)SK_Fixed1)
188 dfixdiv = SK_MinS32;
189 else
190 dfixdiv = SkFloatToFixed(dnumer / ddenom);
191 diff = fixdiv - dfixdiv;
192
193 if (SkAbs32(diff) > 1) {
194 SkDebugf(" %d === numer %g denom %g div %g xdiv %x fxdiv %x\n",
195 i, dnumer, ddenom, ddiv, dfixdiv, fixdiv);
196 }
197 REPORTER_ASSERT(reporter, SkAbs32(diff) <= 1);
198 }
199 #endif
200 } 90 }
201 91
202 #include "TestClassDef.h" 92 #include "TestClassDef.h"
203 DEFINE_TESTCLASS("Sk64", Sk64TestClass, TestSk64) 93 DEFINE_TESTCLASS("Sk64", Sk64TestClass, TestSk64)
OLDNEW
« no previous file with comments | « tests/MathTest.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698