| OLD | NEW |
| 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_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
| 10 #include "vm/os.h" | 10 #include "vm/os.h" |
| 11 #include "vm/unit_test.h" | 11 #include "vm/unit_test.h" |
| 12 #include "vm/virtual_memory.h" | 12 #include "vm/virtual_memory.h" |
| 13 | 13 |
| 14 namespace dart { | 14 namespace dart { |
| 15 | 15 |
| 16 #define __ assembler-> | 16 #define __ assembler-> |
| 17 | 17 |
| 18 ASSEMBLER_TEST_GENERATE(Simple, assembler) { | 18 ASSEMBLER_TEST_GENERATE(Simple, assembler) { |
| 19 __ add(R0, ZR, Operand(ZR)); | 19 __ add(R0, ZR, Operand(ZR)); |
| 20 __ add(R0, R0, Operand(42)); | 20 __ add(R0, R0, Operand(42)); |
| 21 __ ret(); | 21 __ ret(); |
| 22 } | 22 } |
| 23 | 23 |
| 24 | |
| 25 ASSEMBLER_TEST_RUN(Simple, test) { | 24 ASSEMBLER_TEST_RUN(Simple, test) { |
| 26 typedef int64_t (*Int64Return)() DART_UNUSED; | 25 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 27 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 26 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 28 } | 27 } |
| 29 | 28 |
| 30 | |
| 31 // Move wide immediate tests. | 29 // Move wide immediate tests. |
| 32 // movz | 30 // movz |
| 33 ASSEMBLER_TEST_GENERATE(Movz0, assembler) { | 31 ASSEMBLER_TEST_GENERATE(Movz0, assembler) { |
| 34 __ movz(R0, Immediate(42), 0); | 32 __ movz(R0, Immediate(42), 0); |
| 35 __ ret(); | 33 __ ret(); |
| 36 } | 34 } |
| 37 | 35 |
| 38 | |
| 39 ASSEMBLER_TEST_RUN(Movz0, test) { | 36 ASSEMBLER_TEST_RUN(Movz0, test) { |
| 40 typedef int64_t (*Int64Return)() DART_UNUSED; | 37 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 41 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 38 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 42 } | 39 } |
| 43 | 40 |
| 44 | |
| 45 ASSEMBLER_TEST_GENERATE(Movz1, assembler) { | 41 ASSEMBLER_TEST_GENERATE(Movz1, assembler) { |
| 46 __ movz(R0, Immediate(42), 0); // Overwritten by next instruction. | 42 __ movz(R0, Immediate(42), 0); // Overwritten by next instruction. |
| 47 __ movz(R0, Immediate(42), 1); | 43 __ movz(R0, Immediate(42), 1); |
| 48 __ ret(); | 44 __ ret(); |
| 49 } | 45 } |
| 50 | 46 |
| 51 | |
| 52 ASSEMBLER_TEST_RUN(Movz1, test) { | 47 ASSEMBLER_TEST_RUN(Movz1, test) { |
| 53 typedef int64_t (*Int64Return)() DART_UNUSED; | 48 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 54 EXPECT_EQ(42LL << 16, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 49 EXPECT_EQ(42LL << 16, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 55 } | 50 } |
| 56 | 51 |
| 57 | |
| 58 ASSEMBLER_TEST_GENERATE(Movz2, assembler) { | 52 ASSEMBLER_TEST_GENERATE(Movz2, assembler) { |
| 59 __ movz(R0, Immediate(42), 2); | 53 __ movz(R0, Immediate(42), 2); |
| 60 __ ret(); | 54 __ ret(); |
| 61 } | 55 } |
| 62 | 56 |
| 63 | |
| 64 ASSEMBLER_TEST_RUN(Movz2, test) { | 57 ASSEMBLER_TEST_RUN(Movz2, test) { |
| 65 typedef int64_t (*Int64Return)() DART_UNUSED; | 58 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 66 EXPECT_EQ(42LL << 32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 59 EXPECT_EQ(42LL << 32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 67 } | 60 } |
| 68 | 61 |
| 69 | |
| 70 ASSEMBLER_TEST_GENERATE(Movz3, assembler) { | 62 ASSEMBLER_TEST_GENERATE(Movz3, assembler) { |
| 71 __ movz(R0, Immediate(42), 3); | 63 __ movz(R0, Immediate(42), 3); |
| 72 __ ret(); | 64 __ ret(); |
| 73 } | 65 } |
| 74 | 66 |
| 75 | |
| 76 ASSEMBLER_TEST_RUN(Movz3, test) { | 67 ASSEMBLER_TEST_RUN(Movz3, test) { |
| 77 typedef int64_t (*Int64Return)() DART_UNUSED; | 68 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 78 EXPECT_EQ(42LL << 48, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 69 EXPECT_EQ(42LL << 48, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 79 } | 70 } |
| 80 | 71 |
| 81 | |
| 82 // movn | 72 // movn |
| 83 ASSEMBLER_TEST_GENERATE(Movn0, assembler) { | 73 ASSEMBLER_TEST_GENERATE(Movn0, assembler) { |
| 84 __ movn(R0, Immediate(42), 0); | 74 __ movn(R0, Immediate(42), 0); |
| 85 __ ret(); | 75 __ ret(); |
| 86 } | 76 } |
| 87 | 77 |
| 88 | |
| 89 ASSEMBLER_TEST_RUN(Movn0, test) { | 78 ASSEMBLER_TEST_RUN(Movn0, test) { |
| 90 typedef int64_t (*Int64Return)() DART_UNUSED; | 79 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 91 EXPECT_EQ(~42LL, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 80 EXPECT_EQ(~42LL, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 92 } | 81 } |
| 93 | 82 |
| 94 | |
| 95 ASSEMBLER_TEST_GENERATE(Movn1, assembler) { | 83 ASSEMBLER_TEST_GENERATE(Movn1, assembler) { |
| 96 __ movn(R0, Immediate(42), 1); | 84 __ movn(R0, Immediate(42), 1); |
| 97 __ ret(); | 85 __ ret(); |
| 98 } | 86 } |
| 99 | 87 |
| 100 | |
| 101 ASSEMBLER_TEST_RUN(Movn1, test) { | 88 ASSEMBLER_TEST_RUN(Movn1, test) { |
| 102 typedef int64_t (*Int64Return)() DART_UNUSED; | 89 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 103 EXPECT_EQ(~(42LL << 16), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 90 EXPECT_EQ(~(42LL << 16), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 104 } | 91 } |
| 105 | 92 |
| 106 | |
| 107 ASSEMBLER_TEST_GENERATE(Movn2, assembler) { | 93 ASSEMBLER_TEST_GENERATE(Movn2, assembler) { |
| 108 __ movn(R0, Immediate(42), 2); | 94 __ movn(R0, Immediate(42), 2); |
| 109 __ ret(); | 95 __ ret(); |
| 110 } | 96 } |
| 111 | 97 |
| 112 | |
| 113 ASSEMBLER_TEST_RUN(Movn2, test) { | 98 ASSEMBLER_TEST_RUN(Movn2, test) { |
| 114 typedef int64_t (*Int64Return)() DART_UNUSED; | 99 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 115 EXPECT_EQ(~(42LL << 32), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 100 EXPECT_EQ(~(42LL << 32), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 116 } | 101 } |
| 117 | 102 |
| 118 | |
| 119 ASSEMBLER_TEST_GENERATE(Movn3, assembler) { | 103 ASSEMBLER_TEST_GENERATE(Movn3, assembler) { |
| 120 __ movn(R0, Immediate(42), 3); | 104 __ movn(R0, Immediate(42), 3); |
| 121 __ ret(); | 105 __ ret(); |
| 122 } | 106 } |
| 123 | 107 |
| 124 | |
| 125 ASSEMBLER_TEST_RUN(Movn3, test) { | 108 ASSEMBLER_TEST_RUN(Movn3, test) { |
| 126 typedef int64_t (*Int64Return)() DART_UNUSED; | 109 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 127 EXPECT_EQ(~(42LL << 48), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 110 EXPECT_EQ(~(42LL << 48), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 128 } | 111 } |
| 129 | 112 |
| 130 // movk | 113 // movk |
| 131 ASSEMBLER_TEST_GENERATE(Movk0, assembler) { | 114 ASSEMBLER_TEST_GENERATE(Movk0, assembler) { |
| 132 __ movz(R0, Immediate(1), 3); | 115 __ movz(R0, Immediate(1), 3); |
| 133 __ movk(R0, Immediate(42), 0); | 116 __ movk(R0, Immediate(42), 0); |
| 134 __ ret(); | 117 __ ret(); |
| 135 } | 118 } |
| 136 | 119 |
| 137 | |
| 138 ASSEMBLER_TEST_RUN(Movk0, test) { | 120 ASSEMBLER_TEST_RUN(Movk0, test) { |
| 139 typedef int64_t (*Int64Return)() DART_UNUSED; | 121 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 140 EXPECT_EQ(42LL | (1LL << 48), | 122 EXPECT_EQ(42LL | (1LL << 48), |
| 141 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 123 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 142 } | 124 } |
| 143 | 125 |
| 144 | |
| 145 ASSEMBLER_TEST_GENERATE(Movk1, assembler) { | 126 ASSEMBLER_TEST_GENERATE(Movk1, assembler) { |
| 146 __ movz(R0, Immediate(1), 0); | 127 __ movz(R0, Immediate(1), 0); |
| 147 __ movk(R0, Immediate(42), 1); | 128 __ movk(R0, Immediate(42), 1); |
| 148 __ ret(); | 129 __ ret(); |
| 149 } | 130 } |
| 150 | 131 |
| 151 | |
| 152 ASSEMBLER_TEST_RUN(Movk1, test) { | 132 ASSEMBLER_TEST_RUN(Movk1, test) { |
| 153 typedef int64_t (*Int64Return)() DART_UNUSED; | 133 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 154 EXPECT_EQ((42LL << 16) | 1, | 134 EXPECT_EQ((42LL << 16) | 1, |
| 155 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 135 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 156 } | 136 } |
| 157 | 137 |
| 158 | |
| 159 ASSEMBLER_TEST_GENERATE(Movk2, assembler) { | 138 ASSEMBLER_TEST_GENERATE(Movk2, assembler) { |
| 160 __ movz(R0, Immediate(1), 0); | 139 __ movz(R0, Immediate(1), 0); |
| 161 __ movk(R0, Immediate(42), 2); | 140 __ movk(R0, Immediate(42), 2); |
| 162 __ ret(); | 141 __ ret(); |
| 163 } | 142 } |
| 164 | 143 |
| 165 | |
| 166 ASSEMBLER_TEST_RUN(Movk2, test) { | 144 ASSEMBLER_TEST_RUN(Movk2, test) { |
| 167 typedef int64_t (*Int64Return)() DART_UNUSED; | 145 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 168 EXPECT_EQ((42LL << 32) | 1, | 146 EXPECT_EQ((42LL << 32) | 1, |
| 169 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 147 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 170 } | 148 } |
| 171 | 149 |
| 172 | |
| 173 ASSEMBLER_TEST_GENERATE(Movk3, assembler) { | 150 ASSEMBLER_TEST_GENERATE(Movk3, assembler) { |
| 174 __ movz(R0, Immediate(1), 0); | 151 __ movz(R0, Immediate(1), 0); |
| 175 __ movk(R0, Immediate(42), 3); | 152 __ movk(R0, Immediate(42), 3); |
| 176 __ ret(); | 153 __ ret(); |
| 177 } | 154 } |
| 178 | 155 |
| 179 | |
| 180 ASSEMBLER_TEST_RUN(Movk3, test) { | 156 ASSEMBLER_TEST_RUN(Movk3, test) { |
| 181 typedef int64_t (*Int64Return)() DART_UNUSED; | 157 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 182 EXPECT_EQ((42LL << 48) | 1, | 158 EXPECT_EQ((42LL << 48) | 1, |
| 183 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 159 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 184 } | 160 } |
| 185 | 161 |
| 186 | |
| 187 ASSEMBLER_TEST_GENERATE(MovzBig, assembler) { | 162 ASSEMBLER_TEST_GENERATE(MovzBig, assembler) { |
| 188 __ movz(R0, Immediate(0x8000), 0); | 163 __ movz(R0, Immediate(0x8000), 0); |
| 189 __ ret(); | 164 __ ret(); |
| 190 } | 165 } |
| 191 | 166 |
| 192 | |
| 193 ASSEMBLER_TEST_RUN(MovzBig, test) { | 167 ASSEMBLER_TEST_RUN(MovzBig, test) { |
| 194 typedef int64_t (*Int64Return)() DART_UNUSED; | 168 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 195 EXPECT_EQ(0x8000, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 169 EXPECT_EQ(0x8000, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 196 } | 170 } |
| 197 | 171 |
| 198 | |
| 199 // add tests. | 172 // add tests. |
| 200 ASSEMBLER_TEST_GENERATE(AddReg, assembler) { | 173 ASSEMBLER_TEST_GENERATE(AddReg, assembler) { |
| 201 __ movz(R0, Immediate(20), 0); | 174 __ movz(R0, Immediate(20), 0); |
| 202 __ movz(R1, Immediate(22), 0); | 175 __ movz(R1, Immediate(22), 0); |
| 203 __ add(R0, R0, Operand(R1)); | 176 __ add(R0, R0, Operand(R1)); |
| 204 __ ret(); | 177 __ ret(); |
| 205 } | 178 } |
| 206 | 179 |
| 207 | |
| 208 ASSEMBLER_TEST_RUN(AddReg, test) { | 180 ASSEMBLER_TEST_RUN(AddReg, test) { |
| 209 typedef int64_t (*Int64Return)() DART_UNUSED; | 181 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 210 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 182 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 211 } | 183 } |
| 212 | 184 |
| 213 | |
| 214 ASSEMBLER_TEST_GENERATE(AddLSLReg, assembler) { | 185 ASSEMBLER_TEST_GENERATE(AddLSLReg, assembler) { |
| 215 __ movz(R0, Immediate(20), 0); | 186 __ movz(R0, Immediate(20), 0); |
| 216 __ movz(R1, Immediate(11), 0); | 187 __ movz(R1, Immediate(11), 0); |
| 217 __ add(R0, R0, Operand(R1, LSL, 1)); | 188 __ add(R0, R0, Operand(R1, LSL, 1)); |
| 218 __ ret(); | 189 __ ret(); |
| 219 } | 190 } |
| 220 | 191 |
| 221 | |
| 222 ASSEMBLER_TEST_RUN(AddLSLReg, test) { | 192 ASSEMBLER_TEST_RUN(AddLSLReg, test) { |
| 223 typedef int64_t (*Int64Return)() DART_UNUSED; | 193 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 224 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 194 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 225 } | 195 } |
| 226 | 196 |
| 227 | |
| 228 ASSEMBLER_TEST_GENERATE(AddLSRReg, assembler) { | 197 ASSEMBLER_TEST_GENERATE(AddLSRReg, assembler) { |
| 229 __ movz(R0, Immediate(20), 0); | 198 __ movz(R0, Immediate(20), 0); |
| 230 __ movz(R1, Immediate(44), 0); | 199 __ movz(R1, Immediate(44), 0); |
| 231 __ add(R0, R0, Operand(R1, LSR, 1)); | 200 __ add(R0, R0, Operand(R1, LSR, 1)); |
| 232 __ ret(); | 201 __ ret(); |
| 233 } | 202 } |
| 234 | 203 |
| 235 | |
| 236 ASSEMBLER_TEST_RUN(AddLSRReg, test) { | 204 ASSEMBLER_TEST_RUN(AddLSRReg, test) { |
| 237 typedef int64_t (*Int64Return)() DART_UNUSED; | 205 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 238 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 206 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 239 } | 207 } |
| 240 | 208 |
| 241 | |
| 242 ASSEMBLER_TEST_GENERATE(AddASRReg, assembler) { | 209 ASSEMBLER_TEST_GENERATE(AddASRReg, assembler) { |
| 243 __ movz(R0, Immediate(20), 0); | 210 __ movz(R0, Immediate(20), 0); |
| 244 __ movz(R1, Immediate(44), 0); | 211 __ movz(R1, Immediate(44), 0); |
| 245 __ add(R0, R0, Operand(R1, ASR, 1)); | 212 __ add(R0, R0, Operand(R1, ASR, 1)); |
| 246 __ ret(); | 213 __ ret(); |
| 247 } | 214 } |
| 248 | 215 |
| 249 | |
| 250 ASSEMBLER_TEST_RUN(AddASRReg, test) { | 216 ASSEMBLER_TEST_RUN(AddASRReg, test) { |
| 251 typedef int64_t (*Int64Return)() DART_UNUSED; | 217 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 252 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 218 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 253 } | 219 } |
| 254 | 220 |
| 255 | |
| 256 ASSEMBLER_TEST_GENERATE(AddASRNegReg, assembler) { | 221 ASSEMBLER_TEST_GENERATE(AddASRNegReg, assembler) { |
| 257 __ movz(R0, Immediate(43), 0); | 222 __ movz(R0, Immediate(43), 0); |
| 258 __ movn(R1, Immediate(0), 0); // R1 <- -1 | 223 __ movn(R1, Immediate(0), 0); // R1 <- -1 |
| 259 __ add(R1, ZR, Operand(R1, LSL, 3)); // R1 <- -8 | 224 __ add(R1, ZR, Operand(R1, LSL, 3)); // R1 <- -8 |
| 260 __ add(R0, R0, Operand(R1, ASR, 3)); // R0 <- 43 + (-8 >> 3) | 225 __ add(R0, R0, Operand(R1, ASR, 3)); // R0 <- 43 + (-8 >> 3) |
| 261 __ ret(); | 226 __ ret(); |
| 262 } | 227 } |
| 263 | 228 |
| 264 | |
| 265 ASSEMBLER_TEST_RUN(AddASRNegReg, test) { | 229 ASSEMBLER_TEST_RUN(AddASRNegReg, test) { |
| 266 typedef int64_t (*Int64Return)() DART_UNUSED; | 230 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 267 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 231 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 268 } | 232 } |
| 269 | 233 |
| 270 | |
| 271 // TODO(zra): test other sign extension modes. | 234 // TODO(zra): test other sign extension modes. |
| 272 ASSEMBLER_TEST_GENERATE(AddExtReg, assembler) { | 235 ASSEMBLER_TEST_GENERATE(AddExtReg, assembler) { |
| 273 __ movz(R0, Immediate(43), 0); | 236 __ movz(R0, Immediate(43), 0); |
| 274 __ movz(R1, Immediate(0xffff), 0); | 237 __ movz(R1, Immediate(0xffff), 0); |
| 275 __ movk(R1, Immediate(0xffff), 1); // R1 <- -1 (32-bit) | 238 __ movk(R1, Immediate(0xffff), 1); // R1 <- -1 (32-bit) |
| 276 __ add(R0, R0, Operand(R1, SXTW, 0)); // R0 <- R0 + (sign extended R1) | 239 __ add(R0, R0, Operand(R1, SXTW, 0)); // R0 <- R0 + (sign extended R1) |
| 277 __ ret(); | 240 __ ret(); |
| 278 } | 241 } |
| 279 | 242 |
| 280 | |
| 281 ASSEMBLER_TEST_RUN(AddExtReg, test) { | 243 ASSEMBLER_TEST_RUN(AddExtReg, test) { |
| 282 typedef int64_t (*Int64Return)() DART_UNUSED; | 244 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 283 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 245 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 284 } | 246 } |
| 285 | 247 |
| 286 | |
| 287 ASSEMBLER_TEST_GENERATE(AddCarryInOut, assembler) { | 248 ASSEMBLER_TEST_GENERATE(AddCarryInOut, assembler) { |
| 288 __ LoadImmediate(R2, -1); | 249 __ LoadImmediate(R2, -1); |
| 289 __ LoadImmediate(R1, 1); | 250 __ LoadImmediate(R1, 1); |
| 290 __ LoadImmediate(R0, 0); | 251 __ LoadImmediate(R0, 0); |
| 291 __ adds(IP0, R2, Operand(R1)); // c_out = 1. | 252 __ adds(IP0, R2, Operand(R1)); // c_out = 1. |
| 292 __ adcs(IP0, R2, R0); // c_in = 1, c_out = 1. | 253 __ adcs(IP0, R2, R0); // c_in = 1, c_out = 1. |
| 293 __ adc(R0, R0, R0); // c_in = 1. | 254 __ adc(R0, R0, R0); // c_in = 1. |
| 294 __ ret(); | 255 __ ret(); |
| 295 } | 256 } |
| 296 | 257 |
| 297 | |
| 298 ASSEMBLER_TEST_RUN(AddCarryInOut, test) { | 258 ASSEMBLER_TEST_RUN(AddCarryInOut, test) { |
| 299 typedef int64_t (*Int64Return)() DART_UNUSED; | 259 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 300 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 260 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 301 } | 261 } |
| 302 | 262 |
| 303 | |
| 304 ASSEMBLER_TEST_GENERATE(SubCarryInOut, assembler) { | 263 ASSEMBLER_TEST_GENERATE(SubCarryInOut, assembler) { |
| 305 __ LoadImmediate(R1, 1); | 264 __ LoadImmediate(R1, 1); |
| 306 __ LoadImmediate(R0, 0); | 265 __ LoadImmediate(R0, 0); |
| 307 __ subs(IP0, R0, Operand(R1)); // c_out = 1. | 266 __ subs(IP0, R0, Operand(R1)); // c_out = 1. |
| 308 __ sbcs(IP0, R0, R0); // c_in = 1, c_out = 1. | 267 __ sbcs(IP0, R0, R0); // c_in = 1, c_out = 1. |
| 309 __ sbc(R0, R0, R0); // c_in = 1. | 268 __ sbc(R0, R0, R0); // c_in = 1. |
| 310 __ ret(); | 269 __ ret(); |
| 311 } | 270 } |
| 312 | 271 |
| 313 | |
| 314 ASSEMBLER_TEST_RUN(SubCarryInOut, test) { | 272 ASSEMBLER_TEST_RUN(SubCarryInOut, test) { |
| 315 typedef int64_t (*Int64Return)() DART_UNUSED; | 273 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 316 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 274 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 317 } | 275 } |
| 318 | 276 |
| 319 | |
| 320 ASSEMBLER_TEST_GENERATE(Overflow, assembler) { | 277 ASSEMBLER_TEST_GENERATE(Overflow, assembler) { |
| 321 __ LoadImmediate(R0, 0); | 278 __ LoadImmediate(R0, 0); |
| 322 __ LoadImmediate(R1, 1); | 279 __ LoadImmediate(R1, 1); |
| 323 __ LoadImmediate(R2, 0xFFFFFFFFFFFFFFFF); | 280 __ LoadImmediate(R2, 0xFFFFFFFFFFFFFFFF); |
| 324 __ LoadImmediate(R3, 0x7FFFFFFFFFFFFFFF); | 281 __ LoadImmediate(R3, 0x7FFFFFFFFFFFFFFF); |
| 325 __ adds(IP0, R2, Operand(R1)); // c_out = 1. | 282 __ adds(IP0, R2, Operand(R1)); // c_out = 1. |
| 326 __ adcs(IP0, R3, R0); // c_in = 1, c_out = 1, v = 1. | 283 __ adcs(IP0, R3, R0); // c_in = 1, c_out = 1, v = 1. |
| 327 __ csinc(R0, R0, R0, VS); // R0 = v ? R0 : R0 + 1. | 284 __ csinc(R0, R0, R0, VS); // R0 = v ? R0 : R0 + 1. |
| 328 __ ret(); | 285 __ ret(); |
| 329 } | 286 } |
| 330 | 287 |
| 331 | |
| 332 ASSEMBLER_TEST_RUN(Overflow, test) { | 288 ASSEMBLER_TEST_RUN(Overflow, test) { |
| 333 typedef int64_t (*Int64Return)() DART_UNUSED; | 289 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 334 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 290 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 335 } | 291 } |
| 336 | 292 |
| 337 | |
| 338 ASSEMBLER_TEST_GENERATE(WordAddCarryInOut, assembler) { | 293 ASSEMBLER_TEST_GENERATE(WordAddCarryInOut, assembler) { |
| 339 __ LoadImmediate(R2, -1); | 294 __ LoadImmediate(R2, -1); |
| 340 __ LoadImmediate(R1, 1); | 295 __ LoadImmediate(R1, 1); |
| 341 __ LoadImmediate(R0, 0); | 296 __ LoadImmediate(R0, 0); |
| 342 __ addsw(IP0, R2, Operand(R1)); // c_out = 1. | 297 __ addsw(IP0, R2, Operand(R1)); // c_out = 1. |
| 343 __ adcsw(IP0, R2, R0); // c_in = 1, c_out = 1. | 298 __ adcsw(IP0, R2, R0); // c_in = 1, c_out = 1. |
| 344 __ adcw(R0, R0, R0); // c_in = 1. | 299 __ adcw(R0, R0, R0); // c_in = 1. |
| 345 __ ret(); | 300 __ ret(); |
| 346 } | 301 } |
| 347 | 302 |
| 348 | |
| 349 ASSEMBLER_TEST_RUN(WordAddCarryInOut, test) { | 303 ASSEMBLER_TEST_RUN(WordAddCarryInOut, test) { |
| 350 typedef int64_t (*Int64Return)() DART_UNUSED; | 304 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 351 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 305 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 352 } | 306 } |
| 353 | 307 |
| 354 | |
| 355 ASSEMBLER_TEST_GENERATE(WordSubCarryInOut, assembler) { | 308 ASSEMBLER_TEST_GENERATE(WordSubCarryInOut, assembler) { |
| 356 __ LoadImmediate(R1, 1); | 309 __ LoadImmediate(R1, 1); |
| 357 __ LoadImmediate(R0, 0); | 310 __ LoadImmediate(R0, 0); |
| 358 __ subsw(IP0, R0, Operand(R1)); // c_out = 1. | 311 __ subsw(IP0, R0, Operand(R1)); // c_out = 1. |
| 359 __ sbcsw(IP0, R0, R0); // c_in = 1, c_out = 1. | 312 __ sbcsw(IP0, R0, R0); // c_in = 1, c_out = 1. |
| 360 __ sbcw(R0, R0, R0); // c_in = 1. | 313 __ sbcw(R0, R0, R0); // c_in = 1. |
| 361 __ ret(); | 314 __ ret(); |
| 362 } | 315 } |
| 363 | 316 |
| 364 | |
| 365 ASSEMBLER_TEST_RUN(WordSubCarryInOut, test) { | 317 ASSEMBLER_TEST_RUN(WordSubCarryInOut, test) { |
| 366 typedef int64_t (*Int64Return)() DART_UNUSED; | 318 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 367 EXPECT_EQ(0x0FFFFFFFF, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 319 EXPECT_EQ(0x0FFFFFFFF, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 368 } | 320 } |
| 369 | 321 |
| 370 | |
| 371 ASSEMBLER_TEST_GENERATE(WordOverflow, assembler) { | 322 ASSEMBLER_TEST_GENERATE(WordOverflow, assembler) { |
| 372 __ LoadImmediate(R0, 0); | 323 __ LoadImmediate(R0, 0); |
| 373 __ LoadImmediate(R1, 1); | 324 __ LoadImmediate(R1, 1); |
| 374 __ LoadImmediate(R2, 0xFFFFFFFF); | 325 __ LoadImmediate(R2, 0xFFFFFFFF); |
| 375 __ LoadImmediate(R3, 0x7FFFFFFF); | 326 __ LoadImmediate(R3, 0x7FFFFFFF); |
| 376 __ addsw(IP0, R2, Operand(R1)); // c_out = 1. | 327 __ addsw(IP0, R2, Operand(R1)); // c_out = 1. |
| 377 __ adcsw(IP0, R3, R0); // c_in = 1, c_out = 1, v = 1. | 328 __ adcsw(IP0, R3, R0); // c_in = 1, c_out = 1, v = 1. |
| 378 __ csinc(R0, R0, R0, VS); // R0 = v ? R0 : R0 + 1. | 329 __ csinc(R0, R0, R0, VS); // R0 = v ? R0 : R0 + 1. |
| 379 __ ret(); | 330 __ ret(); |
| 380 } | 331 } |
| 381 | 332 |
| 382 | |
| 383 ASSEMBLER_TEST_RUN(WordOverflow, test) { | 333 ASSEMBLER_TEST_RUN(WordOverflow, test) { |
| 384 typedef int64_t (*Int64Return)() DART_UNUSED; | 334 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 385 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 335 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 386 } | 336 } |
| 387 | 337 |
| 388 | |
| 389 // Loads and Stores. | 338 // Loads and Stores. |
| 390 ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) { | 339 ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) { |
| 391 __ SetupDartSP(); | 340 __ SetupDartSP(); |
| 392 __ movz(R0, Immediate(43), 0); | 341 __ movz(R0, Immediate(43), 0); |
| 393 __ movz(R1, Immediate(42), 0); | 342 __ movz(R1, Immediate(42), 0); |
| 394 __ str(R1, Address(SP, -1 * kWordSize, Address::PreIndex)); | 343 __ str(R1, Address(SP, -1 * kWordSize, Address::PreIndex)); |
| 395 __ ldr(R0, Address(SP, 1 * kWordSize, Address::PostIndex)); | 344 __ ldr(R0, Address(SP, 1 * kWordSize, Address::PostIndex)); |
| 396 __ RestoreCSP(); | 345 __ RestoreCSP(); |
| 397 __ ret(); | 346 __ ret(); |
| 398 } | 347 } |
| 399 | 348 |
| 400 | |
| 401 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) { | 349 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) { |
| 402 typedef int64_t (*Int64Return)() DART_UNUSED; | 350 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 403 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 351 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 404 } | 352 } |
| 405 | 353 |
| 406 | |
| 407 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) { | 354 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) { |
| 408 __ SetupDartSP(); | 355 __ SetupDartSP(); |
| 409 __ movz(R0, Immediate(43), 0); | 356 __ movz(R0, Immediate(43), 0); |
| 410 __ movz(R1, Immediate(42), 0); | 357 __ movz(R1, Immediate(42), 0); |
| 411 __ add(R2, SP, Operand(1)); | 358 __ add(R2, SP, Operand(1)); |
| 412 __ str(R1, Address(R2, -1)); | 359 __ str(R1, Address(R2, -1)); |
| 413 __ ldr(R0, Address(R2, -1)); | 360 __ ldr(R0, Address(R2, -1)); |
| 414 __ RestoreCSP(); | 361 __ RestoreCSP(); |
| 415 __ ret(); | 362 __ ret(); |
| 416 } | 363 } |
| 417 | 364 |
| 418 | |
| 419 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) { | 365 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) { |
| 420 typedef int64_t (*Int64Return)() DART_UNUSED; | 366 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 421 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 367 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 422 } | 368 } |
| 423 | 369 |
| 424 | |
| 425 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) { | 370 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) { |
| 426 __ SetupDartSP(); | 371 __ SetupDartSP(); |
| 427 __ movz(R0, Immediate(43), 0); | 372 __ movz(R0, Immediate(43), 0); |
| 428 __ movz(R1, Immediate(42), 0); | 373 __ movz(R1, Immediate(42), 0); |
| 429 // Largest negative offset that can fit in the signed 9-bit immediate field. | 374 // Largest negative offset that can fit in the signed 9-bit immediate field. |
| 430 __ str(R1, Address(SP, -32 * kWordSize, Address::PreIndex)); | 375 __ str(R1, Address(SP, -32 * kWordSize, Address::PreIndex)); |
| 431 // Largest positive kWordSize aligned offset that we can fit. | 376 // Largest positive kWordSize aligned offset that we can fit. |
| 432 __ ldr(R0, Address(SP, 31 * kWordSize, Address::PostIndex)); | 377 __ ldr(R0, Address(SP, 31 * kWordSize, Address::PostIndex)); |
| 433 // Correction. | 378 // Correction. |
| 434 __ add(SP, SP, Operand(kWordSize)); // Restore SP. | 379 __ add(SP, SP, Operand(kWordSize)); // Restore SP. |
| 435 __ RestoreCSP(); | 380 __ RestoreCSP(); |
| 436 __ ret(); | 381 __ ret(); |
| 437 } | 382 } |
| 438 | 383 |
| 439 | |
| 440 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) { | 384 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) { |
| 441 typedef int64_t (*Int64Return)() DART_UNUSED; | 385 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 442 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 386 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 443 } | 387 } |
| 444 | 388 |
| 445 | |
| 446 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) { | 389 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) { |
| 447 __ SetupDartSP(); | 390 __ SetupDartSP(); |
| 448 __ movz(R0, Immediate(43), 0); | 391 __ movz(R0, Immediate(43), 0); |
| 449 __ movz(R1, Immediate(42), 0); | 392 __ movz(R1, Immediate(42), 0); |
| 450 __ sub(SP, SP, Operand(512 * kWordSize)); | 393 __ sub(SP, SP, Operand(512 * kWordSize)); |
| 451 __ str(R1, Address(SP, 512 * kWordSize, Address::Offset)); | 394 __ str(R1, Address(SP, 512 * kWordSize, Address::Offset)); |
| 452 __ add(SP, SP, Operand(512 * kWordSize)); | 395 __ add(SP, SP, Operand(512 * kWordSize)); |
| 453 __ ldr(R0, Address(SP)); | 396 __ ldr(R0, Address(SP)); |
| 454 __ RestoreCSP(); | 397 __ RestoreCSP(); |
| 455 __ ret(); | 398 __ ret(); |
| 456 } | 399 } |
| 457 | 400 |
| 458 | |
| 459 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) { | 401 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) { |
| 460 typedef int64_t (*Int64Return)() DART_UNUSED; | 402 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 461 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 403 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 462 } | 404 } |
| 463 | 405 |
| 464 | |
| 465 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) { | 406 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) { |
| 466 __ SetupDartSP(); | 407 __ SetupDartSP(); |
| 467 __ movz(R0, Immediate(43), 0); | 408 __ movz(R0, Immediate(43), 0); |
| 468 __ movz(R1, Immediate(42), 0); | 409 __ movz(R1, Immediate(42), 0); |
| 469 __ movz(R2, Immediate(0xfff8), 0); | 410 __ movz(R2, Immediate(0xfff8), 0); |
| 470 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). | 411 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). |
| 471 // This should sign extend R2, and add to SP to get address, | 412 // This should sign extend R2, and add to SP to get address, |
| 472 // i.e. SP - kWordSize. | 413 // i.e. SP - kWordSize. |
| 473 __ str(R1, Address(SP, R2, SXTW)); | 414 __ str(R1, Address(SP, R2, SXTW)); |
| 474 __ sub(SP, SP, Operand(kWordSize)); | 415 __ sub(SP, SP, Operand(kWordSize)); |
| 475 __ ldr(R0, Address(SP)); | 416 __ ldr(R0, Address(SP)); |
| 476 __ add(SP, SP, Operand(kWordSize)); | 417 __ add(SP, SP, Operand(kWordSize)); |
| 477 __ RestoreCSP(); | 418 __ RestoreCSP(); |
| 478 __ ret(); | 419 __ ret(); |
| 479 } | 420 } |
| 480 | 421 |
| 481 | |
| 482 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) { | 422 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) { |
| 483 typedef int64_t (*Int64Return)() DART_UNUSED; | 423 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 484 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 424 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 485 } | 425 } |
| 486 | 426 |
| 487 | |
| 488 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) { | 427 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) { |
| 489 __ SetupDartSP(); | 428 __ SetupDartSP(); |
| 490 __ movz(R0, Immediate(43), 0); | 429 __ movz(R0, Immediate(43), 0); |
| 491 __ movz(R1, Immediate(42), 0); | 430 __ movz(R1, Immediate(42), 0); |
| 492 __ movz(R2, Immediate(10), 0); | 431 __ movz(R2, Immediate(10), 0); |
| 493 __ sub(SP, SP, Operand(10 * kWordSize)); | 432 __ sub(SP, SP, Operand(10 * kWordSize)); |
| 494 // Store R1 into SP + R2 * kWordSize. | 433 // Store R1 into SP + R2 * kWordSize. |
| 495 __ str(R1, Address(SP, R2, UXTX, Address::Scaled)); | 434 __ str(R1, Address(SP, R2, UXTX, Address::Scaled)); |
| 496 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled)); | 435 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled)); |
| 497 __ add(SP, SP, Operand(10 * kWordSize)); | 436 __ add(SP, SP, Operand(10 * kWordSize)); |
| 498 __ RestoreCSP(); | 437 __ RestoreCSP(); |
| 499 __ ret(); | 438 __ ret(); |
| 500 } | 439 } |
| 501 | 440 |
| 502 | |
| 503 ASSEMBLER_TEST_RUN(LoadStoreScaledReg, test) { | 441 ASSEMBLER_TEST_RUN(LoadStoreScaledReg, test) { |
| 504 typedef int64_t (*Int64Return)() DART_UNUSED; | 442 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 505 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 443 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 506 } | 444 } |
| 507 | 445 |
| 508 | |
| 509 ASSEMBLER_TEST_GENERATE(LoadSigned32Bit, assembler) { | 446 ASSEMBLER_TEST_GENERATE(LoadSigned32Bit, assembler) { |
| 510 __ SetupDartSP(); | 447 __ SetupDartSP(); |
| 511 __ LoadImmediate(R1, 0xffffffff); | 448 __ LoadImmediate(R1, 0xffffffff); |
| 512 __ str(R1, Address(SP, -4, Address::PreIndex, kWord), kWord); | 449 __ str(R1, Address(SP, -4, Address::PreIndex, kWord), kWord); |
| 513 __ ldr(R0, Address(SP), kWord); | 450 __ ldr(R0, Address(SP), kWord); |
| 514 __ ldr(R1, Address(SP, 4, Address::PostIndex, kWord), kWord); | 451 __ ldr(R1, Address(SP, 4, Address::PostIndex, kWord), kWord); |
| 515 __ RestoreCSP(); | 452 __ RestoreCSP(); |
| 516 __ ret(); | 453 __ ret(); |
| 517 } | 454 } |
| 518 | 455 |
| 519 | |
| 520 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) { | 456 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) { |
| 521 typedef int64_t (*Int64Return)() DART_UNUSED; | 457 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 522 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 458 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 523 } | 459 } |
| 524 | 460 |
| 525 | |
| 526 ASSEMBLER_TEST_GENERATE(SimpleLoadStorePair, assembler) { | 461 ASSEMBLER_TEST_GENERATE(SimpleLoadStorePair, assembler) { |
| 527 __ SetupDartSP(); | 462 __ SetupDartSP(); |
| 528 __ LoadImmediate(R2, 43); | 463 __ LoadImmediate(R2, 43); |
| 529 __ LoadImmediate(R3, 42); | 464 __ LoadImmediate(R3, 42); |
| 530 __ stp(R2, R3, Address(SP, -2 * kWordSize, Address::PairPreIndex)); | 465 __ stp(R2, R3, Address(SP, -2 * kWordSize, Address::PairPreIndex)); |
| 531 __ ldp(R0, R1, Address(SP, 2 * kWordSize, Address::PairPostIndex)); | 466 __ ldp(R0, R1, Address(SP, 2 * kWordSize, Address::PairPostIndex)); |
| 532 __ sub(R0, R0, Operand(R1)); | 467 __ sub(R0, R0, Operand(R1)); |
| 533 __ RestoreCSP(); | 468 __ RestoreCSP(); |
| 534 __ ret(); | 469 __ ret(); |
| 535 } | 470 } |
| 536 | 471 |
| 537 | |
| 538 ASSEMBLER_TEST_RUN(SimpleLoadStorePair, test) { | 472 ASSEMBLER_TEST_RUN(SimpleLoadStorePair, test) { |
| 539 typedef int64_t (*Int64Return)() DART_UNUSED; | 473 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 540 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 474 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 541 } | 475 } |
| 542 | 476 |
| 543 | |
| 544 ASSEMBLER_TEST_GENERATE(LoadStorePairOffset, assembler) { | 477 ASSEMBLER_TEST_GENERATE(LoadStorePairOffset, assembler) { |
| 545 __ SetupDartSP(); | 478 __ SetupDartSP(); |
| 546 __ LoadImmediate(R2, 43); | 479 __ LoadImmediate(R2, 43); |
| 547 __ LoadImmediate(R3, 42); | 480 __ LoadImmediate(R3, 42); |
| 548 __ sub(SP, SP, Operand(4 * kWordSize)); | 481 __ sub(SP, SP, Operand(4 * kWordSize)); |
| 549 __ stp(R2, R3, Address::Pair(SP, 2 * kWordSize)); | 482 __ stp(R2, R3, Address::Pair(SP, 2 * kWordSize)); |
| 550 __ ldp(R0, R1, Address::Pair(SP, 2 * kWordSize)); | 483 __ ldp(R0, R1, Address::Pair(SP, 2 * kWordSize)); |
| 551 __ add(SP, SP, Operand(4 * kWordSize)); | 484 __ add(SP, SP, Operand(4 * kWordSize)); |
| 552 __ sub(R0, R0, Operand(R1)); | 485 __ sub(R0, R0, Operand(R1)); |
| 553 __ RestoreCSP(); | 486 __ RestoreCSP(); |
| 554 __ ret(); | 487 __ ret(); |
| 555 } | 488 } |
| 556 | 489 |
| 557 | |
| 558 ASSEMBLER_TEST_RUN(LoadStorePairOffset, test) { | 490 ASSEMBLER_TEST_RUN(LoadStorePairOffset, test) { |
| 559 typedef int64_t (*Int64Return)() DART_UNUSED; | 491 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 560 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 492 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 561 } | 493 } |
| 562 | 494 |
| 563 | |
| 564 ASSEMBLER_TEST_GENERATE(Semaphore, assembler) { | 495 ASSEMBLER_TEST_GENERATE(Semaphore, assembler) { |
| 565 __ SetupDartSP(); | 496 __ SetupDartSP(); |
| 566 __ movz(R0, Immediate(40), 0); | 497 __ movz(R0, Immediate(40), 0); |
| 567 __ movz(R1, Immediate(42), 0); | 498 __ movz(R1, Immediate(42), 0); |
| 568 __ Push(R0); | 499 __ Push(R0); |
| 569 Label retry; | 500 Label retry; |
| 570 __ Bind(&retry); | 501 __ Bind(&retry); |
| 571 __ ldxr(R0, SP); | 502 __ ldxr(R0, SP); |
| 572 __ stxr(TMP, R1, SP); // IP == 0, success | 503 __ stxr(TMP, R1, SP); // IP == 0, success |
| 573 __ cmp(TMP, Operand(0)); | 504 __ cmp(TMP, Operand(0)); |
| 574 __ b(&retry, NE); // NE if context switch occurred between ldrex and strex. | 505 __ b(&retry, NE); // NE if context switch occurred between ldrex and strex. |
| 575 __ Pop(R0); // 42 | 506 __ Pop(R0); // 42 |
| 576 __ RestoreCSP(); | 507 __ RestoreCSP(); |
| 577 __ ret(); | 508 __ ret(); |
| 578 } | 509 } |
| 579 | 510 |
| 580 | |
| 581 ASSEMBLER_TEST_RUN(Semaphore, test) { | 511 ASSEMBLER_TEST_RUN(Semaphore, test) { |
| 582 EXPECT(test != NULL); | 512 EXPECT(test != NULL); |
| 583 typedef intptr_t (*Semaphore)() DART_UNUSED; | 513 typedef intptr_t (*Semaphore)() DART_UNUSED; |
| 584 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Semaphore, test->entry())); | 514 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Semaphore, test->entry())); |
| 585 } | 515 } |
| 586 | 516 |
| 587 | |
| 588 ASSEMBLER_TEST_GENERATE(FailedSemaphore, assembler) { | 517 ASSEMBLER_TEST_GENERATE(FailedSemaphore, assembler) { |
| 589 __ SetupDartSP(); | 518 __ SetupDartSP(); |
| 590 __ movz(R0, Immediate(40), 0); | 519 __ movz(R0, Immediate(40), 0); |
| 591 __ movz(R1, Immediate(42), 0); | 520 __ movz(R1, Immediate(42), 0); |
| 592 __ Push(R0); | 521 __ Push(R0); |
| 593 __ ldxr(R0, SP); | 522 __ ldxr(R0, SP); |
| 594 __ clrex(); // Simulate a context switch. | 523 __ clrex(); // Simulate a context switch. |
| 595 __ stxr(TMP, R1, SP); // IP == 1, failure | 524 __ stxr(TMP, R1, SP); // IP == 1, failure |
| 596 __ Pop(R0); // 40 | 525 __ Pop(R0); // 40 |
| 597 __ add(R0, R0, Operand(TMP)); | 526 __ add(R0, R0, Operand(TMP)); |
| 598 __ RestoreCSP(); | 527 __ RestoreCSP(); |
| 599 __ ret(); | 528 __ ret(); |
| 600 } | 529 } |
| 601 | 530 |
| 602 | |
| 603 ASSEMBLER_TEST_RUN(FailedSemaphore, test) { | 531 ASSEMBLER_TEST_RUN(FailedSemaphore, test) { |
| 604 EXPECT(test != NULL); | 532 EXPECT(test != NULL); |
| 605 typedef intptr_t (*FailedSemaphore)() DART_UNUSED; | 533 typedef intptr_t (*FailedSemaphore)() DART_UNUSED; |
| 606 EXPECT_EQ(41, EXECUTE_TEST_CODE_INT64(FailedSemaphore, test->entry())); | 534 EXPECT_EQ(41, EXECUTE_TEST_CODE_INT64(FailedSemaphore, test->entry())); |
| 607 } | 535 } |
| 608 | 536 |
| 609 | |
| 610 ASSEMBLER_TEST_GENERATE(Semaphore32, assembler) { | 537 ASSEMBLER_TEST_GENERATE(Semaphore32, assembler) { |
| 611 __ SetupDartSP(); | 538 __ SetupDartSP(); |
| 612 __ movz(R0, Immediate(40), 0); | 539 __ movz(R0, Immediate(40), 0); |
| 613 __ add(R0, R0, Operand(R0, LSL, 32)); | 540 __ add(R0, R0, Operand(R0, LSL, 32)); |
| 614 __ Push(R0); | 541 __ Push(R0); |
| 615 | 542 |
| 616 __ movz(R0, Immediate(40), 0); | 543 __ movz(R0, Immediate(40), 0); |
| 617 __ movz(R1, Immediate(42), 0); | 544 __ movz(R1, Immediate(42), 0); |
| 618 | 545 |
| 619 Label retry; | 546 Label retry; |
| 620 __ Bind(&retry); | 547 __ Bind(&retry); |
| 621 __ ldxr(R0, SP, kWord); | 548 __ ldxr(R0, SP, kWord); |
| 622 // 32 bit operation should ignore the high word of R0 that was pushed on the | 549 // 32 bit operation should ignore the high word of R0 that was pushed on the |
| 623 // stack. | 550 // stack. |
| 624 __ stxr(TMP, R1, SP, kWord); // IP == 0, success | 551 __ stxr(TMP, R1, SP, kWord); // IP == 0, success |
| 625 __ cmp(TMP, Operand(0)); | 552 __ cmp(TMP, Operand(0)); |
| 626 __ b(&retry, NE); // NE if context switch occurred between ldrex and strex. | 553 __ b(&retry, NE); // NE if context switch occurred between ldrex and strex. |
| 627 __ Pop(R0); // 42 + 42 * 2**32 | 554 __ Pop(R0); // 42 + 42 * 2**32 |
| 628 __ RestoreCSP(); | 555 __ RestoreCSP(); |
| 629 __ ret(); | 556 __ ret(); |
| 630 } | 557 } |
| 631 | 558 |
| 632 | |
| 633 ASSEMBLER_TEST_RUN(Semaphore32, test) { | 559 ASSEMBLER_TEST_RUN(Semaphore32, test) { |
| 634 EXPECT(test != NULL); | 560 EXPECT(test != NULL); |
| 635 typedef intptr_t (*Semaphore32)() DART_UNUSED; | 561 typedef intptr_t (*Semaphore32)() DART_UNUSED; |
| 636 // Lower word has been atomically switched from 40 to 42k, whereas upper word | 562 // Lower word has been atomically switched from 40 to 42k, whereas upper word |
| 637 // is unchanged at 40. | 563 // is unchanged at 40. |
| 638 EXPECT_EQ(42 + (40l << 32), | 564 EXPECT_EQ(42 + (40l << 32), |
| 639 EXECUTE_TEST_CODE_INT64(Semaphore32, test->entry())); | 565 EXECUTE_TEST_CODE_INT64(Semaphore32, test->entry())); |
| 640 } | 566 } |
| 641 | 567 |
| 642 | |
| 643 ASSEMBLER_TEST_GENERATE(FailedSemaphore32, assembler) { | 568 ASSEMBLER_TEST_GENERATE(FailedSemaphore32, assembler) { |
| 644 __ SetupDartSP(); | 569 __ SetupDartSP(); |
| 645 __ movz(R0, Immediate(40), 0); | 570 __ movz(R0, Immediate(40), 0); |
| 646 __ add(R0, R0, Operand(R0, LSL, 32)); | 571 __ add(R0, R0, Operand(R0, LSL, 32)); |
| 647 __ Push(R0); | 572 __ Push(R0); |
| 648 | 573 |
| 649 __ movz(R0, Immediate(40), 0); | 574 __ movz(R0, Immediate(40), 0); |
| 650 __ movz(R1, Immediate(42), 0); | 575 __ movz(R1, Immediate(42), 0); |
| 651 | 576 |
| 652 __ ldxr(R0, SP, kWord); | 577 __ ldxr(R0, SP, kWord); |
| 653 __ clrex(); // Simulate a context switch. | 578 __ clrex(); // Simulate a context switch. |
| 654 __ stxr(TMP, R1, SP, kWord); // IP == 1, failure | 579 __ stxr(TMP, R1, SP, kWord); // IP == 1, failure |
| 655 __ Pop(R0); // 40 | 580 __ Pop(R0); // 40 |
| 656 __ add(R0, R0, Operand(TMP)); | 581 __ add(R0, R0, Operand(TMP)); |
| 657 __ RestoreCSP(); | 582 __ RestoreCSP(); |
| 658 __ ret(); | 583 __ ret(); |
| 659 } | 584 } |
| 660 | 585 |
| 661 | |
| 662 ASSEMBLER_TEST_RUN(FailedSemaphore32, test) { | 586 ASSEMBLER_TEST_RUN(FailedSemaphore32, test) { |
| 663 EXPECT(test != NULL); | 587 EXPECT(test != NULL); |
| 664 typedef intptr_t (*FailedSemaphore32)() DART_UNUSED; | 588 typedef intptr_t (*FailedSemaphore32)() DART_UNUSED; |
| 665 // Lower word has had the failure code (1) added to it. Upper word is | 589 // Lower word has had the failure code (1) added to it. Upper word is |
| 666 // unchanged at 40. | 590 // unchanged at 40. |
| 667 EXPECT_EQ(41 + (40l << 32), | 591 EXPECT_EQ(41 + (40l << 32), |
| 668 EXECUTE_TEST_CODE_INT64(FailedSemaphore32, test->entry())); | 592 EXECUTE_TEST_CODE_INT64(FailedSemaphore32, test->entry())); |
| 669 } | 593 } |
| 670 | 594 |
| 671 | |
| 672 // Logical register operations. | 595 // Logical register operations. |
| 673 ASSEMBLER_TEST_GENERATE(AndRegs, assembler) { | 596 ASSEMBLER_TEST_GENERATE(AndRegs, assembler) { |
| 674 __ movz(R1, Immediate(43), 0); | 597 __ movz(R1, Immediate(43), 0); |
| 675 __ movz(R2, Immediate(42), 0); | 598 __ movz(R2, Immediate(42), 0); |
| 676 __ and_(R0, R1, Operand(R2)); | 599 __ and_(R0, R1, Operand(R2)); |
| 677 __ ret(); | 600 __ ret(); |
| 678 } | 601 } |
| 679 | 602 |
| 680 | |
| 681 ASSEMBLER_TEST_RUN(AndRegs, test) { | 603 ASSEMBLER_TEST_RUN(AndRegs, test) { |
| 682 typedef int64_t (*Int64Return)() DART_UNUSED; | 604 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 683 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 605 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 684 } | 606 } |
| 685 | 607 |
| 686 | |
| 687 ASSEMBLER_TEST_GENERATE(AndShiftRegs, assembler) { | 608 ASSEMBLER_TEST_GENERATE(AndShiftRegs, assembler) { |
| 688 __ movz(R1, Immediate(42), 0); | 609 __ movz(R1, Immediate(42), 0); |
| 689 __ movz(R2, Immediate(21), 0); | 610 __ movz(R2, Immediate(21), 0); |
| 690 __ and_(R0, R1, Operand(R2, LSL, 1)); | 611 __ and_(R0, R1, Operand(R2, LSL, 1)); |
| 691 __ ret(); | 612 __ ret(); |
| 692 } | 613 } |
| 693 | 614 |
| 694 | |
| 695 ASSEMBLER_TEST_RUN(AndShiftRegs, test) { | 615 ASSEMBLER_TEST_RUN(AndShiftRegs, test) { |
| 696 typedef int64_t (*Int64Return)() DART_UNUSED; | 616 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 697 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 617 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 698 } | 618 } |
| 699 | 619 |
| 700 | |
| 701 ASSEMBLER_TEST_GENERATE(BicRegs, assembler) { | 620 ASSEMBLER_TEST_GENERATE(BicRegs, assembler) { |
| 702 __ movz(R1, Immediate(42), 0); | 621 __ movz(R1, Immediate(42), 0); |
| 703 __ movz(R2, Immediate(5), 0); | 622 __ movz(R2, Immediate(5), 0); |
| 704 __ bic(R0, R1, Operand(R2)); | 623 __ bic(R0, R1, Operand(R2)); |
| 705 __ ret(); | 624 __ ret(); |
| 706 } | 625 } |
| 707 | 626 |
| 708 | |
| 709 ASSEMBLER_TEST_RUN(BicRegs, test) { | 627 ASSEMBLER_TEST_RUN(BicRegs, test) { |
| 710 typedef int64_t (*Int64Return)() DART_UNUSED; | 628 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 711 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 629 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 712 } | 630 } |
| 713 | 631 |
| 714 | |
| 715 ASSEMBLER_TEST_GENERATE(OrrRegs, assembler) { | 632 ASSEMBLER_TEST_GENERATE(OrrRegs, assembler) { |
| 716 __ movz(R1, Immediate(32), 0); | 633 __ movz(R1, Immediate(32), 0); |
| 717 __ movz(R2, Immediate(10), 0); | 634 __ movz(R2, Immediate(10), 0); |
| 718 __ orr(R0, R1, Operand(R2)); | 635 __ orr(R0, R1, Operand(R2)); |
| 719 __ ret(); | 636 __ ret(); |
| 720 } | 637 } |
| 721 | 638 |
| 722 | |
| 723 ASSEMBLER_TEST_RUN(OrrRegs, test) { | 639 ASSEMBLER_TEST_RUN(OrrRegs, test) { |
| 724 typedef int64_t (*Int64Return)() DART_UNUSED; | 640 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 725 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 641 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 726 } | 642 } |
| 727 | 643 |
| 728 | |
| 729 ASSEMBLER_TEST_GENERATE(OrnRegs, assembler) { | 644 ASSEMBLER_TEST_GENERATE(OrnRegs, assembler) { |
| 730 __ movz(R1, Immediate(32), 0); | 645 __ movz(R1, Immediate(32), 0); |
| 731 __ movn(R2, Immediate(0), 0); // R2 <- 0xffffffffffffffff. | 646 __ movn(R2, Immediate(0), 0); // R2 <- 0xffffffffffffffff. |
| 732 __ movk(R2, Immediate(0xffd5), 0); // R2 <- 0xffffffffffffffe5. | 647 __ movk(R2, Immediate(0xffd5), 0); // R2 <- 0xffffffffffffffe5. |
| 733 __ orn(R0, R1, Operand(R2)); | 648 __ orn(R0, R1, Operand(R2)); |
| 734 __ ret(); | 649 __ ret(); |
| 735 } | 650 } |
| 736 | 651 |
| 737 | |
| 738 ASSEMBLER_TEST_RUN(OrnRegs, test) { | 652 ASSEMBLER_TEST_RUN(OrnRegs, test) { |
| 739 typedef int64_t (*Int64Return)() DART_UNUSED; | 653 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 740 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 654 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 741 } | 655 } |
| 742 | 656 |
| 743 | |
| 744 ASSEMBLER_TEST_GENERATE(EorRegs, assembler) { | 657 ASSEMBLER_TEST_GENERATE(EorRegs, assembler) { |
| 745 __ movz(R1, Immediate(0xffd5), 0); | 658 __ movz(R1, Immediate(0xffd5), 0); |
| 746 __ movz(R2, Immediate(0xffff), 0); | 659 __ movz(R2, Immediate(0xffff), 0); |
| 747 __ eor(R0, R1, Operand(R2)); | 660 __ eor(R0, R1, Operand(R2)); |
| 748 __ ret(); | 661 __ ret(); |
| 749 } | 662 } |
| 750 | 663 |
| 751 | |
| 752 ASSEMBLER_TEST_RUN(EorRegs, test) { | 664 ASSEMBLER_TEST_RUN(EorRegs, test) { |
| 753 typedef int64_t (*Int64Return)() DART_UNUSED; | 665 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 754 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 666 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 755 } | 667 } |
| 756 | 668 |
| 757 | |
| 758 ASSEMBLER_TEST_GENERATE(EonRegs, assembler) { | 669 ASSEMBLER_TEST_GENERATE(EonRegs, assembler) { |
| 759 __ movz(R1, Immediate(0xffd5), 0); | 670 __ movz(R1, Immediate(0xffd5), 0); |
| 760 __ movn(R2, Immediate(0xffff), 0); | 671 __ movn(R2, Immediate(0xffff), 0); |
| 761 __ eon(R0, R1, Operand(R2)); | 672 __ eon(R0, R1, Operand(R2)); |
| 762 __ ret(); | 673 __ ret(); |
| 763 } | 674 } |
| 764 | 675 |
| 765 | |
| 766 ASSEMBLER_TEST_RUN(EonRegs, test) { | 676 ASSEMBLER_TEST_RUN(EonRegs, test) { |
| 767 typedef int64_t (*Int64Return)() DART_UNUSED; | 677 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 768 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 678 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 769 } | 679 } |
| 770 | 680 |
| 771 | |
| 772 // Logical immediate operations. | 681 // Logical immediate operations. |
| 773 ASSEMBLER_TEST_GENERATE(AndImm, assembler) { | 682 ASSEMBLER_TEST_GENERATE(AndImm, assembler) { |
| 774 __ movz(R1, Immediate(42), 0); | 683 __ movz(R1, Immediate(42), 0); |
| 775 __ andi(R0, R1, Immediate(0xaaaaaaaaaaaaaaaaULL)); | 684 __ andi(R0, R1, Immediate(0xaaaaaaaaaaaaaaaaULL)); |
| 776 __ ret(); | 685 __ ret(); |
| 777 } | 686 } |
| 778 | 687 |
| 779 | |
| 780 ASSEMBLER_TEST_RUN(AndImm, test) { | 688 ASSEMBLER_TEST_RUN(AndImm, test) { |
| 781 typedef int64_t (*Int64Return)() DART_UNUSED; | 689 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 782 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 690 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 783 } | 691 } |
| 784 | 692 |
| 785 | |
| 786 ASSEMBLER_TEST_GENERATE(AndImmCsp, assembler) { | 693 ASSEMBLER_TEST_GENERATE(AndImmCsp, assembler) { |
| 787 // Note we must maintain the ARM64 ABI invariants on CSP here. | 694 // Note we must maintain the ARM64 ABI invariants on CSP here. |
| 788 __ mov(TMP, CSP); | 695 __ mov(TMP, CSP); |
| 789 __ sub(TMP2, CSP, Operand(31)); | 696 __ sub(TMP2, CSP, Operand(31)); |
| 790 __ andi(CSP, TMP2, Immediate(~15)); | 697 __ andi(CSP, TMP2, Immediate(~15)); |
| 791 __ mov(R0, CSP); | 698 __ mov(R0, CSP); |
| 792 __ sub(R0, TMP, Operand(R0)); | 699 __ sub(R0, TMP, Operand(R0)); |
| 793 __ mov(CSP, TMP); | 700 __ mov(CSP, TMP); |
| 794 __ ret(); | 701 __ ret(); |
| 795 } | 702 } |
| 796 | 703 |
| 797 | |
| 798 ASSEMBLER_TEST_RUN(AndImmCsp, test) { | 704 ASSEMBLER_TEST_RUN(AndImmCsp, test) { |
| 799 typedef int64_t (*Int64Return)() DART_UNUSED; | 705 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 800 EXPECT_EQ(32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 706 EXPECT_EQ(32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 801 } | 707 } |
| 802 | 708 |
| 803 | |
| 804 ASSEMBLER_TEST_GENERATE(AndOneImm, assembler) { | 709 ASSEMBLER_TEST_GENERATE(AndOneImm, assembler) { |
| 805 __ movz(R1, Immediate(43), 0); | 710 __ movz(R1, Immediate(43), 0); |
| 806 __ andi(R0, R1, Immediate(1)); | 711 __ andi(R0, R1, Immediate(1)); |
| 807 __ ret(); | 712 __ ret(); |
| 808 } | 713 } |
| 809 | 714 |
| 810 | |
| 811 ASSEMBLER_TEST_RUN(AndOneImm, test) { | 715 ASSEMBLER_TEST_RUN(AndOneImm, test) { |
| 812 typedef int64_t (*Int64Return)() DART_UNUSED; | 716 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 813 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 717 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 814 } | 718 } |
| 815 | 719 |
| 816 | |
| 817 ASSEMBLER_TEST_GENERATE(OrrImm, assembler) { | 720 ASSEMBLER_TEST_GENERATE(OrrImm, assembler) { |
| 818 __ movz(R1, Immediate(0), 0); | 721 __ movz(R1, Immediate(0), 0); |
| 819 __ movz(R2, Immediate(0x3f), 0); | 722 __ movz(R2, Immediate(0x3f), 0); |
| 820 __ movz(R3, Immediate(0xa), 0); | 723 __ movz(R3, Immediate(0xa), 0); |
| 821 __ orri(R1, R1, Immediate(0x0020002000200020ULL)); | 724 __ orri(R1, R1, Immediate(0x0020002000200020ULL)); |
| 822 __ orr(R1, R1, Operand(R3)); | 725 __ orr(R1, R1, Operand(R3)); |
| 823 __ and_(R0, R1, Operand(R2)); | 726 __ and_(R0, R1, Operand(R2)); |
| 824 __ ret(); | 727 __ ret(); |
| 825 } | 728 } |
| 826 | 729 |
| 827 | |
| 828 ASSEMBLER_TEST_RUN(OrrImm, test) { | 730 ASSEMBLER_TEST_RUN(OrrImm, test) { |
| 829 typedef int64_t (*Int64Return)() DART_UNUSED; | 731 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 830 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 732 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 831 } | 733 } |
| 832 | 734 |
| 833 | |
| 834 ASSEMBLER_TEST_GENERATE(EorImm, assembler) { | 735 ASSEMBLER_TEST_GENERATE(EorImm, assembler) { |
| 835 __ movn(R0, Immediate(0), 0); | 736 __ movn(R0, Immediate(0), 0); |
| 836 __ movk(R0, Immediate(0xffd5), 0); // R0 < 0xffffffffffffffd5. | 737 __ movk(R0, Immediate(0xffd5), 0); // R0 < 0xffffffffffffffd5. |
| 837 __ movz(R1, Immediate(0x3f), 0); | 738 __ movz(R1, Immediate(0x3f), 0); |
| 838 __ eori(R0, R0, Immediate(0x3f3f3f3f3f3f3f3fULL)); | 739 __ eori(R0, R0, Immediate(0x3f3f3f3f3f3f3f3fULL)); |
| 839 __ and_(R0, R0, Operand(R1)); | 740 __ and_(R0, R0, Operand(R1)); |
| 840 __ ret(); | 741 __ ret(); |
| 841 } | 742 } |
| 842 | 743 |
| 843 | |
| 844 ASSEMBLER_TEST_RUN(EorImm, test) { | 744 ASSEMBLER_TEST_RUN(EorImm, test) { |
| 845 typedef int64_t (*Int64Return)() DART_UNUSED; | 745 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 846 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 746 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 847 } | 747 } |
| 848 | 748 |
| 849 | |
| 850 ASSEMBLER_TEST_GENERATE(Clz, assembler) { | 749 ASSEMBLER_TEST_GENERATE(Clz, assembler) { |
| 851 Label error; | 750 Label error; |
| 852 | 751 |
| 853 __ clz(R1, ZR); | 752 __ clz(R1, ZR); |
| 854 __ cmp(R1, Operand(64)); | 753 __ cmp(R1, Operand(64)); |
| 855 __ b(&error, NE); | 754 __ b(&error, NE); |
| 856 __ LoadImmediate(R2, 42); | 755 __ LoadImmediate(R2, 42); |
| 857 __ clz(R2, R2); | 756 __ clz(R2, R2); |
| 858 __ cmp(R2, Operand(58)); | 757 __ cmp(R2, Operand(58)); |
| 859 __ b(&error, NE); | 758 __ b(&error, NE); |
| 860 __ LoadImmediate(R0, -1); | 759 __ LoadImmediate(R0, -1); |
| 861 __ clz(R1, R0); | 760 __ clz(R1, R0); |
| 862 __ cmp(R1, Operand(0)); | 761 __ cmp(R1, Operand(0)); |
| 863 __ b(&error, NE); | 762 __ b(&error, NE); |
| 864 __ add(R0, ZR, Operand(R0, LSR, 3)); | 763 __ add(R0, ZR, Operand(R0, LSR, 3)); |
| 865 __ clz(R1, R0); | 764 __ clz(R1, R0); |
| 866 __ cmp(R1, Operand(3)); | 765 __ cmp(R1, Operand(3)); |
| 867 __ b(&error, NE); | 766 __ b(&error, NE); |
| 868 __ mov(R0, ZR); | 767 __ mov(R0, ZR); |
| 869 __ ret(); | 768 __ ret(); |
| 870 __ Bind(&error); | 769 __ Bind(&error); |
| 871 __ LoadImmediate(R0, 1); | 770 __ LoadImmediate(R0, 1); |
| 872 __ ret(); | 771 __ ret(); |
| 873 } | 772 } |
| 874 | 773 |
| 875 | |
| 876 ASSEMBLER_TEST_RUN(Clz, test) { | 774 ASSEMBLER_TEST_RUN(Clz, test) { |
| 877 typedef int64_t (*Int64Return)() DART_UNUSED; | 775 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 878 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 776 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 879 } | 777 } |
| 880 | 778 |
| 881 | |
| 882 // Comparisons, branching. | 779 // Comparisons, branching. |
| 883 ASSEMBLER_TEST_GENERATE(BranchALForward, assembler) { | 780 ASSEMBLER_TEST_GENERATE(BranchALForward, assembler) { |
| 884 Label l; | 781 Label l; |
| 885 __ movz(R0, Immediate(42), 0); | 782 __ movz(R0, Immediate(42), 0); |
| 886 __ b(&l, AL); | 783 __ b(&l, AL); |
| 887 __ movz(R0, Immediate(0), 0); | 784 __ movz(R0, Immediate(0), 0); |
| 888 __ Bind(&l); | 785 __ Bind(&l); |
| 889 __ ret(); | 786 __ ret(); |
| 890 } | 787 } |
| 891 | 788 |
| 892 | |
| 893 ASSEMBLER_TEST_RUN(BranchALForward, test) { | 789 ASSEMBLER_TEST_RUN(BranchALForward, test) { |
| 894 typedef int64_t (*Int64Return)() DART_UNUSED; | 790 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 895 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 791 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 896 } | 792 } |
| 897 | 793 |
| 898 | |
| 899 ASSEMBLER_TEST_GENERATE(BranchALBackwards, assembler) { | 794 ASSEMBLER_TEST_GENERATE(BranchALBackwards, assembler) { |
| 900 Label l, leave; | 795 Label l, leave; |
| 901 __ movz(R0, Immediate(42), 0); | 796 __ movz(R0, Immediate(42), 0); |
| 902 __ b(&l, AL); | 797 __ b(&l, AL); |
| 903 | 798 |
| 904 __ movz(R0, Immediate(0), 0); | 799 __ movz(R0, Immediate(0), 0); |
| 905 __ Bind(&leave); | 800 __ Bind(&leave); |
| 906 __ ret(); | 801 __ ret(); |
| 907 __ movz(R0, Immediate(0), 0); | 802 __ movz(R0, Immediate(0), 0); |
| 908 | 803 |
| 909 __ Bind(&l); | 804 __ Bind(&l); |
| 910 __ b(&leave, AL); | 805 __ b(&leave, AL); |
| 911 __ movz(R0, Immediate(0), 0); | 806 __ movz(R0, Immediate(0), 0); |
| 912 __ ret(); | 807 __ ret(); |
| 913 } | 808 } |
| 914 | 809 |
| 915 | |
| 916 ASSEMBLER_TEST_RUN(BranchALBackwards, test) { | 810 ASSEMBLER_TEST_RUN(BranchALBackwards, test) { |
| 917 typedef int64_t (*Int64Return)() DART_UNUSED; | 811 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 918 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 812 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 919 } | 813 } |
| 920 | 814 |
| 921 | |
| 922 ASSEMBLER_TEST_GENERATE(CmpEqBranch, assembler) { | 815 ASSEMBLER_TEST_GENERATE(CmpEqBranch, assembler) { |
| 923 Label l; | 816 Label l; |
| 924 | 817 |
| 925 __ movz(R0, Immediate(42), 0); | 818 __ movz(R0, Immediate(42), 0); |
| 926 __ movz(R1, Immediate(234), 0); | 819 __ movz(R1, Immediate(234), 0); |
| 927 __ movz(R2, Immediate(234), 0); | 820 __ movz(R2, Immediate(234), 0); |
| 928 | 821 |
| 929 __ cmp(R1, Operand(R2)); | 822 __ cmp(R1, Operand(R2)); |
| 930 __ b(&l, EQ); | 823 __ b(&l, EQ); |
| 931 __ movz(R0, Immediate(0), 0); | 824 __ movz(R0, Immediate(0), 0); |
| 932 __ Bind(&l); | 825 __ Bind(&l); |
| 933 __ ret(); | 826 __ ret(); |
| 934 } | 827 } |
| 935 | 828 |
| 936 | |
| 937 ASSEMBLER_TEST_RUN(CmpEqBranch, test) { | 829 ASSEMBLER_TEST_RUN(CmpEqBranch, test) { |
| 938 typedef int64_t (*Int64Return)() DART_UNUSED; | 830 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 939 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 831 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 940 } | 832 } |
| 941 | 833 |
| 942 | |
| 943 ASSEMBLER_TEST_GENERATE(CmpEqBranchNotTaken, assembler) { | 834 ASSEMBLER_TEST_GENERATE(CmpEqBranchNotTaken, assembler) { |
| 944 Label l; | 835 Label l; |
| 945 | 836 |
| 946 __ movz(R0, Immediate(0), 0); | 837 __ movz(R0, Immediate(0), 0); |
| 947 __ movz(R1, Immediate(233), 0); | 838 __ movz(R1, Immediate(233), 0); |
| 948 __ movz(R2, Immediate(234), 0); | 839 __ movz(R2, Immediate(234), 0); |
| 949 | 840 |
| 950 __ cmp(R1, Operand(R2)); | 841 __ cmp(R1, Operand(R2)); |
| 951 __ b(&l, EQ); | 842 __ b(&l, EQ); |
| 952 __ movz(R0, Immediate(42), 0); | 843 __ movz(R0, Immediate(42), 0); |
| 953 __ Bind(&l); | 844 __ Bind(&l); |
| 954 __ ret(); | 845 __ ret(); |
| 955 } | 846 } |
| 956 | 847 |
| 957 | |
| 958 ASSEMBLER_TEST_RUN(CmpEqBranchNotTaken, test) { | 848 ASSEMBLER_TEST_RUN(CmpEqBranchNotTaken, test) { |
| 959 typedef int64_t (*Int64Return)() DART_UNUSED; | 849 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 960 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 850 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 961 } | 851 } |
| 962 | 852 |
| 963 | |
| 964 ASSEMBLER_TEST_GENERATE(CmpEq1Branch, assembler) { | 853 ASSEMBLER_TEST_GENERATE(CmpEq1Branch, assembler) { |
| 965 Label l; | 854 Label l; |
| 966 | 855 |
| 967 __ movz(R0, Immediate(42), 0); | 856 __ movz(R0, Immediate(42), 0); |
| 968 __ movz(R1, Immediate(1), 0); | 857 __ movz(R1, Immediate(1), 0); |
| 969 | 858 |
| 970 __ cmp(R1, Operand(1)); | 859 __ cmp(R1, Operand(1)); |
| 971 __ b(&l, EQ); | 860 __ b(&l, EQ); |
| 972 __ movz(R0, Immediate(0), 0); | 861 __ movz(R0, Immediate(0), 0); |
| 973 __ Bind(&l); | 862 __ Bind(&l); |
| 974 __ ret(); | 863 __ ret(); |
| 975 } | 864 } |
| 976 | 865 |
| 977 | |
| 978 ASSEMBLER_TEST_RUN(CmpEq1Branch, test) { | 866 ASSEMBLER_TEST_RUN(CmpEq1Branch, test) { |
| 979 typedef int64_t (*Int64Return)() DART_UNUSED; | 867 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 980 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 868 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 981 } | 869 } |
| 982 | 870 |
| 983 | |
| 984 ASSEMBLER_TEST_GENERATE(CmnEq1Branch, assembler) { | 871 ASSEMBLER_TEST_GENERATE(CmnEq1Branch, assembler) { |
| 985 Label l; | 872 Label l; |
| 986 | 873 |
| 987 __ movz(R0, Immediate(42), 0); | 874 __ movz(R0, Immediate(42), 0); |
| 988 __ movn(R1, Immediate(0), 0); // R1 <- -1 | 875 __ movn(R1, Immediate(0), 0); // R1 <- -1 |
| 989 | 876 |
| 990 __ cmn(R1, Operand(1)); | 877 __ cmn(R1, Operand(1)); |
| 991 __ b(&l, EQ); | 878 __ b(&l, EQ); |
| 992 __ movz(R0, Immediate(0), 0); | 879 __ movz(R0, Immediate(0), 0); |
| 993 __ Bind(&l); | 880 __ Bind(&l); |
| 994 __ ret(); | 881 __ ret(); |
| 995 } | 882 } |
| 996 | 883 |
| 997 | |
| 998 ASSEMBLER_TEST_RUN(CmnEq1Branch, test) { | 884 ASSEMBLER_TEST_RUN(CmnEq1Branch, test) { |
| 999 typedef int64_t (*Int64Return)() DART_UNUSED; | 885 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1000 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 886 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1001 } | 887 } |
| 1002 | 888 |
| 1003 | |
| 1004 ASSEMBLER_TEST_GENERATE(CmpLtBranch, assembler) { | 889 ASSEMBLER_TEST_GENERATE(CmpLtBranch, assembler) { |
| 1005 Label l; | 890 Label l; |
| 1006 | 891 |
| 1007 __ movz(R0, Immediate(42), 0); | 892 __ movz(R0, Immediate(42), 0); |
| 1008 __ movz(R1, Immediate(233), 0); | 893 __ movz(R1, Immediate(233), 0); |
| 1009 __ movz(R2, Immediate(234), 0); | 894 __ movz(R2, Immediate(234), 0); |
| 1010 | 895 |
| 1011 __ cmp(R1, Operand(R2)); | 896 __ cmp(R1, Operand(R2)); |
| 1012 __ b(&l, LT); | 897 __ b(&l, LT); |
| 1013 __ movz(R0, Immediate(0), 0); | 898 __ movz(R0, Immediate(0), 0); |
| 1014 __ Bind(&l); | 899 __ Bind(&l); |
| 1015 __ ret(); | 900 __ ret(); |
| 1016 } | 901 } |
| 1017 | 902 |
| 1018 | |
| 1019 ASSEMBLER_TEST_RUN(CmpLtBranch, test) { | 903 ASSEMBLER_TEST_RUN(CmpLtBranch, test) { |
| 1020 typedef int64_t (*Int64Return)() DART_UNUSED; | 904 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1021 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 905 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1022 } | 906 } |
| 1023 | 907 |
| 1024 | |
| 1025 ASSEMBLER_TEST_GENERATE(CmpLtBranchNotTaken, assembler) { | 908 ASSEMBLER_TEST_GENERATE(CmpLtBranchNotTaken, assembler) { |
| 1026 Label l; | 909 Label l; |
| 1027 | 910 |
| 1028 __ movz(R0, Immediate(0), 0); | 911 __ movz(R0, Immediate(0), 0); |
| 1029 __ movz(R1, Immediate(235), 0); | 912 __ movz(R1, Immediate(235), 0); |
| 1030 __ movz(R2, Immediate(234), 0); | 913 __ movz(R2, Immediate(234), 0); |
| 1031 | 914 |
| 1032 __ cmp(R1, Operand(R2)); | 915 __ cmp(R1, Operand(R2)); |
| 1033 __ b(&l, LT); | 916 __ b(&l, LT); |
| 1034 __ movz(R0, Immediate(42), 0); | 917 __ movz(R0, Immediate(42), 0); |
| 1035 __ Bind(&l); | 918 __ Bind(&l); |
| 1036 __ ret(); | 919 __ ret(); |
| 1037 } | 920 } |
| 1038 | 921 |
| 1039 | |
| 1040 ASSEMBLER_TEST_RUN(CmpLtBranchNotTaken, test) { | 922 ASSEMBLER_TEST_RUN(CmpLtBranchNotTaken, test) { |
| 1041 typedef int64_t (*Int64Return)() DART_UNUSED; | 923 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1042 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 924 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1043 } | 925 } |
| 1044 | 926 |
| 1045 | |
| 1046 ASSEMBLER_TEST_GENERATE(CmpBranchIfZero, assembler) { | 927 ASSEMBLER_TEST_GENERATE(CmpBranchIfZero, assembler) { |
| 1047 Label l; | 928 Label l; |
| 1048 | 929 |
| 1049 __ movz(R0, Immediate(42), 0); | 930 __ movz(R0, Immediate(42), 0); |
| 1050 __ movz(R1, Immediate(0), 0); | 931 __ movz(R1, Immediate(0), 0); |
| 1051 | 932 |
| 1052 __ cbz(&l, R1); | 933 __ cbz(&l, R1); |
| 1053 __ movz(R0, Immediate(0), 0); | 934 __ movz(R0, Immediate(0), 0); |
| 1054 __ Bind(&l); | 935 __ Bind(&l); |
| 1055 __ ret(); | 936 __ ret(); |
| 1056 } | 937 } |
| 1057 | 938 |
| 1058 | |
| 1059 ASSEMBLER_TEST_RUN(CmpBranchIfZero, test) { | 939 ASSEMBLER_TEST_RUN(CmpBranchIfZero, test) { |
| 1060 typedef int64_t (*Int64Return)() DART_UNUSED; | 940 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1061 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 941 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1062 } | 942 } |
| 1063 | 943 |
| 1064 | |
| 1065 ASSEMBLER_TEST_GENERATE(CmpBranchIfZeroNotTaken, assembler) { | 944 ASSEMBLER_TEST_GENERATE(CmpBranchIfZeroNotTaken, assembler) { |
| 1066 Label l; | 945 Label l; |
| 1067 | 946 |
| 1068 __ movz(R0, Immediate(0), 0); | 947 __ movz(R0, Immediate(0), 0); |
| 1069 __ movz(R1, Immediate(1), 0); | 948 __ movz(R1, Immediate(1), 0); |
| 1070 | 949 |
| 1071 __ cbz(&l, R1); | 950 __ cbz(&l, R1); |
| 1072 __ movz(R0, Immediate(42), 0); | 951 __ movz(R0, Immediate(42), 0); |
| 1073 __ Bind(&l); | 952 __ Bind(&l); |
| 1074 __ ret(); | 953 __ ret(); |
| 1075 } | 954 } |
| 1076 | 955 |
| 1077 | |
| 1078 ASSEMBLER_TEST_RUN(CmpBranchIfZeroNotTaken, test) { | 956 ASSEMBLER_TEST_RUN(CmpBranchIfZeroNotTaken, test) { |
| 1079 typedef int64_t (*Int64Return)() DART_UNUSED; | 957 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1080 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 958 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1081 } | 959 } |
| 1082 | 960 |
| 1083 | |
| 1084 ASSEMBLER_TEST_GENERATE(CmpBranchIfNotZero, assembler) { | 961 ASSEMBLER_TEST_GENERATE(CmpBranchIfNotZero, assembler) { |
| 1085 Label l; | 962 Label l; |
| 1086 | 963 |
| 1087 __ movz(R0, Immediate(42), 0); | 964 __ movz(R0, Immediate(42), 0); |
| 1088 __ movz(R1, Immediate(1), 0); | 965 __ movz(R1, Immediate(1), 0); |
| 1089 | 966 |
| 1090 __ cbnz(&l, R1); | 967 __ cbnz(&l, R1); |
| 1091 __ movz(R0, Immediate(0), 0); | 968 __ movz(R0, Immediate(0), 0); |
| 1092 __ Bind(&l); | 969 __ Bind(&l); |
| 1093 __ ret(); | 970 __ ret(); |
| 1094 } | 971 } |
| 1095 | 972 |
| 1096 | |
| 1097 ASSEMBLER_TEST_RUN(CmpBranchIfNotZero, test) { | 973 ASSEMBLER_TEST_RUN(CmpBranchIfNotZero, test) { |
| 1098 typedef int64_t (*Int64Return)() DART_UNUSED; | 974 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1099 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 975 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1100 } | 976 } |
| 1101 | 977 |
| 1102 | |
| 1103 ASSEMBLER_TEST_GENERATE(CmpBranchIfNotZeroNotTaken, assembler) { | 978 ASSEMBLER_TEST_GENERATE(CmpBranchIfNotZeroNotTaken, assembler) { |
| 1104 Label l; | 979 Label l; |
| 1105 | 980 |
| 1106 __ movz(R0, Immediate(0), 0); | 981 __ movz(R0, Immediate(0), 0); |
| 1107 __ movz(R1, Immediate(0), 0); | 982 __ movz(R1, Immediate(0), 0); |
| 1108 | 983 |
| 1109 __ cbnz(&l, R1); | 984 __ cbnz(&l, R1); |
| 1110 __ movz(R0, Immediate(42), 0); | 985 __ movz(R0, Immediate(42), 0); |
| 1111 __ Bind(&l); | 986 __ Bind(&l); |
| 1112 __ ret(); | 987 __ ret(); |
| 1113 } | 988 } |
| 1114 | 989 |
| 1115 | |
| 1116 ASSEMBLER_TEST_RUN(CmpBranchIfNotZeroNotTaken, test) { | 990 ASSEMBLER_TEST_RUN(CmpBranchIfNotZeroNotTaken, test) { |
| 1117 typedef int64_t (*Int64Return)() DART_UNUSED; | 991 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1118 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 992 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1119 } | 993 } |
| 1120 | 994 |
| 1121 | |
| 1122 ASSEMBLER_TEST_GENERATE(FcmpEqBranch, assembler) { | 995 ASSEMBLER_TEST_GENERATE(FcmpEqBranch, assembler) { |
| 1123 Label l; | 996 Label l; |
| 1124 | 997 |
| 1125 __ LoadDImmediate(V0, 42.0); | 998 __ LoadDImmediate(V0, 42.0); |
| 1126 __ LoadDImmediate(V1, 234.0); | 999 __ LoadDImmediate(V1, 234.0); |
| 1127 __ LoadDImmediate(V2, 234.0); | 1000 __ LoadDImmediate(V2, 234.0); |
| 1128 | 1001 |
| 1129 __ fcmpd(V1, V2); | 1002 __ fcmpd(V1, V2); |
| 1130 __ b(&l, EQ); | 1003 __ b(&l, EQ); |
| 1131 __ LoadDImmediate(V0, 0.0); | 1004 __ LoadDImmediate(V0, 0.0); |
| 1132 __ Bind(&l); | 1005 __ Bind(&l); |
| 1133 __ ret(); | 1006 __ ret(); |
| 1134 } | 1007 } |
| 1135 | 1008 |
| 1136 | |
| 1137 ASSEMBLER_TEST_RUN(FcmpEqBranch, test) { | 1009 ASSEMBLER_TEST_RUN(FcmpEqBranch, test) { |
| 1138 typedef double (*DoubleReturn)() DART_UNUSED; | 1010 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1139 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1011 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1140 } | 1012 } |
| 1141 | 1013 |
| 1142 | |
| 1143 ASSEMBLER_TEST_GENERATE(FcmpEqBranchNotTaken, assembler) { | 1014 ASSEMBLER_TEST_GENERATE(FcmpEqBranchNotTaken, assembler) { |
| 1144 Label l; | 1015 Label l; |
| 1145 | 1016 |
| 1146 __ LoadDImmediate(V0, 0.0); | 1017 __ LoadDImmediate(V0, 0.0); |
| 1147 __ LoadDImmediate(V1, 233.0); | 1018 __ LoadDImmediate(V1, 233.0); |
| 1148 __ LoadDImmediate(V2, 234.0); | 1019 __ LoadDImmediate(V2, 234.0); |
| 1149 | 1020 |
| 1150 __ fcmpd(V1, V2); | 1021 __ fcmpd(V1, V2); |
| 1151 __ b(&l, EQ); | 1022 __ b(&l, EQ); |
| 1152 __ LoadDImmediate(V0, 42.0); | 1023 __ LoadDImmediate(V0, 42.0); |
| 1153 __ Bind(&l); | 1024 __ Bind(&l); |
| 1154 __ ret(); | 1025 __ ret(); |
| 1155 } | 1026 } |
| 1156 | 1027 |
| 1157 | |
| 1158 ASSEMBLER_TEST_RUN(FcmpEqBranchNotTaken, test) { | 1028 ASSEMBLER_TEST_RUN(FcmpEqBranchNotTaken, test) { |
| 1159 typedef double (*DoubleReturn)() DART_UNUSED; | 1029 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1160 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1030 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1161 } | 1031 } |
| 1162 | 1032 |
| 1163 | |
| 1164 ASSEMBLER_TEST_GENERATE(FcmpLtBranch, assembler) { | 1033 ASSEMBLER_TEST_GENERATE(FcmpLtBranch, assembler) { |
| 1165 Label l; | 1034 Label l; |
| 1166 | 1035 |
| 1167 __ LoadDImmediate(V0, 42.0); | 1036 __ LoadDImmediate(V0, 42.0); |
| 1168 __ LoadDImmediate(V1, 233.0); | 1037 __ LoadDImmediate(V1, 233.0); |
| 1169 __ LoadDImmediate(V2, 234.0); | 1038 __ LoadDImmediate(V2, 234.0); |
| 1170 | 1039 |
| 1171 __ fcmpd(V1, V2); | 1040 __ fcmpd(V1, V2); |
| 1172 __ b(&l, LT); | 1041 __ b(&l, LT); |
| 1173 __ LoadDImmediate(V0, 0.0); | 1042 __ LoadDImmediate(V0, 0.0); |
| 1174 __ Bind(&l); | 1043 __ Bind(&l); |
| 1175 __ ret(); | 1044 __ ret(); |
| 1176 } | 1045 } |
| 1177 | 1046 |
| 1178 | |
| 1179 ASSEMBLER_TEST_RUN(FcmpLtBranch, test) { | 1047 ASSEMBLER_TEST_RUN(FcmpLtBranch, test) { |
| 1180 typedef double (*DoubleReturn)() DART_UNUSED; | 1048 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1181 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1049 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1182 } | 1050 } |
| 1183 | 1051 |
| 1184 | |
| 1185 ASSEMBLER_TEST_GENERATE(FcmpLtBranchNotTaken, assembler) { | 1052 ASSEMBLER_TEST_GENERATE(FcmpLtBranchNotTaken, assembler) { |
| 1186 Label l; | 1053 Label l; |
| 1187 | 1054 |
| 1188 __ LoadDImmediate(V0, 0.0); | 1055 __ LoadDImmediate(V0, 0.0); |
| 1189 __ LoadDImmediate(V1, 235.0); | 1056 __ LoadDImmediate(V1, 235.0); |
| 1190 __ LoadDImmediate(V2, 234.0); | 1057 __ LoadDImmediate(V2, 234.0); |
| 1191 | 1058 |
| 1192 __ fcmpd(V1, V2); | 1059 __ fcmpd(V1, V2); |
| 1193 __ b(&l, LT); | 1060 __ b(&l, LT); |
| 1194 __ LoadDImmediate(V0, 42.0); | 1061 __ LoadDImmediate(V0, 42.0); |
| 1195 __ Bind(&l); | 1062 __ Bind(&l); |
| 1196 __ ret(); | 1063 __ ret(); |
| 1197 } | 1064 } |
| 1198 | 1065 |
| 1199 | |
| 1200 ASSEMBLER_TEST_RUN(FcmpLtBranchNotTaken, test) { | 1066 ASSEMBLER_TEST_RUN(FcmpLtBranchNotTaken, test) { |
| 1201 typedef double (*DoubleReturn)() DART_UNUSED; | 1067 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1202 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1068 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1203 } | 1069 } |
| 1204 | 1070 |
| 1205 | |
| 1206 ASSEMBLER_TEST_GENERATE(FcmpzGtBranch, assembler) { | 1071 ASSEMBLER_TEST_GENERATE(FcmpzGtBranch, assembler) { |
| 1207 Label l; | 1072 Label l; |
| 1208 | 1073 |
| 1209 __ LoadDImmediate(V0, 235.0); | 1074 __ LoadDImmediate(V0, 235.0); |
| 1210 __ LoadDImmediate(V1, 233.0); | 1075 __ LoadDImmediate(V1, 233.0); |
| 1211 | 1076 |
| 1212 __ fcmpdz(V1); | 1077 __ fcmpdz(V1); |
| 1213 __ b(&l, GT); | 1078 __ b(&l, GT); |
| 1214 __ LoadDImmediate(V0, 0.0); | 1079 __ LoadDImmediate(V0, 0.0); |
| 1215 __ ret(); | 1080 __ ret(); |
| 1216 __ Bind(&l); | 1081 __ Bind(&l); |
| 1217 __ LoadDImmediate(V0, 42.0); | 1082 __ LoadDImmediate(V0, 42.0); |
| 1218 __ ret(); | 1083 __ ret(); |
| 1219 } | 1084 } |
| 1220 | 1085 |
| 1221 | |
| 1222 ASSEMBLER_TEST_RUN(FcmpzGtBranch, test) { | 1086 ASSEMBLER_TEST_RUN(FcmpzGtBranch, test) { |
| 1223 typedef double (*DoubleReturn)() DART_UNUSED; | 1087 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1224 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1088 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1225 } | 1089 } |
| 1226 | 1090 |
| 1227 | |
| 1228 ASSEMBLER_TEST_GENERATE(AndsBranch, assembler) { | 1091 ASSEMBLER_TEST_GENERATE(AndsBranch, assembler) { |
| 1229 Label l; | 1092 Label l; |
| 1230 | 1093 |
| 1231 __ movz(R0, Immediate(42), 0); | 1094 __ movz(R0, Immediate(42), 0); |
| 1232 __ movz(R1, Immediate(2), 0); | 1095 __ movz(R1, Immediate(2), 0); |
| 1233 __ movz(R2, Immediate(1), 0); | 1096 __ movz(R2, Immediate(1), 0); |
| 1234 | 1097 |
| 1235 __ ands(R3, R1, Operand(R2)); | 1098 __ ands(R3, R1, Operand(R2)); |
| 1236 __ b(&l, EQ); | 1099 __ b(&l, EQ); |
| 1237 __ movz(R0, Immediate(0), 0); | 1100 __ movz(R0, Immediate(0), 0); |
| 1238 __ Bind(&l); | 1101 __ Bind(&l); |
| 1239 __ ret(); | 1102 __ ret(); |
| 1240 } | 1103 } |
| 1241 | 1104 |
| 1242 | |
| 1243 ASSEMBLER_TEST_RUN(AndsBranch, test) { | 1105 ASSEMBLER_TEST_RUN(AndsBranch, test) { |
| 1244 typedef int64_t (*Int64Return)() DART_UNUSED; | 1106 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1245 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1107 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1246 } | 1108 } |
| 1247 | 1109 |
| 1248 | |
| 1249 ASSEMBLER_TEST_GENERATE(AndsBranchNotTaken, assembler) { | 1110 ASSEMBLER_TEST_GENERATE(AndsBranchNotTaken, assembler) { |
| 1250 Label l; | 1111 Label l; |
| 1251 | 1112 |
| 1252 __ movz(R0, Immediate(0), 0); | 1113 __ movz(R0, Immediate(0), 0); |
| 1253 __ movz(R1, Immediate(2), 0); | 1114 __ movz(R1, Immediate(2), 0); |
| 1254 __ movz(R2, Immediate(2), 0); | 1115 __ movz(R2, Immediate(2), 0); |
| 1255 | 1116 |
| 1256 __ ands(R3, R1, Operand(R2)); | 1117 __ ands(R3, R1, Operand(R2)); |
| 1257 __ b(&l, EQ); | 1118 __ b(&l, EQ); |
| 1258 __ movz(R0, Immediate(42), 0); | 1119 __ movz(R0, Immediate(42), 0); |
| 1259 __ Bind(&l); | 1120 __ Bind(&l); |
| 1260 __ ret(); | 1121 __ ret(); |
| 1261 } | 1122 } |
| 1262 | 1123 |
| 1263 | |
| 1264 ASSEMBLER_TEST_RUN(AndsBranchNotTaken, test) { | 1124 ASSEMBLER_TEST_RUN(AndsBranchNotTaken, test) { |
| 1265 typedef int64_t (*Int64Return)() DART_UNUSED; | 1125 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1266 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1126 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1267 } | 1127 } |
| 1268 | 1128 |
| 1269 | |
| 1270 ASSEMBLER_TEST_GENERATE(BicsBranch, assembler) { | 1129 ASSEMBLER_TEST_GENERATE(BicsBranch, assembler) { |
| 1271 Label l; | 1130 Label l; |
| 1272 | 1131 |
| 1273 __ movz(R0, Immediate(42), 0); | 1132 __ movz(R0, Immediate(42), 0); |
| 1274 __ movz(R1, Immediate(2), 0); | 1133 __ movz(R1, Immediate(2), 0); |
| 1275 __ movz(R2, Immediate(2), 0); | 1134 __ movz(R2, Immediate(2), 0); |
| 1276 | 1135 |
| 1277 __ bics(R3, R1, Operand(R2)); | 1136 __ bics(R3, R1, Operand(R2)); |
| 1278 __ b(&l, EQ); | 1137 __ b(&l, EQ); |
| 1279 __ movz(R0, Immediate(0), 0); | 1138 __ movz(R0, Immediate(0), 0); |
| 1280 __ Bind(&l); | 1139 __ Bind(&l); |
| 1281 __ ret(); | 1140 __ ret(); |
| 1282 } | 1141 } |
| 1283 | 1142 |
| 1284 | |
| 1285 ASSEMBLER_TEST_RUN(BicsBranch, test) { | 1143 ASSEMBLER_TEST_RUN(BicsBranch, test) { |
| 1286 typedef int64_t (*Int64Return)() DART_UNUSED; | 1144 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1287 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1145 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1288 } | 1146 } |
| 1289 | 1147 |
| 1290 | |
| 1291 ASSEMBLER_TEST_GENERATE(BicsBranchNotTaken, assembler) { | 1148 ASSEMBLER_TEST_GENERATE(BicsBranchNotTaken, assembler) { |
| 1292 Label l; | 1149 Label l; |
| 1293 | 1150 |
| 1294 __ movz(R0, Immediate(0), 0); | 1151 __ movz(R0, Immediate(0), 0); |
| 1295 __ movz(R1, Immediate(2), 0); | 1152 __ movz(R1, Immediate(2), 0); |
| 1296 __ movz(R2, Immediate(1), 0); | 1153 __ movz(R2, Immediate(1), 0); |
| 1297 | 1154 |
| 1298 __ bics(R3, R1, Operand(R2)); | 1155 __ bics(R3, R1, Operand(R2)); |
| 1299 __ b(&l, EQ); | 1156 __ b(&l, EQ); |
| 1300 __ movz(R0, Immediate(42), 0); | 1157 __ movz(R0, Immediate(42), 0); |
| 1301 __ Bind(&l); | 1158 __ Bind(&l); |
| 1302 __ ret(); | 1159 __ ret(); |
| 1303 } | 1160 } |
| 1304 | 1161 |
| 1305 | |
| 1306 ASSEMBLER_TEST_RUN(BicsBranchNotTaken, test) { | 1162 ASSEMBLER_TEST_RUN(BicsBranchNotTaken, test) { |
| 1307 typedef int64_t (*Int64Return)() DART_UNUSED; | 1163 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1308 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1164 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1309 } | 1165 } |
| 1310 | 1166 |
| 1311 | |
| 1312 ASSEMBLER_TEST_GENERATE(AndisBranch, assembler) { | 1167 ASSEMBLER_TEST_GENERATE(AndisBranch, assembler) { |
| 1313 Label l; | 1168 Label l; |
| 1314 | 1169 |
| 1315 __ movz(R0, Immediate(42), 0); | 1170 __ movz(R0, Immediate(42), 0); |
| 1316 __ movz(R1, Immediate(2), 0); | 1171 __ movz(R1, Immediate(2), 0); |
| 1317 | 1172 |
| 1318 __ andis(R3, R1, Immediate(1)); | 1173 __ andis(R3, R1, Immediate(1)); |
| 1319 __ b(&l, EQ); | 1174 __ b(&l, EQ); |
| 1320 __ movz(R0, Immediate(0), 0); | 1175 __ movz(R0, Immediate(0), 0); |
| 1321 __ Bind(&l); | 1176 __ Bind(&l); |
| 1322 __ ret(); | 1177 __ ret(); |
| 1323 } | 1178 } |
| 1324 | 1179 |
| 1325 | |
| 1326 ASSEMBLER_TEST_RUN(AndisBranch, test) { | 1180 ASSEMBLER_TEST_RUN(AndisBranch, test) { |
| 1327 typedef int64_t (*Int64Return)() DART_UNUSED; | 1181 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1328 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1182 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1329 } | 1183 } |
| 1330 | 1184 |
| 1331 | |
| 1332 ASSEMBLER_TEST_GENERATE(AndisBranchNotTaken, assembler) { | 1185 ASSEMBLER_TEST_GENERATE(AndisBranchNotTaken, assembler) { |
| 1333 Label l; | 1186 Label l; |
| 1334 | 1187 |
| 1335 __ movz(R0, Immediate(0), 0); | 1188 __ movz(R0, Immediate(0), 0); |
| 1336 __ movz(R1, Immediate(2), 0); | 1189 __ movz(R1, Immediate(2), 0); |
| 1337 | 1190 |
| 1338 __ andis(R3, R1, Immediate(2)); | 1191 __ andis(R3, R1, Immediate(2)); |
| 1339 __ b(&l, EQ); | 1192 __ b(&l, EQ); |
| 1340 __ movz(R0, Immediate(42), 0); | 1193 __ movz(R0, Immediate(42), 0); |
| 1341 __ Bind(&l); | 1194 __ Bind(&l); |
| 1342 __ ret(); | 1195 __ ret(); |
| 1343 } | 1196 } |
| 1344 | 1197 |
| 1345 | |
| 1346 ASSEMBLER_TEST_RUN(AndisBranchNotTaken, test) { | 1198 ASSEMBLER_TEST_RUN(AndisBranchNotTaken, test) { |
| 1347 typedef int64_t (*Int64Return)() DART_UNUSED; | 1199 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1348 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1200 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1349 } | 1201 } |
| 1350 | 1202 |
| 1351 | |
| 1352 // Address of PC-rel offset, br, blr. | 1203 // Address of PC-rel offset, br, blr. |
| 1353 ASSEMBLER_TEST_GENERATE(AdrBr, assembler) { | 1204 ASSEMBLER_TEST_GENERATE(AdrBr, assembler) { |
| 1354 __ movz(R0, Immediate(123), 0); | 1205 __ movz(R0, Immediate(123), 0); |
| 1355 // R1 <- PC + 3*Instr::kInstrSize | 1206 // R1 <- PC + 3*Instr::kInstrSize |
| 1356 __ adr(R1, Immediate(3 * Instr::kInstrSize)); | 1207 __ adr(R1, Immediate(3 * Instr::kInstrSize)); |
| 1357 __ br(R1); | 1208 __ br(R1); |
| 1358 __ ret(); | 1209 __ ret(); |
| 1359 | 1210 |
| 1360 // br goes here. | 1211 // br goes here. |
| 1361 __ movz(R0, Immediate(42), 0); | 1212 __ movz(R0, Immediate(42), 0); |
| 1362 __ ret(); | 1213 __ ret(); |
| 1363 } | 1214 } |
| 1364 | 1215 |
| 1365 | |
| 1366 ASSEMBLER_TEST_RUN(AdrBr, test) { | 1216 ASSEMBLER_TEST_RUN(AdrBr, test) { |
| 1367 typedef int64_t (*Int64Return)() DART_UNUSED; | 1217 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1368 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1218 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1369 } | 1219 } |
| 1370 | 1220 |
| 1371 | |
| 1372 ASSEMBLER_TEST_GENERATE(AdrBlr, assembler) { | 1221 ASSEMBLER_TEST_GENERATE(AdrBlr, assembler) { |
| 1373 __ movz(R0, Immediate(123), 0); | 1222 __ movz(R0, Immediate(123), 0); |
| 1374 __ add(R3, ZR, Operand(LR)); // Save LR. | 1223 __ add(R3, ZR, Operand(LR)); // Save LR. |
| 1375 // R1 <- PC + 4*Instr::kInstrSize | 1224 // R1 <- PC + 4*Instr::kInstrSize |
| 1376 __ adr(R1, Immediate(4 * Instr::kInstrSize)); | 1225 __ adr(R1, Immediate(4 * Instr::kInstrSize)); |
| 1377 __ blr(R1); | 1226 __ blr(R1); |
| 1378 __ add(LR, ZR, Operand(R3)); | 1227 __ add(LR, ZR, Operand(R3)); |
| 1379 __ ret(); | 1228 __ ret(); |
| 1380 | 1229 |
| 1381 // blr goes here. | 1230 // blr goes here. |
| 1382 __ movz(R0, Immediate(42), 0); | 1231 __ movz(R0, Immediate(42), 0); |
| 1383 __ ret(); | 1232 __ ret(); |
| 1384 } | 1233 } |
| 1385 | 1234 |
| 1386 | |
| 1387 ASSEMBLER_TEST_RUN(AdrBlr, test) { | 1235 ASSEMBLER_TEST_RUN(AdrBlr, test) { |
| 1388 typedef int64_t (*Int64Return)() DART_UNUSED; | 1236 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1389 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1237 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1390 } | 1238 } |
| 1391 | 1239 |
| 1392 | |
| 1393 // Misc. arithmetic. | 1240 // Misc. arithmetic. |
| 1394 ASSEMBLER_TEST_GENERATE(Udiv, assembler) { | 1241 ASSEMBLER_TEST_GENERATE(Udiv, assembler) { |
| 1395 __ movz(R0, Immediate(27), 0); | 1242 __ movz(R0, Immediate(27), 0); |
| 1396 __ movz(R1, Immediate(9), 0); | 1243 __ movz(R1, Immediate(9), 0); |
| 1397 __ udiv(R2, R0, R1); | 1244 __ udiv(R2, R0, R1); |
| 1398 __ mov(R0, R2); | 1245 __ mov(R0, R2); |
| 1399 __ ret(); | 1246 __ ret(); |
| 1400 } | 1247 } |
| 1401 | 1248 |
| 1402 | |
| 1403 ASSEMBLER_TEST_RUN(Udiv, test) { | 1249 ASSEMBLER_TEST_RUN(Udiv, test) { |
| 1404 EXPECT(test != NULL); | 1250 EXPECT(test != NULL); |
| 1405 typedef int64_t (*Int64Return)() DART_UNUSED; | 1251 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1406 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1252 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1407 } | 1253 } |
| 1408 | 1254 |
| 1409 | |
| 1410 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) { | 1255 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) { |
| 1411 __ movz(R0, Immediate(27), 0); | 1256 __ movz(R0, Immediate(27), 0); |
| 1412 __ movz(R1, Immediate(9), 0); | 1257 __ movz(R1, Immediate(9), 0); |
| 1413 __ neg(R1, R1); | 1258 __ neg(R1, R1); |
| 1414 __ sdiv(R2, R0, R1); | 1259 __ sdiv(R2, R0, R1); |
| 1415 __ mov(R0, R2); | 1260 __ mov(R0, R2); |
| 1416 __ ret(); | 1261 __ ret(); |
| 1417 } | 1262 } |
| 1418 | 1263 |
| 1419 | |
| 1420 ASSEMBLER_TEST_RUN(Sdiv, test) { | 1264 ASSEMBLER_TEST_RUN(Sdiv, test) { |
| 1421 EXPECT(test != NULL); | 1265 EXPECT(test != NULL); |
| 1422 typedef int64_t (*Int64Return)() DART_UNUSED; | 1266 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1423 EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1267 EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1424 } | 1268 } |
| 1425 | 1269 |
| 1426 | |
| 1427 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) { | 1270 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) { |
| 1428 __ movz(R0, Immediate(27), 0); | 1271 __ movz(R0, Immediate(27), 0); |
| 1429 __ movz(R1, Immediate(0), 0); | 1272 __ movz(R1, Immediate(0), 0); |
| 1430 __ udiv(R2, R0, R1); | 1273 __ udiv(R2, R0, R1); |
| 1431 __ mov(R0, R2); | 1274 __ mov(R0, R2); |
| 1432 __ ret(); | 1275 __ ret(); |
| 1433 } | 1276 } |
| 1434 | 1277 |
| 1435 | |
| 1436 ASSEMBLER_TEST_RUN(Udiv_zero, test) { | 1278 ASSEMBLER_TEST_RUN(Udiv_zero, test) { |
| 1437 EXPECT(test != NULL); | 1279 EXPECT(test != NULL); |
| 1438 typedef int64_t (*Int64Return)() DART_UNUSED; | 1280 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1439 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1281 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1440 } | 1282 } |
| 1441 | 1283 |
| 1442 | |
| 1443 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) { | 1284 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) { |
| 1444 __ movz(R0, Immediate(27), 0); | 1285 __ movz(R0, Immediate(27), 0); |
| 1445 __ movz(R1, Immediate(0), 0); | 1286 __ movz(R1, Immediate(0), 0); |
| 1446 __ sdiv(R2, R0, R1); | 1287 __ sdiv(R2, R0, R1); |
| 1447 __ mov(R0, R2); | 1288 __ mov(R0, R2); |
| 1448 __ ret(); | 1289 __ ret(); |
| 1449 } | 1290 } |
| 1450 | 1291 |
| 1451 | |
| 1452 ASSEMBLER_TEST_RUN(Sdiv_zero, test) { | 1292 ASSEMBLER_TEST_RUN(Sdiv_zero, test) { |
| 1453 EXPECT(test != NULL); | 1293 EXPECT(test != NULL); |
| 1454 typedef int64_t (*Int64Return)() DART_UNUSED; | 1294 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1455 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1295 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1456 } | 1296 } |
| 1457 | 1297 |
| 1458 | |
| 1459 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) { | 1298 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) { |
| 1460 __ movz(R0, Immediate(0x8000), 3); // R0 <- 0x8000000000000000 | 1299 __ movz(R0, Immediate(0x8000), 3); // R0 <- 0x8000000000000000 |
| 1461 __ movn(R1, Immediate(0), 0); // R1 <- 0xffffffffffffffff | 1300 __ movn(R1, Immediate(0), 0); // R1 <- 0xffffffffffffffff |
| 1462 __ udiv(R2, R0, R1); | 1301 __ udiv(R2, R0, R1); |
| 1463 __ mov(R0, R2); | 1302 __ mov(R0, R2); |
| 1464 __ ret(); | 1303 __ ret(); |
| 1465 } | 1304 } |
| 1466 | 1305 |
| 1467 | |
| 1468 ASSEMBLER_TEST_RUN(Udiv_corner, test) { | 1306 ASSEMBLER_TEST_RUN(Udiv_corner, test) { |
| 1469 EXPECT(test != NULL); | 1307 EXPECT(test != NULL); |
| 1470 typedef int64_t (*Int64Return)() DART_UNUSED; | 1308 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1471 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1309 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1472 } | 1310 } |
| 1473 | 1311 |
| 1474 | |
| 1475 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) { | 1312 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) { |
| 1476 __ movz(R3, Immediate(0x8000), 3); // R0 <- 0x8000000000000000 | 1313 __ movz(R3, Immediate(0x8000), 3); // R0 <- 0x8000000000000000 |
| 1477 __ movn(R1, Immediate(0), 0); // R1 <- 0xffffffffffffffff | 1314 __ movn(R1, Immediate(0), 0); // R1 <- 0xffffffffffffffff |
| 1478 __ sdiv(R2, R3, R1); | 1315 __ sdiv(R2, R3, R1); |
| 1479 __ mov(R0, R2); | 1316 __ mov(R0, R2); |
| 1480 __ ret(); | 1317 __ ret(); |
| 1481 } | 1318 } |
| 1482 | 1319 |
| 1483 | |
| 1484 ASSEMBLER_TEST_RUN(Sdiv_corner, test) { | 1320 ASSEMBLER_TEST_RUN(Sdiv_corner, test) { |
| 1485 EXPECT(test != NULL); | 1321 EXPECT(test != NULL); |
| 1486 typedef int64_t (*Int64Return)() DART_UNUSED; | 1322 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1487 EXPECT_EQ(static_cast<int64_t>(0x8000000000000000), | 1323 EXPECT_EQ(static_cast<int64_t>(0x8000000000000000), |
| 1488 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1324 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1489 } | 1325 } |
| 1490 | 1326 |
| 1491 | |
| 1492 ASSEMBLER_TEST_GENERATE(Lslv, assembler) { | 1327 ASSEMBLER_TEST_GENERATE(Lslv, assembler) { |
| 1493 __ movz(R1, Immediate(21), 0); | 1328 __ movz(R1, Immediate(21), 0); |
| 1494 __ movz(R2, Immediate(1), 0); | 1329 __ movz(R2, Immediate(1), 0); |
| 1495 __ lslv(R0, R1, R2); | 1330 __ lslv(R0, R1, R2); |
| 1496 __ ret(); | 1331 __ ret(); |
| 1497 } | 1332 } |
| 1498 | 1333 |
| 1499 | |
| 1500 ASSEMBLER_TEST_RUN(Lslv, test) { | 1334 ASSEMBLER_TEST_RUN(Lslv, test) { |
| 1501 typedef int64_t (*Int64Return)() DART_UNUSED; | 1335 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1502 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1336 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1503 } | 1337 } |
| 1504 | 1338 |
| 1505 | |
| 1506 ASSEMBLER_TEST_GENERATE(Lsrv, assembler) { | 1339 ASSEMBLER_TEST_GENERATE(Lsrv, assembler) { |
| 1507 __ movz(R1, Immediate(84), 0); | 1340 __ movz(R1, Immediate(84), 0); |
| 1508 __ movz(R2, Immediate(1), 0); | 1341 __ movz(R2, Immediate(1), 0); |
| 1509 __ lsrv(R0, R1, R2); | 1342 __ lsrv(R0, R1, R2); |
| 1510 __ ret(); | 1343 __ ret(); |
| 1511 } | 1344 } |
| 1512 | 1345 |
| 1513 | |
| 1514 ASSEMBLER_TEST_RUN(Lsrv, test) { | 1346 ASSEMBLER_TEST_RUN(Lsrv, test) { |
| 1515 typedef int64_t (*Int64Return)() DART_UNUSED; | 1347 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1516 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1348 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1517 } | 1349 } |
| 1518 | 1350 |
| 1519 | |
| 1520 ASSEMBLER_TEST_GENERATE(LShiftingV, assembler) { | 1351 ASSEMBLER_TEST_GENERATE(LShiftingV, assembler) { |
| 1521 __ movz(R1, Immediate(1), 0); | 1352 __ movz(R1, Immediate(1), 0); |
| 1522 __ movz(R2, Immediate(63), 0); | 1353 __ movz(R2, Immediate(63), 0); |
| 1523 __ lslv(R1, R1, R2); | 1354 __ lslv(R1, R1, R2); |
| 1524 __ lsrv(R0, R1, R2); | 1355 __ lsrv(R0, R1, R2); |
| 1525 __ ret(); | 1356 __ ret(); |
| 1526 } | 1357 } |
| 1527 | 1358 |
| 1528 | |
| 1529 ASSEMBLER_TEST_RUN(LShiftingV, test) { | 1359 ASSEMBLER_TEST_RUN(LShiftingV, test) { |
| 1530 typedef int64_t (*Int64Return)() DART_UNUSED; | 1360 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1531 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1361 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1532 } | 1362 } |
| 1533 | 1363 |
| 1534 | |
| 1535 ASSEMBLER_TEST_GENERATE(RShiftingV, assembler) { | 1364 ASSEMBLER_TEST_GENERATE(RShiftingV, assembler) { |
| 1536 __ movz(R1, Immediate(1), 0); | 1365 __ movz(R1, Immediate(1), 0); |
| 1537 __ movz(R2, Immediate(63), 0); | 1366 __ movz(R2, Immediate(63), 0); |
| 1538 __ lslv(R1, R1, R2); | 1367 __ lslv(R1, R1, R2); |
| 1539 __ asrv(R0, R1, R2); | 1368 __ asrv(R0, R1, R2); |
| 1540 __ ret(); | 1369 __ ret(); |
| 1541 } | 1370 } |
| 1542 | 1371 |
| 1543 | |
| 1544 ASSEMBLER_TEST_RUN(RShiftingV, test) { | 1372 ASSEMBLER_TEST_RUN(RShiftingV, test) { |
| 1545 typedef int64_t (*Int64Return)() DART_UNUSED; | 1373 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1546 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1374 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1547 } | 1375 } |
| 1548 | 1376 |
| 1549 | |
| 1550 ASSEMBLER_TEST_GENERATE(Mult_pos, assembler) { | 1377 ASSEMBLER_TEST_GENERATE(Mult_pos, assembler) { |
| 1551 __ movz(R1, Immediate(6), 0); | 1378 __ movz(R1, Immediate(6), 0); |
| 1552 __ movz(R2, Immediate(7), 0); | 1379 __ movz(R2, Immediate(7), 0); |
| 1553 __ mul(R0, R1, R2); | 1380 __ mul(R0, R1, R2); |
| 1554 __ ret(); | 1381 __ ret(); |
| 1555 } | 1382 } |
| 1556 | 1383 |
| 1557 | |
| 1558 ASSEMBLER_TEST_RUN(Mult_pos, test) { | 1384 ASSEMBLER_TEST_RUN(Mult_pos, test) { |
| 1559 typedef int64_t (*Int64Return)() DART_UNUSED; | 1385 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1560 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1386 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1561 } | 1387 } |
| 1562 | 1388 |
| 1563 | |
| 1564 ASSEMBLER_TEST_GENERATE(Mult_neg, assembler) { | 1389 ASSEMBLER_TEST_GENERATE(Mult_neg, assembler) { |
| 1565 __ movz(R1, Immediate(6), 0); | 1390 __ movz(R1, Immediate(6), 0); |
| 1566 __ movz(R2, Immediate(7), 0); | 1391 __ movz(R2, Immediate(7), 0); |
| 1567 __ neg(R2, R2); | 1392 __ neg(R2, R2); |
| 1568 __ mul(R0, R1, R2); | 1393 __ mul(R0, R1, R2); |
| 1569 __ ret(); | 1394 __ ret(); |
| 1570 } | 1395 } |
| 1571 | 1396 |
| 1572 | |
| 1573 ASSEMBLER_TEST_RUN(Mult_neg, test) { | 1397 ASSEMBLER_TEST_RUN(Mult_neg, test) { |
| 1574 typedef int64_t (*Int64Return)() DART_UNUSED; | 1398 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1575 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1399 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1576 } | 1400 } |
| 1577 | 1401 |
| 1578 | |
| 1579 ASSEMBLER_TEST_GENERATE(Smulh_pos, assembler) { | 1402 ASSEMBLER_TEST_GENERATE(Smulh_pos, assembler) { |
| 1580 __ movz(R1, Immediate(6), 0); | 1403 __ movz(R1, Immediate(6), 0); |
| 1581 __ movz(R2, Immediate(7), 0); | 1404 __ movz(R2, Immediate(7), 0); |
| 1582 __ smulh(R0, R1, R2); | 1405 __ smulh(R0, R1, R2); |
| 1583 __ ret(); | 1406 __ ret(); |
| 1584 } | 1407 } |
| 1585 | 1408 |
| 1586 | |
| 1587 ASSEMBLER_TEST_RUN(Smulh_pos, test) { | 1409 ASSEMBLER_TEST_RUN(Smulh_pos, test) { |
| 1588 typedef int64_t (*Int64Return)() DART_UNUSED; | 1410 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1589 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1411 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1590 } | 1412 } |
| 1591 | 1413 |
| 1592 | |
| 1593 ASSEMBLER_TEST_GENERATE(Smulh_neg, assembler) { | 1414 ASSEMBLER_TEST_GENERATE(Smulh_neg, assembler) { |
| 1594 __ movz(R1, Immediate(6), 0); | 1415 __ movz(R1, Immediate(6), 0); |
| 1595 __ movz(R2, Immediate(7), 0); | 1416 __ movz(R2, Immediate(7), 0); |
| 1596 __ neg(R2, R2); | 1417 __ neg(R2, R2); |
| 1597 __ smulh(R0, R1, R2); | 1418 __ smulh(R0, R1, R2); |
| 1598 __ ret(); | 1419 __ ret(); |
| 1599 } | 1420 } |
| 1600 | 1421 |
| 1601 | |
| 1602 ASSEMBLER_TEST_RUN(Smulh_neg, test) { | 1422 ASSEMBLER_TEST_RUN(Smulh_neg, test) { |
| 1603 typedef int64_t (*Int64Return)() DART_UNUSED; | 1423 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1604 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1424 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1605 } | 1425 } |
| 1606 | 1426 |
| 1607 | |
| 1608 ASSEMBLER_TEST_GENERATE(Umulh, assembler) { | 1427 ASSEMBLER_TEST_GENERATE(Umulh, assembler) { |
| 1609 __ movz(R1, Immediate(-1), 3); // 0xffff000000000000 | 1428 __ movz(R1, Immediate(-1), 3); // 0xffff000000000000 |
| 1610 __ movz(R2, Immediate(7), 3); // 0x0007000000000000 | 1429 __ movz(R2, Immediate(7), 3); // 0x0007000000000000 |
| 1611 __ umulh(R0, R1, R2); // 0x0006fff900000000 | 1430 __ umulh(R0, R1, R2); // 0x0006fff900000000 |
| 1612 __ ret(); | 1431 __ ret(); |
| 1613 } | 1432 } |
| 1614 | 1433 |
| 1615 | |
| 1616 ASSEMBLER_TEST_RUN(Umulh, test) { | 1434 ASSEMBLER_TEST_RUN(Umulh, test) { |
| 1617 typedef int64_t (*Int64Return)() DART_UNUSED; | 1435 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1618 EXPECT_EQ(static_cast<int64_t>(0x6fff900000000), | 1436 EXPECT_EQ(static_cast<int64_t>(0x6fff900000000), |
| 1619 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1437 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1620 } | 1438 } |
| 1621 | 1439 |
| 1622 | |
| 1623 ASSEMBLER_TEST_GENERATE(Umaddl, assembler) { | 1440 ASSEMBLER_TEST_GENERATE(Umaddl, assembler) { |
| 1624 __ movn(R1, Immediate(0), 0); // W1 = 0xffffffff. | 1441 __ movn(R1, Immediate(0), 0); // W1 = 0xffffffff. |
| 1625 __ movz(R2, Immediate(7), 0); // W2 = 7. | 1442 __ movz(R2, Immediate(7), 0); // W2 = 7. |
| 1626 __ movz(R3, Immediate(8), 0); // X3 = 8. | 1443 __ movz(R3, Immediate(8), 0); // X3 = 8. |
| 1627 __ umaddl(R0, R1, R2, R3); // X0 = W1*W2 + X3 = 0x700000001. | 1444 __ umaddl(R0, R1, R2, R3); // X0 = W1*W2 + X3 = 0x700000001. |
| 1628 __ ret(); | 1445 __ ret(); |
| 1629 } | 1446 } |
| 1630 | 1447 |
| 1631 | |
| 1632 ASSEMBLER_TEST_RUN(Umaddl, test) { | 1448 ASSEMBLER_TEST_RUN(Umaddl, test) { |
| 1633 typedef int64_t (*Int64Return)() DART_UNUSED; | 1449 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1634 EXPECT_EQ(0x700000001, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1450 EXPECT_EQ(0x700000001, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1635 } | 1451 } |
| 1636 | 1452 |
| 1637 | |
| 1638 // Loading immediate values without the object pool. | 1453 // Loading immediate values without the object pool. |
| 1639 ASSEMBLER_TEST_GENERATE(LoadImmediateSmall, assembler) { | 1454 ASSEMBLER_TEST_GENERATE(LoadImmediateSmall, assembler) { |
| 1640 __ LoadImmediate(R0, 42); | 1455 __ LoadImmediate(R0, 42); |
| 1641 __ ret(); | 1456 __ ret(); |
| 1642 } | 1457 } |
| 1643 | 1458 |
| 1644 | |
| 1645 ASSEMBLER_TEST_RUN(LoadImmediateSmall, test) { | 1459 ASSEMBLER_TEST_RUN(LoadImmediateSmall, test) { |
| 1646 typedef int64_t (*Int64Return)() DART_UNUSED; | 1460 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1647 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1461 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1648 } | 1462 } |
| 1649 | 1463 |
| 1650 | |
| 1651 ASSEMBLER_TEST_GENERATE(LoadImmediateMed, assembler) { | 1464 ASSEMBLER_TEST_GENERATE(LoadImmediateMed, assembler) { |
| 1652 __ LoadImmediate(R0, 0xf1234123); | 1465 __ LoadImmediate(R0, 0xf1234123); |
| 1653 __ ret(); | 1466 __ ret(); |
| 1654 } | 1467 } |
| 1655 | 1468 |
| 1656 | |
| 1657 ASSEMBLER_TEST_RUN(LoadImmediateMed, test) { | 1469 ASSEMBLER_TEST_RUN(LoadImmediateMed, test) { |
| 1658 typedef int64_t (*Int64Return)() DART_UNUSED; | 1470 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1659 EXPECT_EQ(0xf1234123, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1471 EXPECT_EQ(0xf1234123, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1660 } | 1472 } |
| 1661 | 1473 |
| 1662 | |
| 1663 ASSEMBLER_TEST_GENERATE(LoadImmediateMed2, assembler) { | 1474 ASSEMBLER_TEST_GENERATE(LoadImmediateMed2, assembler) { |
| 1664 __ LoadImmediate(R0, 0x4321f1234123); | 1475 __ LoadImmediate(R0, 0x4321f1234123); |
| 1665 __ ret(); | 1476 __ ret(); |
| 1666 } | 1477 } |
| 1667 | 1478 |
| 1668 | |
| 1669 ASSEMBLER_TEST_RUN(LoadImmediateMed2, test) { | 1479 ASSEMBLER_TEST_RUN(LoadImmediateMed2, test) { |
| 1670 typedef int64_t (*Int64Return)() DART_UNUSED; | 1480 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1671 EXPECT_EQ(0x4321f1234123, | 1481 EXPECT_EQ(0x4321f1234123, |
| 1672 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1482 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1673 } | 1483 } |
| 1674 | 1484 |
| 1675 | |
| 1676 ASSEMBLER_TEST_GENERATE(LoadImmediateLarge, assembler) { | 1485 ASSEMBLER_TEST_GENERATE(LoadImmediateLarge, assembler) { |
| 1677 __ LoadImmediate(R0, 0x9287436598237465); | 1486 __ LoadImmediate(R0, 0x9287436598237465); |
| 1678 __ ret(); | 1487 __ ret(); |
| 1679 } | 1488 } |
| 1680 | 1489 |
| 1681 | |
| 1682 ASSEMBLER_TEST_RUN(LoadImmediateLarge, test) { | 1490 ASSEMBLER_TEST_RUN(LoadImmediateLarge, test) { |
| 1683 typedef int64_t (*Int64Return)() DART_UNUSED; | 1491 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1684 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), | 1492 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), |
| 1685 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1493 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1686 } | 1494 } |
| 1687 | 1495 |
| 1688 | |
| 1689 ASSEMBLER_TEST_GENERATE(LoadImmediateSmallNeg, assembler) { | 1496 ASSEMBLER_TEST_GENERATE(LoadImmediateSmallNeg, assembler) { |
| 1690 __ LoadImmediate(R0, -42); | 1497 __ LoadImmediate(R0, -42); |
| 1691 __ ret(); | 1498 __ ret(); |
| 1692 } | 1499 } |
| 1693 | 1500 |
| 1694 | |
| 1695 ASSEMBLER_TEST_RUN(LoadImmediateSmallNeg, test) { | 1501 ASSEMBLER_TEST_RUN(LoadImmediateSmallNeg, test) { |
| 1696 typedef int64_t (*Int64Return)() DART_UNUSED; | 1502 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1697 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1503 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1698 } | 1504 } |
| 1699 | 1505 |
| 1700 | |
| 1701 ASSEMBLER_TEST_GENERATE(LoadImmediateMedNeg, assembler) { | 1506 ASSEMBLER_TEST_GENERATE(LoadImmediateMedNeg, assembler) { |
| 1702 __ LoadImmediate(R0, -0x1212341234); | 1507 __ LoadImmediate(R0, -0x1212341234); |
| 1703 __ ret(); | 1508 __ ret(); |
| 1704 } | 1509 } |
| 1705 | 1510 |
| 1706 | |
| 1707 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg, test) { | 1511 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg, test) { |
| 1708 typedef int64_t (*Int64Return)() DART_UNUSED; | 1512 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1709 EXPECT_EQ(-0x1212341234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1513 EXPECT_EQ(-0x1212341234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1710 } | 1514 } |
| 1711 | 1515 |
| 1712 | |
| 1713 ASSEMBLER_TEST_GENERATE(LoadImmediateMedNeg2, assembler) { | 1516 ASSEMBLER_TEST_GENERATE(LoadImmediateMedNeg2, assembler) { |
| 1714 __ LoadImmediate(R0, -0x1212340000); | 1517 __ LoadImmediate(R0, -0x1212340000); |
| 1715 __ ret(); | 1518 __ ret(); |
| 1716 } | 1519 } |
| 1717 | 1520 |
| 1718 | |
| 1719 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg2, test) { | 1521 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg2, test) { |
| 1720 typedef int64_t (*Int64Return)() DART_UNUSED; | 1522 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1721 EXPECT_EQ(-0x1212340000, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1523 EXPECT_EQ(-0x1212340000, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1722 } | 1524 } |
| 1723 | 1525 |
| 1724 | |
| 1725 ASSEMBLER_TEST_GENERATE(LoadImmediateMedNeg3, assembler) { | 1526 ASSEMBLER_TEST_GENERATE(LoadImmediateMedNeg3, assembler) { |
| 1726 __ LoadImmediate(R0, -0x1200001234); | 1527 __ LoadImmediate(R0, -0x1200001234); |
| 1727 __ ret(); | 1528 __ ret(); |
| 1728 } | 1529 } |
| 1729 | 1530 |
| 1730 | |
| 1731 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg3, test) { | 1531 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg3, test) { |
| 1732 typedef int64_t (*Int64Return)() DART_UNUSED; | 1532 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1733 EXPECT_EQ(-0x1200001234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1533 EXPECT_EQ(-0x1200001234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1734 } | 1534 } |
| 1735 | 1535 |
| 1736 | |
| 1737 ASSEMBLER_TEST_GENERATE(LoadImmediateMedNeg4, assembler) { | 1536 ASSEMBLER_TEST_GENERATE(LoadImmediateMedNeg4, assembler) { |
| 1738 __ LoadImmediate(R0, -0x12341234); | 1537 __ LoadImmediate(R0, -0x12341234); |
| 1739 __ ret(); | 1538 __ ret(); |
| 1740 } | 1539 } |
| 1741 | 1540 |
| 1742 | |
| 1743 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg4, test) { | 1541 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg4, test) { |
| 1744 typedef int64_t (*Int64Return)() DART_UNUSED; | 1542 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1745 EXPECT_EQ(-0x12341234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1543 EXPECT_EQ(-0x12341234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1746 } | 1544 } |
| 1747 | 1545 |
| 1748 | |
| 1749 ASSEMBLER_TEST_GENERATE(LoadHalfWordUnaligned, assembler) { | 1546 ASSEMBLER_TEST_GENERATE(LoadHalfWordUnaligned, assembler) { |
| 1750 __ LoadUnaligned(R1, R0, TMP, kHalfword); | 1547 __ LoadUnaligned(R1, R0, TMP, kHalfword); |
| 1751 __ mov(R0, R1); | 1548 __ mov(R0, R1); |
| 1752 __ ret(); | 1549 __ ret(); |
| 1753 } | 1550 } |
| 1754 | 1551 |
| 1755 | |
| 1756 ASSEMBLER_TEST_RUN(LoadHalfWordUnaligned, test) { | 1552 ASSEMBLER_TEST_RUN(LoadHalfWordUnaligned, test) { |
| 1757 EXPECT(test != NULL); | 1553 EXPECT(test != NULL); |
| 1758 typedef intptr_t (*LoadHalfWordUnaligned)(intptr_t) DART_UNUSED; | 1554 typedef intptr_t (*LoadHalfWordUnaligned)(intptr_t) DART_UNUSED; |
| 1759 uint8_t buffer[4] = { | 1555 uint8_t buffer[4] = { |
| 1760 0x89, 0xAB, 0xCD, 0xEF, | 1556 0x89, 0xAB, 0xCD, 0xEF, |
| 1761 }; | 1557 }; |
| 1762 | 1558 |
| 1763 EXPECT_EQ( | 1559 EXPECT_EQ( |
| 1764 static_cast<int16_t>(static_cast<uint16_t>(0xAB89)), | 1560 static_cast<int16_t>(static_cast<uint16_t>(0xAB89)), |
| 1765 EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned, test->entry(), | 1561 EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned, test->entry(), |
| 1766 reinterpret_cast<intptr_t>(&buffer[0]))); | 1562 reinterpret_cast<intptr_t>(&buffer[0]))); |
| 1767 EXPECT_EQ( | 1563 EXPECT_EQ( |
| 1768 static_cast<int16_t>(static_cast<uint16_t>(0xCDAB)), | 1564 static_cast<int16_t>(static_cast<uint16_t>(0xCDAB)), |
| 1769 EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned, test->entry(), | 1565 EXECUTE_TEST_CODE_INTPTR_INTPTR(LoadHalfWordUnaligned, test->entry(), |
| 1770 reinterpret_cast<intptr_t>(&buffer[1]))); | 1566 reinterpret_cast<intptr_t>(&buffer[1]))); |
| 1771 } | 1567 } |
| 1772 | 1568 |
| 1773 | |
| 1774 ASSEMBLER_TEST_GENERATE(LoadHalfWordUnsignedUnaligned, assembler) { | 1569 ASSEMBLER_TEST_GENERATE(LoadHalfWordUnsignedUnaligned, assembler) { |
| 1775 __ LoadUnaligned(R1, R0, TMP, kUnsignedHalfword); | 1570 __ LoadUnaligned(R1, R0, TMP, kUnsignedHalfword); |
| 1776 __ mov(R0, R1); | 1571 __ mov(R0, R1); |
| 1777 __ ret(); | 1572 __ ret(); |
| 1778 } | 1573 } |
| 1779 | 1574 |
| 1780 | |
| 1781 ASSEMBLER_TEST_RUN(LoadHalfWordUnsignedUnaligned, test) { | 1575 ASSEMBLER_TEST_RUN(LoadHalfWordUnsignedUnaligned, test) { |
| 1782 EXPECT(test != NULL); | 1576 EXPECT(test != NULL); |
| 1783 typedef intptr_t (*LoadHalfWordUnsignedUnaligned)(intptr_t) DART_UNUSED; | 1577 typedef intptr_t (*LoadHalfWordUnsignedUnaligned)(intptr_t) DART_UNUSED; |
| 1784 uint8_t buffer[4] = { | 1578 uint8_t buffer[4] = { |
| 1785 0x89, 0xAB, 0xCD, 0xEF, | 1579 0x89, 0xAB, 0xCD, 0xEF, |
| 1786 }; | 1580 }; |
| 1787 | 1581 |
| 1788 EXPECT_EQ(0xAB89, EXECUTE_TEST_CODE_INTPTR_INTPTR( | 1582 EXPECT_EQ(0xAB89, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1789 LoadHalfWordUnsignedUnaligned, test->entry(), | 1583 LoadHalfWordUnsignedUnaligned, test->entry(), |
| 1790 reinterpret_cast<intptr_t>(&buffer[0]))); | 1584 reinterpret_cast<intptr_t>(&buffer[0]))); |
| 1791 EXPECT_EQ(0xCDAB, EXECUTE_TEST_CODE_INTPTR_INTPTR( | 1585 EXPECT_EQ(0xCDAB, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1792 LoadHalfWordUnsignedUnaligned, test->entry(), | 1586 LoadHalfWordUnsignedUnaligned, test->entry(), |
| 1793 reinterpret_cast<intptr_t>(&buffer[1]))); | 1587 reinterpret_cast<intptr_t>(&buffer[1]))); |
| 1794 } | 1588 } |
| 1795 | 1589 |
| 1796 | |
| 1797 ASSEMBLER_TEST_GENERATE(StoreHalfWordUnaligned, assembler) { | 1590 ASSEMBLER_TEST_GENERATE(StoreHalfWordUnaligned, assembler) { |
| 1798 __ LoadImmediate(R1, 0xABCD); | 1591 __ LoadImmediate(R1, 0xABCD); |
| 1799 __ StoreUnaligned(R1, R0, TMP, kHalfword); | 1592 __ StoreUnaligned(R1, R0, TMP, kHalfword); |
| 1800 __ mov(R0, R1); | 1593 __ mov(R0, R1); |
| 1801 __ ret(); | 1594 __ ret(); |
| 1802 } | 1595 } |
| 1803 | 1596 |
| 1804 | |
| 1805 ASSEMBLER_TEST_RUN(StoreHalfWordUnaligned, test) { | 1597 ASSEMBLER_TEST_RUN(StoreHalfWordUnaligned, test) { |
| 1806 EXPECT(test != NULL); | 1598 EXPECT(test != NULL); |
| 1807 typedef intptr_t (*StoreHalfWordUnaligned)(intptr_t) DART_UNUSED; | 1599 typedef intptr_t (*StoreHalfWordUnaligned)(intptr_t) DART_UNUSED; |
| 1808 uint8_t buffer[4] = { | 1600 uint8_t buffer[4] = { |
| 1809 0, 0, 0, 0, | 1601 0, 0, 0, 0, |
| 1810 }; | 1602 }; |
| 1811 | 1603 |
| 1812 EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR( | 1604 EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1813 StoreHalfWordUnaligned, test->entry(), | 1605 StoreHalfWordUnaligned, test->entry(), |
| 1814 reinterpret_cast<intptr_t>(&buffer[0]))); | 1606 reinterpret_cast<intptr_t>(&buffer[0]))); |
| 1815 EXPECT_EQ(0xCD, buffer[0]); | 1607 EXPECT_EQ(0xCD, buffer[0]); |
| 1816 EXPECT_EQ(0xAB, buffer[1]); | 1608 EXPECT_EQ(0xAB, buffer[1]); |
| 1817 EXPECT_EQ(0, buffer[2]); | 1609 EXPECT_EQ(0, buffer[2]); |
| 1818 | 1610 |
| 1819 EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR( | 1611 EXPECT_EQ(0xABCD, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1820 StoreHalfWordUnaligned, test->entry(), | 1612 StoreHalfWordUnaligned, test->entry(), |
| 1821 reinterpret_cast<intptr_t>(&buffer[1]))); | 1613 reinterpret_cast<intptr_t>(&buffer[1]))); |
| 1822 EXPECT_EQ(0xCD, buffer[1]); | 1614 EXPECT_EQ(0xCD, buffer[1]); |
| 1823 EXPECT_EQ(0xAB, buffer[2]); | 1615 EXPECT_EQ(0xAB, buffer[2]); |
| 1824 EXPECT_EQ(0, buffer[3]); | 1616 EXPECT_EQ(0, buffer[3]); |
| 1825 } | 1617 } |
| 1826 | 1618 |
| 1827 | |
| 1828 ASSEMBLER_TEST_GENERATE(LoadWordUnaligned, assembler) { | 1619 ASSEMBLER_TEST_GENERATE(LoadWordUnaligned, assembler) { |
| 1829 __ LoadUnaligned(R1, R0, TMP, kUnsignedWord); | 1620 __ LoadUnaligned(R1, R0, TMP, kUnsignedWord); |
| 1830 __ mov(R0, R1); | 1621 __ mov(R0, R1); |
| 1831 __ ret(); | 1622 __ ret(); |
| 1832 } | 1623 } |
| 1833 | 1624 |
| 1834 | |
| 1835 ASSEMBLER_TEST_RUN(LoadWordUnaligned, test) { | 1625 ASSEMBLER_TEST_RUN(LoadWordUnaligned, test) { |
| 1836 EXPECT(test != NULL); | 1626 EXPECT(test != NULL); |
| 1837 typedef int32_t (*LoadWordUnaligned)(intptr_t) DART_UNUSED; | 1627 typedef int32_t (*LoadWordUnaligned)(intptr_t) DART_UNUSED; |
| 1838 uint8_t buffer[8] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0}; | 1628 uint8_t buffer[8] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0}; |
| 1839 | 1629 |
| 1840 EXPECT_EQ( | 1630 EXPECT_EQ( |
| 1841 static_cast<int32_t>(0x78563412), | 1631 static_cast<int32_t>(0x78563412), |
| 1842 EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned, test->entry(), | 1632 EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned, test->entry(), |
| 1843 reinterpret_cast<intptr_t>(&buffer[0]))); | 1633 reinterpret_cast<intptr_t>(&buffer[0]))); |
| 1844 EXPECT_EQ( | 1634 EXPECT_EQ( |
| 1845 static_cast<int32_t>(0x9A785634), | 1635 static_cast<int32_t>(0x9A785634), |
| 1846 EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned, test->entry(), | 1636 EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned, test->entry(), |
| 1847 reinterpret_cast<intptr_t>(&buffer[1]))); | 1637 reinterpret_cast<intptr_t>(&buffer[1]))); |
| 1848 EXPECT_EQ( | 1638 EXPECT_EQ( |
| 1849 static_cast<int32_t>(0xBC9A7856), | 1639 static_cast<int32_t>(0xBC9A7856), |
| 1850 EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned, test->entry(), | 1640 EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned, test->entry(), |
| 1851 reinterpret_cast<intptr_t>(&buffer[2]))); | 1641 reinterpret_cast<intptr_t>(&buffer[2]))); |
| 1852 EXPECT_EQ( | 1642 EXPECT_EQ( |
| 1853 static_cast<int32_t>(0xDEBC9A78), | 1643 static_cast<int32_t>(0xDEBC9A78), |
| 1854 EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned, test->entry(), | 1644 EXECUTE_TEST_CODE_INT32_INTPTR(LoadWordUnaligned, test->entry(), |
| 1855 reinterpret_cast<intptr_t>(&buffer[3]))); | 1645 reinterpret_cast<intptr_t>(&buffer[3]))); |
| 1856 } | 1646 } |
| 1857 | 1647 |
| 1858 | |
| 1859 ASSEMBLER_TEST_GENERATE(StoreWordUnaligned, assembler) { | 1648 ASSEMBLER_TEST_GENERATE(StoreWordUnaligned, assembler) { |
| 1860 __ LoadImmediate(R1, 0x12345678); | 1649 __ LoadImmediate(R1, 0x12345678); |
| 1861 __ StoreUnaligned(R1, R0, TMP, kUnsignedWord); | 1650 __ StoreUnaligned(R1, R0, TMP, kUnsignedWord); |
| 1862 __ mov(R0, R1); | 1651 __ mov(R0, R1); |
| 1863 __ ret(); | 1652 __ ret(); |
| 1864 } | 1653 } |
| 1865 | 1654 |
| 1866 | |
| 1867 ASSEMBLER_TEST_RUN(StoreWordUnaligned, test) { | 1655 ASSEMBLER_TEST_RUN(StoreWordUnaligned, test) { |
| 1868 EXPECT(test != NULL); | 1656 EXPECT(test != NULL); |
| 1869 typedef intptr_t (*StoreWordUnaligned)(intptr_t) DART_UNUSED; | 1657 typedef intptr_t (*StoreWordUnaligned)(intptr_t) DART_UNUSED; |
| 1870 uint8_t buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; | 1658 uint8_t buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; |
| 1871 | 1659 |
| 1872 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR( | 1660 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1873 StoreWordUnaligned, test->entry(), | 1661 StoreWordUnaligned, test->entry(), |
| 1874 reinterpret_cast<intptr_t>(&buffer[0]))); | 1662 reinterpret_cast<intptr_t>(&buffer[0]))); |
| 1875 EXPECT_EQ(0x78, buffer[0]); | 1663 EXPECT_EQ(0x78, buffer[0]); |
| 1876 EXPECT_EQ(0x56, buffer[1]); | 1664 EXPECT_EQ(0x56, buffer[1]); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1895 | 1683 |
| 1896 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR( | 1684 EXPECT_EQ(0x12345678, EXECUTE_TEST_CODE_INTPTR_INTPTR( |
| 1897 StoreWordUnaligned, test->entry(), | 1685 StoreWordUnaligned, test->entry(), |
| 1898 reinterpret_cast<intptr_t>(&buffer[3]))); | 1686 reinterpret_cast<intptr_t>(&buffer[3]))); |
| 1899 EXPECT_EQ(0x78, buffer[3]); | 1687 EXPECT_EQ(0x78, buffer[3]); |
| 1900 EXPECT_EQ(0x56, buffer[4]); | 1688 EXPECT_EQ(0x56, buffer[4]); |
| 1901 EXPECT_EQ(0x34, buffer[5]); | 1689 EXPECT_EQ(0x34, buffer[5]); |
| 1902 EXPECT_EQ(0x12, buffer[6]); | 1690 EXPECT_EQ(0x12, buffer[6]); |
| 1903 } | 1691 } |
| 1904 | 1692 |
| 1905 | |
| 1906 static void EnterTestFrame(Assembler* assembler) { | 1693 static void EnterTestFrame(Assembler* assembler) { |
| 1907 __ EnterFrame(0); | 1694 __ EnterFrame(0); |
| 1908 __ Push(CODE_REG); | 1695 __ Push(CODE_REG); |
| 1909 __ Push(THR); | 1696 __ Push(THR); |
| 1910 __ TagAndPushPP(); | 1697 __ TagAndPushPP(); |
| 1911 __ ldr(CODE_REG, Address(R0, VMHandles::kOffsetOfRawPtrInHandle)); | 1698 __ ldr(CODE_REG, Address(R0, VMHandles::kOffsetOfRawPtrInHandle)); |
| 1912 __ mov(THR, R1); | 1699 __ mov(THR, R1); |
| 1913 __ LoadPoolPointer(PP); | 1700 __ LoadPoolPointer(PP); |
| 1914 } | 1701 } |
| 1915 | 1702 |
| 1916 | |
| 1917 static void LeaveTestFrame(Assembler* assembler) { | 1703 static void LeaveTestFrame(Assembler* assembler) { |
| 1918 __ PopAndUntagPP(); | 1704 __ PopAndUntagPP(); |
| 1919 __ Pop(THR); | 1705 __ Pop(THR); |
| 1920 __ Pop(CODE_REG); | 1706 __ Pop(CODE_REG); |
| 1921 __ LeaveFrame(); | 1707 __ LeaveFrame(); |
| 1922 } | 1708 } |
| 1923 | 1709 |
| 1924 | |
| 1925 // Loading immediate values with the object pool. | 1710 // Loading immediate values with the object pool. |
| 1926 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) { | 1711 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) { |
| 1927 __ SetupDartSP(); | 1712 __ SetupDartSP(); |
| 1928 EnterTestFrame(assembler); | 1713 EnterTestFrame(assembler); |
| 1929 __ LoadImmediate(R0, 42); | 1714 __ LoadImmediate(R0, 42); |
| 1930 LeaveTestFrame(assembler); | 1715 LeaveTestFrame(assembler); |
| 1931 __ RestoreCSP(); | 1716 __ RestoreCSP(); |
| 1932 __ ret(); | 1717 __ ret(); |
| 1933 } | 1718 } |
| 1934 | 1719 |
| 1935 | |
| 1936 ASSEMBLER_TEST_RUN(LoadImmediatePPSmall, test) { | 1720 ASSEMBLER_TEST_RUN(LoadImmediatePPSmall, test) { |
| 1937 EXPECT_EQ(42, test->InvokeWithCodeAndThread<int64_t>()); | 1721 EXPECT_EQ(42, test->InvokeWithCodeAndThread<int64_t>()); |
| 1938 } | 1722 } |
| 1939 | 1723 |
| 1940 | |
| 1941 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) { | 1724 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) { |
| 1942 __ SetupDartSP(); | 1725 __ SetupDartSP(); |
| 1943 EnterTestFrame(assembler); | 1726 EnterTestFrame(assembler); |
| 1944 __ LoadImmediate(R0, 0xf1234123); | 1727 __ LoadImmediate(R0, 0xf1234123); |
| 1945 LeaveTestFrame(assembler); | 1728 LeaveTestFrame(assembler); |
| 1946 __ RestoreCSP(); | 1729 __ RestoreCSP(); |
| 1947 __ ret(); | 1730 __ ret(); |
| 1948 } | 1731 } |
| 1949 | 1732 |
| 1950 | |
| 1951 ASSEMBLER_TEST_RUN(LoadImmediatePPMed, test) { | 1733 ASSEMBLER_TEST_RUN(LoadImmediatePPMed, test) { |
| 1952 EXPECT_EQ(0xf1234123, test->InvokeWithCodeAndThread<int64_t>()); | 1734 EXPECT_EQ(0xf1234123, test->InvokeWithCodeAndThread<int64_t>()); |
| 1953 } | 1735 } |
| 1954 | 1736 |
| 1955 | |
| 1956 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) { | 1737 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) { |
| 1957 __ SetupDartSP(); | 1738 __ SetupDartSP(); |
| 1958 EnterTestFrame(assembler); | 1739 EnterTestFrame(assembler); |
| 1959 __ LoadImmediate(R0, 0x4321f1234124); | 1740 __ LoadImmediate(R0, 0x4321f1234124); |
| 1960 LeaveTestFrame(assembler); | 1741 LeaveTestFrame(assembler); |
| 1961 __ RestoreCSP(); | 1742 __ RestoreCSP(); |
| 1962 __ ret(); | 1743 __ ret(); |
| 1963 } | 1744 } |
| 1964 | 1745 |
| 1965 | |
| 1966 ASSEMBLER_TEST_RUN(LoadImmediatePPMed2, test) { | 1746 ASSEMBLER_TEST_RUN(LoadImmediatePPMed2, test) { |
| 1967 EXPECT_EQ(0x4321f1234124, test->InvokeWithCodeAndThread<int64_t>()); | 1747 EXPECT_EQ(0x4321f1234124, test->InvokeWithCodeAndThread<int64_t>()); |
| 1968 } | 1748 } |
| 1969 | 1749 |
| 1970 | |
| 1971 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) { | 1750 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) { |
| 1972 __ SetupDartSP(); | 1751 __ SetupDartSP(); |
| 1973 EnterTestFrame(assembler); | 1752 EnterTestFrame(assembler); |
| 1974 __ LoadImmediate(R0, 0x9287436598237465); | 1753 __ LoadImmediate(R0, 0x9287436598237465); |
| 1975 LeaveTestFrame(assembler); | 1754 LeaveTestFrame(assembler); |
| 1976 __ RestoreCSP(); | 1755 __ RestoreCSP(); |
| 1977 __ ret(); | 1756 __ ret(); |
| 1978 } | 1757 } |
| 1979 | 1758 |
| 1980 | |
| 1981 ASSEMBLER_TEST_RUN(LoadImmediatePPLarge, test) { | 1759 ASSEMBLER_TEST_RUN(LoadImmediatePPLarge, test) { |
| 1982 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), | 1760 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), |
| 1983 test->InvokeWithCodeAndThread<int64_t>()); | 1761 test->InvokeWithCodeAndThread<int64_t>()); |
| 1984 } | 1762 } |
| 1985 | 1763 |
| 1986 | |
| 1987 // LoadObject null. | 1764 // LoadObject null. |
| 1988 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) { | 1765 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) { |
| 1989 __ SetupDartSP(); | 1766 __ SetupDartSP(); |
| 1990 EnterTestFrame(assembler); | 1767 EnterTestFrame(assembler); |
| 1991 __ LoadObject(R0, Object::null_object()); | 1768 __ LoadObject(R0, Object::null_object()); |
| 1992 LeaveTestFrame(assembler); | 1769 LeaveTestFrame(assembler); |
| 1993 __ RestoreCSP(); | 1770 __ RestoreCSP(); |
| 1994 __ ret(); | 1771 __ ret(); |
| 1995 } | 1772 } |
| 1996 | 1773 |
| 1997 | |
| 1998 ASSEMBLER_TEST_RUN(LoadObjectNull, test) { | 1774 ASSEMBLER_TEST_RUN(LoadObjectNull, test) { |
| 1999 EXPECT_EQ(Object::null(), test->InvokeWithCodeAndThread<RawObject*>()); | 1775 EXPECT_EQ(Object::null(), test->InvokeWithCodeAndThread<RawObject*>()); |
| 2000 } | 1776 } |
| 2001 | 1777 |
| 2002 | |
| 2003 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) { | 1778 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) { |
| 2004 __ SetupDartSP(); | 1779 __ SetupDartSP(); |
| 2005 EnterTestFrame(assembler); | 1780 EnterTestFrame(assembler); |
| 2006 __ LoadObject(R0, Bool::True()); | 1781 __ LoadObject(R0, Bool::True()); |
| 2007 LeaveTestFrame(assembler); | 1782 LeaveTestFrame(assembler); |
| 2008 __ RestoreCSP(); | 1783 __ RestoreCSP(); |
| 2009 __ ret(); | 1784 __ ret(); |
| 2010 } | 1785 } |
| 2011 | 1786 |
| 2012 | |
| 2013 ASSEMBLER_TEST_RUN(LoadObjectTrue, test) { | 1787 ASSEMBLER_TEST_RUN(LoadObjectTrue, test) { |
| 2014 EXPECT_EQ(Bool::True().raw(), test->InvokeWithCodeAndThread<RawObject*>()); | 1788 EXPECT_EQ(Bool::True().raw(), test->InvokeWithCodeAndThread<RawObject*>()); |
| 2015 } | 1789 } |
| 2016 | 1790 |
| 2017 | |
| 2018 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) { | 1791 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) { |
| 2019 __ SetupDartSP(); | 1792 __ SetupDartSP(); |
| 2020 EnterTestFrame(assembler); | 1793 EnterTestFrame(assembler); |
| 2021 __ LoadObject(R0, Bool::False()); | 1794 __ LoadObject(R0, Bool::False()); |
| 2022 LeaveTestFrame(assembler); | 1795 LeaveTestFrame(assembler); |
| 2023 __ RestoreCSP(); | 1796 __ RestoreCSP(); |
| 2024 __ ret(); | 1797 __ ret(); |
| 2025 } | 1798 } |
| 2026 | 1799 |
| 2027 | |
| 2028 ASSEMBLER_TEST_RUN(LoadObjectFalse, test) { | 1800 ASSEMBLER_TEST_RUN(LoadObjectFalse, test) { |
| 2029 EXPECT_EQ(Bool::False().raw(), test->InvokeWithCodeAndThread<RawObject*>()); | 1801 EXPECT_EQ(Bool::False().raw(), test->InvokeWithCodeAndThread<RawObject*>()); |
| 2030 } | 1802 } |
| 2031 | 1803 |
| 2032 | |
| 2033 ASSEMBLER_TEST_GENERATE(CSelTrue, assembler) { | 1804 ASSEMBLER_TEST_GENERATE(CSelTrue, assembler) { |
| 2034 __ LoadImmediate(R1, 42); | 1805 __ LoadImmediate(R1, 42); |
| 2035 __ LoadImmediate(R2, 1234); | 1806 __ LoadImmediate(R2, 1234); |
| 2036 __ CompareRegisters(R1, R2); | 1807 __ CompareRegisters(R1, R2); |
| 2037 __ csel(R0, R1, R2, LT); | 1808 __ csel(R0, R1, R2, LT); |
| 2038 __ ret(); | 1809 __ ret(); |
| 2039 } | 1810 } |
| 2040 | 1811 |
| 2041 | |
| 2042 ASSEMBLER_TEST_RUN(CSelTrue, test) { | 1812 ASSEMBLER_TEST_RUN(CSelTrue, test) { |
| 2043 typedef int64_t (*Int64Return)() DART_UNUSED; | 1813 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2044 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1814 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 2045 } | 1815 } |
| 2046 | 1816 |
| 2047 | |
| 2048 ASSEMBLER_TEST_GENERATE(CSelFalse, assembler) { | 1817 ASSEMBLER_TEST_GENERATE(CSelFalse, assembler) { |
| 2049 __ LoadImmediate(R1, 42); | 1818 __ LoadImmediate(R1, 42); |
| 2050 __ LoadImmediate(R2, 1234); | 1819 __ LoadImmediate(R2, 1234); |
| 2051 __ CompareRegisters(R1, R2); | 1820 __ CompareRegisters(R1, R2); |
| 2052 __ csel(R0, R1, R2, GE); | 1821 __ csel(R0, R1, R2, GE); |
| 2053 __ ret(); | 1822 __ ret(); |
| 2054 } | 1823 } |
| 2055 | 1824 |
| 2056 | |
| 2057 ASSEMBLER_TEST_RUN(CSelFalse, test) { | 1825 ASSEMBLER_TEST_RUN(CSelFalse, test) { |
| 2058 typedef int64_t (*Int64Return)() DART_UNUSED; | 1826 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2059 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1827 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 2060 } | 1828 } |
| 2061 | 1829 |
| 2062 | |
| 2063 ASSEMBLER_TEST_GENERATE(CsincFalse, assembler) { | 1830 ASSEMBLER_TEST_GENERATE(CsincFalse, assembler) { |
| 2064 __ LoadImmediate(R1, 42); | 1831 __ LoadImmediate(R1, 42); |
| 2065 __ LoadImmediate(R2, 1234); | 1832 __ LoadImmediate(R2, 1234); |
| 2066 __ CompareRegisters(R1, R2); | 1833 __ CompareRegisters(R1, R2); |
| 2067 __ csinc(R0, R2, R1, GE); | 1834 __ csinc(R0, R2, R1, GE); |
| 2068 __ ret(); | 1835 __ ret(); |
| 2069 } | 1836 } |
| 2070 | 1837 |
| 2071 | |
| 2072 ASSEMBLER_TEST_RUN(CsincFalse, test) { | 1838 ASSEMBLER_TEST_RUN(CsincFalse, test) { |
| 2073 typedef int64_t (*Int64Return)() DART_UNUSED; | 1839 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2074 EXPECT_EQ(43, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1840 EXPECT_EQ(43, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 2075 } | 1841 } |
| 2076 | 1842 |
| 2077 | |
| 2078 ASSEMBLER_TEST_GENERATE(CsincTrue, assembler) { | 1843 ASSEMBLER_TEST_GENERATE(CsincTrue, assembler) { |
| 2079 __ LoadImmediate(R1, 42); | 1844 __ LoadImmediate(R1, 42); |
| 2080 __ LoadImmediate(R2, 1234); | 1845 __ LoadImmediate(R2, 1234); |
| 2081 __ CompareRegisters(R1, R2); | 1846 __ CompareRegisters(R1, R2); |
| 2082 __ csinc(R0, R2, R1, LT); | 1847 __ csinc(R0, R2, R1, LT); |
| 2083 __ ret(); | 1848 __ ret(); |
| 2084 } | 1849 } |
| 2085 | 1850 |
| 2086 | |
| 2087 ASSEMBLER_TEST_RUN(CsincTrue, test) { | 1851 ASSEMBLER_TEST_RUN(CsincTrue, test) { |
| 2088 typedef int64_t (*Int64Return)() DART_UNUSED; | 1852 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2089 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1853 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 2090 } | 1854 } |
| 2091 | 1855 |
| 2092 | |
| 2093 ASSEMBLER_TEST_GENERATE(CsinvFalse, assembler) { | 1856 ASSEMBLER_TEST_GENERATE(CsinvFalse, assembler) { |
| 2094 __ LoadImmediate(R1, 42); | 1857 __ LoadImmediate(R1, 42); |
| 2095 __ LoadImmediate(R2, 1234); | 1858 __ LoadImmediate(R2, 1234); |
| 2096 __ CompareRegisters(R1, R2); | 1859 __ CompareRegisters(R1, R2); |
| 2097 __ csinv(R0, R2, R1, GE); | 1860 __ csinv(R0, R2, R1, GE); |
| 2098 __ ret(); | 1861 __ ret(); |
| 2099 } | 1862 } |
| 2100 | 1863 |
| 2101 | |
| 2102 ASSEMBLER_TEST_RUN(CsinvFalse, test) { | 1864 ASSEMBLER_TEST_RUN(CsinvFalse, test) { |
| 2103 typedef int64_t (*Int64Return)() DART_UNUSED; | 1865 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2104 EXPECT_EQ(~42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1866 EXPECT_EQ(~42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 2105 } | 1867 } |
| 2106 | 1868 |
| 2107 | |
| 2108 ASSEMBLER_TEST_GENERATE(CsinvTrue, assembler) { | 1869 ASSEMBLER_TEST_GENERATE(CsinvTrue, assembler) { |
| 2109 __ LoadImmediate(R1, 42); | 1870 __ LoadImmediate(R1, 42); |
| 2110 __ LoadImmediate(R2, 1234); | 1871 __ LoadImmediate(R2, 1234); |
| 2111 __ CompareRegisters(R1, R2); | 1872 __ CompareRegisters(R1, R2); |
| 2112 __ csinv(R0, R2, R1, LT); | 1873 __ csinv(R0, R2, R1, LT); |
| 2113 __ ret(); | 1874 __ ret(); |
| 2114 } | 1875 } |
| 2115 | 1876 |
| 2116 | |
| 2117 ASSEMBLER_TEST_RUN(CsinvTrue, test) { | 1877 ASSEMBLER_TEST_RUN(CsinvTrue, test) { |
| 2118 typedef int64_t (*Int64Return)() DART_UNUSED; | 1878 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2119 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1879 EXPECT_EQ(1234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 2120 } | 1880 } |
| 2121 | 1881 |
| 2122 | |
| 2123 // Floating point move immediate, to/from integer register. | 1882 // Floating point move immediate, to/from integer register. |
| 2124 ASSEMBLER_TEST_GENERATE(Fmovdi, assembler) { | 1883 ASSEMBLER_TEST_GENERATE(Fmovdi, assembler) { |
| 2125 __ LoadDImmediate(V0, 1.0); | 1884 __ LoadDImmediate(V0, 1.0); |
| 2126 __ ret(); | 1885 __ ret(); |
| 2127 } | 1886 } |
| 2128 | 1887 |
| 2129 | |
| 2130 ASSEMBLER_TEST_RUN(Fmovdi, test) { | 1888 ASSEMBLER_TEST_RUN(Fmovdi, test) { |
| 2131 typedef double (*DoubleReturn)() DART_UNUSED; | 1889 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2132 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1890 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2133 } | 1891 } |
| 2134 | 1892 |
| 2135 | |
| 2136 ASSEMBLER_TEST_GENERATE(Fmovdi2, assembler) { | 1893 ASSEMBLER_TEST_GENERATE(Fmovdi2, assembler) { |
| 2137 __ LoadDImmediate(V0, 123412983.1324524315); | 1894 __ LoadDImmediate(V0, 123412983.1324524315); |
| 2138 __ ret(); | 1895 __ ret(); |
| 2139 } | 1896 } |
| 2140 | 1897 |
| 2141 | |
| 2142 ASSEMBLER_TEST_RUN(Fmovdi2, test) { | 1898 ASSEMBLER_TEST_RUN(Fmovdi2, test) { |
| 2143 typedef double (*DoubleReturn)() DART_UNUSED; | 1899 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2144 EXPECT_FLOAT_EQ(123412983.1324524315, | 1900 EXPECT_FLOAT_EQ(123412983.1324524315, |
| 2145 EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()), | 1901 EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()), |
| 2146 0.0001f); | 1902 0.0001f); |
| 2147 } | 1903 } |
| 2148 | 1904 |
| 2149 | |
| 2150 ASSEMBLER_TEST_GENERATE(Fmovrd, assembler) { | 1905 ASSEMBLER_TEST_GENERATE(Fmovrd, assembler) { |
| 2151 __ LoadDImmediate(V1, 1.0); | 1906 __ LoadDImmediate(V1, 1.0); |
| 2152 __ fmovrd(R0, V1); | 1907 __ fmovrd(R0, V1); |
| 2153 __ ret(); | 1908 __ ret(); |
| 2154 } | 1909 } |
| 2155 | 1910 |
| 2156 | |
| 2157 ASSEMBLER_TEST_RUN(Fmovrd, test) { | 1911 ASSEMBLER_TEST_RUN(Fmovrd, test) { |
| 2158 typedef int64_t (*Int64Return)() DART_UNUSED; | 1912 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2159 const int64_t one = bit_cast<int64_t, double>(1.0); | 1913 const int64_t one = bit_cast<int64_t, double>(1.0); |
| 2160 EXPECT_EQ(one, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1914 EXPECT_EQ(one, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 2161 } | 1915 } |
| 2162 | 1916 |
| 2163 | |
| 2164 ASSEMBLER_TEST_GENERATE(Fmovdr, assembler) { | 1917 ASSEMBLER_TEST_GENERATE(Fmovdr, assembler) { |
| 2165 __ LoadDImmediate(V1, 1.0); | 1918 __ LoadDImmediate(V1, 1.0); |
| 2166 __ fmovrd(R1, V1); | 1919 __ fmovrd(R1, V1); |
| 2167 __ fmovdr(V0, R1); | 1920 __ fmovdr(V0, R1); |
| 2168 __ ret(); | 1921 __ ret(); |
| 2169 } | 1922 } |
| 2170 | 1923 |
| 2171 | |
| 2172 ASSEMBLER_TEST_RUN(Fmovdr, test) { | 1924 ASSEMBLER_TEST_RUN(Fmovdr, test) { |
| 2173 typedef double (*DoubleReturn)() DART_UNUSED; | 1925 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2174 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1926 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2175 } | 1927 } |
| 2176 | 1928 |
| 2177 | |
| 2178 ASSEMBLER_TEST_GENERATE(Fmovrs, assembler) { | 1929 ASSEMBLER_TEST_GENERATE(Fmovrs, assembler) { |
| 2179 __ LoadDImmediate(V2, 1.0); | 1930 __ LoadDImmediate(V2, 1.0); |
| 2180 __ fcvtsd(V1, V2); | 1931 __ fcvtsd(V1, V2); |
| 2181 __ fmovrs(R0, V1); | 1932 __ fmovrs(R0, V1); |
| 2182 __ ret(); | 1933 __ ret(); |
| 2183 } | 1934 } |
| 2184 | 1935 |
| 2185 | |
| 2186 ASSEMBLER_TEST_RUN(Fmovrs, test) { | 1936 ASSEMBLER_TEST_RUN(Fmovrs, test) { |
| 2187 typedef int64_t (*Int64Return)() DART_UNUSED; | 1937 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2188 int64_t result = EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()); | 1938 int64_t result = EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()); |
| 2189 const uint32_t one = bit_cast<uint32_t, float>(1.0f); | 1939 const uint32_t one = bit_cast<uint32_t, float>(1.0f); |
| 2190 EXPECT_EQ(one, static_cast<uint32_t>(result)); | 1940 EXPECT_EQ(one, static_cast<uint32_t>(result)); |
| 2191 } | 1941 } |
| 2192 | 1942 |
| 2193 | |
| 2194 ASSEMBLER_TEST_GENERATE(Fmovsr, assembler) { | 1943 ASSEMBLER_TEST_GENERATE(Fmovsr, assembler) { |
| 2195 __ LoadImmediate(R2, bit_cast<uint32_t, float>(1.0f)); | 1944 __ LoadImmediate(R2, bit_cast<uint32_t, float>(1.0f)); |
| 2196 __ fmovsr(V1, R2); | 1945 __ fmovsr(V1, R2); |
| 2197 __ fmovrs(R0, V1); | 1946 __ fmovrs(R0, V1); |
| 2198 __ ret(); | 1947 __ ret(); |
| 2199 } | 1948 } |
| 2200 | 1949 |
| 2201 | |
| 2202 ASSEMBLER_TEST_RUN(Fmovsr, test) { | 1950 ASSEMBLER_TEST_RUN(Fmovsr, test) { |
| 2203 typedef int64_t (*Int64Return)() DART_UNUSED; | 1951 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2204 int64_t result = EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()); | 1952 int64_t result = EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()); |
| 2205 const uint32_t one = bit_cast<uint32_t, float>(1.0f); | 1953 const uint32_t one = bit_cast<uint32_t, float>(1.0f); |
| 2206 EXPECT_EQ(one, static_cast<uint32_t>(result)); | 1954 EXPECT_EQ(one, static_cast<uint32_t>(result)); |
| 2207 } | 1955 } |
| 2208 | 1956 |
| 2209 | |
| 2210 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) { | 1957 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) { |
| 2211 __ SetupDartSP(); | 1958 __ SetupDartSP(); |
| 2212 __ LoadDImmediate(V1, 42.0); | 1959 __ LoadDImmediate(V1, 42.0); |
| 2213 __ fstrd(V1, Address(SP, -1 * kWordSize, Address::PreIndex)); | 1960 __ fstrd(V1, Address(SP, -1 * kWordSize, Address::PreIndex)); |
| 2214 __ fldrd(V0, Address(SP, 1 * kWordSize, Address::PostIndex)); | 1961 __ fldrd(V0, Address(SP, 1 * kWordSize, Address::PostIndex)); |
| 2215 __ RestoreCSP(); | 1962 __ RestoreCSP(); |
| 2216 __ ret(); | 1963 __ ret(); |
| 2217 } | 1964 } |
| 2218 | 1965 |
| 2219 | |
| 2220 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { | 1966 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { |
| 2221 typedef double (*DoubleReturn)() DART_UNUSED; | 1967 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2222 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1968 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2223 } | 1969 } |
| 2224 | 1970 |
| 2225 | |
| 2226 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) { | 1971 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) { |
| 2227 __ SetupDartSP(); | 1972 __ SetupDartSP(); |
| 2228 __ LoadDImmediate(V1, 42.0); | 1973 __ LoadDImmediate(V1, 42.0); |
| 2229 __ fcvtsd(V2, V1); | 1974 __ fcvtsd(V2, V1); |
| 2230 __ fstrs(V2, Address(SP, -1 * kWordSize, Address::PreIndex)); | 1975 __ fstrs(V2, Address(SP, -1 * kWordSize, Address::PreIndex)); |
| 2231 __ fldrs(V3, Address(SP, 1 * kWordSize, Address::PostIndex)); | 1976 __ fldrs(V3, Address(SP, 1 * kWordSize, Address::PostIndex)); |
| 2232 __ fcvtds(V0, V3); | 1977 __ fcvtds(V0, V3); |
| 2233 __ RestoreCSP(); | 1978 __ RestoreCSP(); |
| 2234 __ ret(); | 1979 __ ret(); |
| 2235 } | 1980 } |
| 2236 | 1981 |
| 2237 | |
| 2238 ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) { | 1982 ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) { |
| 2239 typedef double (*DoubleReturn)() DART_UNUSED; | 1983 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2240 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1984 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2241 } | 1985 } |
| 2242 | 1986 |
| 2243 | |
| 2244 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) { | 1987 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) { |
| 2245 __ SetupDartSP(); | 1988 __ SetupDartSP(); |
| 2246 __ LoadDImmediate(V1, 21.0); | 1989 __ LoadDImmediate(V1, 21.0); |
| 2247 __ LoadDImmediate(V2, 21.0); | 1990 __ LoadDImmediate(V2, 21.0); |
| 2248 __ LoadImmediate(R1, 42); | 1991 __ LoadImmediate(R1, 42); |
| 2249 __ Push(R1); | 1992 __ Push(R1); |
| 2250 __ PushDouble(V1); | 1993 __ PushDouble(V1); |
| 2251 __ PushDouble(V2); | 1994 __ PushDouble(V2); |
| 2252 __ fldrq(V3, Address(SP, 2 * kWordSize, Address::PostIndex)); | 1995 __ fldrq(V3, Address(SP, 2 * kWordSize, Address::PostIndex)); |
| 2253 __ Pop(R0); | 1996 __ Pop(R0); |
| 2254 __ fstrq(V3, Address(SP, -2 * kWordSize, Address::PreIndex)); | 1997 __ fstrq(V3, Address(SP, -2 * kWordSize, Address::PreIndex)); |
| 2255 __ PopDouble(V0); | 1998 __ PopDouble(V0); |
| 2256 __ PopDouble(V1); | 1999 __ PopDouble(V1); |
| 2257 __ faddd(V0, V0, V1); | 2000 __ faddd(V0, V0, V1); |
| 2258 __ RestoreCSP(); | 2001 __ RestoreCSP(); |
| 2259 __ ret(); | 2002 __ ret(); |
| 2260 } | 2003 } |
| 2261 | 2004 |
| 2262 | |
| 2263 ASSEMBLER_TEST_RUN(FldrqFstrqPrePostIndex, test) { | 2005 ASSEMBLER_TEST_RUN(FldrqFstrqPrePostIndex, test) { |
| 2264 typedef double (*DoubleReturn)() DART_UNUSED; | 2006 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2265 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2007 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2266 } | 2008 } |
| 2267 | 2009 |
| 2268 | |
| 2269 ASSEMBLER_TEST_GENERATE(Fcvtzds, assembler) { | 2010 ASSEMBLER_TEST_GENERATE(Fcvtzds, assembler) { |
| 2270 __ LoadDImmediate(V0, 42.0); | 2011 __ LoadDImmediate(V0, 42.0); |
| 2271 __ fcvtzds(R0, V0); | 2012 __ fcvtzds(R0, V0); |
| 2272 __ ret(); | 2013 __ ret(); |
| 2273 } | 2014 } |
| 2274 | 2015 |
| 2275 | |
| 2276 ASSEMBLER_TEST_RUN(Fcvtzds, test) { | 2016 ASSEMBLER_TEST_RUN(Fcvtzds, test) { |
| 2277 typedef int64_t (*Int64Return)() DART_UNUSED; | 2017 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2278 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 2018 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 2279 } | 2019 } |
| 2280 | 2020 |
| 2281 | |
| 2282 ASSEMBLER_TEST_GENERATE(Scvtfdx, assembler) { | 2021 ASSEMBLER_TEST_GENERATE(Scvtfdx, assembler) { |
| 2283 __ LoadImmediate(R0, 42); | 2022 __ LoadImmediate(R0, 42); |
| 2284 __ scvtfdx(V0, R0); | 2023 __ scvtfdx(V0, R0); |
| 2285 __ ret(); | 2024 __ ret(); |
| 2286 } | 2025 } |
| 2287 | 2026 |
| 2288 | |
| 2289 ASSEMBLER_TEST_RUN(Scvtfdx, test) { | 2027 ASSEMBLER_TEST_RUN(Scvtfdx, test) { |
| 2290 typedef double (*DoubleReturn)() DART_UNUSED; | 2028 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2291 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2029 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2292 } | 2030 } |
| 2293 | 2031 |
| 2294 | |
| 2295 ASSEMBLER_TEST_GENERATE(Scvtfdw, assembler) { | 2032 ASSEMBLER_TEST_GENERATE(Scvtfdw, assembler) { |
| 2296 // Fill upper 32-bits with garbage. | 2033 // Fill upper 32-bits with garbage. |
| 2297 __ LoadImmediate(R0, 0x111111110000002A); | 2034 __ LoadImmediate(R0, 0x111111110000002A); |
| 2298 __ scvtfdw(V0, R0); | 2035 __ scvtfdw(V0, R0); |
| 2299 __ ret(); | 2036 __ ret(); |
| 2300 } | 2037 } |
| 2301 | 2038 |
| 2302 | |
| 2303 ASSEMBLER_TEST_RUN(Scvtfdw, test) { | 2039 ASSEMBLER_TEST_RUN(Scvtfdw, test) { |
| 2304 typedef double (*DoubleReturn)() DART_UNUSED; | 2040 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2305 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2041 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2306 } | 2042 } |
| 2307 | 2043 |
| 2308 | |
| 2309 ASSEMBLER_TEST_GENERATE(FabsdPos, assembler) { | 2044 ASSEMBLER_TEST_GENERATE(FabsdPos, assembler) { |
| 2310 __ LoadDImmediate(V1, 42.0); | 2045 __ LoadDImmediate(V1, 42.0); |
| 2311 __ fabsd(V0, V1); | 2046 __ fabsd(V0, V1); |
| 2312 __ ret(); | 2047 __ ret(); |
| 2313 } | 2048 } |
| 2314 | 2049 |
| 2315 | |
| 2316 ASSEMBLER_TEST_RUN(FabsdPos, test) { | 2050 ASSEMBLER_TEST_RUN(FabsdPos, test) { |
| 2317 typedef double (*DoubleReturn)() DART_UNUSED; | 2051 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2318 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2052 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2319 } | 2053 } |
| 2320 | 2054 |
| 2321 | |
| 2322 ASSEMBLER_TEST_GENERATE(FabsdNeg, assembler) { | 2055 ASSEMBLER_TEST_GENERATE(FabsdNeg, assembler) { |
| 2323 __ LoadDImmediate(V1, -42.0); | 2056 __ LoadDImmediate(V1, -42.0); |
| 2324 __ fabsd(V0, V1); | 2057 __ fabsd(V0, V1); |
| 2325 __ ret(); | 2058 __ ret(); |
| 2326 } | 2059 } |
| 2327 | 2060 |
| 2328 | |
| 2329 ASSEMBLER_TEST_RUN(FabsdNeg, test) { | 2061 ASSEMBLER_TEST_RUN(FabsdNeg, test) { |
| 2330 typedef double (*DoubleReturn)() DART_UNUSED; | 2062 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2331 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2063 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2332 } | 2064 } |
| 2333 | 2065 |
| 2334 | |
| 2335 ASSEMBLER_TEST_GENERATE(FnegdPos, assembler) { | 2066 ASSEMBLER_TEST_GENERATE(FnegdPos, assembler) { |
| 2336 __ LoadDImmediate(V1, 42.0); | 2067 __ LoadDImmediate(V1, 42.0); |
| 2337 __ fnegd(V0, V1); | 2068 __ fnegd(V0, V1); |
| 2338 __ ret(); | 2069 __ ret(); |
| 2339 } | 2070 } |
| 2340 | 2071 |
| 2341 | |
| 2342 ASSEMBLER_TEST_RUN(FnegdPos, test) { | 2072 ASSEMBLER_TEST_RUN(FnegdPos, test) { |
| 2343 typedef double (*DoubleReturn)() DART_UNUSED; | 2073 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2344 EXPECT_EQ(-42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2074 EXPECT_EQ(-42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2345 } | 2075 } |
| 2346 | 2076 |
| 2347 | |
| 2348 ASSEMBLER_TEST_GENERATE(FnegdNeg, assembler) { | 2077 ASSEMBLER_TEST_GENERATE(FnegdNeg, assembler) { |
| 2349 __ LoadDImmediate(V1, -42.0); | 2078 __ LoadDImmediate(V1, -42.0); |
| 2350 __ fnegd(V0, V1); | 2079 __ fnegd(V0, V1); |
| 2351 __ ret(); | 2080 __ ret(); |
| 2352 } | 2081 } |
| 2353 | 2082 |
| 2354 | |
| 2355 ASSEMBLER_TEST_RUN(FnegdNeg, test) { | 2083 ASSEMBLER_TEST_RUN(FnegdNeg, test) { |
| 2356 typedef double (*DoubleReturn)() DART_UNUSED; | 2084 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2357 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2085 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2358 } | 2086 } |
| 2359 | 2087 |
| 2360 | |
| 2361 ASSEMBLER_TEST_GENERATE(Fsqrtd, assembler) { | 2088 ASSEMBLER_TEST_GENERATE(Fsqrtd, assembler) { |
| 2362 __ LoadDImmediate(V1, 64.0); | 2089 __ LoadDImmediate(V1, 64.0); |
| 2363 __ fsqrtd(V0, V1); | 2090 __ fsqrtd(V0, V1); |
| 2364 __ ret(); | 2091 __ ret(); |
| 2365 } | 2092 } |
| 2366 | 2093 |
| 2367 | |
| 2368 ASSEMBLER_TEST_RUN(Fsqrtd, test) { | 2094 ASSEMBLER_TEST_RUN(Fsqrtd, test) { |
| 2369 typedef double (*DoubleReturn)() DART_UNUSED; | 2095 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2370 EXPECT_EQ(8.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2096 EXPECT_EQ(8.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2371 } | 2097 } |
| 2372 | 2098 |
| 2373 | |
| 2374 ASSEMBLER_TEST_GENERATE(Fmuld, assembler) { | 2099 ASSEMBLER_TEST_GENERATE(Fmuld, assembler) { |
| 2375 __ LoadDImmediate(V1, 84.0); | 2100 __ LoadDImmediate(V1, 84.0); |
| 2376 __ LoadDImmediate(V2, 0.5); | 2101 __ LoadDImmediate(V2, 0.5); |
| 2377 __ fmuld(V0, V1, V2); | 2102 __ fmuld(V0, V1, V2); |
| 2378 __ ret(); | 2103 __ ret(); |
| 2379 } | 2104 } |
| 2380 | 2105 |
| 2381 | |
| 2382 ASSEMBLER_TEST_RUN(Fmuld, test) { | 2106 ASSEMBLER_TEST_RUN(Fmuld, test) { |
| 2383 typedef double (*DoubleReturn)() DART_UNUSED; | 2107 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2384 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2108 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2385 } | 2109 } |
| 2386 | 2110 |
| 2387 | |
| 2388 ASSEMBLER_TEST_GENERATE(Fdivd, assembler) { | 2111 ASSEMBLER_TEST_GENERATE(Fdivd, assembler) { |
| 2389 __ LoadDImmediate(V1, 84.0); | 2112 __ LoadDImmediate(V1, 84.0); |
| 2390 __ LoadDImmediate(V2, 2.0); | 2113 __ LoadDImmediate(V2, 2.0); |
| 2391 __ fdivd(V0, V1, V2); | 2114 __ fdivd(V0, V1, V2); |
| 2392 __ ret(); | 2115 __ ret(); |
| 2393 } | 2116 } |
| 2394 | 2117 |
| 2395 | |
| 2396 ASSEMBLER_TEST_RUN(Fdivd, test) { | 2118 ASSEMBLER_TEST_RUN(Fdivd, test) { |
| 2397 typedef double (*DoubleReturn)() DART_UNUSED; | 2119 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2398 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2120 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2399 } | 2121 } |
| 2400 | 2122 |
| 2401 | |
| 2402 ASSEMBLER_TEST_GENERATE(Faddd, assembler) { | 2123 ASSEMBLER_TEST_GENERATE(Faddd, assembler) { |
| 2403 __ LoadDImmediate(V1, 41.5); | 2124 __ LoadDImmediate(V1, 41.5); |
| 2404 __ LoadDImmediate(V2, 0.5); | 2125 __ LoadDImmediate(V2, 0.5); |
| 2405 __ faddd(V0, V1, V2); | 2126 __ faddd(V0, V1, V2); |
| 2406 __ ret(); | 2127 __ ret(); |
| 2407 } | 2128 } |
| 2408 | 2129 |
| 2409 | |
| 2410 ASSEMBLER_TEST_RUN(Faddd, test) { | 2130 ASSEMBLER_TEST_RUN(Faddd, test) { |
| 2411 typedef double (*DoubleReturn)() DART_UNUSED; | 2131 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2412 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2132 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2413 } | 2133 } |
| 2414 | 2134 |
| 2415 | |
| 2416 ASSEMBLER_TEST_GENERATE(Fsubd, assembler) { | 2135 ASSEMBLER_TEST_GENERATE(Fsubd, assembler) { |
| 2417 __ LoadDImmediate(V1, 42.5); | 2136 __ LoadDImmediate(V1, 42.5); |
| 2418 __ LoadDImmediate(V2, 0.5); | 2137 __ LoadDImmediate(V2, 0.5); |
| 2419 __ fsubd(V0, V1, V2); | 2138 __ fsubd(V0, V1, V2); |
| 2420 __ ret(); | 2139 __ ret(); |
| 2421 } | 2140 } |
| 2422 | 2141 |
| 2423 | |
| 2424 ASSEMBLER_TEST_RUN(Fsubd, test) { | 2142 ASSEMBLER_TEST_RUN(Fsubd, test) { |
| 2425 typedef double (*DoubleReturn)() DART_UNUSED; | 2143 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2426 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2144 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2427 } | 2145 } |
| 2428 | 2146 |
| 2429 | |
| 2430 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { | 2147 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { |
| 2431 __ SetupDartSP(); | 2148 __ SetupDartSP(); |
| 2432 __ LoadDImmediate(V0, 43.0); | 2149 __ LoadDImmediate(V0, 43.0); |
| 2433 __ LoadDImmediate(V1, 42.0); | 2150 __ LoadDImmediate(V1, 42.0); |
| 2434 __ AddImmediate(SP, SP, -1 * kWordSize); | 2151 __ AddImmediate(SP, SP, -1 * kWordSize); |
| 2435 __ add(R2, SP, Operand(1)); | 2152 __ add(R2, SP, Operand(1)); |
| 2436 __ fstrd(V1, Address(R2, -1)); | 2153 __ fstrd(V1, Address(R2, -1)); |
| 2437 __ fldrd(V0, Address(R2, -1)); | 2154 __ fldrd(V0, Address(R2, -1)); |
| 2438 __ AddImmediate(SP, 1 * kWordSize); | 2155 __ AddImmediate(SP, 1 * kWordSize); |
| 2439 __ RestoreCSP(); | 2156 __ RestoreCSP(); |
| 2440 __ ret(); | 2157 __ ret(); |
| 2441 } | 2158 } |
| 2442 | 2159 |
| 2443 | |
| 2444 ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) { | 2160 ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) { |
| 2445 typedef double (*DoubleReturn)() DART_UNUSED; | 2161 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2446 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2162 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2447 } | 2163 } |
| 2448 | 2164 |
| 2449 | |
| 2450 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) { | 2165 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) { |
| 2451 __ SetupDartSP(); | 2166 __ SetupDartSP(); |
| 2452 __ LoadDImmediate(V0, 43.0); | 2167 __ LoadDImmediate(V0, 43.0); |
| 2453 __ LoadDImmediate(V1, 42.0); | 2168 __ LoadDImmediate(V1, 42.0); |
| 2454 // Largest negative offset that can fit in the signed 9-bit immediate field. | 2169 // Largest negative offset that can fit in the signed 9-bit immediate field. |
| 2455 __ fstrd(V1, Address(SP, -32 * kWordSize, Address::PreIndex)); | 2170 __ fstrd(V1, Address(SP, -32 * kWordSize, Address::PreIndex)); |
| 2456 // Largest positive kWordSize aligned offset that we can fit. | 2171 // Largest positive kWordSize aligned offset that we can fit. |
| 2457 __ fldrd(V0, Address(SP, 31 * kWordSize, Address::PostIndex)); | 2172 __ fldrd(V0, Address(SP, 31 * kWordSize, Address::PostIndex)); |
| 2458 // Correction. | 2173 // Correction. |
| 2459 __ add(SP, SP, Operand(kWordSize)); // Restore SP. | 2174 __ add(SP, SP, Operand(kWordSize)); // Restore SP. |
| 2460 __ RestoreCSP(); | 2175 __ RestoreCSP(); |
| 2461 __ ret(); | 2176 __ ret(); |
| 2462 } | 2177 } |
| 2463 | 2178 |
| 2464 | |
| 2465 ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) { | 2179 ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) { |
| 2466 typedef double (*DoubleReturn)() DART_UNUSED; | 2180 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2467 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2181 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2468 } | 2182 } |
| 2469 | 2183 |
| 2470 | |
| 2471 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) { | 2184 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) { |
| 2472 __ SetupDartSP(); | 2185 __ SetupDartSP(); |
| 2473 __ LoadDImmediate(V0, 43.0); | 2186 __ LoadDImmediate(V0, 43.0); |
| 2474 __ LoadDImmediate(V1, 42.0); | 2187 __ LoadDImmediate(V1, 42.0); |
| 2475 __ sub(SP, SP, Operand(512 * kWordSize)); | 2188 __ sub(SP, SP, Operand(512 * kWordSize)); |
| 2476 __ fstrd(V1, Address(SP, 512 * kWordSize, Address::Offset)); | 2189 __ fstrd(V1, Address(SP, 512 * kWordSize, Address::Offset)); |
| 2477 __ add(SP, SP, Operand(512 * kWordSize)); | 2190 __ add(SP, SP, Operand(512 * kWordSize)); |
| 2478 __ fldrd(V0, Address(SP)); | 2191 __ fldrd(V0, Address(SP)); |
| 2479 __ RestoreCSP(); | 2192 __ RestoreCSP(); |
| 2480 __ ret(); | 2193 __ ret(); |
| 2481 } | 2194 } |
| 2482 | 2195 |
| 2483 | |
| 2484 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { | 2196 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { |
| 2485 typedef double (*DoubleReturn)() DART_UNUSED; | 2197 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2486 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2198 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2487 } | 2199 } |
| 2488 | 2200 |
| 2489 | |
| 2490 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { | 2201 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { |
| 2491 __ SetupDartSP(); | 2202 __ SetupDartSP(); |
| 2492 __ LoadDImmediate(V0, 43.0); | 2203 __ LoadDImmediate(V0, 43.0); |
| 2493 __ LoadDImmediate(V1, 42.0); | 2204 __ LoadDImmediate(V1, 42.0); |
| 2494 __ movz(R2, Immediate(0xfff8), 0); | 2205 __ movz(R2, Immediate(0xfff8), 0); |
| 2495 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). | 2206 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). |
| 2496 // This should sign extend R2, and add to SP to get address, | 2207 // This should sign extend R2, and add to SP to get address, |
| 2497 // i.e. SP - kWordSize. | 2208 // i.e. SP - kWordSize. |
| 2498 __ fstrd(V1, Address(SP, R2, SXTW)); | 2209 __ fstrd(V1, Address(SP, R2, SXTW)); |
| 2499 __ sub(SP, SP, Operand(kWordSize)); | 2210 __ sub(SP, SP, Operand(kWordSize)); |
| 2500 __ fldrd(V0, Address(SP)); | 2211 __ fldrd(V0, Address(SP)); |
| 2501 __ add(SP, SP, Operand(kWordSize)); | 2212 __ add(SP, SP, Operand(kWordSize)); |
| 2502 __ RestoreCSP(); | 2213 __ RestoreCSP(); |
| 2503 __ ret(); | 2214 __ ret(); |
| 2504 } | 2215 } |
| 2505 | 2216 |
| 2506 | |
| 2507 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { | 2217 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { |
| 2508 typedef double (*DoubleReturn)() DART_UNUSED; | 2218 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2509 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2219 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2510 } | 2220 } |
| 2511 | 2221 |
| 2512 | |
| 2513 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) { | 2222 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) { |
| 2514 __ SetupDartSP(); | 2223 __ SetupDartSP(); |
| 2515 __ LoadDImmediate(V0, 43.0); | 2224 __ LoadDImmediate(V0, 43.0); |
| 2516 __ LoadDImmediate(V1, 42.0); | 2225 __ LoadDImmediate(V1, 42.0); |
| 2517 __ movz(R2, Immediate(10), 0); | 2226 __ movz(R2, Immediate(10), 0); |
| 2518 __ sub(SP, SP, Operand(10 * kWordSize)); | 2227 __ sub(SP, SP, Operand(10 * kWordSize)); |
| 2519 // Store V1 into SP + R2 * kWordSize. | 2228 // Store V1 into SP + R2 * kWordSize. |
| 2520 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); | 2229 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); |
| 2521 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); | 2230 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); |
| 2522 __ add(SP, SP, Operand(10 * kWordSize)); | 2231 __ add(SP, SP, Operand(10 * kWordSize)); |
| 2523 __ RestoreCSP(); | 2232 __ RestoreCSP(); |
| 2524 __ ret(); | 2233 __ ret(); |
| 2525 } | 2234 } |
| 2526 | 2235 |
| 2527 | |
| 2528 ASSEMBLER_TEST_RUN(FldrdFstrdScaledReg, test) { | 2236 ASSEMBLER_TEST_RUN(FldrdFstrdScaledReg, test) { |
| 2529 typedef double (*DoubleReturn)() DART_UNUSED; | 2237 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2530 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2238 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2531 } | 2239 } |
| 2532 | 2240 |
| 2533 | |
| 2534 ASSEMBLER_TEST_GENERATE(VinswVmovrs, assembler) { | 2241 ASSEMBLER_TEST_GENERATE(VinswVmovrs, assembler) { |
| 2535 __ LoadImmediate(R0, 42); | 2242 __ LoadImmediate(R0, 42); |
| 2536 __ LoadImmediate(R1, 43); | 2243 __ LoadImmediate(R1, 43); |
| 2537 __ LoadImmediate(R2, 44); | 2244 __ LoadImmediate(R2, 44); |
| 2538 __ LoadImmediate(R3, 45); | 2245 __ LoadImmediate(R3, 45); |
| 2539 | 2246 |
| 2540 __ vinsw(V0, 0, R0); | 2247 __ vinsw(V0, 0, R0); |
| 2541 __ vinsw(V0, 1, R1); | 2248 __ vinsw(V0, 1, R1); |
| 2542 __ vinsw(V0, 2, R2); | 2249 __ vinsw(V0, 2, R2); |
| 2543 __ vinsw(V0, 3, R3); | 2250 __ vinsw(V0, 3, R3); |
| 2544 | 2251 |
| 2545 __ vmovrs(R4, V0, 0); | 2252 __ vmovrs(R4, V0, 0); |
| 2546 __ vmovrs(R5, V0, 1); | 2253 __ vmovrs(R5, V0, 1); |
| 2547 __ vmovrs(R6, V0, 2); | 2254 __ vmovrs(R6, V0, 2); |
| 2548 __ vmovrs(R7, V0, 3); | 2255 __ vmovrs(R7, V0, 3); |
| 2549 | 2256 |
| 2550 __ add(R0, R4, Operand(R5)); | 2257 __ add(R0, R4, Operand(R5)); |
| 2551 __ add(R0, R0, Operand(R6)); | 2258 __ add(R0, R0, Operand(R6)); |
| 2552 __ add(R0, R0, Operand(R7)); | 2259 __ add(R0, R0, Operand(R7)); |
| 2553 __ ret(); | 2260 __ ret(); |
| 2554 } | 2261 } |
| 2555 | 2262 |
| 2556 | |
| 2557 ASSEMBLER_TEST_RUN(VinswVmovrs, test) { | 2263 ASSEMBLER_TEST_RUN(VinswVmovrs, test) { |
| 2558 EXPECT(test != NULL); | 2264 EXPECT(test != NULL); |
| 2559 typedef int64_t (*Int64Return)() DART_UNUSED; | 2265 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2560 EXPECT_EQ(174, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 2266 EXPECT_EQ(174, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 2561 } | 2267 } |
| 2562 | 2268 |
| 2563 | |
| 2564 ASSEMBLER_TEST_GENERATE(VinsxVmovrd, assembler) { | 2269 ASSEMBLER_TEST_GENERATE(VinsxVmovrd, assembler) { |
| 2565 __ LoadImmediate(R0, 42); | 2270 __ LoadImmediate(R0, 42); |
| 2566 __ LoadImmediate(R1, 43); | 2271 __ LoadImmediate(R1, 43); |
| 2567 | 2272 |
| 2568 __ vinsx(V0, 0, R0); | 2273 __ vinsx(V0, 0, R0); |
| 2569 __ vinsx(V0, 1, R1); | 2274 __ vinsx(V0, 1, R1); |
| 2570 | 2275 |
| 2571 __ vmovrd(R2, V0, 0); | 2276 __ vmovrd(R2, V0, 0); |
| 2572 __ vmovrd(R3, V0, 1); | 2277 __ vmovrd(R3, V0, 1); |
| 2573 | 2278 |
| 2574 __ add(R0, R2, Operand(R3)); | 2279 __ add(R0, R2, Operand(R3)); |
| 2575 __ ret(); | 2280 __ ret(); |
| 2576 } | 2281 } |
| 2577 | 2282 |
| 2578 | |
| 2579 ASSEMBLER_TEST_RUN(VinsxVmovrd, test) { | 2283 ASSEMBLER_TEST_RUN(VinsxVmovrd, test) { |
| 2580 EXPECT(test != NULL); | 2284 EXPECT(test != NULL); |
| 2581 typedef int64_t (*Int64Return)() DART_UNUSED; | 2285 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2582 EXPECT_EQ(85, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 2286 EXPECT_EQ(85, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 2583 } | 2287 } |
| 2584 | 2288 |
| 2585 | |
| 2586 ASSEMBLER_TEST_GENERATE(Vnot, assembler) { | 2289 ASSEMBLER_TEST_GENERATE(Vnot, assembler) { |
| 2587 __ LoadImmediate(R0, 0xfffffffe); | 2290 __ LoadImmediate(R0, 0xfffffffe); |
| 2588 __ LoadImmediate(R1, 0xffffffff); | 2291 __ LoadImmediate(R1, 0xffffffff); |
| 2589 __ vinsw(V1, 0, R1); | 2292 __ vinsw(V1, 0, R1); |
| 2590 __ vinsw(V1, 1, R0); | 2293 __ vinsw(V1, 1, R0); |
| 2591 __ vinsw(V1, 2, R1); | 2294 __ vinsw(V1, 2, R1); |
| 2592 __ vinsw(V1, 3, R0); | 2295 __ vinsw(V1, 3, R0); |
| 2593 | 2296 |
| 2594 __ vnot(V0, V1); | 2297 __ vnot(V0, V1); |
| 2595 | 2298 |
| 2596 __ vmovrs(R2, V0, 0); | 2299 __ vmovrs(R2, V0, 0); |
| 2597 __ vmovrs(R3, V0, 1); | 2300 __ vmovrs(R3, V0, 1); |
| 2598 __ vmovrs(R4, V0, 2); | 2301 __ vmovrs(R4, V0, 2); |
| 2599 __ vmovrs(R5, V0, 3); | 2302 __ vmovrs(R5, V0, 3); |
| 2600 __ add(R0, R2, Operand(R3)); | 2303 __ add(R0, R2, Operand(R3)); |
| 2601 __ add(R0, R0, Operand(R4)); | 2304 __ add(R0, R0, Operand(R4)); |
| 2602 __ add(R0, R0, Operand(R5)); | 2305 __ add(R0, R0, Operand(R5)); |
| 2603 __ ret(); | 2306 __ ret(); |
| 2604 } | 2307 } |
| 2605 | 2308 |
| 2606 | |
| 2607 ASSEMBLER_TEST_RUN(Vnot, test) { | 2309 ASSEMBLER_TEST_RUN(Vnot, test) { |
| 2608 EXPECT(test != NULL); | 2310 EXPECT(test != NULL); |
| 2609 typedef int64_t (*Int64Return)() DART_UNUSED; | 2311 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 2610 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 2312 EXPECT_EQ(2, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 2611 } | 2313 } |
| 2612 | 2314 |
| 2613 | |
| 2614 ASSEMBLER_TEST_GENERATE(Vabss, assembler) { | 2315 ASSEMBLER_TEST_GENERATE(Vabss, assembler) { |
| 2615 __ LoadDImmediate(V1, 21.0); | 2316 __ LoadDImmediate(V1, 21.0); |
| 2616 __ LoadDImmediate(V2, -21.0); | 2317 __ LoadDImmediate(V2, -21.0); |
| 2617 | 2318 |
| 2618 __ fcvtsd(V1, V1); | 2319 __ fcvtsd(V1, V1); |
| 2619 __ fcvtsd(V2, V2); | 2320 __ fcvtsd(V2, V2); |
| 2620 | 2321 |
| 2621 __ veor(V3, V3, V3); | 2322 __ veor(V3, V3, V3); |
| 2622 __ vinss(V3, 1, V1, 0); | 2323 __ vinss(V3, 1, V1, 0); |
| 2623 __ vinss(V3, 3, V2, 0); | 2324 __ vinss(V3, 3, V2, 0); |
| 2624 | 2325 |
| 2625 __ vabss(V4, V3); | 2326 __ vabss(V4, V3); |
| 2626 | 2327 |
| 2627 __ vinss(V5, 0, V4, 1); | 2328 __ vinss(V5, 0, V4, 1); |
| 2628 __ vinss(V6, 0, V4, 3); | 2329 __ vinss(V6, 0, V4, 3); |
| 2629 | 2330 |
| 2630 __ fcvtds(V5, V5); | 2331 __ fcvtds(V5, V5); |
| 2631 __ fcvtds(V6, V6); | 2332 __ fcvtds(V6, V6); |
| 2632 | 2333 |
| 2633 __ faddd(V0, V5, V6); | 2334 __ faddd(V0, V5, V6); |
| 2634 __ ret(); | 2335 __ ret(); |
| 2635 } | 2336 } |
| 2636 | 2337 |
| 2637 | |
| 2638 ASSEMBLER_TEST_RUN(Vabss, test) { | 2338 ASSEMBLER_TEST_RUN(Vabss, test) { |
| 2639 typedef double (*DoubleReturn)() DART_UNUSED; | 2339 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2640 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2340 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2641 } | 2341 } |
| 2642 | 2342 |
| 2643 | |
| 2644 ASSEMBLER_TEST_GENERATE(Vabsd, assembler) { | 2343 ASSEMBLER_TEST_GENERATE(Vabsd, assembler) { |
| 2645 __ LoadDImmediate(V1, 21.0); | 2344 __ LoadDImmediate(V1, 21.0); |
| 2646 __ LoadDImmediate(V2, -21.0); | 2345 __ LoadDImmediate(V2, -21.0); |
| 2647 | 2346 |
| 2648 __ vinsd(V3, 0, V1, 0); | 2347 __ vinsd(V3, 0, V1, 0); |
| 2649 __ vinsd(V3, 1, V2, 0); | 2348 __ vinsd(V3, 1, V2, 0); |
| 2650 | 2349 |
| 2651 __ vabsd(V4, V3); | 2350 __ vabsd(V4, V3); |
| 2652 | 2351 |
| 2653 __ vinsd(V5, 0, V4, 0); | 2352 __ vinsd(V5, 0, V4, 0); |
| 2654 __ vinsd(V6, 0, V4, 1); | 2353 __ vinsd(V6, 0, V4, 1); |
| 2655 | 2354 |
| 2656 __ faddd(V0, V5, V6); | 2355 __ faddd(V0, V5, V6); |
| 2657 __ ret(); | 2356 __ ret(); |
| 2658 } | 2357 } |
| 2659 | 2358 |
| 2660 | |
| 2661 ASSEMBLER_TEST_RUN(Vabsd, test) { | 2359 ASSEMBLER_TEST_RUN(Vabsd, test) { |
| 2662 typedef double (*DoubleReturn)() DART_UNUSED; | 2360 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2663 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2361 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2664 } | 2362 } |
| 2665 | 2363 |
| 2666 | |
| 2667 ASSEMBLER_TEST_GENERATE(Vnegs, assembler) { | 2364 ASSEMBLER_TEST_GENERATE(Vnegs, assembler) { |
| 2668 __ LoadDImmediate(V1, 42.0); | 2365 __ LoadDImmediate(V1, 42.0); |
| 2669 __ LoadDImmediate(V2, -84.0); | 2366 __ LoadDImmediate(V2, -84.0); |
| 2670 | 2367 |
| 2671 __ fcvtsd(V1, V1); | 2368 __ fcvtsd(V1, V1); |
| 2672 __ fcvtsd(V2, V2); | 2369 __ fcvtsd(V2, V2); |
| 2673 | 2370 |
| 2674 __ veor(V3, V3, V3); | 2371 __ veor(V3, V3, V3); |
| 2675 __ vinss(V3, 1, V1, 0); | 2372 __ vinss(V3, 1, V1, 0); |
| 2676 __ vinss(V3, 3, V2, 0); | 2373 __ vinss(V3, 3, V2, 0); |
| 2677 | 2374 |
| 2678 __ vnegs(V4, V3); | 2375 __ vnegs(V4, V3); |
| 2679 | 2376 |
| 2680 __ vinss(V5, 0, V4, 1); | 2377 __ vinss(V5, 0, V4, 1); |
| 2681 __ vinss(V6, 0, V4, 3); | 2378 __ vinss(V6, 0, V4, 3); |
| 2682 | 2379 |
| 2683 __ fcvtds(V5, V5); | 2380 __ fcvtds(V5, V5); |
| 2684 __ fcvtds(V6, V6); | 2381 __ fcvtds(V6, V6); |
| 2685 __ faddd(V0, V5, V6); | 2382 __ faddd(V0, V5, V6); |
| 2686 __ ret(); | 2383 __ ret(); |
| 2687 } | 2384 } |
| 2688 | 2385 |
| 2689 | |
| 2690 ASSEMBLER_TEST_RUN(Vnegs, test) { | 2386 ASSEMBLER_TEST_RUN(Vnegs, test) { |
| 2691 typedef double (*DoubleReturn)() DART_UNUSED; | 2387 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2692 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2388 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2693 } | 2389 } |
| 2694 | 2390 |
| 2695 | |
| 2696 ASSEMBLER_TEST_GENERATE(Vnegd, assembler) { | 2391 ASSEMBLER_TEST_GENERATE(Vnegd, assembler) { |
| 2697 __ LoadDImmediate(V1, 42.0); | 2392 __ LoadDImmediate(V1, 42.0); |
| 2698 __ LoadDImmediate(V2, -84.0); | 2393 __ LoadDImmediate(V2, -84.0); |
| 2699 | 2394 |
| 2700 __ vinsd(V3, 0, V1, 0); | 2395 __ vinsd(V3, 0, V1, 0); |
| 2701 __ vinsd(V3, 1, V2, 0); | 2396 __ vinsd(V3, 1, V2, 0); |
| 2702 | 2397 |
| 2703 __ vnegd(V4, V3); | 2398 __ vnegd(V4, V3); |
| 2704 | 2399 |
| 2705 __ vinsd(V5, 0, V4, 0); | 2400 __ vinsd(V5, 0, V4, 0); |
| 2706 __ vinsd(V6, 0, V4, 1); | 2401 __ vinsd(V6, 0, V4, 1); |
| 2707 | 2402 |
| 2708 __ faddd(V0, V5, V6); | 2403 __ faddd(V0, V5, V6); |
| 2709 __ ret(); | 2404 __ ret(); |
| 2710 } | 2405 } |
| 2711 | 2406 |
| 2712 | |
| 2713 ASSEMBLER_TEST_RUN(Vnegd, test) { | 2407 ASSEMBLER_TEST_RUN(Vnegd, test) { |
| 2714 typedef double (*DoubleReturn)() DART_UNUSED; | 2408 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2715 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2409 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2716 } | 2410 } |
| 2717 | 2411 |
| 2718 | |
| 2719 ASSEMBLER_TEST_GENERATE(Vadds, assembler) { | 2412 ASSEMBLER_TEST_GENERATE(Vadds, assembler) { |
| 2720 __ LoadDImmediate(V0, 0.0); | 2413 __ LoadDImmediate(V0, 0.0); |
| 2721 __ LoadDImmediate(V1, 1.0); | 2414 __ LoadDImmediate(V1, 1.0); |
| 2722 __ LoadDImmediate(V2, 2.0); | 2415 __ LoadDImmediate(V2, 2.0); |
| 2723 __ LoadDImmediate(V3, 3.0); | 2416 __ LoadDImmediate(V3, 3.0); |
| 2724 | 2417 |
| 2725 __ fcvtsd(V0, V0); | 2418 __ fcvtsd(V0, V0); |
| 2726 __ fcvtsd(V1, V1); | 2419 __ fcvtsd(V1, V1); |
| 2727 __ fcvtsd(V2, V2); | 2420 __ fcvtsd(V2, V2); |
| 2728 __ fcvtsd(V3, V3); | 2421 __ fcvtsd(V3, V3); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2743 __ fcvtds(V1, V1); | 2436 __ fcvtds(V1, V1); |
| 2744 __ fcvtds(V2, V2); | 2437 __ fcvtds(V2, V2); |
| 2745 __ fcvtds(V3, V3); | 2438 __ fcvtds(V3, V3); |
| 2746 | 2439 |
| 2747 __ faddd(V0, V0, V1); | 2440 __ faddd(V0, V0, V1); |
| 2748 __ faddd(V0, V0, V2); | 2441 __ faddd(V0, V0, V2); |
| 2749 __ faddd(V0, V0, V3); | 2442 __ faddd(V0, V0, V3); |
| 2750 __ ret(); | 2443 __ ret(); |
| 2751 } | 2444 } |
| 2752 | 2445 |
| 2753 | |
| 2754 ASSEMBLER_TEST_RUN(Vadds, test) { | 2446 ASSEMBLER_TEST_RUN(Vadds, test) { |
| 2755 typedef double (*DoubleReturn)() DART_UNUSED; | 2447 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2756 EXPECT_EQ(12.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2448 EXPECT_EQ(12.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2757 } | 2449 } |
| 2758 | 2450 |
| 2759 | |
| 2760 ASSEMBLER_TEST_GENERATE(Vsubs, assembler) { | 2451 ASSEMBLER_TEST_GENERATE(Vsubs, assembler) { |
| 2761 __ LoadDImmediate(V0, 0.0); | 2452 __ LoadDImmediate(V0, 0.0); |
| 2762 __ LoadDImmediate(V1, 1.0); | 2453 __ LoadDImmediate(V1, 1.0); |
| 2763 __ LoadDImmediate(V2, 2.0); | 2454 __ LoadDImmediate(V2, 2.0); |
| 2764 __ LoadDImmediate(V3, 3.0); | 2455 __ LoadDImmediate(V3, 3.0); |
| 2765 __ LoadDImmediate(V5, 0.0); | 2456 __ LoadDImmediate(V5, 0.0); |
| 2766 | 2457 |
| 2767 __ fcvtsd(V0, V0); | 2458 __ fcvtsd(V0, V0); |
| 2768 __ fcvtsd(V1, V1); | 2459 __ fcvtsd(V1, V1); |
| 2769 __ fcvtsd(V2, V2); | 2460 __ fcvtsd(V2, V2); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2785 __ fcvtds(V1, V1); | 2476 __ fcvtds(V1, V1); |
| 2786 __ fcvtds(V2, V2); | 2477 __ fcvtds(V2, V2); |
| 2787 __ fcvtds(V3, V3); | 2478 __ fcvtds(V3, V3); |
| 2788 | 2479 |
| 2789 __ faddd(V0, V0, V1); | 2480 __ faddd(V0, V0, V1); |
| 2790 __ faddd(V0, V0, V2); | 2481 __ faddd(V0, V0, V2); |
| 2791 __ faddd(V0, V0, V3); | 2482 __ faddd(V0, V0, V3); |
| 2792 __ ret(); | 2483 __ ret(); |
| 2793 } | 2484 } |
| 2794 | 2485 |
| 2795 | |
| 2796 ASSEMBLER_TEST_RUN(Vsubs, test) { | 2486 ASSEMBLER_TEST_RUN(Vsubs, test) { |
| 2797 typedef double (*DoubleReturn)() DART_UNUSED; | 2487 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2798 EXPECT_EQ(-6.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2488 EXPECT_EQ(-6.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2799 } | 2489 } |
| 2800 | 2490 |
| 2801 | |
| 2802 ASSEMBLER_TEST_GENERATE(Vmuls, assembler) { | 2491 ASSEMBLER_TEST_GENERATE(Vmuls, assembler) { |
| 2803 __ LoadDImmediate(V0, 0.0); | 2492 __ LoadDImmediate(V0, 0.0); |
| 2804 __ LoadDImmediate(V1, 1.0); | 2493 __ LoadDImmediate(V1, 1.0); |
| 2805 __ LoadDImmediate(V2, 2.0); | 2494 __ LoadDImmediate(V2, 2.0); |
| 2806 __ LoadDImmediate(V3, 3.0); | 2495 __ LoadDImmediate(V3, 3.0); |
| 2807 | 2496 |
| 2808 __ fcvtsd(V0, V0); | 2497 __ fcvtsd(V0, V0); |
| 2809 __ fcvtsd(V1, V1); | 2498 __ fcvtsd(V1, V1); |
| 2810 __ fcvtsd(V2, V2); | 2499 __ fcvtsd(V2, V2); |
| 2811 __ fcvtsd(V3, V3); | 2500 __ fcvtsd(V3, V3); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2826 __ fcvtds(V1, V1); | 2515 __ fcvtds(V1, V1); |
| 2827 __ fcvtds(V2, V2); | 2516 __ fcvtds(V2, V2); |
| 2828 __ fcvtds(V3, V3); | 2517 __ fcvtds(V3, V3); |
| 2829 | 2518 |
| 2830 __ faddd(V0, V0, V1); | 2519 __ faddd(V0, V0, V1); |
| 2831 __ faddd(V0, V0, V2); | 2520 __ faddd(V0, V0, V2); |
| 2832 __ faddd(V0, V0, V3); | 2521 __ faddd(V0, V0, V3); |
| 2833 __ ret(); | 2522 __ ret(); |
| 2834 } | 2523 } |
| 2835 | 2524 |
| 2836 | |
| 2837 ASSEMBLER_TEST_RUN(Vmuls, test) { | 2525 ASSEMBLER_TEST_RUN(Vmuls, test) { |
| 2838 typedef double (*DoubleReturn)() DART_UNUSED; | 2526 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2839 EXPECT_EQ(14.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2527 EXPECT_EQ(14.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2840 } | 2528 } |
| 2841 | 2529 |
| 2842 | |
| 2843 ASSEMBLER_TEST_GENERATE(Vdivs, assembler) { | 2530 ASSEMBLER_TEST_GENERATE(Vdivs, assembler) { |
| 2844 __ LoadDImmediate(V0, 0.0); | 2531 __ LoadDImmediate(V0, 0.0); |
| 2845 __ LoadDImmediate(V1, 1.0); | 2532 __ LoadDImmediate(V1, 1.0); |
| 2846 __ LoadDImmediate(V2, 2.0); | 2533 __ LoadDImmediate(V2, 2.0); |
| 2847 __ LoadDImmediate(V3, 3.0); | 2534 __ LoadDImmediate(V3, 3.0); |
| 2848 | 2535 |
| 2849 __ fcvtsd(V0, V0); | 2536 __ fcvtsd(V0, V0); |
| 2850 __ fcvtsd(V1, V1); | 2537 __ fcvtsd(V1, V1); |
| 2851 __ fcvtsd(V2, V2); | 2538 __ fcvtsd(V2, V2); |
| 2852 __ fcvtsd(V3, V3); | 2539 __ fcvtsd(V3, V3); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2867 __ fcvtds(V1, V1); | 2554 __ fcvtds(V1, V1); |
| 2868 __ fcvtds(V2, V2); | 2555 __ fcvtds(V2, V2); |
| 2869 __ fcvtds(V3, V3); | 2556 __ fcvtds(V3, V3); |
| 2870 | 2557 |
| 2871 __ faddd(V0, V1, V1); | 2558 __ faddd(V0, V1, V1); |
| 2872 __ faddd(V0, V0, V2); | 2559 __ faddd(V0, V0, V2); |
| 2873 __ faddd(V0, V0, V3); | 2560 __ faddd(V0, V0, V3); |
| 2874 __ ret(); | 2561 __ ret(); |
| 2875 } | 2562 } |
| 2876 | 2563 |
| 2877 | |
| 2878 ASSEMBLER_TEST_RUN(Vdivs, test) { | 2564 ASSEMBLER_TEST_RUN(Vdivs, test) { |
| 2879 typedef double (*DoubleReturn)() DART_UNUSED; | 2565 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2880 EXPECT_EQ(4.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2566 EXPECT_EQ(4.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2881 } | 2567 } |
| 2882 | 2568 |
| 2883 | |
| 2884 ASSEMBLER_TEST_GENERATE(Vaddd, assembler) { | 2569 ASSEMBLER_TEST_GENERATE(Vaddd, assembler) { |
| 2885 __ LoadDImmediate(V0, 2.0); | 2570 __ LoadDImmediate(V0, 2.0); |
| 2886 __ LoadDImmediate(V1, 3.0); | 2571 __ LoadDImmediate(V1, 3.0); |
| 2887 | 2572 |
| 2888 __ vinsd(V4, 0, V0, 0); | 2573 __ vinsd(V4, 0, V0, 0); |
| 2889 __ vinsd(V4, 1, V1, 0); | 2574 __ vinsd(V4, 1, V1, 0); |
| 2890 | 2575 |
| 2891 __ vaddd(V5, V4, V4); | 2576 __ vaddd(V5, V4, V4); |
| 2892 | 2577 |
| 2893 __ vinsd(V0, 0, V5, 0); | 2578 __ vinsd(V0, 0, V5, 0); |
| 2894 __ vinsd(V1, 0, V5, 1); | 2579 __ vinsd(V1, 0, V5, 1); |
| 2895 | 2580 |
| 2896 __ faddd(V0, V0, V1); | 2581 __ faddd(V0, V0, V1); |
| 2897 __ ret(); | 2582 __ ret(); |
| 2898 } | 2583 } |
| 2899 | 2584 |
| 2900 | |
| 2901 ASSEMBLER_TEST_RUN(Vaddd, test) { | 2585 ASSEMBLER_TEST_RUN(Vaddd, test) { |
| 2902 typedef double (*DoubleReturn)() DART_UNUSED; | 2586 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2903 EXPECT_EQ(10.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2587 EXPECT_EQ(10.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2904 } | 2588 } |
| 2905 | 2589 |
| 2906 | |
| 2907 ASSEMBLER_TEST_GENERATE(Vsubd, assembler) { | 2590 ASSEMBLER_TEST_GENERATE(Vsubd, assembler) { |
| 2908 __ LoadDImmediate(V0, 2.0); | 2591 __ LoadDImmediate(V0, 2.0); |
| 2909 __ LoadDImmediate(V1, 3.0); | 2592 __ LoadDImmediate(V1, 3.0); |
| 2910 __ LoadDImmediate(V5, 0.0); | 2593 __ LoadDImmediate(V5, 0.0); |
| 2911 | 2594 |
| 2912 __ vinsd(V4, 0, V0, 0); | 2595 __ vinsd(V4, 0, V0, 0); |
| 2913 __ vinsd(V4, 1, V1, 0); | 2596 __ vinsd(V4, 1, V1, 0); |
| 2914 | 2597 |
| 2915 __ vsubd(V5, V5, V4); | 2598 __ vsubd(V5, V5, V4); |
| 2916 | 2599 |
| 2917 __ vinsd(V0, 0, V5, 0); | 2600 __ vinsd(V0, 0, V5, 0); |
| 2918 __ vinsd(V1, 0, V5, 1); | 2601 __ vinsd(V1, 0, V5, 1); |
| 2919 | 2602 |
| 2920 __ faddd(V0, V0, V1); | 2603 __ faddd(V0, V0, V1); |
| 2921 __ ret(); | 2604 __ ret(); |
| 2922 } | 2605 } |
| 2923 | 2606 |
| 2924 | |
| 2925 ASSEMBLER_TEST_RUN(Vsubd, test) { | 2607 ASSEMBLER_TEST_RUN(Vsubd, test) { |
| 2926 typedef double (*DoubleReturn)() DART_UNUSED; | 2608 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2927 EXPECT_EQ(-5.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2609 EXPECT_EQ(-5.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2928 } | 2610 } |
| 2929 | 2611 |
| 2930 | |
| 2931 ASSEMBLER_TEST_GENERATE(Vmuld, assembler) { | 2612 ASSEMBLER_TEST_GENERATE(Vmuld, assembler) { |
| 2932 __ LoadDImmediate(V0, 2.0); | 2613 __ LoadDImmediate(V0, 2.0); |
| 2933 __ LoadDImmediate(V1, 3.0); | 2614 __ LoadDImmediate(V1, 3.0); |
| 2934 | 2615 |
| 2935 __ vinsd(V4, 0, V0, 0); | 2616 __ vinsd(V4, 0, V0, 0); |
| 2936 __ vinsd(V4, 1, V1, 0); | 2617 __ vinsd(V4, 1, V1, 0); |
| 2937 | 2618 |
| 2938 __ vmuld(V5, V4, V4); | 2619 __ vmuld(V5, V4, V4); |
| 2939 | 2620 |
| 2940 __ vinsd(V0, 0, V5, 0); | 2621 __ vinsd(V0, 0, V5, 0); |
| 2941 __ vinsd(V1, 0, V5, 1); | 2622 __ vinsd(V1, 0, V5, 1); |
| 2942 | 2623 |
| 2943 __ faddd(V0, V0, V1); | 2624 __ faddd(V0, V0, V1); |
| 2944 __ ret(); | 2625 __ ret(); |
| 2945 } | 2626 } |
| 2946 | 2627 |
| 2947 | |
| 2948 ASSEMBLER_TEST_RUN(Vmuld, test) { | 2628 ASSEMBLER_TEST_RUN(Vmuld, test) { |
| 2949 typedef double (*DoubleReturn)() DART_UNUSED; | 2629 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2950 EXPECT_EQ(13.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2630 EXPECT_EQ(13.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2951 } | 2631 } |
| 2952 | 2632 |
| 2953 | |
| 2954 ASSEMBLER_TEST_GENERATE(Vdivd, assembler) { | 2633 ASSEMBLER_TEST_GENERATE(Vdivd, assembler) { |
| 2955 __ LoadDImmediate(V0, 2.0); | 2634 __ LoadDImmediate(V0, 2.0); |
| 2956 __ LoadDImmediate(V1, 3.0); | 2635 __ LoadDImmediate(V1, 3.0); |
| 2957 | 2636 |
| 2958 __ vinsd(V4, 0, V0, 0); | 2637 __ vinsd(V4, 0, V0, 0); |
| 2959 __ vinsd(V4, 1, V1, 0); | 2638 __ vinsd(V4, 1, V1, 0); |
| 2960 | 2639 |
| 2961 __ vdivd(V5, V4, V4); | 2640 __ vdivd(V5, V4, V4); |
| 2962 | 2641 |
| 2963 __ vinsd(V0, 0, V5, 0); | 2642 __ vinsd(V0, 0, V5, 0); |
| 2964 __ vinsd(V1, 0, V5, 1); | 2643 __ vinsd(V1, 0, V5, 1); |
| 2965 | 2644 |
| 2966 __ faddd(V0, V0, V1); | 2645 __ faddd(V0, V0, V1); |
| 2967 __ ret(); | 2646 __ ret(); |
| 2968 } | 2647 } |
| 2969 | 2648 |
| 2970 | |
| 2971 ASSEMBLER_TEST_RUN(Vdivd, test) { | 2649 ASSEMBLER_TEST_RUN(Vdivd, test) { |
| 2972 typedef double (*DoubleReturn)() DART_UNUSED; | 2650 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2973 EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2651 EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2974 } | 2652 } |
| 2975 | 2653 |
| 2976 | |
| 2977 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) { | 2654 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) { |
| 2978 __ SetupDartSP(); | 2655 __ SetupDartSP(); |
| 2979 __ LoadDImmediate(V0, 21.0); | 2656 __ LoadDImmediate(V0, 21.0); |
| 2980 __ vdupd(V1, V0, 0); | 2657 __ vdupd(V1, V0, 0); |
| 2981 | 2658 |
| 2982 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); | 2659 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); |
| 2983 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2660 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2984 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2661 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2985 | 2662 |
| 2986 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2663 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2987 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2664 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2988 | 2665 |
| 2989 __ faddd(V0, V2, V3); | 2666 __ faddd(V0, V2, V3); |
| 2990 __ RestoreCSP(); | 2667 __ RestoreCSP(); |
| 2991 __ ret(); | 2668 __ ret(); |
| 2992 } | 2669 } |
| 2993 | 2670 |
| 2994 | |
| 2995 ASSEMBLER_TEST_RUN(Vdupd, test) { | 2671 ASSEMBLER_TEST_RUN(Vdupd, test) { |
| 2996 typedef double (*DoubleReturn)() DART_UNUSED; | 2672 typedef double (*DoubleReturn)() DART_UNUSED; |
| 2997 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2673 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2998 } | 2674 } |
| 2999 | 2675 |
| 3000 | |
| 3001 ASSEMBLER_TEST_GENERATE(Vdups, assembler) { | 2676 ASSEMBLER_TEST_GENERATE(Vdups, assembler) { |
| 3002 __ SetupDartSP(); | 2677 __ SetupDartSP(); |
| 3003 __ LoadDImmediate(V0, 21.0); | 2678 __ LoadDImmediate(V0, 21.0); |
| 3004 __ fcvtsd(V0, V0); | 2679 __ fcvtsd(V0, V0); |
| 3005 __ vdups(V1, V0, 0); | 2680 __ vdups(V1, V0, 0); |
| 3006 | 2681 |
| 3007 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); | 2682 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); |
| 3008 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2683 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 3009 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2684 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 3010 | 2685 |
| 3011 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2686 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3012 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2687 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3013 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2688 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3014 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2689 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3015 | 2690 |
| 3016 __ fcvtds(V0, V0); | 2691 __ fcvtds(V0, V0); |
| 3017 __ fcvtds(V1, V1); | 2692 __ fcvtds(V1, V1); |
| 3018 __ fcvtds(V2, V2); | 2693 __ fcvtds(V2, V2); |
| 3019 __ fcvtds(V3, V3); | 2694 __ fcvtds(V3, V3); |
| 3020 | 2695 |
| 3021 __ faddd(V0, V1, V1); | 2696 __ faddd(V0, V1, V1); |
| 3022 __ faddd(V0, V0, V2); | 2697 __ faddd(V0, V0, V2); |
| 3023 __ faddd(V0, V0, V3); | 2698 __ faddd(V0, V0, V3); |
| 3024 __ RestoreCSP(); | 2699 __ RestoreCSP(); |
| 3025 __ ret(); | 2700 __ ret(); |
| 3026 } | 2701 } |
| 3027 | 2702 |
| 3028 | |
| 3029 ASSEMBLER_TEST_RUN(Vdups, test) { | 2703 ASSEMBLER_TEST_RUN(Vdups, test) { |
| 3030 typedef double (*DoubleReturn)() DART_UNUSED; | 2704 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3031 EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2705 EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3032 } | 2706 } |
| 3033 | 2707 |
| 3034 | |
| 3035 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) { | 2708 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) { |
| 3036 __ SetupDartSP(); | 2709 __ SetupDartSP(); |
| 3037 __ LoadDImmediate(V5, 42.0); | 2710 __ LoadDImmediate(V5, 42.0); |
| 3038 __ vinsd(V1, 1, V5, 0); // V1[1] <- V0[0]. | 2711 __ vinsd(V1, 1, V5, 0); // V1[1] <- V0[0]. |
| 3039 | 2712 |
| 3040 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); | 2713 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); |
| 3041 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2714 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 3042 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2715 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 3043 | 2716 |
| 3044 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2717 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 3045 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2718 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 3046 | 2719 |
| 3047 __ fmovdd(V0, V3); | 2720 __ fmovdd(V0, V3); |
| 3048 __ RestoreCSP(); | 2721 __ RestoreCSP(); |
| 3049 __ ret(); | 2722 __ ret(); |
| 3050 } | 2723 } |
| 3051 | 2724 |
| 3052 | |
| 3053 ASSEMBLER_TEST_RUN(Vinsd, test) { | 2725 ASSEMBLER_TEST_RUN(Vinsd, test) { |
| 3054 typedef double (*DoubleReturn)() DART_UNUSED; | 2726 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3055 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2727 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3056 } | 2728 } |
| 3057 | 2729 |
| 3058 | |
| 3059 ASSEMBLER_TEST_GENERATE(Vinss, assembler) { | 2730 ASSEMBLER_TEST_GENERATE(Vinss, assembler) { |
| 3060 __ SetupDartSP(); | 2731 __ SetupDartSP(); |
| 3061 __ LoadDImmediate(V0, 21.0); | 2732 __ LoadDImmediate(V0, 21.0); |
| 3062 __ fcvtsd(V0, V0); | 2733 __ fcvtsd(V0, V0); |
| 3063 __ vinss(V1, 3, V0, 0); | 2734 __ vinss(V1, 3, V0, 0); |
| 3064 __ vinss(V1, 1, V0, 0); | 2735 __ vinss(V1, 1, V0, 0); |
| 3065 | 2736 |
| 3066 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); | 2737 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); |
| 3067 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2738 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 3068 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2739 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 3069 | 2740 |
| 3070 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2741 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3071 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2742 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3072 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2743 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3073 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2744 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 3074 | 2745 |
| 3075 __ fcvtds(V0, V0); | 2746 __ fcvtds(V0, V0); |
| 3076 __ fcvtds(V1, V1); | 2747 __ fcvtds(V1, V1); |
| 3077 __ fcvtds(V2, V2); | 2748 __ fcvtds(V2, V2); |
| 3078 __ fcvtds(V3, V3); | 2749 __ fcvtds(V3, V3); |
| 3079 | 2750 |
| 3080 __ faddd(V0, V0, V1); | 2751 __ faddd(V0, V0, V1); |
| 3081 __ faddd(V0, V0, V2); | 2752 __ faddd(V0, V0, V2); |
| 3082 __ faddd(V0, V0, V3); | 2753 __ faddd(V0, V0, V3); |
| 3083 __ RestoreCSP(); | 2754 __ RestoreCSP(); |
| 3084 __ ret(); | 2755 __ ret(); |
| 3085 } | 2756 } |
| 3086 | 2757 |
| 3087 | |
| 3088 ASSEMBLER_TEST_RUN(Vinss, test) { | 2758 ASSEMBLER_TEST_RUN(Vinss, test) { |
| 3089 typedef double (*DoubleReturn)() DART_UNUSED; | 2759 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3090 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2760 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3091 } | 2761 } |
| 3092 | 2762 |
| 3093 | |
| 3094 ASSEMBLER_TEST_GENERATE(Vand, assembler) { | 2763 ASSEMBLER_TEST_GENERATE(Vand, assembler) { |
| 3095 __ LoadDImmediate(V1, 21.0); | 2764 __ LoadDImmediate(V1, 21.0); |
| 3096 __ LoadImmediate(R0, 0xffffffff); | 2765 __ LoadImmediate(R0, 0xffffffff); |
| 3097 | 2766 |
| 3098 // V0 <- (0, 0xffffffff, 0, 0xffffffff) | 2767 // V0 <- (0, 0xffffffff, 0, 0xffffffff) |
| 3099 __ fmovdr(V0, R0); | 2768 __ fmovdr(V0, R0); |
| 3100 __ vinss(V0, 2, V0, 0); | 2769 __ vinss(V0, 2, V0, 0); |
| 3101 | 2770 |
| 3102 // V1 <- (21.0, 21.0, 21.0, 21.0) | 2771 // V1 <- (21.0, 21.0, 21.0, 21.0) |
| 3103 __ fcvtsd(V1, V1); | 2772 __ fcvtsd(V1, V1); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 3114 __ fcvtds(V4, V4); | 2783 __ fcvtds(V4, V4); |
| 3115 __ fcvtds(V5, V5); | 2784 __ fcvtds(V5, V5); |
| 3116 __ fcvtds(V6, V6); | 2785 __ fcvtds(V6, V6); |
| 3117 | 2786 |
| 3118 __ vaddd(V0, V3, V4); | 2787 __ vaddd(V0, V3, V4); |
| 3119 __ vaddd(V0, V0, V5); | 2788 __ vaddd(V0, V0, V5); |
| 3120 __ vaddd(V0, V0, V6); | 2789 __ vaddd(V0, V0, V6); |
| 3121 __ ret(); | 2790 __ ret(); |
| 3122 } | 2791 } |
| 3123 | 2792 |
| 3124 | |
| 3125 ASSEMBLER_TEST_RUN(Vand, test) { | 2793 ASSEMBLER_TEST_RUN(Vand, test) { |
| 3126 typedef double (*DoubleReturn)() DART_UNUSED; | 2794 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3127 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2795 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3128 } | 2796 } |
| 3129 | 2797 |
| 3130 | |
| 3131 ASSEMBLER_TEST_GENERATE(Vorr, assembler) { | 2798 ASSEMBLER_TEST_GENERATE(Vorr, assembler) { |
| 3132 __ LoadDImmediate(V1, 10.5); | 2799 __ LoadDImmediate(V1, 10.5); |
| 3133 __ fcvtsd(V1, V1); | 2800 __ fcvtsd(V1, V1); |
| 3134 | 2801 |
| 3135 // V0 <- (0, 10.5, 0, 10.5) | 2802 // V0 <- (0, 10.5, 0, 10.5) |
| 3136 __ fmovdd(V0, V1); | 2803 __ fmovdd(V0, V1); |
| 3137 __ vinss(V0, 2, V0, 0); | 2804 __ vinss(V0, 2, V0, 0); |
| 3138 | 2805 |
| 3139 // V1 <- (10.5, 0, 10.5, 0) | 2806 // V1 <- (10.5, 0, 10.5, 0) |
| 3140 __ veor(V1, V1, V1); | 2807 __ veor(V1, V1, V1); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3152 __ fcvtds(V4, V4); | 2819 __ fcvtds(V4, V4); |
| 3153 __ fcvtds(V5, V5); | 2820 __ fcvtds(V5, V5); |
| 3154 __ fcvtds(V6, V6); | 2821 __ fcvtds(V6, V6); |
| 3155 | 2822 |
| 3156 __ vaddd(V0, V3, V4); | 2823 __ vaddd(V0, V3, V4); |
| 3157 __ vaddd(V0, V0, V5); | 2824 __ vaddd(V0, V0, V5); |
| 3158 __ vaddd(V0, V0, V6); | 2825 __ vaddd(V0, V0, V6); |
| 3159 __ ret(); | 2826 __ ret(); |
| 3160 } | 2827 } |
| 3161 | 2828 |
| 3162 | |
| 3163 ASSEMBLER_TEST_RUN(Vorr, test) { | 2829 ASSEMBLER_TEST_RUN(Vorr, test) { |
| 3164 typedef double (*DoubleReturn)() DART_UNUSED; | 2830 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3165 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2831 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3166 } | 2832 } |
| 3167 | 2833 |
| 3168 | |
| 3169 ASSEMBLER_TEST_GENERATE(Veor, assembler) { | 2834 ASSEMBLER_TEST_GENERATE(Veor, assembler) { |
| 3170 __ LoadImmediate(R1, 0xffffffff); | 2835 __ LoadImmediate(R1, 0xffffffff); |
| 3171 __ LoadImmediate(R2, ~21); | 2836 __ LoadImmediate(R2, ~21); |
| 3172 | 2837 |
| 3173 __ vinsw(V1, 0, R1); | 2838 __ vinsw(V1, 0, R1); |
| 3174 __ vinsw(V1, 1, R2); | 2839 __ vinsw(V1, 1, R2); |
| 3175 __ vinsw(V1, 2, R1); | 2840 __ vinsw(V1, 2, R1); |
| 3176 __ vinsw(V1, 3, R2); | 2841 __ vinsw(V1, 3, R2); |
| 3177 | 2842 |
| 3178 __ vinsw(V2, 0, R1); | 2843 __ vinsw(V2, 0, R1); |
| 3179 __ vinsw(V2, 1, R1); | 2844 __ vinsw(V2, 1, R1); |
| 3180 __ vinsw(V2, 2, R1); | 2845 __ vinsw(V2, 2, R1); |
| 3181 __ vinsw(V2, 3, R1); | 2846 __ vinsw(V2, 3, R1); |
| 3182 | 2847 |
| 3183 __ veor(V0, V1, V2); | 2848 __ veor(V0, V1, V2); |
| 3184 | 2849 |
| 3185 __ vmovrs(R3, V0, 0); | 2850 __ vmovrs(R3, V0, 0); |
| 3186 __ vmovrs(R4, V0, 1); | 2851 __ vmovrs(R4, V0, 1); |
| 3187 __ vmovrs(R5, V0, 2); | 2852 __ vmovrs(R5, V0, 2); |
| 3188 __ vmovrs(R6, V0, 3); | 2853 __ vmovrs(R6, V0, 3); |
| 3189 | 2854 |
| 3190 __ add(R0, R3, Operand(R4)); | 2855 __ add(R0, R3, Operand(R4)); |
| 3191 __ add(R0, R0, Operand(R5)); | 2856 __ add(R0, R0, Operand(R5)); |
| 3192 __ add(R0, R0, Operand(R6)); | 2857 __ add(R0, R0, Operand(R6)); |
| 3193 __ ret(); | 2858 __ ret(); |
| 3194 } | 2859 } |
| 3195 | 2860 |
| 3196 | |
| 3197 ASSEMBLER_TEST_RUN(Veor, test) { | 2861 ASSEMBLER_TEST_RUN(Veor, test) { |
| 3198 typedef int64_t (*Int64Return)() DART_UNUSED; | 2862 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 3199 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 2863 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 3200 } | 2864 } |
| 3201 | 2865 |
| 3202 | |
| 3203 ASSEMBLER_TEST_GENERATE(Vaddw, assembler) { | 2866 ASSEMBLER_TEST_GENERATE(Vaddw, assembler) { |
| 3204 __ LoadImmediate(R4, 21); | 2867 __ LoadImmediate(R4, 21); |
| 3205 | 2868 |
| 3206 __ vdupw(V1, R4); | 2869 __ vdupw(V1, R4); |
| 3207 __ vdupw(V2, R4); | 2870 __ vdupw(V2, R4); |
| 3208 | 2871 |
| 3209 __ vaddw(V0, V1, V2); | 2872 __ vaddw(V0, V1, V2); |
| 3210 | 2873 |
| 3211 __ vmovrs(R0, V0, 0); | 2874 __ vmovrs(R0, V0, 0); |
| 3212 __ vmovrs(R1, V0, 1); | 2875 __ vmovrs(R1, V0, 1); |
| 3213 __ vmovrs(R2, V0, 2); | 2876 __ vmovrs(R2, V0, 2); |
| 3214 __ vmovrs(R3, V0, 3); | 2877 __ vmovrs(R3, V0, 3); |
| 3215 __ add(R0, R0, Operand(R1)); | 2878 __ add(R0, R0, Operand(R1)); |
| 3216 __ add(R0, R0, Operand(R2)); | 2879 __ add(R0, R0, Operand(R2)); |
| 3217 __ add(R0, R0, Operand(R3)); | 2880 __ add(R0, R0, Operand(R3)); |
| 3218 __ ret(); | 2881 __ ret(); |
| 3219 } | 2882 } |
| 3220 | 2883 |
| 3221 | |
| 3222 ASSEMBLER_TEST_RUN(Vaddw, test) { | 2884 ASSEMBLER_TEST_RUN(Vaddw, test) { |
| 3223 typedef int64_t (*Int64Return)() DART_UNUSED; | 2885 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 3224 EXPECT_EQ(168, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 2886 EXPECT_EQ(168, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 3225 } | 2887 } |
| 3226 | 2888 |
| 3227 | |
| 3228 ASSEMBLER_TEST_GENERATE(Vsubw, assembler) { | 2889 ASSEMBLER_TEST_GENERATE(Vsubw, assembler) { |
| 3229 __ LoadImmediate(R4, 31); | 2890 __ LoadImmediate(R4, 31); |
| 3230 __ LoadImmediate(R5, 10); | 2891 __ LoadImmediate(R5, 10); |
| 3231 | 2892 |
| 3232 __ vdupw(V1, R4); | 2893 __ vdupw(V1, R4); |
| 3233 __ vdupw(V2, R5); | 2894 __ vdupw(V2, R5); |
| 3234 | 2895 |
| 3235 __ vsubw(V0, V1, V2); | 2896 __ vsubw(V0, V1, V2); |
| 3236 | 2897 |
| 3237 __ vmovrs(R0, V0, 0); | 2898 __ vmovrs(R0, V0, 0); |
| 3238 __ vmovrs(R1, V0, 1); | 2899 __ vmovrs(R1, V0, 1); |
| 3239 __ vmovrs(R2, V0, 2); | 2900 __ vmovrs(R2, V0, 2); |
| 3240 __ vmovrs(R3, V0, 3); | 2901 __ vmovrs(R3, V0, 3); |
| 3241 __ add(R0, R0, Operand(R1)); | 2902 __ add(R0, R0, Operand(R1)); |
| 3242 __ add(R0, R0, Operand(R2)); | 2903 __ add(R0, R0, Operand(R2)); |
| 3243 __ add(R0, R0, Operand(R3)); | 2904 __ add(R0, R0, Operand(R3)); |
| 3244 __ ret(); | 2905 __ ret(); |
| 3245 } | 2906 } |
| 3246 | 2907 |
| 3247 | |
| 3248 ASSEMBLER_TEST_RUN(Vsubw, test) { | 2908 ASSEMBLER_TEST_RUN(Vsubw, test) { |
| 3249 typedef int64_t (*Int64Return)() DART_UNUSED; | 2909 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 3250 EXPECT_EQ(84, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 2910 EXPECT_EQ(84, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 3251 } | 2911 } |
| 3252 | 2912 |
| 3253 | |
| 3254 ASSEMBLER_TEST_GENERATE(Vaddx, assembler) { | 2913 ASSEMBLER_TEST_GENERATE(Vaddx, assembler) { |
| 3255 __ LoadImmediate(R4, 21); | 2914 __ LoadImmediate(R4, 21); |
| 3256 | 2915 |
| 3257 __ vdupx(V1, R4); | 2916 __ vdupx(V1, R4); |
| 3258 __ vdupx(V2, R4); | 2917 __ vdupx(V2, R4); |
| 3259 | 2918 |
| 3260 __ vaddx(V0, V1, V2); | 2919 __ vaddx(V0, V1, V2); |
| 3261 | 2920 |
| 3262 __ vmovrd(R0, V0, 0); | 2921 __ vmovrd(R0, V0, 0); |
| 3263 __ vmovrd(R1, V0, 1); | 2922 __ vmovrd(R1, V0, 1); |
| 3264 __ add(R0, R0, Operand(R1)); | 2923 __ add(R0, R0, Operand(R1)); |
| 3265 __ ret(); | 2924 __ ret(); |
| 3266 } | 2925 } |
| 3267 | 2926 |
| 3268 | |
| 3269 ASSEMBLER_TEST_RUN(Vaddx, test) { | 2927 ASSEMBLER_TEST_RUN(Vaddx, test) { |
| 3270 typedef int64_t (*Int64Return)() DART_UNUSED; | 2928 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 3271 EXPECT_EQ(84, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 2929 EXPECT_EQ(84, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 3272 } | 2930 } |
| 3273 | 2931 |
| 3274 | |
| 3275 ASSEMBLER_TEST_GENERATE(Vsubx, assembler) { | 2932 ASSEMBLER_TEST_GENERATE(Vsubx, assembler) { |
| 3276 __ LoadImmediate(R4, 31); | 2933 __ LoadImmediate(R4, 31); |
| 3277 __ LoadImmediate(R5, 10); | 2934 __ LoadImmediate(R5, 10); |
| 3278 | 2935 |
| 3279 __ vdupx(V1, R4); | 2936 __ vdupx(V1, R4); |
| 3280 __ vdupx(V2, R5); | 2937 __ vdupx(V2, R5); |
| 3281 | 2938 |
| 3282 __ vsubx(V0, V1, V2); | 2939 __ vsubx(V0, V1, V2); |
| 3283 | 2940 |
| 3284 __ vmovrd(R0, V0, 0); | 2941 __ vmovrd(R0, V0, 0); |
| 3285 __ vmovrd(R1, V0, 1); | 2942 __ vmovrd(R1, V0, 1); |
| 3286 __ add(R0, R0, Operand(R1)); | 2943 __ add(R0, R0, Operand(R1)); |
| 3287 __ ret(); | 2944 __ ret(); |
| 3288 } | 2945 } |
| 3289 | 2946 |
| 3290 | |
| 3291 ASSEMBLER_TEST_RUN(Vsubx, test) { | 2947 ASSEMBLER_TEST_RUN(Vsubx, test) { |
| 3292 typedef int64_t (*Int64Return)() DART_UNUSED; | 2948 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 3293 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 2949 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 3294 } | 2950 } |
| 3295 | 2951 |
| 3296 | |
| 3297 ASSEMBLER_TEST_GENERATE(Vceqs, assembler) { | 2952 ASSEMBLER_TEST_GENERATE(Vceqs, assembler) { |
| 3298 __ LoadDImmediate(V0, 42.0); | 2953 __ LoadDImmediate(V0, 42.0); |
| 3299 __ LoadDImmediate(V1, -42.0); | 2954 __ LoadDImmediate(V1, -42.0); |
| 3300 | 2955 |
| 3301 __ fcvtsd(V0, V0); | 2956 __ fcvtsd(V0, V0); |
| 3302 __ fcvtsd(V1, V1); | 2957 __ fcvtsd(V1, V1); |
| 3303 | 2958 |
| 3304 __ vdups(V2, V0, 0); | 2959 __ vdups(V2, V0, 0); |
| 3305 __ vinss(V3, 0, V0, 0); | 2960 __ vinss(V3, 0, V0, 0); |
| 3306 __ vinss(V3, 1, V1, 0); | 2961 __ vinss(V3, 1, V1, 0); |
| 3307 __ vinss(V3, 2, V0, 0); | 2962 __ vinss(V3, 2, V0, 0); |
| 3308 __ vinss(V3, 3, V1, 0); | 2963 __ vinss(V3, 3, V1, 0); |
| 3309 | 2964 |
| 3310 __ vceqs(V4, V2, V3); | 2965 __ vceqs(V4, V2, V3); |
| 3311 | 2966 |
| 3312 __ vmovrs(R1, V4, 0); | 2967 __ vmovrs(R1, V4, 0); |
| 3313 __ vmovrs(R2, V4, 1); | 2968 __ vmovrs(R2, V4, 1); |
| 3314 __ vmovrs(R3, V4, 2); | 2969 __ vmovrs(R3, V4, 2); |
| 3315 __ vmovrs(R4, V4, 3); | 2970 __ vmovrs(R4, V4, 3); |
| 3316 | 2971 |
| 3317 __ addw(R0, R1, Operand(R2)); | 2972 __ addw(R0, R1, Operand(R2)); |
| 3318 __ addw(R0, R0, Operand(R3)); | 2973 __ addw(R0, R0, Operand(R3)); |
| 3319 __ addw(R0, R0, Operand(R4)); | 2974 __ addw(R0, R0, Operand(R4)); |
| 3320 __ ret(); | 2975 __ ret(); |
| 3321 } | 2976 } |
| 3322 | 2977 |
| 3323 | |
| 3324 ASSEMBLER_TEST_RUN(Vceqs, test) { | 2978 ASSEMBLER_TEST_RUN(Vceqs, test) { |
| 3325 typedef int64_t (*Int64Return)() DART_UNUSED; | 2979 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 3326 EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 2980 EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 3327 } | 2981 } |
| 3328 | 2982 |
| 3329 | |
| 3330 ASSEMBLER_TEST_GENERATE(Vceqd, assembler) { | 2983 ASSEMBLER_TEST_GENERATE(Vceqd, assembler) { |
| 3331 __ LoadDImmediate(V0, 42.0); | 2984 __ LoadDImmediate(V0, 42.0); |
| 3332 __ LoadDImmediate(V1, -42.0); | 2985 __ LoadDImmediate(V1, -42.0); |
| 3333 | 2986 |
| 3334 __ vdupd(V2, V0, 0); | 2987 __ vdupd(V2, V0, 0); |
| 3335 __ vinsd(V3, 0, V0, 0); | 2988 __ vinsd(V3, 0, V0, 0); |
| 3336 __ vinsd(V3, 1, V1, 0); | 2989 __ vinsd(V3, 1, V1, 0); |
| 3337 | 2990 |
| 3338 __ vceqd(V4, V2, V3); | 2991 __ vceqd(V4, V2, V3); |
| 3339 | 2992 |
| 3340 __ vmovrd(R1, V4, 0); | 2993 __ vmovrd(R1, V4, 0); |
| 3341 __ vmovrd(R2, V4, 1); | 2994 __ vmovrd(R2, V4, 1); |
| 3342 | 2995 |
| 3343 __ add(R0, R1, Operand(R2)); | 2996 __ add(R0, R1, Operand(R2)); |
| 3344 __ ret(); | 2997 __ ret(); |
| 3345 } | 2998 } |
| 3346 | 2999 |
| 3347 | |
| 3348 ASSEMBLER_TEST_RUN(Vceqd, test) { | 3000 ASSEMBLER_TEST_RUN(Vceqd, test) { |
| 3349 typedef int64_t (*Int64Return)() DART_UNUSED; | 3001 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 3350 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 3002 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 3351 } | 3003 } |
| 3352 | 3004 |
| 3353 | |
| 3354 ASSEMBLER_TEST_GENERATE(Vcgts, assembler) { | 3005 ASSEMBLER_TEST_GENERATE(Vcgts, assembler) { |
| 3355 __ LoadDImmediate(V0, 42.0); | 3006 __ LoadDImmediate(V0, 42.0); |
| 3356 __ LoadDImmediate(V1, -42.0); | 3007 __ LoadDImmediate(V1, -42.0); |
| 3357 | 3008 |
| 3358 __ fcvtsd(V0, V0); | 3009 __ fcvtsd(V0, V0); |
| 3359 __ fcvtsd(V1, V1); | 3010 __ fcvtsd(V1, V1); |
| 3360 | 3011 |
| 3361 __ vdups(V2, V0, 0); | 3012 __ vdups(V2, V0, 0); |
| 3362 __ vinss(V3, 0, V0, 0); | 3013 __ vinss(V3, 0, V0, 0); |
| 3363 __ vinss(V3, 1, V1, 0); | 3014 __ vinss(V3, 1, V1, 0); |
| 3364 __ vinss(V3, 2, V0, 0); | 3015 __ vinss(V3, 2, V0, 0); |
| 3365 __ vinss(V3, 3, V1, 0); | 3016 __ vinss(V3, 3, V1, 0); |
| 3366 | 3017 |
| 3367 __ vcgts(V4, V2, V3); | 3018 __ vcgts(V4, V2, V3); |
| 3368 | 3019 |
| 3369 __ vmovrs(R1, V4, 0); | 3020 __ vmovrs(R1, V4, 0); |
| 3370 __ vmovrs(R2, V4, 1); | 3021 __ vmovrs(R2, V4, 1); |
| 3371 __ vmovrs(R3, V4, 2); | 3022 __ vmovrs(R3, V4, 2); |
| 3372 __ vmovrs(R4, V4, 3); | 3023 __ vmovrs(R4, V4, 3); |
| 3373 | 3024 |
| 3374 __ addw(R0, R1, Operand(R2)); | 3025 __ addw(R0, R1, Operand(R2)); |
| 3375 __ addw(R0, R0, Operand(R3)); | 3026 __ addw(R0, R0, Operand(R3)); |
| 3376 __ addw(R0, R0, Operand(R4)); | 3027 __ addw(R0, R0, Operand(R4)); |
| 3377 __ ret(); | 3028 __ ret(); |
| 3378 } | 3029 } |
| 3379 | 3030 |
| 3380 | |
| 3381 ASSEMBLER_TEST_RUN(Vcgts, test) { | 3031 ASSEMBLER_TEST_RUN(Vcgts, test) { |
| 3382 typedef int64_t (*Int64Return)() DART_UNUSED; | 3032 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 3383 EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 3033 EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 3384 } | 3034 } |
| 3385 | 3035 |
| 3386 | |
| 3387 ASSEMBLER_TEST_GENERATE(Vcgtd, assembler) { | 3036 ASSEMBLER_TEST_GENERATE(Vcgtd, assembler) { |
| 3388 __ LoadDImmediate(V0, 42.0); | 3037 __ LoadDImmediate(V0, 42.0); |
| 3389 __ LoadDImmediate(V1, -42.0); | 3038 __ LoadDImmediate(V1, -42.0); |
| 3390 | 3039 |
| 3391 __ vdupd(V2, V0, 0); | 3040 __ vdupd(V2, V0, 0); |
| 3392 __ vinsd(V3, 0, V0, 0); | 3041 __ vinsd(V3, 0, V0, 0); |
| 3393 __ vinsd(V3, 1, V1, 0); | 3042 __ vinsd(V3, 1, V1, 0); |
| 3394 | 3043 |
| 3395 __ vcgtd(V4, V2, V3); | 3044 __ vcgtd(V4, V2, V3); |
| 3396 | 3045 |
| 3397 __ vmovrd(R1, V4, 0); | 3046 __ vmovrd(R1, V4, 0); |
| 3398 __ vmovrd(R2, V4, 1); | 3047 __ vmovrd(R2, V4, 1); |
| 3399 | 3048 |
| 3400 __ add(R0, R1, Operand(R2)); | 3049 __ add(R0, R1, Operand(R2)); |
| 3401 __ ret(); | 3050 __ ret(); |
| 3402 } | 3051 } |
| 3403 | 3052 |
| 3404 | |
| 3405 ASSEMBLER_TEST_RUN(Vcgtd, test) { | 3053 ASSEMBLER_TEST_RUN(Vcgtd, test) { |
| 3406 typedef int64_t (*Int64Return)() DART_UNUSED; | 3054 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 3407 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 3055 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 3408 } | 3056 } |
| 3409 | 3057 |
| 3410 | |
| 3411 ASSEMBLER_TEST_GENERATE(Vcges, assembler) { | 3058 ASSEMBLER_TEST_GENERATE(Vcges, assembler) { |
| 3412 __ LoadDImmediate(V0, 42.0); | 3059 __ LoadDImmediate(V0, 42.0); |
| 3413 __ LoadDImmediate(V1, 43.0); | 3060 __ LoadDImmediate(V1, 43.0); |
| 3414 | 3061 |
| 3415 __ fcvtsd(V0, V0); | 3062 __ fcvtsd(V0, V0); |
| 3416 __ fcvtsd(V1, V1); | 3063 __ fcvtsd(V1, V1); |
| 3417 | 3064 |
| 3418 __ vdups(V2, V0, 0); | 3065 __ vdups(V2, V0, 0); |
| 3419 __ vinss(V3, 0, V0, 0); | 3066 __ vinss(V3, 0, V0, 0); |
| 3420 __ vinss(V3, 1, V1, 0); | 3067 __ vinss(V3, 1, V1, 0); |
| 3421 __ vinss(V3, 2, V0, 0); | 3068 __ vinss(V3, 2, V0, 0); |
| 3422 __ vinss(V3, 3, V1, 0); | 3069 __ vinss(V3, 3, V1, 0); |
| 3423 | 3070 |
| 3424 __ vcges(V4, V2, V3); | 3071 __ vcges(V4, V2, V3); |
| 3425 | 3072 |
| 3426 __ vmovrs(R1, V4, 0); | 3073 __ vmovrs(R1, V4, 0); |
| 3427 __ vmovrs(R2, V4, 1); | 3074 __ vmovrs(R2, V4, 1); |
| 3428 __ vmovrs(R3, V4, 2); | 3075 __ vmovrs(R3, V4, 2); |
| 3429 __ vmovrs(R4, V4, 3); | 3076 __ vmovrs(R4, V4, 3); |
| 3430 | 3077 |
| 3431 __ addw(R0, R1, Operand(R2)); | 3078 __ addw(R0, R1, Operand(R2)); |
| 3432 __ addw(R0, R0, Operand(R3)); | 3079 __ addw(R0, R0, Operand(R3)); |
| 3433 __ addw(R0, R0, Operand(R4)); | 3080 __ addw(R0, R0, Operand(R4)); |
| 3434 __ ret(); | 3081 __ ret(); |
| 3435 } | 3082 } |
| 3436 | 3083 |
| 3437 | |
| 3438 ASSEMBLER_TEST_RUN(Vcges, test) { | 3084 ASSEMBLER_TEST_RUN(Vcges, test) { |
| 3439 typedef int64_t (*Int64Return)() DART_UNUSED; | 3085 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 3440 EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 3086 EXPECT_EQ(0xfffffffe, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 3441 } | 3087 } |
| 3442 | 3088 |
| 3443 | |
| 3444 ASSEMBLER_TEST_GENERATE(Vcged, assembler) { | 3089 ASSEMBLER_TEST_GENERATE(Vcged, assembler) { |
| 3445 __ LoadDImmediate(V0, 42.0); | 3090 __ LoadDImmediate(V0, 42.0); |
| 3446 __ LoadDImmediate(V1, 43.0); | 3091 __ LoadDImmediate(V1, 43.0); |
| 3447 | 3092 |
| 3448 __ vdupd(V2, V0, 0); | 3093 __ vdupd(V2, V0, 0); |
| 3449 __ vinsd(V3, 0, V0, 0); | 3094 __ vinsd(V3, 0, V0, 0); |
| 3450 __ vinsd(V3, 1, V1, 0); | 3095 __ vinsd(V3, 1, V1, 0); |
| 3451 | 3096 |
| 3452 __ vcged(V4, V2, V3); | 3097 __ vcged(V4, V2, V3); |
| 3453 | 3098 |
| 3454 __ vmovrd(R1, V4, 0); | 3099 __ vmovrd(R1, V4, 0); |
| 3455 __ vmovrd(R2, V4, 1); | 3100 __ vmovrd(R2, V4, 1); |
| 3456 | 3101 |
| 3457 __ add(R0, R1, Operand(R2)); | 3102 __ add(R0, R1, Operand(R2)); |
| 3458 __ ret(); | 3103 __ ret(); |
| 3459 } | 3104 } |
| 3460 | 3105 |
| 3461 | |
| 3462 ASSEMBLER_TEST_RUN(Vcged, test) { | 3106 ASSEMBLER_TEST_RUN(Vcged, test) { |
| 3463 typedef int64_t (*Int64Return)() DART_UNUSED; | 3107 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 3464 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 3108 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 3465 } | 3109 } |
| 3466 | 3110 |
| 3467 | |
| 3468 ASSEMBLER_TEST_GENERATE(Vmaxs, assembler) { | 3111 ASSEMBLER_TEST_GENERATE(Vmaxs, assembler) { |
| 3469 __ LoadDImmediate(V0, 10.5); | 3112 __ LoadDImmediate(V0, 10.5); |
| 3470 __ LoadDImmediate(V1, 10.0); | 3113 __ LoadDImmediate(V1, 10.0); |
| 3471 | 3114 |
| 3472 __ fcvtsd(V0, V0); | 3115 __ fcvtsd(V0, V0); |
| 3473 __ fcvtsd(V1, V1); | 3116 __ fcvtsd(V1, V1); |
| 3474 | 3117 |
| 3475 __ vdups(V2, V0, 0); | 3118 __ vdups(V2, V0, 0); |
| 3476 __ vinss(V3, 0, V0, 0); | 3119 __ vinss(V3, 0, V0, 0); |
| 3477 __ vinss(V3, 1, V1, 0); | 3120 __ vinss(V3, 1, V1, 0); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3489 __ fcvtds(V1, V1); | 3132 __ fcvtds(V1, V1); |
| 3490 __ fcvtds(V2, V2); | 3133 __ fcvtds(V2, V2); |
| 3491 __ fcvtds(V3, V3); | 3134 __ fcvtds(V3, V3); |
| 3492 | 3135 |
| 3493 __ faddd(V0, V0, V1); | 3136 __ faddd(V0, V0, V1); |
| 3494 __ faddd(V0, V0, V2); | 3137 __ faddd(V0, V0, V2); |
| 3495 __ faddd(V0, V0, V3); | 3138 __ faddd(V0, V0, V3); |
| 3496 __ ret(); | 3139 __ ret(); |
| 3497 } | 3140 } |
| 3498 | 3141 |
| 3499 | |
| 3500 ASSEMBLER_TEST_RUN(Vmaxs, test) { | 3142 ASSEMBLER_TEST_RUN(Vmaxs, test) { |
| 3501 typedef double (*DoubleReturn)() DART_UNUSED; | 3143 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3502 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 3144 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3503 } | 3145 } |
| 3504 | 3146 |
| 3505 | |
| 3506 ASSEMBLER_TEST_GENERATE(Vmaxd, assembler) { | 3147 ASSEMBLER_TEST_GENERATE(Vmaxd, assembler) { |
| 3507 __ LoadDImmediate(V0, 21.0); | 3148 __ LoadDImmediate(V0, 21.0); |
| 3508 __ LoadDImmediate(V1, 20.5); | 3149 __ LoadDImmediate(V1, 20.5); |
| 3509 | 3150 |
| 3510 __ vdupd(V2, V0, 0); | 3151 __ vdupd(V2, V0, 0); |
| 3511 __ vinsd(V3, 0, V0, 0); | 3152 __ vinsd(V3, 0, V0, 0); |
| 3512 __ vinsd(V3, 1, V1, 0); | 3153 __ vinsd(V3, 1, V1, 0); |
| 3513 | 3154 |
| 3514 __ vmaxd(V4, V2, V3); | 3155 __ vmaxd(V4, V2, V3); |
| 3515 | 3156 |
| 3516 __ vinsd(V0, 0, V4, 0); | 3157 __ vinsd(V0, 0, V4, 0); |
| 3517 __ vinsd(V1, 0, V4, 1); | 3158 __ vinsd(V1, 0, V4, 1); |
| 3518 | 3159 |
| 3519 __ faddd(V0, V0, V1); | 3160 __ faddd(V0, V0, V1); |
| 3520 __ ret(); | 3161 __ ret(); |
| 3521 } | 3162 } |
| 3522 | 3163 |
| 3523 | |
| 3524 ASSEMBLER_TEST_RUN(Vmaxd, test) { | 3164 ASSEMBLER_TEST_RUN(Vmaxd, test) { |
| 3525 typedef double (*DoubleReturn)() DART_UNUSED; | 3165 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3526 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 3166 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3527 } | 3167 } |
| 3528 | 3168 |
| 3529 | |
| 3530 ASSEMBLER_TEST_GENERATE(Vmins, assembler) { | 3169 ASSEMBLER_TEST_GENERATE(Vmins, assembler) { |
| 3531 __ LoadDImmediate(V0, 10.5); | 3170 __ LoadDImmediate(V0, 10.5); |
| 3532 __ LoadDImmediate(V1, 11.0); | 3171 __ LoadDImmediate(V1, 11.0); |
| 3533 | 3172 |
| 3534 __ fcvtsd(V0, V0); | 3173 __ fcvtsd(V0, V0); |
| 3535 __ fcvtsd(V1, V1); | 3174 __ fcvtsd(V1, V1); |
| 3536 | 3175 |
| 3537 __ vdups(V2, V0, 0); | 3176 __ vdups(V2, V0, 0); |
| 3538 __ vinss(V3, 0, V0, 0); | 3177 __ vinss(V3, 0, V0, 0); |
| 3539 __ vinss(V3, 1, V1, 0); | 3178 __ vinss(V3, 1, V1, 0); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3551 __ fcvtds(V1, V1); | 3190 __ fcvtds(V1, V1); |
| 3552 __ fcvtds(V2, V2); | 3191 __ fcvtds(V2, V2); |
| 3553 __ fcvtds(V3, V3); | 3192 __ fcvtds(V3, V3); |
| 3554 | 3193 |
| 3555 __ faddd(V0, V0, V1); | 3194 __ faddd(V0, V0, V1); |
| 3556 __ faddd(V0, V0, V2); | 3195 __ faddd(V0, V0, V2); |
| 3557 __ faddd(V0, V0, V3); | 3196 __ faddd(V0, V0, V3); |
| 3558 __ ret(); | 3197 __ ret(); |
| 3559 } | 3198 } |
| 3560 | 3199 |
| 3561 | |
| 3562 ASSEMBLER_TEST_RUN(Vmins, test) { | 3200 ASSEMBLER_TEST_RUN(Vmins, test) { |
| 3563 typedef double (*DoubleReturn)() DART_UNUSED; | 3201 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3564 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 3202 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3565 } | 3203 } |
| 3566 | 3204 |
| 3567 | |
| 3568 ASSEMBLER_TEST_GENERATE(Vmind, assembler) { | 3205 ASSEMBLER_TEST_GENERATE(Vmind, assembler) { |
| 3569 __ LoadDImmediate(V0, 21.0); | 3206 __ LoadDImmediate(V0, 21.0); |
| 3570 __ LoadDImmediate(V1, 21.5); | 3207 __ LoadDImmediate(V1, 21.5); |
| 3571 | 3208 |
| 3572 __ vdupd(V2, V0, 0); | 3209 __ vdupd(V2, V0, 0); |
| 3573 __ vinsd(V3, 0, V0, 0); | 3210 __ vinsd(V3, 0, V0, 0); |
| 3574 __ vinsd(V3, 1, V1, 0); | 3211 __ vinsd(V3, 1, V1, 0); |
| 3575 | 3212 |
| 3576 __ vmind(V4, V2, V3); | 3213 __ vmind(V4, V2, V3); |
| 3577 | 3214 |
| 3578 __ vinsd(V0, 0, V4, 0); | 3215 __ vinsd(V0, 0, V4, 0); |
| 3579 __ vinsd(V1, 0, V4, 1); | 3216 __ vinsd(V1, 0, V4, 1); |
| 3580 | 3217 |
| 3581 __ faddd(V0, V0, V1); | 3218 __ faddd(V0, V0, V1); |
| 3582 __ ret(); | 3219 __ ret(); |
| 3583 } | 3220 } |
| 3584 | 3221 |
| 3585 | |
| 3586 ASSEMBLER_TEST_RUN(Vmind, test) { | 3222 ASSEMBLER_TEST_RUN(Vmind, test) { |
| 3587 typedef double (*DoubleReturn)() DART_UNUSED; | 3223 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3588 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 3224 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3589 } | 3225 } |
| 3590 | 3226 |
| 3591 | |
| 3592 ASSEMBLER_TEST_GENERATE(Vsqrts, assembler) { | 3227 ASSEMBLER_TEST_GENERATE(Vsqrts, assembler) { |
| 3593 __ LoadDImmediate(V0, 64.0); | 3228 __ LoadDImmediate(V0, 64.0); |
| 3594 __ LoadDImmediate(V1, 49.0); | 3229 __ LoadDImmediate(V1, 49.0); |
| 3595 | 3230 |
| 3596 __ fcvtsd(V0, V0); | 3231 __ fcvtsd(V0, V0); |
| 3597 __ fcvtsd(V1, V1); | 3232 __ fcvtsd(V1, V1); |
| 3598 | 3233 |
| 3599 __ veor(V3, V3, V3); | 3234 __ veor(V3, V3, V3); |
| 3600 __ vinss(V3, 1, V0, 0); | 3235 __ vinss(V3, 1, V0, 0); |
| 3601 __ vinss(V3, 3, V1, 0); | 3236 __ vinss(V3, 3, V1, 0); |
| 3602 | 3237 |
| 3603 __ vsqrts(V4, V3); | 3238 __ vsqrts(V4, V3); |
| 3604 | 3239 |
| 3605 __ vinss(V5, 0, V4, 1); | 3240 __ vinss(V5, 0, V4, 1); |
| 3606 __ vinss(V6, 0, V4, 3); | 3241 __ vinss(V6, 0, V4, 3); |
| 3607 | 3242 |
| 3608 __ fcvtds(V5, V5); | 3243 __ fcvtds(V5, V5); |
| 3609 __ fcvtds(V6, V6); | 3244 __ fcvtds(V6, V6); |
| 3610 | 3245 |
| 3611 __ faddd(V0, V5, V6); | 3246 __ faddd(V0, V5, V6); |
| 3612 __ ret(); | 3247 __ ret(); |
| 3613 } | 3248 } |
| 3614 | 3249 |
| 3615 | |
| 3616 ASSEMBLER_TEST_RUN(Vsqrts, test) { | 3250 ASSEMBLER_TEST_RUN(Vsqrts, test) { |
| 3617 typedef double (*DoubleReturn)() DART_UNUSED; | 3251 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3618 EXPECT_EQ(15.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 3252 EXPECT_EQ(15.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3619 } | 3253 } |
| 3620 | 3254 |
| 3621 | |
| 3622 ASSEMBLER_TEST_GENERATE(Vsqrtd, assembler) { | 3255 ASSEMBLER_TEST_GENERATE(Vsqrtd, assembler) { |
| 3623 __ LoadDImmediate(V0, 64.0); | 3256 __ LoadDImmediate(V0, 64.0); |
| 3624 __ LoadDImmediate(V1, 49.0); | 3257 __ LoadDImmediate(V1, 49.0); |
| 3625 | 3258 |
| 3626 __ vinsd(V3, 0, V0, 0); | 3259 __ vinsd(V3, 0, V0, 0); |
| 3627 __ vinsd(V3, 1, V1, 0); | 3260 __ vinsd(V3, 1, V1, 0); |
| 3628 | 3261 |
| 3629 __ vsqrtd(V4, V3); | 3262 __ vsqrtd(V4, V3); |
| 3630 | 3263 |
| 3631 __ vinsd(V5, 0, V4, 0); | 3264 __ vinsd(V5, 0, V4, 0); |
| 3632 __ vinsd(V6, 0, V4, 1); | 3265 __ vinsd(V6, 0, V4, 1); |
| 3633 | 3266 |
| 3634 __ faddd(V0, V5, V6); | 3267 __ faddd(V0, V5, V6); |
| 3635 __ ret(); | 3268 __ ret(); |
| 3636 } | 3269 } |
| 3637 | 3270 |
| 3638 | |
| 3639 ASSEMBLER_TEST_RUN(Vsqrtd, test) { | 3271 ASSEMBLER_TEST_RUN(Vsqrtd, test) { |
| 3640 typedef double (*DoubleReturn)() DART_UNUSED; | 3272 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3641 EXPECT_EQ(15.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 3273 EXPECT_EQ(15.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 3642 } | 3274 } |
| 3643 | 3275 |
| 3644 | |
| 3645 // This is the same function as in the Simulator. | 3276 // This is the same function as in the Simulator. |
| 3646 static float arm_recip_estimate(float a) { | 3277 static float arm_recip_estimate(float a) { |
| 3647 // From the ARM Architecture Reference Manual A2-85. | 3278 // From the ARM Architecture Reference Manual A2-85. |
| 3648 if (isinf(a) || (fabs(a) >= exp2f(126))) | 3279 if (isinf(a) || (fabs(a) >= exp2f(126))) |
| 3649 return 0.0; | 3280 return 0.0; |
| 3650 else if (a == 0.0) | 3281 else if (a == 0.0) |
| 3651 return kPosInfinity; | 3282 return kPosInfinity; |
| 3652 else if (isnan(a)) | 3283 else if (isnan(a)) |
| 3653 return a; | 3284 return a; |
| 3654 | 3285 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 3672 double estimate = static_cast<double>(s) / 256.0; | 3303 double estimate = static_cast<double>(s) / 256.0; |
| 3673 ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0))); | 3304 ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0))); |
| 3674 | 3305 |
| 3675 // result = sign : result_exp<7:0> : estimate<51:29> | 3306 // result = sign : result_exp<7:0> : estimate<51:29> |
| 3676 int32_t result_bits = | 3307 int32_t result_bits = |
| 3677 (a_bits & 0x80000000) | ((result_exp & 0xff) << 23) | | 3308 (a_bits & 0x80000000) | ((result_exp & 0xff) << 23) | |
| 3678 ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff); | 3309 ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff); |
| 3679 return bit_cast<float, int32_t>(result_bits); | 3310 return bit_cast<float, int32_t>(result_bits); |
| 3680 } | 3311 } |
| 3681 | 3312 |
| 3682 | |
| 3683 ASSEMBLER_TEST_GENERATE(Vrecpes, assembler) { | 3313 ASSEMBLER_TEST_GENERATE(Vrecpes, assembler) { |
| 3684 __ LoadDImmediate(V1, 147.0); | 3314 __ LoadDImmediate(V1, 147.0); |
| 3685 __ fcvtsd(V1, V1); | 3315 __ fcvtsd(V1, V1); |
| 3686 __ vinss(V2, 0, V1, 0); | 3316 __ vinss(V2, 0, V1, 0); |
| 3687 __ vinss(V2, 1, V1, 0); | 3317 __ vinss(V2, 1, V1, 0); |
| 3688 __ vinss(V2, 2, V1, 0); | 3318 __ vinss(V2, 2, V1, 0); |
| 3689 __ vinss(V2, 3, V1, 0); | 3319 __ vinss(V2, 3, V1, 0); |
| 3690 __ vrecpes(V0, V2); | 3320 __ vrecpes(V0, V2); |
| 3691 __ fcvtds(V0, V0); | 3321 __ fcvtds(V0, V0); |
| 3692 __ ret(); | 3322 __ ret(); |
| 3693 } | 3323 } |
| 3694 | 3324 |
| 3695 | |
| 3696 ASSEMBLER_TEST_RUN(Vrecpes, test) { | 3325 ASSEMBLER_TEST_RUN(Vrecpes, test) { |
| 3697 EXPECT(test != NULL); | 3326 EXPECT(test != NULL); |
| 3698 typedef double (*DoubleReturn)() DART_UNUSED; | 3327 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3699 float res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()); | 3328 float res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()); |
| 3700 EXPECT_FLOAT_EQ(arm_recip_estimate(147.0), res, 0.0001); | 3329 EXPECT_FLOAT_EQ(arm_recip_estimate(147.0), res, 0.0001); |
| 3701 } | 3330 } |
| 3702 | 3331 |
| 3703 | |
| 3704 ASSEMBLER_TEST_GENERATE(Vrecpss, assembler) { | 3332 ASSEMBLER_TEST_GENERATE(Vrecpss, assembler) { |
| 3705 __ LoadDImmediate(V1, 5.0); | 3333 __ LoadDImmediate(V1, 5.0); |
| 3706 __ LoadDImmediate(V2, 10.0); | 3334 __ LoadDImmediate(V2, 10.0); |
| 3707 | 3335 |
| 3708 __ fcvtsd(V1, V1); | 3336 __ fcvtsd(V1, V1); |
| 3709 __ fcvtsd(V2, V2); | 3337 __ fcvtsd(V2, V2); |
| 3710 | 3338 |
| 3711 __ vrecpss(V0, V1, V2); | 3339 __ vrecpss(V0, V1, V2); |
| 3712 | 3340 |
| 3713 __ fcvtds(V0, V0); | 3341 __ fcvtds(V0, V0); |
| 3714 __ ret(); | 3342 __ ret(); |
| 3715 } | 3343 } |
| 3716 | 3344 |
| 3717 | |
| 3718 ASSEMBLER_TEST_RUN(Vrecpss, test) { | 3345 ASSEMBLER_TEST_RUN(Vrecpss, test) { |
| 3719 EXPECT(test != NULL); | 3346 EXPECT(test != NULL); |
| 3720 typedef double (*DoubleReturn)() DART_UNUSED; | 3347 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3721 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()); | 3348 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()); |
| 3722 EXPECT_FLOAT_EQ(2.0 - 10.0 * 5.0, res, 0.0001); | 3349 EXPECT_FLOAT_EQ(2.0 - 10.0 * 5.0, res, 0.0001); |
| 3723 } | 3350 } |
| 3724 | 3351 |
| 3725 | |
| 3726 ASSEMBLER_TEST_GENERATE(VRecps, assembler) { | 3352 ASSEMBLER_TEST_GENERATE(VRecps, assembler) { |
| 3727 __ LoadDImmediate(V0, 1.0 / 10.5); | 3353 __ LoadDImmediate(V0, 1.0 / 10.5); |
| 3728 __ fcvtsd(V0, V0); | 3354 __ fcvtsd(V0, V0); |
| 3729 | 3355 |
| 3730 __ vdups(V1, V0, 0); | 3356 __ vdups(V1, V0, 0); |
| 3731 | 3357 |
| 3732 __ VRecps(V2, V1); | 3358 __ VRecps(V2, V1); |
| 3733 | 3359 |
| 3734 __ vinss(V0, 0, V2, 0); | 3360 __ vinss(V0, 0, V2, 0); |
| 3735 __ vinss(V1, 0, V2, 1); | 3361 __ vinss(V1, 0, V2, 1); |
| 3736 __ vinss(V2, 0, V2, 2); | 3362 __ vinss(V2, 0, V2, 2); |
| 3737 __ vinss(V3, 0, V2, 3); | 3363 __ vinss(V3, 0, V2, 3); |
| 3738 | 3364 |
| 3739 __ fcvtds(V0, V0); | 3365 __ fcvtds(V0, V0); |
| 3740 __ fcvtds(V1, V1); | 3366 __ fcvtds(V1, V1); |
| 3741 __ fcvtds(V2, V2); | 3367 __ fcvtds(V2, V2); |
| 3742 __ fcvtds(V3, V3); | 3368 __ fcvtds(V3, V3); |
| 3743 | 3369 |
| 3744 __ faddd(V0, V0, V1); | 3370 __ faddd(V0, V0, V1); |
| 3745 __ faddd(V0, V0, V2); | 3371 __ faddd(V0, V0, V2); |
| 3746 __ faddd(V0, V0, V3); | 3372 __ faddd(V0, V0, V3); |
| 3747 __ ret(); | 3373 __ ret(); |
| 3748 } | 3374 } |
| 3749 | 3375 |
| 3750 | |
| 3751 ASSEMBLER_TEST_RUN(VRecps, test) { | 3376 ASSEMBLER_TEST_RUN(VRecps, test) { |
| 3752 typedef double (*DoubleReturn)() DART_UNUSED; | 3377 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3753 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()); | 3378 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()); |
| 3754 EXPECT_FLOAT_EQ(42.0, res, 0.0001); | 3379 EXPECT_FLOAT_EQ(42.0, res, 0.0001); |
| 3755 } | 3380 } |
| 3756 | 3381 |
| 3757 | |
| 3758 static float arm_reciprocal_sqrt_estimate(float a) { | 3382 static float arm_reciprocal_sqrt_estimate(float a) { |
| 3759 // From the ARM Architecture Reference Manual A2-87. | 3383 // From the ARM Architecture Reference Manual A2-87. |
| 3760 if (isinf(a) || (fabs(a) >= exp2f(126))) | 3384 if (isinf(a) || (fabs(a) >= exp2f(126))) |
| 3761 return 0.0; | 3385 return 0.0; |
| 3762 else if (a == 0.0) | 3386 else if (a == 0.0) |
| 3763 return kPosInfinity; | 3387 return kPosInfinity; |
| 3764 else if (isnan(a)) | 3388 else if (isnan(a)) |
| 3765 return a; | 3389 return a; |
| 3766 | 3390 |
| 3767 uint32_t a_bits = bit_cast<uint32_t, float>(a); | 3391 uint32_t a_bits = bit_cast<uint32_t, float>(a); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3802 double estimate = static_cast<double>(s) / 256.0; | 3426 double estimate = static_cast<double>(s) / 256.0; |
| 3803 ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0))); | 3427 ASSERT((estimate >= 1.0) && (estimate <= (511.0 / 256.0))); |
| 3804 | 3428 |
| 3805 // result = 0 : result_exp<7:0> : estimate<51:29> | 3429 // result = 0 : result_exp<7:0> : estimate<51:29> |
| 3806 int32_t result_bits = | 3430 int32_t result_bits = |
| 3807 ((result_exp & 0xff) << 23) | | 3431 ((result_exp & 0xff) << 23) | |
| 3808 ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff); | 3432 ((bit_cast<uint64_t, double>(estimate) >> 29) & 0x7fffff); |
| 3809 return bit_cast<float, int32_t>(result_bits); | 3433 return bit_cast<float, int32_t>(result_bits); |
| 3810 } | 3434 } |
| 3811 | 3435 |
| 3812 | |
| 3813 ASSEMBLER_TEST_GENERATE(Vrsqrtes, assembler) { | 3436 ASSEMBLER_TEST_GENERATE(Vrsqrtes, assembler) { |
| 3814 __ LoadDImmediate(V1, 147.0); | 3437 __ LoadDImmediate(V1, 147.0); |
| 3815 __ fcvtsd(V1, V1); | 3438 __ fcvtsd(V1, V1); |
| 3816 | 3439 |
| 3817 __ vrsqrtes(V0, V1); | 3440 __ vrsqrtes(V0, V1); |
| 3818 | 3441 |
| 3819 __ fcvtds(V0, V0); | 3442 __ fcvtds(V0, V0); |
| 3820 __ ret(); | 3443 __ ret(); |
| 3821 } | 3444 } |
| 3822 | 3445 |
| 3823 | |
| 3824 ASSEMBLER_TEST_RUN(Vrsqrtes, test) { | 3446 ASSEMBLER_TEST_RUN(Vrsqrtes, test) { |
| 3825 EXPECT(test != NULL); | 3447 EXPECT(test != NULL); |
| 3826 typedef double (*DoubleReturn)() DART_UNUSED; | 3448 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3827 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()); | 3449 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()); |
| 3828 EXPECT_FLOAT_EQ(arm_reciprocal_sqrt_estimate(147.0), res, 0.0001); | 3450 EXPECT_FLOAT_EQ(arm_reciprocal_sqrt_estimate(147.0), res, 0.0001); |
| 3829 } | 3451 } |
| 3830 | 3452 |
| 3831 | |
| 3832 ASSEMBLER_TEST_GENERATE(Vrsqrtss, assembler) { | 3453 ASSEMBLER_TEST_GENERATE(Vrsqrtss, assembler) { |
| 3833 __ LoadDImmediate(V1, 5.0); | 3454 __ LoadDImmediate(V1, 5.0); |
| 3834 __ LoadDImmediate(V2, 10.0); | 3455 __ LoadDImmediate(V2, 10.0); |
| 3835 | 3456 |
| 3836 __ fcvtsd(V1, V1); | 3457 __ fcvtsd(V1, V1); |
| 3837 __ fcvtsd(V2, V2); | 3458 __ fcvtsd(V2, V2); |
| 3838 | 3459 |
| 3839 __ vrsqrtss(V0, V1, V2); | 3460 __ vrsqrtss(V0, V1, V2); |
| 3840 | 3461 |
| 3841 __ fcvtds(V0, V0); | 3462 __ fcvtds(V0, V0); |
| 3842 __ ret(); | 3463 __ ret(); |
| 3843 } | 3464 } |
| 3844 | 3465 |
| 3845 | |
| 3846 ASSEMBLER_TEST_RUN(Vrsqrtss, test) { | 3466 ASSEMBLER_TEST_RUN(Vrsqrtss, test) { |
| 3847 EXPECT(test != NULL); | 3467 EXPECT(test != NULL); |
| 3848 typedef double (*DoubleReturn)() DART_UNUSED; | 3468 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3849 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()); | 3469 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()); |
| 3850 EXPECT_FLOAT_EQ((3.0 - 10.0 * 5.0) / 2.0, res, 0.0001); | 3470 EXPECT_FLOAT_EQ((3.0 - 10.0 * 5.0) / 2.0, res, 0.0001); |
| 3851 } | 3471 } |
| 3852 | 3472 |
| 3853 | |
| 3854 ASSEMBLER_TEST_GENERATE(ReciprocalSqrt, assembler) { | 3473 ASSEMBLER_TEST_GENERATE(ReciprocalSqrt, assembler) { |
| 3855 __ LoadDImmediate(V1, 147000.0); | 3474 __ LoadDImmediate(V1, 147000.0); |
| 3856 __ fcvtsd(V1, V1); | 3475 __ fcvtsd(V1, V1); |
| 3857 | 3476 |
| 3858 __ VRSqrts(V0, V1); | 3477 __ VRSqrts(V0, V1); |
| 3859 | 3478 |
| 3860 __ fcvtds(V0, V0); | 3479 __ fcvtds(V0, V0); |
| 3861 __ ret(); | 3480 __ ret(); |
| 3862 } | 3481 } |
| 3863 | 3482 |
| 3864 | |
| 3865 ASSEMBLER_TEST_RUN(ReciprocalSqrt, test) { | 3483 ASSEMBLER_TEST_RUN(ReciprocalSqrt, test) { |
| 3866 EXPECT(test != NULL); | 3484 EXPECT(test != NULL); |
| 3867 typedef double (*DoubleReturn)() DART_UNUSED; | 3485 typedef double (*DoubleReturn)() DART_UNUSED; |
| 3868 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()); | 3486 double res = EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()); |
| 3869 EXPECT_FLOAT_EQ(1.0 / sqrt(147000.0), res, 0.0001); | 3487 EXPECT_FLOAT_EQ(1.0 / sqrt(147000.0), res, 0.0001); |
| 3870 } | 3488 } |
| 3871 | 3489 |
| 3872 | |
| 3873 // Called from assembler_test.cc. | 3490 // Called from assembler_test.cc. |
| 3874 // LR: return address. | 3491 // LR: return address. |
| 3875 // R0: value. | 3492 // R0: value. |
| 3876 // R1: growable array. | 3493 // R1: growable array. |
| 3877 // R2: current thread. | 3494 // R2: current thread. |
| 3878 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { | 3495 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { |
| 3879 __ SetupDartSP(); | 3496 __ SetupDartSP(); |
| 3880 __ Push(CODE_REG); | 3497 __ Push(CODE_REG); |
| 3881 __ Push(THR); | 3498 __ Push(THR); |
| 3882 __ Push(LR); | 3499 __ Push(LR); |
| 3883 __ mov(THR, R2); | 3500 __ mov(THR, R2); |
| 3884 __ StoreIntoObject(R1, FieldAddress(R1, GrowableObjectArray::data_offset()), | 3501 __ StoreIntoObject(R1, FieldAddress(R1, GrowableObjectArray::data_offset()), |
| 3885 R0); | 3502 R0); |
| 3886 __ Pop(LR); | 3503 __ Pop(LR); |
| 3887 __ Pop(THR); | 3504 __ Pop(THR); |
| 3888 __ Pop(CODE_REG); | 3505 __ Pop(CODE_REG); |
| 3889 __ RestoreCSP(); | 3506 __ RestoreCSP(); |
| 3890 __ ret(); | 3507 __ ret(); |
| 3891 } | 3508 } |
| 3892 | 3509 |
| 3893 } // namespace dart | 3510 } // namespace dart |
| 3894 | 3511 |
| 3895 #endif // defined(TARGET_ARCH_ARM64) | 3512 #endif // defined(TARGET_ARCH_ARM64) |
| OLD | NEW |