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

Side by Side Diff: test/mjsunit/harmony/atomics.js

Issue 1318713007: [Atomics] Remove support for atomic accesses on floating-point values. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: feedback Created 5 years, 3 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
« no previous file with comments | « test/mjsunit/asm/atomics-store.js ('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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Flags: --harmony-sharedarraybuffer 5 // Flags: --harmony-sharedarraybuffer
6 // 6 //
7 7
8 function toRangeWrapped(value) { 8 function toRangeWrapped(value) {
9 var range = this.max - this.min + 1; 9 var range = this.max - this.min + 1;
10 while (value < this.min) { 10 while (value < this.min) {
(...skipping 20 matching lines...) Expand all
31 var IntegerTypedArrayConstructors = [ 31 var IntegerTypedArrayConstructors = [
32 makeConstructorObject(Int8Array, -128, 127, toRangeWrapped), 32 makeConstructorObject(Int8Array, -128, 127, toRangeWrapped),
33 makeConstructorObject(Int16Array, -32768, 32767, toRangeWrapped), 33 makeConstructorObject(Int16Array, -32768, 32767, toRangeWrapped),
34 makeConstructorObject(Int32Array, -0x80000000, 0x7fffffff, toRangeWrapped), 34 makeConstructorObject(Int32Array, -0x80000000, 0x7fffffff, toRangeWrapped),
35 makeConstructorObject(Uint8Array, 0, 255, toRangeWrapped), 35 makeConstructorObject(Uint8Array, 0, 255, toRangeWrapped),
36 makeConstructorObject(Uint8ClampedArray, 0, 255, toRangeClamped), 36 makeConstructorObject(Uint8ClampedArray, 0, 255, toRangeClamped),
37 makeConstructorObject(Uint16Array, 0, 65535, toRangeWrapped), 37 makeConstructorObject(Uint16Array, 0, 65535, toRangeWrapped),
38 makeConstructorObject(Uint32Array, 0, 0xffffffff, toRangeWrapped), 38 makeConstructorObject(Uint32Array, 0, 0xffffffff, toRangeWrapped),
39 ]; 39 ];
40 40
41 var TypedArrayConstructors = IntegerTypedArrayConstructors.concat([
42 {constr: Float32Array},
43 {constr: Float64Array},
44 ]);
45
46 (function TestBadArray() { 41 (function TestBadArray() {
47 var ab = new ArrayBuffer(16); 42 var ab = new ArrayBuffer(16);
48 var u32a = new Uint32Array(16); 43 var u32a = new Uint32Array(16);
49 var sab = new SharedArrayBuffer(128); 44 var sab = new SharedArrayBuffer(128);
50 var sf32a = new Float32Array(sab); 45 var sf32a = new Float32Array(sab);
51 var sf64a = new Float64Array(sab); 46 var sf64a = new Float64Array(sab);
52 47
53 // Atomic ops required shared typed arrays 48 // Atomic ops required integer shared typed arrays
54 [undefined, 1, 'hi', 3.4, ab, u32a, sab].forEach(function(o) { 49 [undefined, 1, 'hi', 3.4, ab, u32a, sab, sf32a, sf64a].forEach(function(o) {
55 assertThrows(function() { Atomics.compareExchange(o, 0, 0, 0); }, 50 assertThrows(function() { Atomics.compareExchange(o, 0, 0, 0); },
56 TypeError); 51 TypeError);
57 assertThrows(function() { Atomics.load(o, 0); }, TypeError); 52 assertThrows(function() { Atomics.load(o, 0); }, TypeError);
58 assertThrows(function() { Atomics.store(o, 0, 0); }, TypeError); 53 assertThrows(function() { Atomics.store(o, 0, 0); }, TypeError);
59 assertThrows(function() { Atomics.add(o, 0, 0); }, TypeError); 54 assertThrows(function() { Atomics.add(o, 0, 0); }, TypeError);
60 assertThrows(function() { Atomics.sub(o, 0, 0); }, TypeError); 55 assertThrows(function() { Atomics.sub(o, 0, 0); }, TypeError);
61 assertThrows(function() { Atomics.and(o, 0, 0); }, TypeError); 56 assertThrows(function() { Atomics.and(o, 0, 0); }, TypeError);
62 assertThrows(function() { Atomics.or(o, 0, 0); }, TypeError); 57 assertThrows(function() { Atomics.or(o, 0, 0); }, TypeError);
63 assertThrows(function() { Atomics.xor(o, 0, 0); }, TypeError); 58 assertThrows(function() { Atomics.xor(o, 0, 0); }, TypeError);
64 assertThrows(function() { Atomics.exchange(o, 0, 0); }, TypeError); 59 assertThrows(function() { Atomics.exchange(o, 0, 0); }, TypeError);
65 }); 60 });
66
67 // Arithmetic atomic ops require integer shared arrays
68 [sab, sf32a, sf64a].forEach(function(o) {
69 assertThrows(function() { Atomics.add(o, 0, 0); }, TypeError);
70 assertThrows(function() { Atomics.sub(o, 0, 0); }, TypeError);
71 assertThrows(function() { Atomics.and(o, 0, 0); }, TypeError);
72 assertThrows(function() { Atomics.or(o, 0, 0); }, TypeError);
73 assertThrows(function() { Atomics.xor(o, 0, 0); }, TypeError);
74 assertThrows(function() { Atomics.exchange(o, 0, 0); }, TypeError);
75 });
76 })(); 61 })();
77 62
78 function testAtomicOp(op, ia, index, expectedIndex, name) { 63 function testAtomicOp(op, ia, index, expectedIndex, name) {
79 for (var i = 0; i < ia.length; ++i) 64 for (var i = 0; i < ia.length; ++i)
80 ia[i] = 22; 65 ia[i] = 22;
81 66
82 ia[expectedIndex] = 0; 67 ia[expectedIndex] = 0;
83 assertEquals(0, op(ia, index, 0, 0), name); 68 assertEquals(0, op(ia, index, 0, 0), name);
84 assertEquals(0, ia[expectedIndex], name); 69 assertEquals(0, ia[expectedIndex], name);
85 70
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 testAtomicOp(Atomics.add, si32a, i, 3, name); 141 testAtomicOp(Atomics.add, si32a, i, 3, name);
157 testAtomicOp(Atomics.sub, si32a, i, 3, name); 142 testAtomicOp(Atomics.sub, si32a, i, 3, name);
158 testAtomicOp(Atomics.and, si32a, i, 3, name); 143 testAtomicOp(Atomics.and, si32a, i, 3, name);
159 testAtomicOp(Atomics.or, si32a, i, 3, name); 144 testAtomicOp(Atomics.or, si32a, i, 3, name);
160 testAtomicOp(Atomics.xor, si32a, i, 3, name); 145 testAtomicOp(Atomics.xor, si32a, i, 3, name);
161 testAtomicOp(Atomics.exchange, si32a, i, 3, name); 146 testAtomicOp(Atomics.exchange, si32a, i, 3, name);
162 }); 147 });
163 })(); 148 })();
164 149
165 (function TestCompareExchange() { 150 (function TestCompareExchange() {
166 TypedArrayConstructors.forEach(function(t) { 151 IntegerTypedArrayConstructors.forEach(function(t) {
167 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); 152 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT);
168 var sta = new t.constr(sab); 153 var sta = new t.constr(sab);
169 var name = Object.prototype.toString.call(sta); 154 var name = Object.prototype.toString.call(sta);
170 for (var i = 0; i < 10; ++i) { 155 for (var i = 0; i < 10; ++i) {
171 // sta[i] == 0, CAS will store 156 // sta[i] == 0, CAS will store
172 assertEquals(0, Atomics.compareExchange(sta, i, 0, 50), name); 157 assertEquals(0, Atomics.compareExchange(sta, i, 0, 50), name);
173 assertEquals(50, sta[i], name); 158 assertEquals(50, sta[i], name);
174 159
175 // sta[i] == 50, CAS will not store 160 // sta[i] == 50, CAS will not store
176 assertEquals(50, Atomics.compareExchange(sta, i, 0, 100), name); 161 assertEquals(50, Atomics.compareExchange(sta, i, 0, 100), name);
177 assertEquals(50, sta[i], name); 162 assertEquals(50, sta[i], name);
178 } 163 }
179 }); 164 });
180
181 // * Exact float values should be OK
182 // * Infinity, -Infinity should be OK (has exact representation)
183 // * NaN is not OK, it has many representations, cannot ensure successful CAS
184 // because it does a bitwise compare
185 [1.5, 4.25, -1e8, -Infinity, Infinity].forEach(function(v) {
186 var sab = new SharedArrayBuffer(10 * Float32Array.BYTES_PER_ELEMENT);
187 var sf32a = new Float32Array(sab);
188 sf32a[0] = 0;
189 assertEquals(0, Atomics.compareExchange(sf32a, 0, 0, v));
190 assertEquals(v, sf32a[0]);
191 assertEquals(v, Atomics.compareExchange(sf32a, 0, v, 0));
192 assertEquals(0, sf32a[0]);
193
194 var sab2 = new SharedArrayBuffer(10 * Float64Array.BYTES_PER_ELEMENT);
195 var sf64a = new Float64Array(sab2);
196 sf64a[0] = 0;
197 assertEquals(0, Atomics.compareExchange(sf64a, 0, 0, v));
198 assertEquals(v, sf64a[0]);
199 assertEquals(v, Atomics.compareExchange(sf64a, 0, v, 0));
200 assertEquals(0, sf64a[0]);
201 });
202 })(); 165 })();
203 166
204 (function TestLoad() { 167 (function TestLoad() {
205 TypedArrayConstructors.forEach(function(t) { 168 IntegerTypedArrayConstructors.forEach(function(t) {
206 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); 169 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT);
207 var sta = new t.constr(sab); 170 var sta = new t.constr(sab);
208 var name = Object.prototype.toString.call(sta); 171 var name = Object.prototype.toString.call(sta);
209 for (var i = 0; i < 10; ++i) { 172 for (var i = 0; i < 10; ++i) {
210 sta[i] = 0; 173 sta[i] = 0;
211 assertEquals(0, Atomics.load(sta, i), name); 174 assertEquals(0, Atomics.load(sta, i), name);
212 sta[i] = 50; 175 sta[i] = 50;
213 assertEquals(50, Atomics.load(sta, i), name); 176 assertEquals(50, Atomics.load(sta, i), name);
214 } 177 }
215 }); 178 });
216 })(); 179 })();
217 180
218 (function TestStore() { 181 (function TestStore() {
219 TypedArrayConstructors.forEach(function(t) { 182 IntegerTypedArrayConstructors.forEach(function(t) {
220 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); 183 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT);
221 var sta = new t.constr(sab); 184 var sta = new t.constr(sab);
222 var name = Object.prototype.toString.call(sta); 185 var name = Object.prototype.toString.call(sta);
223 for (var i = 0; i < 10; ++i) { 186 for (var i = 0; i < 10; ++i) {
224 assertEquals(50, Atomics.store(sta, i, 50), name); 187 assertEquals(50, Atomics.store(sta, i, 50), name);
225 assertEquals(50, sta[i], name); 188 assertEquals(50, sta[i], name);
226 189
227 assertEquals(100, Atomics.store(sta, i, 100), name); 190 assertEquals(100, Atomics.store(sta, i, 100), name);
228 assertEquals(100, sta[i], name); 191 assertEquals(100, sta[i], name);
229 } 192 }
230 }); 193 });
231
232 [1.5, 4.25, -1e8, -Infinity, Infinity, NaN].forEach(function(v) {
233 var sab = new SharedArrayBuffer(10 * Float32Array.BYTES_PER_ELEMENT);
234 var sf32a = new Float32Array(sab);
235 sf32a[0] = 0;
236 assertEquals(v, Atomics.store(sf32a, 0, v));
237 assertEquals(v, sf32a[0]);
238
239 var sab2 = new SharedArrayBuffer(10 * Float64Array.BYTES_PER_ELEMENT);
240 var sf64a = new Float64Array(sab2);
241 sf64a[0] = 0;
242 assertEquals(v, Atomics.store(sf64a, 0, v));
243 assertEquals(v, sf64a[0]);
244 });
245 })(); 194 })();
246 195
247 (function TestAdd() { 196 (function TestAdd() {
248 IntegerTypedArrayConstructors.forEach(function(t) { 197 IntegerTypedArrayConstructors.forEach(function(t) {
249 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT); 198 var sab = new SharedArrayBuffer(10 * t.constr.BYTES_PER_ELEMENT);
250 var sta = new t.constr(sab); 199 var sta = new t.constr(sab);
251 var name = Object.prototype.toString.call(sta); 200 var name = Object.prototype.toString.call(sta);
252 for (var i = 0; i < 10; ++i) { 201 for (var i = 0; i < 10; ++i) {
253 assertEquals(0, Atomics.add(sta, i, 50), name); 202 assertEquals(0, Atomics.add(sta, i, 50), name);
254 assertEquals(50, sta[i], name); 203 assertEquals(50, sta[i], name);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 290
342 (function TestIsLockFree() { 291 (function TestIsLockFree() {
343 // For all platforms we support, 1, 2 and 4 bytes should be lock-free. 292 // For all platforms we support, 1, 2 and 4 bytes should be lock-free.
344 assertEquals(true, Atomics.isLockFree(1)); 293 assertEquals(true, Atomics.isLockFree(1));
345 assertEquals(true, Atomics.isLockFree(2)); 294 assertEquals(true, Atomics.isLockFree(2));
346 assertEquals(true, Atomics.isLockFree(4)); 295 assertEquals(true, Atomics.isLockFree(4));
347 296
348 // Sizes that aren't equal to a typedarray BYTES_PER_ELEMENT always return 297 // Sizes that aren't equal to a typedarray BYTES_PER_ELEMENT always return
349 // false. 298 // false.
350 var validSizes = {}; 299 var validSizes = {};
351 TypedArrayConstructors.forEach(function(t) { 300 IntegerTypedArrayConstructors.forEach(function(t) {
352 validSizes[t.constr.BYTES_PER_ELEMENT] = true; 301 validSizes[t.constr.BYTES_PER_ELEMENT] = true;
353 }); 302 });
354 303
355 for (var i = 0; i < 1000; ++i) { 304 for (var i = 0; i < 1000; ++i) {
356 if (!validSizes[i]) { 305 if (!validSizes[i]) {
357 assertEquals(false, Atomics.isLockFree(i)); 306 assertEquals(false, Atomics.isLockFree(i));
358 } 307 }
359 } 308 }
360 })(); 309 })();
361 310
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 // Exchange 451 // Exchange
503 sta[0] = val = 0x12; 452 sta[0] = val = 0x12;
504 operand = 0x22 + offset; 453 operand = 0x22 + offset;
505 valWrapped = t.toRange(operand); 454 valWrapped = t.toRange(operand);
506 assertEquals(val, Atomics.exchange(sta, 0, operand), name); 455 assertEquals(val, Atomics.exchange(sta, 0, operand), name);
507 assertEquals(valWrapped, sta[0], name); 456 assertEquals(valWrapped, sta[0], name);
508 } 457 }
509 458
510 }); 459 });
511 })(); 460 })();
OLDNEW
« no previous file with comments | « test/mjsunit/asm/atomics-store.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698