blob: 4b833bebdc386f7b43b996bffb68c8486c47b699 [file] [log] [blame]
Nicolas Geoffray3c7bb982014-07-23 16:04:16 +01001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// Simple test for array accesses.
18
19public class Main extends TestCase {
20 public static void main(String[] args) {
21 $opt$testReads(new boolean[1], new byte[1], new char[1], new short[1],
Serguei Katkov55501ce2015-04-08 13:26:09 +060022 new int[1], new Object[1], new long[1], new float[1], new double[1], 0);
Nicolas Geoffray3c7bb982014-07-23 16:04:16 +010023 $opt$testWrites(new boolean[2], new byte[2], new char[2], new short[2],
Serguei Katkov55501ce2015-04-08 13:26:09 +060024 new int[2], new Object[2], new long[2], new float[2], new double[2], 1);
Nicolas Geoffray3c7bb982014-07-23 16:04:16 +010025 ensureThrows(new boolean[2], 2);
26 ensureThrows(new boolean[2], 4);
27 ensureThrows(new boolean[2], -1);
28 ensureThrows(new boolean[2], Integer.MIN_VALUE);
29 ensureThrows(new boolean[2], Integer.MAX_VALUE);
30 }
31
32 static void $opt$testReads(boolean[] bools, byte[] bytes, char[] chars, short[] shorts,
Serguei Katkov55501ce2015-04-08 13:26:09 +060033 int[] ints, Object[] objects, long[] longs, float[] floats,
34 double[] doubles, int index) {
Nicolas Geoffray3c7bb982014-07-23 16:04:16 +010035 assertEquals(false, bools[0]);
36 assertEquals(false, bools[index]);
37
38 assertEquals(0, bytes[0]);
39 assertEquals(0, bytes[index]);
40
41 assertEquals(0, chars[0]);
42 assertEquals(0, chars[index]);
43
44 assertEquals(0, shorts[0]);
45 assertEquals(0, shorts[index]);
46
47 assertEquals(0, ints[0]);
48 assertEquals(0, ints[index]);
49
50 assertNull(objects[0]);
51 assertNull(objects[index]);
52
53 assertEquals(0, longs[0]);
54 assertEquals(0, longs[index]);
Serguei Katkov55501ce2015-04-08 13:26:09 +060055
56 assertEquals(0, floats[0]);
57 assertEquals(0, floats[index]);
58
59 assertEquals(0, doubles[0]);
60 assertEquals(0, doubles[index]);
Nicolas Geoffray3c7bb982014-07-23 16:04:16 +010061 }
62
63 static void $opt$testWrites(boolean[] bools, byte[] bytes, char[] chars, short[] shorts,
Serguei Katkov55501ce2015-04-08 13:26:09 +060064 int[] ints, Object[] objects, long[] longs, float[] floats,
65 double doubles[], int index) {
Nicolas Geoffray3c7bb982014-07-23 16:04:16 +010066 bools[0] = true;
67 assertEquals(true, bools[0]);
Nicolas Geoffray39468442014-09-02 15:17:15 +010068 bools[index] = true;
Nicolas Geoffray3c7bb982014-07-23 16:04:16 +010069 assertEquals(true, bools[index]);
70
71 bytes[0] = -4;
72 assertEquals(-4, bytes[0]);
73 bytes[index] = -8;
74 assertEquals(-8, bytes[index]);
75
76 chars[0] = 'c';
77 assertEquals('c', chars[0]);
78 chars[index] = 'd';
79 assertEquals('d', chars[index]);
80
Nicolas Geoffrayb6e72062014-10-07 14:54:48 +010081 chars[0] = 65535;
82 assertEquals(65535, chars[0]);
83 // Do an update between the two max value updates, to avoid
84 // optimizing the second away.
85 chars[index] = 0;
86 assertEquals(0, chars[index]);
87 chars[index] = 65535;
88 assertEquals(65535, chars[index]);
89
Nicolas Geoffray3c7bb982014-07-23 16:04:16 +010090 shorts[0] = -42;
91 assertEquals(-42, shorts[0]);
92 shorts[index] = -84;
93 assertEquals(-84, shorts[index]);
94
95 ints[0] = -32;
96 assertEquals(-32, ints[0]);
97 ints[index] = -64;
98 assertEquals(-64, ints[index]);
99
100 Object o1 = new Object();
101 objects[0] = o1;
102 assertEquals(o1, objects[0]);
103 Object o2 = new Object();
104 objects[index] = o2;
105 assertEquals(o2, objects[index]);
Nicolas Geoffrayb6e72062014-10-07 14:54:48 +0100106 // Longs are initially not supported in the linear scan register allocator
107 // on 32bits. So we call out a long helper to ensure this method gets
108 // optimized.
109 $opt$testLongWrites(longs, index);
Serguei Katkov55501ce2015-04-08 13:26:09 +0600110
111 float f = 1.0F;
112 floats[0] = f / (1 | 0);
113 assertEquals(f, floats[0]);
114 floats[index] = f / (1 | 0);
115 assertEquals(f, floats[index]);
116
117 double d = 1.0F;
118 doubles[0] = d / (1 | 0);
119 assertEquals(d, doubles[0]);
120 doubles[index] = d / (1 | 0);
121 assertEquals(d, doubles[index]);
Nicolas Geoffrayb6e72062014-10-07 14:54:48 +0100122 }
Nicolas Geoffray3c7bb982014-07-23 16:04:16 +0100123
Nicolas Geoffrayb6e72062014-10-07 14:54:48 +0100124 public static void $opt$testLongWrites(long[] longs, int index) {
Nicolas Geoffray3c7bb982014-07-23 16:04:16 +0100125 long l = -21876876876876876L;
126 longs[0] = l;
127 assertEquals(l, longs[0]);
128 l = -21876876876876877L;
129 longs[index] = l;
130 assertEquals(l, longs[index]);
131 }
132
133 public static void ensureThrows(boolean[] array, int index) {
134 ArrayIndexOutOfBoundsException exception = null;
135 try {
136 $opt$doArrayLoad(array, index);
137 } catch (ArrayIndexOutOfBoundsException e) {
138 exception = e;
139 }
140
141 assertNotNull(exception);
142 assertTrue(exception.toString().contains(Integer.toString(index)));
143
144 exception = null;
145 try {
146 $opt$doArrayStore(array, index);
147 } catch (ArrayIndexOutOfBoundsException e) {
148 exception = e;
149 }
150
151 assertNotNull(exception);
152 assertTrue(exception.toString().contains(Integer.toString(index)));
153 }
154
155 public static void $opt$doArrayLoad(boolean[] array, int index) {
156 boolean res = array[index];
157 }
158
159 public static void $opt$doArrayStore(boolean[] array, int index) {
160 array[index] = false;
161 }
162}