| 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" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 | 26 |
| 27 ASSEMBLER_TEST_RUN(Simple, test) { | 27 ASSEMBLER_TEST_RUN(Simple, test) { |
| 28 typedef int64_t (*Int64Return)() DART_UNUSED; | 28 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 29 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 29 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 30 } | 30 } |
| 31 | 31 |
| 32 | 32 |
| 33 // Move wide immediate tests. | 33 // Move wide immediate tests. |
| 34 // movz | 34 // movz |
| 35 ASSEMBLER_TEST_GENERATE(Movz0, assembler) { | 35 ASSEMBLER_TEST_GENERATE(Movz0, assembler) { |
| 36 __ movz(R0, 42, 0); | 36 __ movz(R0, Immediate(42), 0); |
| 37 __ ret(); | 37 __ ret(); |
| 38 } | 38 } |
| 39 | 39 |
| 40 | 40 |
| 41 ASSEMBLER_TEST_RUN(Movz0, test) { | 41 ASSEMBLER_TEST_RUN(Movz0, test) { |
| 42 typedef int64_t (*Int64Return)() DART_UNUSED; | 42 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 43 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 43 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 44 } | 44 } |
| 45 | 45 |
| 46 | 46 |
| 47 ASSEMBLER_TEST_GENERATE(Movz1, assembler) { | 47 ASSEMBLER_TEST_GENERATE(Movz1, assembler) { |
| 48 __ movz(R0, 42, 0); // Overwritten by next instruction. | 48 __ movz(R0, Immediate(42), 0); // Overwritten by next instruction. |
| 49 __ movz(R0, 42, 1); | 49 __ movz(R0, Immediate(42), 1); |
| 50 __ ret(); | 50 __ ret(); |
| 51 } | 51 } |
| 52 | 52 |
| 53 | 53 |
| 54 ASSEMBLER_TEST_RUN(Movz1, test) { | 54 ASSEMBLER_TEST_RUN(Movz1, test) { |
| 55 typedef int64_t (*Int64Return)() DART_UNUSED; | 55 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 56 EXPECT_EQ(42LL << 16, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 56 EXPECT_EQ(42LL << 16, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 57 } | 57 } |
| 58 | 58 |
| 59 | 59 |
| 60 ASSEMBLER_TEST_GENERATE(Movz2, assembler) { | 60 ASSEMBLER_TEST_GENERATE(Movz2, assembler) { |
| 61 __ movz(R0, 42, 2); | 61 __ movz(R0, Immediate(42), 2); |
| 62 __ ret(); | 62 __ ret(); |
| 63 } | 63 } |
| 64 | 64 |
| 65 | 65 |
| 66 ASSEMBLER_TEST_RUN(Movz2, test) { | 66 ASSEMBLER_TEST_RUN(Movz2, test) { |
| 67 typedef int64_t (*Int64Return)() DART_UNUSED; | 67 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 68 EXPECT_EQ(42LL << 32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 68 EXPECT_EQ(42LL << 32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 69 } | 69 } |
| 70 | 70 |
| 71 | 71 |
| 72 ASSEMBLER_TEST_GENERATE(Movz3, assembler) { | 72 ASSEMBLER_TEST_GENERATE(Movz3, assembler) { |
| 73 __ movz(R0, 42, 3); | 73 __ movz(R0, Immediate(42), 3); |
| 74 __ ret(); | 74 __ ret(); |
| 75 } | 75 } |
| 76 | 76 |
| 77 | 77 |
| 78 ASSEMBLER_TEST_RUN(Movz3, test) { | 78 ASSEMBLER_TEST_RUN(Movz3, test) { |
| 79 typedef int64_t (*Int64Return)() DART_UNUSED; | 79 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 80 EXPECT_EQ(42LL << 48, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 80 EXPECT_EQ(42LL << 48, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 81 } | 81 } |
| 82 | 82 |
| 83 | 83 |
| 84 // movn | 84 // movn |
| 85 ASSEMBLER_TEST_GENERATE(Movn0, assembler) { | 85 ASSEMBLER_TEST_GENERATE(Movn0, assembler) { |
| 86 __ movn(R0, 42, 0); | 86 __ movn(R0, Immediate(42), 0); |
| 87 __ ret(); | 87 __ ret(); |
| 88 } | 88 } |
| 89 | 89 |
| 90 | 90 |
| 91 ASSEMBLER_TEST_RUN(Movn0, test) { | 91 ASSEMBLER_TEST_RUN(Movn0, test) { |
| 92 typedef int64_t (*Int64Return)() DART_UNUSED; | 92 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 93 EXPECT_EQ(~42LL, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 93 EXPECT_EQ(~42LL, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 94 } | 94 } |
| 95 | 95 |
| 96 | 96 |
| 97 ASSEMBLER_TEST_GENERATE(Movn1, assembler) { | 97 ASSEMBLER_TEST_GENERATE(Movn1, assembler) { |
| 98 __ movn(R0, 42, 1); | 98 __ movn(R0, Immediate(42), 1); |
| 99 __ ret(); | 99 __ ret(); |
| 100 } | 100 } |
| 101 | 101 |
| 102 | 102 |
| 103 ASSEMBLER_TEST_RUN(Movn1, test) { | 103 ASSEMBLER_TEST_RUN(Movn1, test) { |
| 104 typedef int64_t (*Int64Return)() DART_UNUSED; | 104 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 105 EXPECT_EQ(~(42LL << 16), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 105 EXPECT_EQ(~(42LL << 16), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 106 } | 106 } |
| 107 | 107 |
| 108 | 108 |
| 109 ASSEMBLER_TEST_GENERATE(Movn2, assembler) { | 109 ASSEMBLER_TEST_GENERATE(Movn2, assembler) { |
| 110 __ movn(R0, 42, 2); | 110 __ movn(R0, Immediate(42), 2); |
| 111 __ ret(); | 111 __ ret(); |
| 112 } | 112 } |
| 113 | 113 |
| 114 | 114 |
| 115 ASSEMBLER_TEST_RUN(Movn2, test) { | 115 ASSEMBLER_TEST_RUN(Movn2, test) { |
| 116 typedef int64_t (*Int64Return)() DART_UNUSED; | 116 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 117 EXPECT_EQ(~(42LL << 32), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 117 EXPECT_EQ(~(42LL << 32), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 118 } | 118 } |
| 119 | 119 |
| 120 | 120 |
| 121 ASSEMBLER_TEST_GENERATE(Movn3, assembler) { | 121 ASSEMBLER_TEST_GENERATE(Movn3, assembler) { |
| 122 __ movn(R0, 42, 3); | 122 __ movn(R0, Immediate(42), 3); |
| 123 __ ret(); | 123 __ ret(); |
| 124 } | 124 } |
| 125 | 125 |
| 126 | 126 |
| 127 ASSEMBLER_TEST_RUN(Movn3, test) { | 127 ASSEMBLER_TEST_RUN(Movn3, test) { |
| 128 typedef int64_t (*Int64Return)() DART_UNUSED; | 128 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 129 EXPECT_EQ(~(42LL << 48), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 129 EXPECT_EQ(~(42LL << 48), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 130 } | 130 } |
| 131 | 131 |
| 132 // movk | 132 // movk |
| 133 ASSEMBLER_TEST_GENERATE(Movk0, assembler) { | 133 ASSEMBLER_TEST_GENERATE(Movk0, assembler) { |
| 134 __ movz(R0, 1, 3); | 134 __ movz(R0, Immediate(1), 3); |
| 135 __ movk(R0, 42, 0); | 135 __ movk(R0, Immediate(42), 0); |
| 136 __ ret(); | 136 __ ret(); |
| 137 } | 137 } |
| 138 | 138 |
| 139 | 139 |
| 140 ASSEMBLER_TEST_RUN(Movk0, test) { | 140 ASSEMBLER_TEST_RUN(Movk0, test) { |
| 141 typedef int64_t (*Int64Return)() DART_UNUSED; | 141 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 142 EXPECT_EQ( | 142 EXPECT_EQ( |
| 143 42LL | (1LL << 48), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 143 42LL | (1LL << 48), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 144 } | 144 } |
| 145 | 145 |
| 146 | 146 |
| 147 ASSEMBLER_TEST_GENERATE(Movk1, assembler) { | 147 ASSEMBLER_TEST_GENERATE(Movk1, assembler) { |
| 148 __ movz(R0, 1, 0); | 148 __ movz(R0, Immediate(1), 0); |
| 149 __ movk(R0, 42, 1); | 149 __ movk(R0, Immediate(42), 1); |
| 150 __ ret(); | 150 __ ret(); |
| 151 } | 151 } |
| 152 | 152 |
| 153 | 153 |
| 154 ASSEMBLER_TEST_RUN(Movk1, test) { | 154 ASSEMBLER_TEST_RUN(Movk1, test) { |
| 155 typedef int64_t (*Int64Return)() DART_UNUSED; | 155 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 156 EXPECT_EQ( | 156 EXPECT_EQ( |
| 157 (42LL << 16) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 157 (42LL << 16) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 158 } | 158 } |
| 159 | 159 |
| 160 | 160 |
| 161 ASSEMBLER_TEST_GENERATE(Movk2, assembler) { | 161 ASSEMBLER_TEST_GENERATE(Movk2, assembler) { |
| 162 __ movz(R0, 1, 0); | 162 __ movz(R0, Immediate(1), 0); |
| 163 __ movk(R0, 42, 2); | 163 __ movk(R0, Immediate(42), 2); |
| 164 __ ret(); | 164 __ ret(); |
| 165 } | 165 } |
| 166 | 166 |
| 167 | 167 |
| 168 ASSEMBLER_TEST_RUN(Movk2, test) { | 168 ASSEMBLER_TEST_RUN(Movk2, test) { |
| 169 typedef int64_t (*Int64Return)() DART_UNUSED; | 169 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 170 EXPECT_EQ( | 170 EXPECT_EQ( |
| 171 (42LL << 32) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 171 (42LL << 32) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 172 } | 172 } |
| 173 | 173 |
| 174 | 174 |
| 175 ASSEMBLER_TEST_GENERATE(Movk3, assembler) { | 175 ASSEMBLER_TEST_GENERATE(Movk3, assembler) { |
| 176 __ movz(R0, 1, 0); | 176 __ movz(R0, Immediate(1), 0); |
| 177 __ movk(R0, 42, 3); | 177 __ movk(R0, Immediate(42), 3); |
| 178 __ ret(); | 178 __ ret(); |
| 179 } | 179 } |
| 180 | 180 |
| 181 | 181 |
| 182 ASSEMBLER_TEST_RUN(Movk3, test) { | 182 ASSEMBLER_TEST_RUN(Movk3, test) { |
| 183 typedef int64_t (*Int64Return)() DART_UNUSED; | 183 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 184 EXPECT_EQ( | 184 EXPECT_EQ( |
| 185 (42LL << 48) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 185 (42LL << 48) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 186 } | 186 } |
| 187 | 187 |
| 188 | 188 |
| 189 ASSEMBLER_TEST_GENERATE(MovzBig, assembler) { | 189 ASSEMBLER_TEST_GENERATE(MovzBig, assembler) { |
| 190 __ movz(R0, 0x8000, 0); | 190 __ movz(R0, Immediate(0x8000), 0); |
| 191 __ ret(); | 191 __ ret(); |
| 192 } | 192 } |
| 193 | 193 |
| 194 | 194 |
| 195 ASSEMBLER_TEST_RUN(MovzBig, test) { | 195 ASSEMBLER_TEST_RUN(MovzBig, test) { |
| 196 typedef int64_t (*Int64Return)() DART_UNUSED; | 196 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 197 EXPECT_EQ(0x8000, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 197 EXPECT_EQ(0x8000, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 198 } | 198 } |
| 199 | 199 |
| 200 | 200 |
| 201 // add tests. | 201 // add tests. |
| 202 ASSEMBLER_TEST_GENERATE(AddReg, assembler) { | 202 ASSEMBLER_TEST_GENERATE(AddReg, assembler) { |
| 203 __ movz(R0, 20, 0); | 203 __ movz(R0, Immediate(20), 0); |
| 204 __ movz(R1, 22, 0); | 204 __ movz(R1, Immediate(22), 0); |
| 205 __ add(R0, R0, Operand(R1)); | 205 __ add(R0, R0, Operand(R1)); |
| 206 __ ret(); | 206 __ ret(); |
| 207 } | 207 } |
| 208 | 208 |
| 209 | 209 |
| 210 ASSEMBLER_TEST_RUN(AddReg, test) { | 210 ASSEMBLER_TEST_RUN(AddReg, test) { |
| 211 typedef int64_t (*Int64Return)() DART_UNUSED; | 211 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 212 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 212 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 213 } | 213 } |
| 214 | 214 |
| 215 | 215 |
| 216 ASSEMBLER_TEST_GENERATE(AddLSLReg, assembler) { | 216 ASSEMBLER_TEST_GENERATE(AddLSLReg, assembler) { |
| 217 __ movz(R0, 20, 0); | 217 __ movz(R0, Immediate(20), 0); |
| 218 __ movz(R1, 11, 0); | 218 __ movz(R1, Immediate(11), 0); |
| 219 __ add(R0, R0, Operand(R1, LSL, 1)); | 219 __ add(R0, R0, Operand(R1, LSL, 1)); |
| 220 __ ret(); | 220 __ ret(); |
| 221 } | 221 } |
| 222 | 222 |
| 223 | 223 |
| 224 ASSEMBLER_TEST_RUN(AddLSLReg, test) { | 224 ASSEMBLER_TEST_RUN(AddLSLReg, test) { |
| 225 typedef int64_t (*Int64Return)() DART_UNUSED; | 225 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 226 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 226 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 227 } | 227 } |
| 228 | 228 |
| 229 | 229 |
| 230 ASSEMBLER_TEST_GENERATE(AddLSRReg, assembler) { | 230 ASSEMBLER_TEST_GENERATE(AddLSRReg, assembler) { |
| 231 __ movz(R0, 20, 0); | 231 __ movz(R0, Immediate(20), 0); |
| 232 __ movz(R1, 44, 0); | 232 __ movz(R1, Immediate(44), 0); |
| 233 __ add(R0, R0, Operand(R1, LSR, 1)); | 233 __ add(R0, R0, Operand(R1, LSR, 1)); |
| 234 __ ret(); | 234 __ ret(); |
| 235 } | 235 } |
| 236 | 236 |
| 237 | 237 |
| 238 ASSEMBLER_TEST_RUN(AddLSRReg, test) { | 238 ASSEMBLER_TEST_RUN(AddLSRReg, test) { |
| 239 typedef int64_t (*Int64Return)() DART_UNUSED; | 239 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 240 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 240 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 241 } | 241 } |
| 242 | 242 |
| 243 | 243 |
| 244 ASSEMBLER_TEST_GENERATE(AddASRReg, assembler) { | 244 ASSEMBLER_TEST_GENERATE(AddASRReg, assembler) { |
| 245 __ movz(R0, 20, 0); | 245 __ movz(R0, Immediate(20), 0); |
| 246 __ movz(R1, 44, 0); | 246 __ movz(R1, Immediate(44), 0); |
| 247 __ add(R0, R0, Operand(R1, ASR, 1)); | 247 __ add(R0, R0, Operand(R1, ASR, 1)); |
| 248 __ ret(); | 248 __ ret(); |
| 249 } | 249 } |
| 250 | 250 |
| 251 | 251 |
| 252 ASSEMBLER_TEST_RUN(AddASRReg, test) { | 252 ASSEMBLER_TEST_RUN(AddASRReg, test) { |
| 253 typedef int64_t (*Int64Return)() DART_UNUSED; | 253 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 254 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 254 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 255 } | 255 } |
| 256 | 256 |
| 257 | 257 |
| 258 ASSEMBLER_TEST_GENERATE(AddASRNegReg, assembler) { | 258 ASSEMBLER_TEST_GENERATE(AddASRNegReg, assembler) { |
| 259 __ movz(R0, 43, 0); | 259 __ movz(R0, Immediate(43), 0); |
| 260 __ movn(R1, 0, 0); // R1 <- -1 | 260 __ movn(R1, Immediate(0), 0); // R1 <- -1 |
| 261 __ add(R1, ZR, Operand(R1, LSL, 3)); // R1 <- -8 | 261 __ add(R1, ZR, Operand(R1, LSL, 3)); // R1 <- -8 |
| 262 __ add(R0, R0, Operand(R1, ASR, 3)); // R0 <- 43 + (-8 >> 3) | 262 __ add(R0, R0, Operand(R1, ASR, 3)); // R0 <- 43 + (-8 >> 3) |
| 263 __ ret(); | 263 __ ret(); |
| 264 } | 264 } |
| 265 | 265 |
| 266 | 266 |
| 267 ASSEMBLER_TEST_RUN(AddASRNegReg, test) { | 267 ASSEMBLER_TEST_RUN(AddASRNegReg, test) { |
| 268 typedef int64_t (*Int64Return)() DART_UNUSED; | 268 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 269 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 269 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 270 } | 270 } |
| 271 | 271 |
| 272 | 272 |
| 273 // TODO(zra): test other sign extension modes. | 273 // TODO(zra): test other sign extension modes. |
| 274 ASSEMBLER_TEST_GENERATE(AddExtReg, assembler) { | 274 ASSEMBLER_TEST_GENERATE(AddExtReg, assembler) { |
| 275 __ movz(R0, 43, 0); | 275 __ movz(R0, Immediate(43), 0); |
| 276 __ movz(R1, 0xffff, 0); | 276 __ movz(R1, Immediate(0xffff), 0); |
| 277 __ movk(R1, 0xffff, 1); // R1 <- -1 (32-bit) | 277 __ movk(R1, Immediate(0xffff), 1); // R1 <- -1 (32-bit) |
| 278 __ add(R0, R0, Operand(R1, SXTW, 0)); // R0 <- R0 + (sign extended R1) | 278 __ add(R0, R0, Operand(R1, SXTW, 0)); // R0 <- R0 + (sign extended R1) |
| 279 __ ret(); | 279 __ ret(); |
| 280 } | 280 } |
| 281 | 281 |
| 282 | 282 |
| 283 ASSEMBLER_TEST_RUN(AddExtReg, test) { | 283 ASSEMBLER_TEST_RUN(AddExtReg, test) { |
| 284 typedef int64_t (*Int64Return)() DART_UNUSED; | 284 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 285 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 285 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 286 } | 286 } |
| 287 | 287 |
| 288 | 288 |
| 289 // Loads and Stores. | 289 // Loads and Stores. |
| 290 ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) { | 290 ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) { |
| 291 __ SetupDartSP(kTestStackSpace); | 291 __ SetupDartSP(kTestStackSpace); |
| 292 __ movz(R0, 43, 0); | 292 __ movz(R0, Immediate(43), 0); |
| 293 __ movz(R1, 42, 0); | 293 __ movz(R1, Immediate(42), 0); |
| 294 __ str(R1, Address(SP, -1*kWordSize, Address::PreIndex)); | 294 __ str(R1, Address(SP, -1*kWordSize, Address::PreIndex)); |
| 295 __ ldr(R0, Address(SP, 1*kWordSize, Address::PostIndex)); | 295 __ ldr(R0, Address(SP, 1*kWordSize, Address::PostIndex)); |
| 296 __ mov(CSP, SP); | 296 __ mov(CSP, SP); |
| 297 __ ret(); | 297 __ ret(); |
| 298 } | 298 } |
| 299 | 299 |
| 300 | 300 |
| 301 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) { | 301 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) { |
| 302 typedef int64_t (*Int64Return)() DART_UNUSED; | 302 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 303 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 303 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 304 } | 304 } |
| 305 | 305 |
| 306 | 306 |
| 307 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) { | 307 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) { |
| 308 __ SetupDartSP(kTestStackSpace); | 308 __ SetupDartSP(kTestStackSpace); |
| 309 __ movz(R0, 43, 0); | 309 __ movz(R0, Immediate(43), 0); |
| 310 __ movz(R1, 42, 0); | 310 __ movz(R1, Immediate(42), 0); |
| 311 __ add(R2, SP, Operand(1)); | 311 __ add(R2, SP, Operand(1)); |
| 312 __ str(R1, Address(R2, -1)); | 312 __ str(R1, Address(R2, -1)); |
| 313 __ ldr(R0, Address(R2, -1)); | 313 __ ldr(R0, Address(R2, -1)); |
| 314 __ mov(CSP, SP); | 314 __ mov(CSP, SP); |
| 315 __ ret(); | 315 __ ret(); |
| 316 } | 316 } |
| 317 | 317 |
| 318 | 318 |
| 319 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) { | 319 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) { |
| 320 typedef int64_t (*Int64Return)() DART_UNUSED; | 320 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 321 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 321 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 322 } | 322 } |
| 323 | 323 |
| 324 | 324 |
| 325 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) { | 325 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) { |
| 326 __ SetupDartSP(kTestStackSpace); | 326 __ SetupDartSP(kTestStackSpace); |
| 327 __ movz(R0, 43, 0); | 327 __ movz(R0, Immediate(43), 0); |
| 328 __ movz(R1, 42, 0); | 328 __ movz(R1, Immediate(42), 0); |
| 329 // Largest negative offset that can fit in the signed 9-bit immediate field. | 329 // Largest negative offset that can fit in the signed 9-bit immediate field. |
| 330 __ str(R1, Address(SP, -32*kWordSize, Address::PreIndex)); | 330 __ str(R1, Address(SP, -32*kWordSize, Address::PreIndex)); |
| 331 // Largest positive kWordSize aligned offset that we can fit. | 331 // Largest positive kWordSize aligned offset that we can fit. |
| 332 __ ldr(R0, Address(SP, 31*kWordSize, Address::PostIndex)); | 332 __ ldr(R0, Address(SP, 31*kWordSize, Address::PostIndex)); |
| 333 // Correction. | 333 // Correction. |
| 334 __ add(SP, SP, Operand(kWordSize)); // Restore SP. | 334 __ add(SP, SP, Operand(kWordSize)); // Restore SP. |
| 335 __ mov(CSP, SP); | 335 __ mov(CSP, SP); |
| 336 __ ret(); | 336 __ ret(); |
| 337 } | 337 } |
| 338 | 338 |
| 339 | 339 |
| 340 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) { | 340 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) { |
| 341 typedef int64_t (*Int64Return)() DART_UNUSED; | 341 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 342 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 342 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 343 } | 343 } |
| 344 | 344 |
| 345 | 345 |
| 346 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) { | 346 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) { |
| 347 __ SetupDartSP(kTestStackSpace); | 347 __ SetupDartSP(kTestStackSpace); |
| 348 __ movz(R0, 43, 0); | 348 __ movz(R0, Immediate(43), 0); |
| 349 __ movz(R1, 42, 0); | 349 __ movz(R1, Immediate(42), 0); |
| 350 __ sub(SP, SP, Operand(512*kWordSize)); | 350 __ sub(SP, SP, Operand(512*kWordSize)); |
| 351 __ str(R1, Address(SP, 512*kWordSize, Address::Offset)); | 351 __ str(R1, Address(SP, 512*kWordSize, Address::Offset)); |
| 352 __ add(SP, SP, Operand(512*kWordSize)); | 352 __ add(SP, SP, Operand(512*kWordSize)); |
| 353 __ ldr(R0, Address(SP)); | 353 __ ldr(R0, Address(SP)); |
| 354 __ mov(CSP, SP); | 354 __ mov(CSP, SP); |
| 355 __ ret(); | 355 __ ret(); |
| 356 } | 356 } |
| 357 | 357 |
| 358 | 358 |
| 359 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) { | 359 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) { |
| 360 typedef int64_t (*Int64Return)() DART_UNUSED; | 360 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 361 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 361 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 362 } | 362 } |
| 363 | 363 |
| 364 | 364 |
| 365 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) { | 365 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) { |
| 366 __ SetupDartSP(kTestStackSpace); | 366 __ SetupDartSP(kTestStackSpace); |
| 367 __ movz(R0, 43, 0); | 367 __ movz(R0, Immediate(43), 0); |
| 368 __ movz(R1, 42, 0); | 368 __ movz(R1, Immediate(42), 0); |
| 369 __ movz(R2, 0xfff8, 0); | 369 __ movz(R2, Immediate(0xfff8), 0); |
| 370 __ movk(R2, 0xffff, 1); // R2 <- -8 (int32_t). | 370 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). |
| 371 // This should sign extend R2, and add to SP to get address, | 371 // This should sign extend R2, and add to SP to get address, |
| 372 // i.e. SP - kWordSize. | 372 // i.e. SP - kWordSize. |
| 373 __ str(R1, Address(SP, R2, SXTW)); | 373 __ str(R1, Address(SP, R2, SXTW)); |
| 374 __ sub(SP, SP, Operand(kWordSize)); | 374 __ sub(SP, SP, Operand(kWordSize)); |
| 375 __ ldr(R0, Address(SP)); | 375 __ ldr(R0, Address(SP)); |
| 376 __ add(SP, SP, Operand(kWordSize)); | 376 __ add(SP, SP, Operand(kWordSize)); |
| 377 __ mov(CSP, SP); | 377 __ mov(CSP, SP); |
| 378 __ ret(); | 378 __ ret(); |
| 379 } | 379 } |
| 380 | 380 |
| 381 | 381 |
| 382 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) { | 382 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) { |
| 383 typedef int64_t (*Int64Return)() DART_UNUSED; | 383 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 384 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 384 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 385 } | 385 } |
| 386 | 386 |
| 387 | 387 |
| 388 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) { | 388 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) { |
| 389 __ SetupDartSP(kTestStackSpace); | 389 __ SetupDartSP(kTestStackSpace); |
| 390 __ movz(R0, 43, 0); | 390 __ movz(R0, Immediate(43), 0); |
| 391 __ movz(R1, 42, 0); | 391 __ movz(R1, Immediate(42), 0); |
| 392 __ movz(R2, 10, 0); | 392 __ movz(R2, Immediate(10), 0); |
| 393 __ sub(SP, SP, Operand(10*kWordSize)); | 393 __ sub(SP, SP, Operand(10*kWordSize)); |
| 394 // Store R1 into SP + R2 * kWordSize. | 394 // Store R1 into SP + R2 * kWordSize. |
| 395 __ str(R1, Address(SP, R2, UXTX, Address::Scaled)); | 395 __ str(R1, Address(SP, R2, UXTX, Address::Scaled)); |
| 396 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled)); | 396 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled)); |
| 397 __ add(SP, SP, Operand(10*kWordSize)); | 397 __ add(SP, SP, Operand(10*kWordSize)); |
| 398 __ mov(CSP, SP); | 398 __ mov(CSP, SP); |
| 399 __ ret(); | 399 __ ret(); |
| 400 } | 400 } |
| 401 | 401 |
| 402 | 402 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 418 | 418 |
| 419 | 419 |
| 420 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) { | 420 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) { |
| 421 typedef int64_t (*Int64Return)() DART_UNUSED; | 421 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 422 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 422 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 423 } | 423 } |
| 424 | 424 |
| 425 | 425 |
| 426 // Logical register operations. | 426 // Logical register operations. |
| 427 ASSEMBLER_TEST_GENERATE(AndRegs, assembler) { | 427 ASSEMBLER_TEST_GENERATE(AndRegs, assembler) { |
| 428 __ movz(R1, 43, 0); | 428 __ movz(R1, Immediate(43), 0); |
| 429 __ movz(R2, 42, 0); | 429 __ movz(R2, Immediate(42), 0); |
| 430 __ and_(R0, R1, Operand(R2)); | 430 __ and_(R0, R1, Operand(R2)); |
| 431 __ ret(); | 431 __ ret(); |
| 432 } | 432 } |
| 433 | 433 |
| 434 | 434 |
| 435 ASSEMBLER_TEST_RUN(AndRegs, test) { | 435 ASSEMBLER_TEST_RUN(AndRegs, test) { |
| 436 typedef int64_t (*Int64Return)() DART_UNUSED; | 436 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 437 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 437 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 438 } | 438 } |
| 439 | 439 |
| 440 | 440 |
| 441 ASSEMBLER_TEST_GENERATE(AndShiftRegs, assembler) { | 441 ASSEMBLER_TEST_GENERATE(AndShiftRegs, assembler) { |
| 442 __ movz(R1, 42, 0); | 442 __ movz(R1, Immediate(42), 0); |
| 443 __ movz(R2, 21, 0); | 443 __ movz(R2, Immediate(21), 0); |
| 444 __ and_(R0, R1, Operand(R2, LSL, 1)); | 444 __ and_(R0, R1, Operand(R2, LSL, 1)); |
| 445 __ ret(); | 445 __ ret(); |
| 446 } | 446 } |
| 447 | 447 |
| 448 | 448 |
| 449 ASSEMBLER_TEST_RUN(AndShiftRegs, test) { | 449 ASSEMBLER_TEST_RUN(AndShiftRegs, test) { |
| 450 typedef int64_t (*Int64Return)() DART_UNUSED; | 450 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 451 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 451 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 452 } | 452 } |
| 453 | 453 |
| 454 | 454 |
| 455 ASSEMBLER_TEST_GENERATE(BicRegs, assembler) { | 455 ASSEMBLER_TEST_GENERATE(BicRegs, assembler) { |
| 456 __ movz(R1, 42, 0); | 456 __ movz(R1, Immediate(42), 0); |
| 457 __ movz(R2, 5, 0); | 457 __ movz(R2, Immediate(5), 0); |
| 458 __ bic(R0, R1, Operand(R2)); | 458 __ bic(R0, R1, Operand(R2)); |
| 459 __ ret(); | 459 __ ret(); |
| 460 } | 460 } |
| 461 | 461 |
| 462 | 462 |
| 463 ASSEMBLER_TEST_RUN(BicRegs, test) { | 463 ASSEMBLER_TEST_RUN(BicRegs, test) { |
| 464 typedef int64_t (*Int64Return)() DART_UNUSED; | 464 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 465 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 465 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 466 } | 466 } |
| 467 | 467 |
| 468 | 468 |
| 469 ASSEMBLER_TEST_GENERATE(OrrRegs, assembler) { | 469 ASSEMBLER_TEST_GENERATE(OrrRegs, assembler) { |
| 470 __ movz(R1, 32, 0); | 470 __ movz(R1, Immediate(32), 0); |
| 471 __ movz(R2, 10, 0); | 471 __ movz(R2, Immediate(10), 0); |
| 472 __ orr(R0, R1, Operand(R2)); | 472 __ orr(R0, R1, Operand(R2)); |
| 473 __ ret(); | 473 __ ret(); |
| 474 } | 474 } |
| 475 | 475 |
| 476 | 476 |
| 477 ASSEMBLER_TEST_RUN(OrrRegs, test) { | 477 ASSEMBLER_TEST_RUN(OrrRegs, test) { |
| 478 typedef int64_t (*Int64Return)() DART_UNUSED; | 478 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 479 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 479 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 480 } | 480 } |
| 481 | 481 |
| 482 | 482 |
| 483 ASSEMBLER_TEST_GENERATE(OrnRegs, assembler) { | 483 ASSEMBLER_TEST_GENERATE(OrnRegs, assembler) { |
| 484 __ movz(R1, 32, 0); | 484 __ movz(R1, Immediate(32), 0); |
| 485 __ movn(R2, 0, 0); // R2 <- 0xffffffffffffffff. | 485 __ movn(R2, Immediate(0), 0); // R2 <- 0xffffffffffffffff. |
| 486 __ movk(R2, 0xffd5, 0); // R2 <- 0xffffffffffffffe5. | 486 __ movk(R2, Immediate(0xffd5), 0); // R2 <- 0xffffffffffffffe5. |
| 487 __ orn(R0, R1, Operand(R2)); | 487 __ orn(R0, R1, Operand(R2)); |
| 488 __ ret(); | 488 __ ret(); |
| 489 } | 489 } |
| 490 | 490 |
| 491 | 491 |
| 492 ASSEMBLER_TEST_RUN(OrnRegs, test) { | 492 ASSEMBLER_TEST_RUN(OrnRegs, test) { |
| 493 typedef int64_t (*Int64Return)() DART_UNUSED; | 493 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 494 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 494 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 495 } | 495 } |
| 496 | 496 |
| 497 | 497 |
| 498 ASSEMBLER_TEST_GENERATE(EorRegs, assembler) { | 498 ASSEMBLER_TEST_GENERATE(EorRegs, assembler) { |
| 499 __ movz(R1, 0xffd5, 0); | 499 __ movz(R1, Immediate(0xffd5), 0); |
| 500 __ movz(R2, 0xffff, 0); | 500 __ movz(R2, Immediate(0xffff), 0); |
| 501 __ eor(R0, R1, Operand(R2)); | 501 __ eor(R0, R1, Operand(R2)); |
| 502 __ ret(); | 502 __ ret(); |
| 503 } | 503 } |
| 504 | 504 |
| 505 | 505 |
| 506 ASSEMBLER_TEST_RUN(EorRegs, test) { | 506 ASSEMBLER_TEST_RUN(EorRegs, test) { |
| 507 typedef int64_t (*Int64Return)() DART_UNUSED; | 507 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 508 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 508 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 509 } | 509 } |
| 510 | 510 |
| 511 | 511 |
| 512 ASSEMBLER_TEST_GENERATE(EonRegs, assembler) { | 512 ASSEMBLER_TEST_GENERATE(EonRegs, assembler) { |
| 513 __ movz(R1, 0xffd5, 0); | 513 __ movz(R1, Immediate(0xffd5), 0); |
| 514 __ movn(R2, 0xffff, 0); | 514 __ movn(R2, Immediate(0xffff), 0); |
| 515 __ eon(R0, R1, Operand(R2)); | 515 __ eon(R0, R1, Operand(R2)); |
| 516 __ ret(); | 516 __ ret(); |
| 517 } | 517 } |
| 518 | 518 |
| 519 | 519 |
| 520 ASSEMBLER_TEST_RUN(EonRegs, test) { | 520 ASSEMBLER_TEST_RUN(EonRegs, test) { |
| 521 typedef int64_t (*Int64Return)() DART_UNUSED; | 521 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 522 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 522 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 523 } | 523 } |
| 524 | 524 |
| 525 | 525 |
| 526 // Logical immediate operations. | 526 // Logical immediate operations. |
| 527 ASSEMBLER_TEST_GENERATE(AndImm, assembler) { | 527 ASSEMBLER_TEST_GENERATE(AndImm, assembler) { |
| 528 __ movz(R1, 42, 0); | 528 __ movz(R1, Immediate(42), 0); |
| 529 __ andi(R0, R1, 0xaaaaaaaaaaaaaaaaULL); | 529 __ andi(R0, R1, Immediate(0xaaaaaaaaaaaaaaaaULL)); |
| 530 __ ret(); | 530 __ ret(); |
| 531 } | 531 } |
| 532 | 532 |
| 533 | 533 |
| 534 ASSEMBLER_TEST_RUN(AndImm, test) { | 534 ASSEMBLER_TEST_RUN(AndImm, test) { |
| 535 typedef int64_t (*Int64Return)() DART_UNUSED; | 535 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 536 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 536 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 537 } | 537 } |
| 538 | 538 |
| 539 | 539 |
| 540 ASSEMBLER_TEST_GENERATE(AndOneImm, assembler) { | 540 ASSEMBLER_TEST_GENERATE(AndOneImm, assembler) { |
| 541 __ movz(R1, 43, 0); | 541 __ movz(R1, Immediate(43), 0); |
| 542 __ andi(R0, R1, 1); | 542 __ andi(R0, R1, Immediate(1)); |
| 543 __ ret(); | 543 __ ret(); |
| 544 } | 544 } |
| 545 | 545 |
| 546 | 546 |
| 547 ASSEMBLER_TEST_RUN(AndOneImm, test) { | 547 ASSEMBLER_TEST_RUN(AndOneImm, test) { |
| 548 typedef int64_t (*Int64Return)() DART_UNUSED; | 548 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 549 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 549 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 550 } | 550 } |
| 551 | 551 |
| 552 | 552 |
| 553 ASSEMBLER_TEST_GENERATE(OrrImm, assembler) { | 553 ASSEMBLER_TEST_GENERATE(OrrImm, assembler) { |
| 554 __ movz(R1, 0, 0); | 554 __ movz(R1, Immediate(0), 0); |
| 555 __ movz(R2, 0x3f, 0); | 555 __ movz(R2, Immediate(0x3f), 0); |
| 556 __ movz(R3, 0xa, 0); | 556 __ movz(R3, Immediate(0xa), 0); |
| 557 __ orri(R1, R1, 0x0020002000200020ULL); | 557 __ orri(R1, R1, Immediate(0x0020002000200020ULL)); |
| 558 __ orr(R1, R1, Operand(R3)); | 558 __ orr(R1, R1, Operand(R3)); |
| 559 __ and_(R0, R1, Operand(R2)); | 559 __ and_(R0, R1, Operand(R2)); |
| 560 __ ret(); | 560 __ ret(); |
| 561 } | 561 } |
| 562 | 562 |
| 563 | 563 |
| 564 ASSEMBLER_TEST_RUN(OrrImm, test) { | 564 ASSEMBLER_TEST_RUN(OrrImm, test) { |
| 565 typedef int64_t (*Int64Return)() DART_UNUSED; | 565 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 566 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 566 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 567 } | 567 } |
| 568 | 568 |
| 569 | 569 |
| 570 ASSEMBLER_TEST_GENERATE(EorImm, assembler) { | 570 ASSEMBLER_TEST_GENERATE(EorImm, assembler) { |
| 571 __ movn(R0, 0, 0); | 571 __ movn(R0, Immediate(0), 0); |
| 572 __ movk(R0, 0xffd5, 0); // R0 < 0xffffffffffffffd5. | 572 __ movk(R0, Immediate(0xffd5), 0); // R0 < 0xffffffffffffffd5. |
| 573 __ movz(R1, 0x3f, 0); | 573 __ movz(R1, Immediate(0x3f), 0); |
| 574 __ eori(R0, R0, 0x3f3f3f3f3f3f3f3fULL); | 574 __ eori(R0, R0, Immediate(0x3f3f3f3f3f3f3f3fULL)); |
| 575 __ and_(R0, R0, Operand(R1)); | 575 __ and_(R0, R0, Operand(R1)); |
| 576 __ ret(); | 576 __ ret(); |
| 577 } | 577 } |
| 578 | 578 |
| 579 | 579 |
| 580 ASSEMBLER_TEST_RUN(EorImm, test) { | 580 ASSEMBLER_TEST_RUN(EorImm, test) { |
| 581 typedef int64_t (*Int64Return)() DART_UNUSED; | 581 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 582 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 582 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 583 } | 583 } |
| 584 | 584 |
| 585 | 585 |
| 586 // Comparisons, branching. | 586 // Comparisons, branching. |
| 587 ASSEMBLER_TEST_GENERATE(BranchALForward, assembler) { | 587 ASSEMBLER_TEST_GENERATE(BranchALForward, assembler) { |
| 588 Label l; | 588 Label l; |
| 589 __ movz(R0, 42, 0); | 589 __ movz(R0, Immediate(42), 0); |
| 590 __ b(&l, AL); | 590 __ b(&l, AL); |
| 591 __ movz(R0, 0, 0); | 591 __ movz(R0, Immediate(0), 0); |
| 592 __ Bind(&l); | 592 __ Bind(&l); |
| 593 __ ret(); | 593 __ ret(); |
| 594 } | 594 } |
| 595 | 595 |
| 596 | 596 |
| 597 ASSEMBLER_TEST_RUN(BranchALForward, test) { | 597 ASSEMBLER_TEST_RUN(BranchALForward, test) { |
| 598 typedef int64_t (*Int64Return)() DART_UNUSED; | 598 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 599 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 599 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 600 } | 600 } |
| 601 | 601 |
| 602 | 602 |
| 603 ASSEMBLER_TEST_GENERATE(BranchALBackwards, assembler) { | 603 ASSEMBLER_TEST_GENERATE(BranchALBackwards, assembler) { |
| 604 Label l, leave; | 604 Label l, leave; |
| 605 __ movz(R0, 42, 0); | 605 __ movz(R0, Immediate(42), 0); |
| 606 __ b(&l, AL); | 606 __ b(&l, AL); |
| 607 | 607 |
| 608 __ movz(R0, 0, 0); | 608 __ movz(R0, Immediate(0), 0); |
| 609 __ Bind(&leave); | 609 __ Bind(&leave); |
| 610 __ ret(); | 610 __ ret(); |
| 611 __ movz(R0, 0, 0); | 611 __ movz(R0, Immediate(0), 0); |
| 612 | 612 |
| 613 __ Bind(&l); | 613 __ Bind(&l); |
| 614 __ b(&leave, AL); | 614 __ b(&leave, AL); |
| 615 __ movz(R0, 0, 0); | 615 __ movz(R0, Immediate(0), 0); |
| 616 __ ret(); | 616 __ ret(); |
| 617 } | 617 } |
| 618 | 618 |
| 619 | 619 |
| 620 ASSEMBLER_TEST_RUN(BranchALBackwards, test) { | 620 ASSEMBLER_TEST_RUN(BranchALBackwards, test) { |
| 621 typedef int64_t (*Int64Return)() DART_UNUSED; | 621 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 622 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 622 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 623 } | 623 } |
| 624 | 624 |
| 625 | 625 |
| 626 ASSEMBLER_TEST_GENERATE(CmpEqBranch, assembler) { | 626 ASSEMBLER_TEST_GENERATE(CmpEqBranch, assembler) { |
| 627 Label l; | 627 Label l; |
| 628 | 628 |
| 629 __ movz(R0, 42, 0); | 629 __ movz(R0, Immediate(42), 0); |
| 630 __ movz(R1, 234, 0); | 630 __ movz(R1, Immediate(234), 0); |
| 631 __ movz(R2, 234, 0); | 631 __ movz(R2, Immediate(234), 0); |
| 632 | 632 |
| 633 __ cmp(R1, Operand(R2)); | 633 __ cmp(R1, Operand(R2)); |
| 634 __ b(&l, EQ); | 634 __ b(&l, EQ); |
| 635 __ movz(R0, 0, 0); | 635 __ movz(R0, Immediate(0), 0); |
| 636 __ Bind(&l); | 636 __ Bind(&l); |
| 637 __ ret(); | 637 __ ret(); |
| 638 } | 638 } |
| 639 | 639 |
| 640 | 640 |
| 641 ASSEMBLER_TEST_RUN(CmpEqBranch, test) { | 641 ASSEMBLER_TEST_RUN(CmpEqBranch, test) { |
| 642 typedef int64_t (*Int64Return)() DART_UNUSED; | 642 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 643 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 643 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 644 } | 644 } |
| 645 | 645 |
| 646 | 646 |
| 647 ASSEMBLER_TEST_GENERATE(CmpEqBranchNotTaken, assembler) { | 647 ASSEMBLER_TEST_GENERATE(CmpEqBranchNotTaken, assembler) { |
| 648 Label l; | 648 Label l; |
| 649 | 649 |
| 650 __ movz(R0, 0, 0); | 650 __ movz(R0, Immediate(0), 0); |
| 651 __ movz(R1, 233, 0); | 651 __ movz(R1, Immediate(233), 0); |
| 652 __ movz(R2, 234, 0); | 652 __ movz(R2, Immediate(234), 0); |
| 653 | 653 |
| 654 __ cmp(R1, Operand(R2)); | 654 __ cmp(R1, Operand(R2)); |
| 655 __ b(&l, EQ); | 655 __ b(&l, EQ); |
| 656 __ movz(R0, 42, 0); | 656 __ movz(R0, Immediate(42), 0); |
| 657 __ Bind(&l); | 657 __ Bind(&l); |
| 658 __ ret(); | 658 __ ret(); |
| 659 } | 659 } |
| 660 | 660 |
| 661 | 661 |
| 662 ASSEMBLER_TEST_RUN(CmpEqBranchNotTaken, test) { | 662 ASSEMBLER_TEST_RUN(CmpEqBranchNotTaken, test) { |
| 663 typedef int64_t (*Int64Return)() DART_UNUSED; | 663 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 664 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 664 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 665 } | 665 } |
| 666 | 666 |
| 667 | 667 |
| 668 ASSEMBLER_TEST_GENERATE(CmpEq1Branch, assembler) { | 668 ASSEMBLER_TEST_GENERATE(CmpEq1Branch, assembler) { |
| 669 Label l; | 669 Label l; |
| 670 | 670 |
| 671 __ movz(R0, 42, 0); | 671 __ movz(R0, Immediate(42), 0); |
| 672 __ movz(R1, 1, 0); | 672 __ movz(R1, Immediate(1), 0); |
| 673 | 673 |
| 674 __ cmp(R1, Operand(1)); | 674 __ cmp(R1, Operand(1)); |
| 675 __ b(&l, EQ); | 675 __ b(&l, EQ); |
| 676 __ movz(R0, 0, 0); | 676 __ movz(R0, Immediate(0), 0); |
| 677 __ Bind(&l); | 677 __ Bind(&l); |
| 678 __ ret(); | 678 __ ret(); |
| 679 } | 679 } |
| 680 | 680 |
| 681 | 681 |
| 682 ASSEMBLER_TEST_RUN(CmpEq1Branch, test) { | 682 ASSEMBLER_TEST_RUN(CmpEq1Branch, test) { |
| 683 typedef int64_t (*Int64Return)() DART_UNUSED; | 683 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 684 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 684 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 685 } | 685 } |
| 686 | 686 |
| 687 | 687 |
| 688 ASSEMBLER_TEST_GENERATE(CmnEq1Branch, assembler) { | 688 ASSEMBLER_TEST_GENERATE(CmnEq1Branch, assembler) { |
| 689 Label l; | 689 Label l; |
| 690 | 690 |
| 691 __ movz(R0, 42, 0); | 691 __ movz(R0, Immediate(42), 0); |
| 692 __ movn(R1, 0, 0); // R1 <- -1 | 692 __ movn(R1, Immediate(0), 0); // R1 <- -1 |
| 693 | 693 |
| 694 __ cmn(R1, Operand(1)); | 694 __ cmn(R1, Operand(1)); |
| 695 __ b(&l, EQ); | 695 __ b(&l, EQ); |
| 696 __ movz(R0, 0, 0); | 696 __ movz(R0, Immediate(0), 0); |
| 697 __ Bind(&l); | 697 __ Bind(&l); |
| 698 __ ret(); | 698 __ ret(); |
| 699 } | 699 } |
| 700 | 700 |
| 701 | 701 |
| 702 ASSEMBLER_TEST_RUN(CmnEq1Branch, test) { | 702 ASSEMBLER_TEST_RUN(CmnEq1Branch, test) { |
| 703 typedef int64_t (*Int64Return)() DART_UNUSED; | 703 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 704 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 704 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 705 } | 705 } |
| 706 | 706 |
| 707 | 707 |
| 708 ASSEMBLER_TEST_GENERATE(CmpLtBranch, assembler) { | 708 ASSEMBLER_TEST_GENERATE(CmpLtBranch, assembler) { |
| 709 Label l; | 709 Label l; |
| 710 | 710 |
| 711 __ movz(R0, 42, 0); | 711 __ movz(R0, Immediate(42), 0); |
| 712 __ movz(R1, 233, 0); | 712 __ movz(R1, Immediate(233), 0); |
| 713 __ movz(R2, 234, 0); | 713 __ movz(R2, Immediate(234), 0); |
| 714 | 714 |
| 715 __ cmp(R1, Operand(R2)); | 715 __ cmp(R1, Operand(R2)); |
| 716 __ b(&l, LT); | 716 __ b(&l, LT); |
| 717 __ movz(R0, 0, 0); | 717 __ movz(R0, Immediate(0), 0); |
| 718 __ Bind(&l); | 718 __ Bind(&l); |
| 719 __ ret(); | 719 __ ret(); |
| 720 } | 720 } |
| 721 | 721 |
| 722 | 722 |
| 723 ASSEMBLER_TEST_RUN(CmpLtBranch, test) { | 723 ASSEMBLER_TEST_RUN(CmpLtBranch, test) { |
| 724 typedef int64_t (*Int64Return)() DART_UNUSED; | 724 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 725 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 725 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 726 } | 726 } |
| 727 | 727 |
| 728 | 728 |
| 729 ASSEMBLER_TEST_GENERATE(CmpLtBranchNotTaken, assembler) { | 729 ASSEMBLER_TEST_GENERATE(CmpLtBranchNotTaken, assembler) { |
| 730 Label l; | 730 Label l; |
| 731 | 731 |
| 732 __ movz(R0, 0, 0); | 732 __ movz(R0, Immediate(0), 0); |
| 733 __ movz(R1, 235, 0); | 733 __ movz(R1, Immediate(235), 0); |
| 734 __ movz(R2, 234, 0); | 734 __ movz(R2, Immediate(234), 0); |
| 735 | 735 |
| 736 __ cmp(R1, Operand(R2)); | 736 __ cmp(R1, Operand(R2)); |
| 737 __ b(&l, LT); | 737 __ b(&l, LT); |
| 738 __ movz(R0, 42, 0); | 738 __ movz(R0, Immediate(42), 0); |
| 739 __ Bind(&l); | 739 __ Bind(&l); |
| 740 __ ret(); | 740 __ ret(); |
| 741 } | 741 } |
| 742 | 742 |
| 743 | 743 |
| 744 ASSEMBLER_TEST_RUN(CmpLtBranchNotTaken, test) { | 744 ASSEMBLER_TEST_RUN(CmpLtBranchNotTaken, test) { |
| 745 typedef int64_t (*Int64Return)() DART_UNUSED; | 745 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 746 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 746 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 747 } | 747 } |
| 748 | 748 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 849 | 849 |
| 850 ASSEMBLER_TEST_RUN(FcmpzGtBranch, test) { | 850 ASSEMBLER_TEST_RUN(FcmpzGtBranch, test) { |
| 851 typedef double (*DoubleReturn)() DART_UNUSED; | 851 typedef double (*DoubleReturn)() DART_UNUSED; |
| 852 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 852 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 853 } | 853 } |
| 854 | 854 |
| 855 | 855 |
| 856 ASSEMBLER_TEST_GENERATE(AndsBranch, assembler) { | 856 ASSEMBLER_TEST_GENERATE(AndsBranch, assembler) { |
| 857 Label l; | 857 Label l; |
| 858 | 858 |
| 859 __ movz(R0, 42, 0); | 859 __ movz(R0, Immediate(42), 0); |
| 860 __ movz(R1, 2, 0); | 860 __ movz(R1, Immediate(2), 0); |
| 861 __ movz(R2, 1, 0); | 861 __ movz(R2, Immediate(1), 0); |
| 862 | 862 |
| 863 __ ands(R3, R1, Operand(R2)); | 863 __ ands(R3, R1, Operand(R2)); |
| 864 __ b(&l, EQ); | 864 __ b(&l, EQ); |
| 865 __ movz(R0, 0, 0); | 865 __ movz(R0, Immediate(0), 0); |
| 866 __ Bind(&l); | 866 __ Bind(&l); |
| 867 __ ret(); | 867 __ ret(); |
| 868 } | 868 } |
| 869 | 869 |
| 870 | 870 |
| 871 ASSEMBLER_TEST_RUN(AndsBranch, test) { | 871 ASSEMBLER_TEST_RUN(AndsBranch, test) { |
| 872 typedef int64_t (*Int64Return)() DART_UNUSED; | 872 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 873 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 873 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 874 } | 874 } |
| 875 | 875 |
| 876 | 876 |
| 877 ASSEMBLER_TEST_GENERATE(AndsBranchNotTaken, assembler) { | 877 ASSEMBLER_TEST_GENERATE(AndsBranchNotTaken, assembler) { |
| 878 Label l; | 878 Label l; |
| 879 | 879 |
| 880 __ movz(R0, 0, 0); | 880 __ movz(R0, Immediate(0), 0); |
| 881 __ movz(R1, 2, 0); | 881 __ movz(R1, Immediate(2), 0); |
| 882 __ movz(R2, 2, 0); | 882 __ movz(R2, Immediate(2), 0); |
| 883 | 883 |
| 884 __ ands(R3, R1, Operand(R2)); | 884 __ ands(R3, R1, Operand(R2)); |
| 885 __ b(&l, EQ); | 885 __ b(&l, EQ); |
| 886 __ movz(R0, 42, 0); | 886 __ movz(R0, Immediate(42), 0); |
| 887 __ Bind(&l); | 887 __ Bind(&l); |
| 888 __ ret(); | 888 __ ret(); |
| 889 } | 889 } |
| 890 | 890 |
| 891 | 891 |
| 892 ASSEMBLER_TEST_RUN(AndsBranchNotTaken, test) { | 892 ASSEMBLER_TEST_RUN(AndsBranchNotTaken, test) { |
| 893 typedef int64_t (*Int64Return)() DART_UNUSED; | 893 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 894 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 894 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 895 } | 895 } |
| 896 | 896 |
| 897 | 897 |
| 898 ASSEMBLER_TEST_GENERATE(BicsBranch, assembler) { | 898 ASSEMBLER_TEST_GENERATE(BicsBranch, assembler) { |
| 899 Label l; | 899 Label l; |
| 900 | 900 |
| 901 __ movz(R0, 42, 0); | 901 __ movz(R0, Immediate(42), 0); |
| 902 __ movz(R1, 2, 0); | 902 __ movz(R1, Immediate(2), 0); |
| 903 __ movz(R2, 2, 0); | 903 __ movz(R2, Immediate(2), 0); |
| 904 | 904 |
| 905 __ bics(R3, R1, Operand(R2)); | 905 __ bics(R3, R1, Operand(R2)); |
| 906 __ b(&l, EQ); | 906 __ b(&l, EQ); |
| 907 __ movz(R0, 0, 0); | 907 __ movz(R0, Immediate(0), 0); |
| 908 __ Bind(&l); | 908 __ Bind(&l); |
| 909 __ ret(); | 909 __ ret(); |
| 910 } | 910 } |
| 911 | 911 |
| 912 | 912 |
| 913 ASSEMBLER_TEST_RUN(BicsBranch, test) { | 913 ASSEMBLER_TEST_RUN(BicsBranch, test) { |
| 914 typedef int64_t (*Int64Return)() DART_UNUSED; | 914 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 915 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 915 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 916 } | 916 } |
| 917 | 917 |
| 918 | 918 |
| 919 ASSEMBLER_TEST_GENERATE(BicsBranchNotTaken, assembler) { | 919 ASSEMBLER_TEST_GENERATE(BicsBranchNotTaken, assembler) { |
| 920 Label l; | 920 Label l; |
| 921 | 921 |
| 922 __ movz(R0, 0, 0); | 922 __ movz(R0, Immediate(0), 0); |
| 923 __ movz(R1, 2, 0); | 923 __ movz(R1, Immediate(2), 0); |
| 924 __ movz(R2, 1, 0); | 924 __ movz(R2, Immediate(1), 0); |
| 925 | 925 |
| 926 __ bics(R3, R1, Operand(R2)); | 926 __ bics(R3, R1, Operand(R2)); |
| 927 __ b(&l, EQ); | 927 __ b(&l, EQ); |
| 928 __ movz(R0, 42, 0); | 928 __ movz(R0, Immediate(42), 0); |
| 929 __ Bind(&l); | 929 __ Bind(&l); |
| 930 __ ret(); | 930 __ ret(); |
| 931 } | 931 } |
| 932 | 932 |
| 933 | 933 |
| 934 ASSEMBLER_TEST_RUN(BicsBranchNotTaken, test) { | 934 ASSEMBLER_TEST_RUN(BicsBranchNotTaken, test) { |
| 935 typedef int64_t (*Int64Return)() DART_UNUSED; | 935 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 936 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 936 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 937 } | 937 } |
| 938 | 938 |
| 939 | 939 |
| 940 ASSEMBLER_TEST_GENERATE(AndisBranch, assembler) { | 940 ASSEMBLER_TEST_GENERATE(AndisBranch, assembler) { |
| 941 Label l; | 941 Label l; |
| 942 | 942 |
| 943 __ movz(R0, 42, 0); | 943 __ movz(R0, Immediate(42), 0); |
| 944 __ movz(R1, 2, 0); | 944 __ movz(R1, Immediate(2), 0); |
| 945 | 945 |
| 946 __ andis(R3, R1, 1); | 946 __ andis(R3, R1, Immediate(1)); |
| 947 __ b(&l, EQ); | 947 __ b(&l, EQ); |
| 948 __ movz(R0, 0, 0); | 948 __ movz(R0, Immediate(0), 0); |
| 949 __ Bind(&l); | 949 __ Bind(&l); |
| 950 __ ret(); | 950 __ ret(); |
| 951 } | 951 } |
| 952 | 952 |
| 953 | 953 |
| 954 ASSEMBLER_TEST_RUN(AndisBranch, test) { | 954 ASSEMBLER_TEST_RUN(AndisBranch, test) { |
| 955 typedef int64_t (*Int64Return)() DART_UNUSED; | 955 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 956 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 956 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 957 } | 957 } |
| 958 | 958 |
| 959 | 959 |
| 960 ASSEMBLER_TEST_GENERATE(AndisBranchNotTaken, assembler) { | 960 ASSEMBLER_TEST_GENERATE(AndisBranchNotTaken, assembler) { |
| 961 Label l; | 961 Label l; |
| 962 | 962 |
| 963 __ movz(R0, 0, 0); | 963 __ movz(R0, Immediate(0), 0); |
| 964 __ movz(R1, 2, 0); | 964 __ movz(R1, Immediate(2), 0); |
| 965 | 965 |
| 966 __ andis(R3, R1, 2); | 966 __ andis(R3, R1, Immediate(2)); |
| 967 __ b(&l, EQ); | 967 __ b(&l, EQ); |
| 968 __ movz(R0, 42, 0); | 968 __ movz(R0, Immediate(42), 0); |
| 969 __ Bind(&l); | 969 __ Bind(&l); |
| 970 __ ret(); | 970 __ ret(); |
| 971 } | 971 } |
| 972 | 972 |
| 973 | 973 |
| 974 ASSEMBLER_TEST_RUN(AndisBranchNotTaken, test) { | 974 ASSEMBLER_TEST_RUN(AndisBranchNotTaken, test) { |
| 975 typedef int64_t (*Int64Return)() DART_UNUSED; | 975 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 976 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 976 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 977 } | 977 } |
| 978 | 978 |
| 979 | 979 |
| 980 // Address of PC-rel offset, br, blr. | 980 // Address of PC-rel offset, br, blr. |
| 981 ASSEMBLER_TEST_GENERATE(AdrBr, assembler) { | 981 ASSEMBLER_TEST_GENERATE(AdrBr, assembler) { |
| 982 __ movz(R0, 123, 0); | 982 __ movz(R0, Immediate(123), 0); |
| 983 __ adr(R1, 3 * Instr::kInstrSize); // R1 <- PC + 3*Instr::kInstrSize | 983 // R1 <- PC + 3*Instr::kInstrSize |
| 984 __ adr(R1, Immediate(3 * Instr::kInstrSize)); |
| 984 __ br(R1); | 985 __ br(R1); |
| 985 __ ret(); | 986 __ ret(); |
| 986 | 987 |
| 987 // br goes here. | 988 // br goes here. |
| 988 __ movz(R0, 42, 0); | 989 __ movz(R0, Immediate(42), 0); |
| 989 __ ret(); | 990 __ ret(); |
| 990 } | 991 } |
| 991 | 992 |
| 992 | 993 |
| 993 ASSEMBLER_TEST_RUN(AdrBr, test) { | 994 ASSEMBLER_TEST_RUN(AdrBr, test) { |
| 994 typedef int64_t (*Int64Return)() DART_UNUSED; | 995 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 995 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 996 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 996 } | 997 } |
| 997 | 998 |
| 998 | 999 |
| 999 ASSEMBLER_TEST_GENERATE(AdrBlr, assembler) { | 1000 ASSEMBLER_TEST_GENERATE(AdrBlr, assembler) { |
| 1000 __ movz(R0, 123, 0); | 1001 __ movz(R0, Immediate(123), 0); |
| 1001 __ add(R3, ZR, Operand(LR)); // Save LR. | 1002 __ add(R3, ZR, Operand(LR)); // Save LR. |
| 1002 __ adr(R1, 4 * Instr::kInstrSize); // R1 <- PC + 4*Instr::kInstrSize | 1003 // R1 <- PC + 4*Instr::kInstrSize |
| 1004 __ adr(R1, Immediate(4 * Instr::kInstrSize)); |
| 1003 __ blr(R1); | 1005 __ blr(R1); |
| 1004 __ add(LR, ZR, Operand(R3)); | 1006 __ add(LR, ZR, Operand(R3)); |
| 1005 __ ret(); | 1007 __ ret(); |
| 1006 | 1008 |
| 1007 // blr goes here. | 1009 // blr goes here. |
| 1008 __ movz(R0, 42, 0); | 1010 __ movz(R0, Immediate(42), 0); |
| 1009 __ ret(); | 1011 __ ret(); |
| 1010 } | 1012 } |
| 1011 | 1013 |
| 1012 | 1014 |
| 1013 ASSEMBLER_TEST_RUN(AdrBlr, test) { | 1015 ASSEMBLER_TEST_RUN(AdrBlr, test) { |
| 1014 typedef int64_t (*Int64Return)() DART_UNUSED; | 1016 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1015 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1017 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1016 } | 1018 } |
| 1017 | 1019 |
| 1018 | 1020 |
| 1019 // Misc. arithmetic. | 1021 // Misc. arithmetic. |
| 1020 ASSEMBLER_TEST_GENERATE(Udiv, assembler) { | 1022 ASSEMBLER_TEST_GENERATE(Udiv, assembler) { |
| 1021 __ movz(R0, 27, 0); | 1023 __ movz(R0, Immediate(27), 0); |
| 1022 __ movz(R1, 9, 0); | 1024 __ movz(R1, Immediate(9), 0); |
| 1023 __ udiv(R2, R0, R1); | 1025 __ udiv(R2, R0, R1); |
| 1024 __ mov(R0, R2); | 1026 __ mov(R0, R2); |
| 1025 __ ret(); | 1027 __ ret(); |
| 1026 } | 1028 } |
| 1027 | 1029 |
| 1028 | 1030 |
| 1029 ASSEMBLER_TEST_RUN(Udiv, test) { | 1031 ASSEMBLER_TEST_RUN(Udiv, test) { |
| 1030 EXPECT(test != NULL); | 1032 EXPECT(test != NULL); |
| 1031 typedef int64_t (*Int64Return)() DART_UNUSED; | 1033 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1032 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1034 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1033 } | 1035 } |
| 1034 | 1036 |
| 1035 | 1037 |
| 1036 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) { | 1038 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) { |
| 1037 __ movz(R0, 27, 0); | 1039 __ movz(R0, Immediate(27), 0); |
| 1038 __ movz(R1, 9, 0); | 1040 __ movz(R1, Immediate(9), 0); |
| 1039 __ neg(R1, R1); | 1041 __ neg(R1, R1); |
| 1040 __ sdiv(R2, R0, R1); | 1042 __ sdiv(R2, R0, R1); |
| 1041 __ mov(R0, R2); | 1043 __ mov(R0, R2); |
| 1042 __ ret(); | 1044 __ ret(); |
| 1043 } | 1045 } |
| 1044 | 1046 |
| 1045 | 1047 |
| 1046 ASSEMBLER_TEST_RUN(Sdiv, test) { | 1048 ASSEMBLER_TEST_RUN(Sdiv, test) { |
| 1047 EXPECT(test != NULL); | 1049 EXPECT(test != NULL); |
| 1048 typedef int64_t (*Int64Return)() DART_UNUSED; | 1050 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1049 EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1051 EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1050 } | 1052 } |
| 1051 | 1053 |
| 1052 | 1054 |
| 1053 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) { | 1055 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) { |
| 1054 __ movz(R0, 27, 0); | 1056 __ movz(R0, Immediate(27), 0); |
| 1055 __ movz(R1, 0, 0); | 1057 __ movz(R1, Immediate(0), 0); |
| 1056 __ udiv(R2, R0, R1); | 1058 __ udiv(R2, R0, R1); |
| 1057 __ mov(R0, R2); | 1059 __ mov(R0, R2); |
| 1058 __ ret(); | 1060 __ ret(); |
| 1059 } | 1061 } |
| 1060 | 1062 |
| 1061 | 1063 |
| 1062 ASSEMBLER_TEST_RUN(Udiv_zero, test) { | 1064 ASSEMBLER_TEST_RUN(Udiv_zero, test) { |
| 1063 EXPECT(test != NULL); | 1065 EXPECT(test != NULL); |
| 1064 typedef int64_t (*Int64Return)() DART_UNUSED; | 1066 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1065 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1067 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1066 } | 1068 } |
| 1067 | 1069 |
| 1068 | 1070 |
| 1069 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) { | 1071 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) { |
| 1070 __ movz(R0, 27, 0); | 1072 __ movz(R0, Immediate(27), 0); |
| 1071 __ movz(R1, 0, 0); | 1073 __ movz(R1, Immediate(0), 0); |
| 1072 __ sdiv(R2, R0, R1); | 1074 __ sdiv(R2, R0, R1); |
| 1073 __ mov(R0, R2); | 1075 __ mov(R0, R2); |
| 1074 __ ret(); | 1076 __ ret(); |
| 1075 } | 1077 } |
| 1076 | 1078 |
| 1077 | 1079 |
| 1078 ASSEMBLER_TEST_RUN(Sdiv_zero, test) { | 1080 ASSEMBLER_TEST_RUN(Sdiv_zero, test) { |
| 1079 EXPECT(test != NULL); | 1081 EXPECT(test != NULL); |
| 1080 typedef int64_t (*Int64Return)() DART_UNUSED; | 1082 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1081 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1083 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1082 } | 1084 } |
| 1083 | 1085 |
| 1084 | 1086 |
| 1085 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) { | 1087 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) { |
| 1086 __ movz(R0, 0x8000, 3); // R0 <- 0x8000000000000000 | 1088 __ movz(R0, Immediate(0x8000), 3); // R0 <- 0x8000000000000000 |
| 1087 __ movn(R1, 0, 0); // R1 <- 0xffffffffffffffff | 1089 __ movn(R1, Immediate(0), 0); // R1 <- 0xffffffffffffffff |
| 1088 __ udiv(R2, R0, R1); | 1090 __ udiv(R2, R0, R1); |
| 1089 __ mov(R0, R2); | 1091 __ mov(R0, R2); |
| 1090 __ ret(); | 1092 __ ret(); |
| 1091 } | 1093 } |
| 1092 | 1094 |
| 1093 | 1095 |
| 1094 ASSEMBLER_TEST_RUN(Udiv_corner, test) { | 1096 ASSEMBLER_TEST_RUN(Udiv_corner, test) { |
| 1095 EXPECT(test != NULL); | 1097 EXPECT(test != NULL); |
| 1096 typedef int64_t (*Int64Return)() DART_UNUSED; | 1098 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1097 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1099 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1098 } | 1100 } |
| 1099 | 1101 |
| 1100 | 1102 |
| 1101 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) { | 1103 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) { |
| 1102 __ movz(R3, 0x8000, 3); // R0 <- 0x8000000000000000 | 1104 __ movz(R3, Immediate(0x8000), 3); // R0 <- 0x8000000000000000 |
| 1103 __ movn(R1, 0, 0); // R1 <- 0xffffffffffffffff | 1105 __ movn(R1, Immediate(0), 0); // R1 <- 0xffffffffffffffff |
| 1104 __ sdiv(R2, R3, R1); | 1106 __ sdiv(R2, R3, R1); |
| 1105 __ mov(R0, R2); | 1107 __ mov(R0, R2); |
| 1106 __ ret(); | 1108 __ ret(); |
| 1107 } | 1109 } |
| 1108 | 1110 |
| 1109 | 1111 |
| 1110 ASSEMBLER_TEST_RUN(Sdiv_corner, test) { | 1112 ASSEMBLER_TEST_RUN(Sdiv_corner, test) { |
| 1111 EXPECT(test != NULL); | 1113 EXPECT(test != NULL); |
| 1112 typedef int64_t (*Int64Return)() DART_UNUSED; | 1114 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1113 EXPECT_EQ(static_cast<int64_t>(0x8000000000000000), | 1115 EXPECT_EQ(static_cast<int64_t>(0x8000000000000000), |
| 1114 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1116 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1115 } | 1117 } |
| 1116 | 1118 |
| 1117 | 1119 |
| 1118 ASSEMBLER_TEST_GENERATE(Lslv, assembler) { | 1120 ASSEMBLER_TEST_GENERATE(Lslv, assembler) { |
| 1119 __ movz(R1, 21, 0); | 1121 __ movz(R1, Immediate(21), 0); |
| 1120 __ movz(R2, 1, 0); | 1122 __ movz(R2, Immediate(1), 0); |
| 1121 __ lslv(R0, R1, R2); | 1123 __ lslv(R0, R1, R2); |
| 1122 __ ret(); | 1124 __ ret(); |
| 1123 } | 1125 } |
| 1124 | 1126 |
| 1125 | 1127 |
| 1126 ASSEMBLER_TEST_RUN(Lslv, test) { | 1128 ASSEMBLER_TEST_RUN(Lslv, test) { |
| 1127 typedef int64_t (*Int64Return)() DART_UNUSED; | 1129 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1128 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1130 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1129 } | 1131 } |
| 1130 | 1132 |
| 1131 | 1133 |
| 1132 ASSEMBLER_TEST_GENERATE(Lsrv, assembler) { | 1134 ASSEMBLER_TEST_GENERATE(Lsrv, assembler) { |
| 1133 __ movz(R1, 84, 0); | 1135 __ movz(R1, Immediate(84), 0); |
| 1134 __ movz(R2, 1, 0); | 1136 __ movz(R2, Immediate(1), 0); |
| 1135 __ lsrv(R0, R1, R2); | 1137 __ lsrv(R0, R1, R2); |
| 1136 __ ret(); | 1138 __ ret(); |
| 1137 } | 1139 } |
| 1138 | 1140 |
| 1139 | 1141 |
| 1140 ASSEMBLER_TEST_RUN(Lsrv, test) { | 1142 ASSEMBLER_TEST_RUN(Lsrv, test) { |
| 1141 typedef int64_t (*Int64Return)() DART_UNUSED; | 1143 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1142 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1144 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1143 } | 1145 } |
| 1144 | 1146 |
| 1145 | 1147 |
| 1146 ASSEMBLER_TEST_GENERATE(LShiftingV, assembler) { | 1148 ASSEMBLER_TEST_GENERATE(LShiftingV, assembler) { |
| 1147 __ movz(R1, 1, 0); | 1149 __ movz(R1, Immediate(1), 0); |
| 1148 __ movz(R2, 63, 0); | 1150 __ movz(R2, Immediate(63), 0); |
| 1149 __ lslv(R1, R1, R2); | 1151 __ lslv(R1, R1, R2); |
| 1150 __ lsrv(R0, R1, R2); | 1152 __ lsrv(R0, R1, R2); |
| 1151 __ ret(); | 1153 __ ret(); |
| 1152 } | 1154 } |
| 1153 | 1155 |
| 1154 | 1156 |
| 1155 ASSEMBLER_TEST_RUN(LShiftingV, test) { | 1157 ASSEMBLER_TEST_RUN(LShiftingV, test) { |
| 1156 typedef int64_t (*Int64Return)() DART_UNUSED; | 1158 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1157 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1159 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1158 } | 1160 } |
| 1159 | 1161 |
| 1160 | 1162 |
| 1161 ASSEMBLER_TEST_GENERATE(RShiftingV, assembler) { | 1163 ASSEMBLER_TEST_GENERATE(RShiftingV, assembler) { |
| 1162 __ movz(R1, 1, 0); | 1164 __ movz(R1, Immediate(1), 0); |
| 1163 __ movz(R2, 63, 0); | 1165 __ movz(R2, Immediate(63), 0); |
| 1164 __ lslv(R1, R1, R2); | 1166 __ lslv(R1, R1, R2); |
| 1165 __ asrv(R0, R1, R2); | 1167 __ asrv(R0, R1, R2); |
| 1166 __ ret(); | 1168 __ ret(); |
| 1167 } | 1169 } |
| 1168 | 1170 |
| 1169 | 1171 |
| 1170 ASSEMBLER_TEST_RUN(RShiftingV, test) { | 1172 ASSEMBLER_TEST_RUN(RShiftingV, test) { |
| 1171 typedef int64_t (*Int64Return)() DART_UNUSED; | 1173 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1172 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1174 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1173 } | 1175 } |
| 1174 | 1176 |
| 1175 | 1177 |
| 1176 ASSEMBLER_TEST_GENERATE(Mult_pos, assembler) { | 1178 ASSEMBLER_TEST_GENERATE(Mult_pos, assembler) { |
| 1177 __ movz(R1, 6, 0); | 1179 __ movz(R1, Immediate(6), 0); |
| 1178 __ movz(R2, 7, 0); | 1180 __ movz(R2, Immediate(7), 0); |
| 1179 __ mul(R0, R1, R2); | 1181 __ mul(R0, R1, R2); |
| 1180 __ ret(); | 1182 __ ret(); |
| 1181 } | 1183 } |
| 1182 | 1184 |
| 1183 | 1185 |
| 1184 ASSEMBLER_TEST_RUN(Mult_pos, test) { | 1186 ASSEMBLER_TEST_RUN(Mult_pos, test) { |
| 1185 typedef int64_t (*Int64Return)() DART_UNUSED; | 1187 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1186 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1188 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1187 } | 1189 } |
| 1188 | 1190 |
| 1189 | 1191 |
| 1190 ASSEMBLER_TEST_GENERATE(Mult_neg, assembler) { | 1192 ASSEMBLER_TEST_GENERATE(Mult_neg, assembler) { |
| 1191 __ movz(R1, 6, 0); | 1193 __ movz(R1, Immediate(6), 0); |
| 1192 __ movz(R2, 7, 0); | 1194 __ movz(R2, Immediate(7), 0); |
| 1193 __ neg(R2, R2); | 1195 __ neg(R2, R2); |
| 1194 __ mul(R0, R1, R2); | 1196 __ mul(R0, R1, R2); |
| 1195 __ ret(); | 1197 __ ret(); |
| 1196 } | 1198 } |
| 1197 | 1199 |
| 1198 | 1200 |
| 1199 ASSEMBLER_TEST_RUN(Mult_neg, test) { | 1201 ASSEMBLER_TEST_RUN(Mult_neg, test) { |
| 1200 typedef int64_t (*Int64Return)() DART_UNUSED; | 1202 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1201 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1203 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1202 } | 1204 } |
| 1203 | 1205 |
| 1204 | 1206 |
| 1205 ASSEMBLER_TEST_GENERATE(Smulh_pos, assembler) { | 1207 ASSEMBLER_TEST_GENERATE(Smulh_pos, assembler) { |
| 1206 __ movz(R1, 6, 0); | 1208 __ movz(R1, Immediate(6), 0); |
| 1207 __ movz(R2, 7, 0); | 1209 __ movz(R2, Immediate(7), 0); |
| 1208 __ smulh(R0, R1, R2); | 1210 __ smulh(R0, R1, R2); |
| 1209 __ ret(); | 1211 __ ret(); |
| 1210 } | 1212 } |
| 1211 | 1213 |
| 1212 | 1214 |
| 1213 ASSEMBLER_TEST_RUN(Smulh_pos, test) { | 1215 ASSEMBLER_TEST_RUN(Smulh_pos, test) { |
| 1214 typedef int64_t (*Int64Return)() DART_UNUSED; | 1216 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1215 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1217 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1216 } | 1218 } |
| 1217 | 1219 |
| 1218 | 1220 |
| 1219 ASSEMBLER_TEST_GENERATE(Smulh_neg, assembler) { | 1221 ASSEMBLER_TEST_GENERATE(Smulh_neg, assembler) { |
| 1220 __ movz(R1, 6, 0); | 1222 __ movz(R1, Immediate(6), 0); |
| 1221 __ movz(R2, 7, 0); | 1223 __ movz(R2, Immediate(7), 0); |
| 1222 __ neg(R2, R2); | 1224 __ neg(R2, R2); |
| 1223 __ smulh(R0, R1, R2); | 1225 __ smulh(R0, R1, R2); |
| 1224 __ ret(); | 1226 __ ret(); |
| 1225 } | 1227 } |
| 1226 | 1228 |
| 1227 | 1229 |
| 1228 ASSEMBLER_TEST_RUN(Smulh_neg, test) { | 1230 ASSEMBLER_TEST_RUN(Smulh_neg, test) { |
| 1229 typedef int64_t (*Int64Return)() DART_UNUSED; | 1231 typedef int64_t (*Int64Return)() DART_UNUSED; |
| 1230 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1232 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1231 } | 1233 } |
| (...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1875 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { | 1877 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { |
| 1876 typedef double (*DoubleReturn)() DART_UNUSED; | 1878 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1877 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1879 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1878 } | 1880 } |
| 1879 | 1881 |
| 1880 | 1882 |
| 1881 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { | 1883 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { |
| 1882 __ SetupDartSP(kTestStackSpace); | 1884 __ SetupDartSP(kTestStackSpace); |
| 1883 __ LoadDImmediate(V0, 43.0, kNoPP); | 1885 __ LoadDImmediate(V0, 43.0, kNoPP); |
| 1884 __ LoadDImmediate(V1, 42.0, kNoPP); | 1886 __ LoadDImmediate(V1, 42.0, kNoPP); |
| 1885 __ movz(R2, 0xfff8, 0); | 1887 __ movz(R2, Immediate(0xfff8), 0); |
| 1886 __ movk(R2, 0xffff, 1); // R2 <- -8 (int32_t). | 1888 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t). |
| 1887 // This should sign extend R2, and add to SP to get address, | 1889 // This should sign extend R2, and add to SP to get address, |
| 1888 // i.e. SP - kWordSize. | 1890 // i.e. SP - kWordSize. |
| 1889 __ fstrd(V1, Address(SP, R2, SXTW)); | 1891 __ fstrd(V1, Address(SP, R2, SXTW)); |
| 1890 __ sub(SP, SP, Operand(kWordSize)); | 1892 __ sub(SP, SP, Operand(kWordSize)); |
| 1891 __ fldrd(V0, Address(SP)); | 1893 __ fldrd(V0, Address(SP)); |
| 1892 __ add(SP, SP, Operand(kWordSize)); | 1894 __ add(SP, SP, Operand(kWordSize)); |
| 1893 __ mov(CSP, SP); | 1895 __ mov(CSP, SP); |
| 1894 __ ret(); | 1896 __ ret(); |
| 1895 } | 1897 } |
| 1896 | 1898 |
| 1897 | 1899 |
| 1898 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { | 1900 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { |
| 1899 typedef double (*DoubleReturn)() DART_UNUSED; | 1901 typedef double (*DoubleReturn)() DART_UNUSED; |
| 1900 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1902 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1901 } | 1903 } |
| 1902 | 1904 |
| 1903 | 1905 |
| 1904 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) { | 1906 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) { |
| 1905 __ SetupDartSP(kTestStackSpace); | 1907 __ SetupDartSP(kTestStackSpace); |
| 1906 __ LoadDImmediate(V0, 43.0, kNoPP); | 1908 __ LoadDImmediate(V0, 43.0, kNoPP); |
| 1907 __ LoadDImmediate(V1, 42.0, kNoPP); | 1909 __ LoadDImmediate(V1, 42.0, kNoPP); |
| 1908 __ movz(R2, 10, 0); | 1910 __ movz(R2, Immediate(10), 0); |
| 1909 __ sub(SP, SP, Operand(10*kWordSize)); | 1911 __ sub(SP, SP, Operand(10*kWordSize)); |
| 1910 // Store V1 into SP + R2 * kWordSize. | 1912 // Store V1 into SP + R2 * kWordSize. |
| 1911 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); | 1913 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); |
| 1912 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); | 1914 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); |
| 1913 __ add(SP, SP, Operand(10*kWordSize)); | 1915 __ add(SP, SP, Operand(10*kWordSize)); |
| 1914 __ mov(CSP, SP); | 1916 __ mov(CSP, SP); |
| 1915 __ ret(); | 1917 __ ret(); |
| 1916 } | 1918 } |
| 1917 | 1919 |
| 1918 | 1920 |
| (...skipping 1353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3272 __ Pop(LR); | 3274 __ Pop(LR); |
| 3273 __ Pop(CTX); | 3275 __ Pop(CTX); |
| 3274 __ PopAndUntagPP(); | 3276 __ PopAndUntagPP(); |
| 3275 __ mov(CSP, SP); | 3277 __ mov(CSP, SP); |
| 3276 __ ret(); | 3278 __ ret(); |
| 3277 } | 3279 } |
| 3278 | 3280 |
| 3279 } // namespace dart | 3281 } // namespace dart |
| 3280 | 3282 |
| 3281 #endif // defined(TARGET_ARCH_ARM64) | 3283 #endif // defined(TARGET_ARCH_ARM64) |
| OLD | NEW |