testJitMoveEmitterCycles.cpp (24823B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 2 * vim: set ts=8 sts=2 et sw=2 tw=80: 3 */ 4 /* This Source Code Form is subject to the terms of the Mozilla Public 5 * License, v. 2.0. If a copy of the MPL was not distributed with this 6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 7 8 #if defined(JS_SIMULATOR_ARM) 9 10 # include "jit/arm/Assembler-arm.h" 11 # include "jit/arm/MoveEmitter-arm.h" 12 # include "jit/arm/Simulator-arm.h" 13 # include "jit/Linker.h" 14 # include "jit/MacroAssembler.h" 15 # include "jit/MoveResolver.h" 16 17 # include "jsapi-tests/tests.h" 18 19 # include "vm/Runtime.h" 20 21 static const int LIFO_ALLOC_PRIMARY_CHUNK_SIZE = 4 * 1024; 22 23 static constexpr js::jit::FloatRegister s0(0, js::jit::VFPRegister::Single); 24 static constexpr js::jit::FloatRegister s1(1, js::jit::VFPRegister::Single); 25 static constexpr js::jit::FloatRegister s2(2, js::jit::VFPRegister::Single); 26 static constexpr js::jit::FloatRegister s3(3, js::jit::VFPRegister::Single); 27 static constexpr js::jit::FloatRegister s4(4, js::jit::VFPRegister::Single); 28 static constexpr js::jit::FloatRegister s5(5, js::jit::VFPRegister::Single); 29 static constexpr js::jit::FloatRegister s6(6, js::jit::VFPRegister::Single); 30 static constexpr js::jit::FloatRegister s7(7, js::jit::VFPRegister::Single); 31 static constexpr js::jit::FloatRegister s8(8, js::jit::VFPRegister::Single); 32 static constexpr js::jit::FloatRegister s9(9, js::jit::VFPRegister::Single); 33 static constexpr js::jit::FloatRegister s10(10, js::jit::VFPRegister::Single); 34 static constexpr js::jit::FloatRegister s11(11, js::jit::VFPRegister::Single); 35 static constexpr js::jit::FloatRegister s12(12, js::jit::VFPRegister::Single); 36 static constexpr js::jit::FloatRegister s13(13, js::jit::VFPRegister::Single); 37 static constexpr js::jit::FloatRegister s14(14, js::jit::VFPRegister::Single); 38 static constexpr js::jit::FloatRegister s15(15, js::jit::VFPRegister::Single); 39 static constexpr js::jit::FloatRegister s16(16, js::jit::VFPRegister::Single); 40 static constexpr js::jit::FloatRegister s17(17, js::jit::VFPRegister::Single); 41 static constexpr js::jit::FloatRegister s18(18, js::jit::VFPRegister::Single); 42 static constexpr js::jit::FloatRegister s19(19, js::jit::VFPRegister::Single); 43 static constexpr js::jit::FloatRegister s20(20, js::jit::VFPRegister::Single); 44 static constexpr js::jit::FloatRegister s21(21, js::jit::VFPRegister::Single); 45 static constexpr js::jit::FloatRegister s22(22, js::jit::VFPRegister::Single); 46 static constexpr js::jit::FloatRegister s23(23, js::jit::VFPRegister::Single); 47 static constexpr js::jit::FloatRegister s24(24, js::jit::VFPRegister::Single); 48 static constexpr js::jit::FloatRegister s25(25, js::jit::VFPRegister::Single); 49 static constexpr js::jit::FloatRegister s26(26, js::jit::VFPRegister::Single); 50 static constexpr js::jit::FloatRegister s27(27, js::jit::VFPRegister::Single); 51 static constexpr js::jit::FloatRegister s28(28, js::jit::VFPRegister::Single); 52 static constexpr js::jit::FloatRegister s29(29, js::jit::VFPRegister::Single); 53 static constexpr js::jit::FloatRegister s30(30, js::jit::VFPRegister::Single); 54 static constexpr js::jit::FloatRegister s31(31, js::jit::VFPRegister::Single); 55 56 static js::jit::JitCode* linkAndAllocate(JSContext* cx, 57 js::jit::MacroAssembler* masm) { 58 using namespace js; 59 using namespace js::jit; 60 Linker l(*masm); 61 return l.newCode(cx, CodeKind::Ion); 62 } 63 64 # define TRY(x) \ 65 if (!(x)) return false; 66 67 BEGIN_TEST(testJitMoveEmitterCycles_simple) { 68 using namespace js; 69 using namespace js::jit; 70 LifoAlloc lifo(LIFO_ALLOC_PRIMARY_CHUNK_SIZE, js::MallocArena); 71 TempAllocator alloc(&lifo); 72 JitContext jc(cx); 73 StackMacroAssembler masm(cx, alloc); 74 AutoCreatedBy acb(masm, __func__); 75 MoveEmitter mover(masm); 76 MoveResolver mr; 77 mr.setAllocator(alloc); 78 Simulator* sim = Simulator::Current(); 79 TRY(mr.addMove(MoveOperand(d0), MoveOperand(d2), MoveOp::DOUBLE)); 80 sim->set_d_register_from_double(0, 2); 81 TRY(mr.addMove(MoveOperand(d3), MoveOperand(d1), MoveOp::DOUBLE)); 82 sim->set_d_register_from_double(3, 1); 83 TRY(mr.addMove(MoveOperand(s4), MoveOperand(s0), MoveOp::FLOAT32)); 84 sim->set_s_register_from_float(4, 0); 85 TRY(mr.addMove(MoveOperand(s5), MoveOperand(s6), MoveOp::FLOAT32)); 86 sim->set_s_register_from_float(5, 6); 87 TRY(mr.addMove(MoveOperand(s2), MoveOperand(s1), MoveOp::FLOAT32)); 88 sim->set_s_register_from_float(2, 1); 89 TRY(mr.addMove(MoveOperand(s3), MoveOperand(s7), MoveOp::FLOAT32)); 90 sim->set_s_register_from_float(3, 7); 91 // don't explode! 92 TRY(mr.resolve()); 93 mover.emit(mr); 94 mover.finish(); 95 masm.abiret(); 96 JitCode* code = linkAndAllocate(cx, &masm); 97 sim->call(code->raw(), 1, 1); 98 float f; 99 double d; 100 sim->get_double_from_d_register(2, &d); 101 CHECK(d == 2); 102 sim->get_double_from_d_register(1, &d); 103 CHECK(int(d) == 1); 104 sim->get_float_from_s_register(0, &f); 105 CHECK(int(f) == 0); 106 sim->get_float_from_s_register(6, &f); 107 CHECK(int(f) == 6); 108 sim->get_float_from_s_register(1, &f); 109 CHECK(int(f) == 1); 110 sim->get_float_from_s_register(7, &f); 111 CHECK(int(f) == 7); 112 return true; 113 } 114 END_TEST(testJitMoveEmitterCycles_simple) 115 BEGIN_TEST(testJitMoveEmitterCycles_autogen) { 116 using namespace js; 117 using namespace js::jit; 118 LifoAlloc lifo(LIFO_ALLOC_PRIMARY_CHUNK_SIZE, js::MallocArena); 119 TempAllocator alloc(&lifo); 120 JitContext jc(cx); 121 StackMacroAssembler masm(cx, alloc); 122 AutoCreatedBy acb(masm, __func__); 123 MoveEmitter mover(masm); 124 MoveResolver mr; 125 mr.setAllocator(alloc); 126 Simulator* sim = Simulator::Current(); 127 TRY(mr.addMove(MoveOperand(d9), MoveOperand(d14), MoveOp::DOUBLE)); 128 sim->set_d_register_from_double(9, 9); 129 TRY(mr.addMove(MoveOperand(s24), MoveOperand(s25), MoveOp::FLOAT32)); 130 sim->set_s_register_from_float(24, 24); 131 TRY(mr.addMove(MoveOperand(d3), MoveOperand(d0), MoveOp::DOUBLE)); 132 sim->set_d_register_from_double(3, 3); 133 TRY(mr.addMove(MoveOperand(s10), MoveOperand(s31), MoveOp::FLOAT32)); 134 sim->set_s_register_from_float(10, 10); 135 TRY(mr.addMove(MoveOperand(d1), MoveOperand(d10), MoveOp::DOUBLE)); 136 sim->set_d_register_from_double(1, 1); 137 TRY(mr.addMove(MoveOperand(s8), MoveOperand(s10), MoveOp::FLOAT32)); 138 sim->set_s_register_from_float(8, 8); 139 TRY(mr.addMove(MoveOperand(d2), MoveOperand(d7), MoveOp::DOUBLE)); 140 sim->set_d_register_from_double(2, 2); 141 TRY(mr.addMove(MoveOperand(s20), MoveOperand(s18), MoveOp::FLOAT32)); 142 sim->set_s_register_from_float(20, 20); 143 TRY(mr.addMove(MoveOperand(s1), MoveOperand(s3), MoveOp::FLOAT32)); 144 sim->set_s_register_from_float(1, 1); 145 TRY(mr.addMove(MoveOperand(s17), MoveOperand(s11), MoveOp::FLOAT32)); 146 sim->set_s_register_from_float(17, 17); 147 TRY(mr.addMove(MoveOperand(s22), MoveOperand(s30), MoveOp::FLOAT32)); 148 sim->set_s_register_from_float(22, 22); 149 TRY(mr.addMove(MoveOperand(s31), MoveOperand(s7), MoveOp::FLOAT32)); 150 sim->set_s_register_from_float(31, 31); 151 TRY(mr.addMove(MoveOperand(d3), MoveOperand(d13), MoveOp::DOUBLE)); 152 sim->set_d_register_from_double(3, 3); 153 TRY(mr.addMove(MoveOperand(d9), MoveOperand(d8), MoveOp::DOUBLE)); 154 sim->set_d_register_from_double(9, 9); 155 TRY(mr.addMove(MoveOperand(s31), MoveOperand(s23), MoveOp::FLOAT32)); 156 sim->set_s_register_from_float(31, 31); 157 TRY(mr.addMove(MoveOperand(s13), MoveOperand(s8), MoveOp::FLOAT32)); 158 sim->set_s_register_from_float(13, 13); 159 TRY(mr.addMove(MoveOperand(s28), MoveOperand(s5), MoveOp::FLOAT32)); 160 sim->set_s_register_from_float(28, 28); 161 TRY(mr.addMove(MoveOperand(s31), MoveOperand(s19), MoveOp::FLOAT32)); 162 sim->set_s_register_from_float(31, 31); 163 TRY(mr.addMove(MoveOperand(s20), MoveOperand(s6), MoveOp::FLOAT32)); 164 sim->set_s_register_from_float(20, 20); 165 TRY(mr.addMove(MoveOperand(s0), MoveOperand(s2), MoveOp::FLOAT32)); 166 sim->set_s_register_from_float(0, 0); 167 TRY(mr.addMove(MoveOperand(d7), MoveOperand(d6), MoveOp::DOUBLE)); 168 sim->set_d_register_from_double(7, 7); 169 TRY(mr.addMove(MoveOperand(s13), MoveOperand(s9), MoveOp::FLOAT32)); 170 sim->set_s_register_from_float(13, 13); 171 TRY(mr.addMove(MoveOperand(s1), MoveOperand(s4), MoveOp::FLOAT32)); 172 sim->set_s_register_from_float(1, 1); 173 TRY(mr.addMove(MoveOperand(s29), MoveOperand(s22), MoveOp::FLOAT32)); 174 sim->set_s_register_from_float(29, 29); 175 TRY(mr.addMove(MoveOperand(s25), MoveOperand(s24), MoveOp::FLOAT32)); 176 sim->set_s_register_from_float(25, 25); 177 // don't explode! 178 TRY(mr.resolve()); 179 mover.emit(mr); 180 mover.finish(); 181 masm.abiret(); 182 JitCode* code = linkAndAllocate(cx, &masm); 183 sim->skipCalleeSavedRegsCheck = true; 184 sim->call(code->raw(), 1, 1); 185 double d; 186 float f; 187 sim->get_double_from_d_register(14, &d); 188 CHECK(int(d) == 9); 189 sim->get_float_from_s_register(25, &f); 190 CHECK(int(f) == 24); 191 sim->get_double_from_d_register(0, &d); 192 CHECK(int(d) == 3); 193 sim->get_float_from_s_register(31, &f); 194 CHECK(int(f) == 10); 195 sim->get_double_from_d_register(10, &d); 196 CHECK(int(d) == 1); 197 sim->get_float_from_s_register(10, &f); 198 CHECK(int(f) == 8); 199 sim->get_double_from_d_register(7, &d); 200 CHECK(int(d) == 2); 201 sim->get_float_from_s_register(18, &f); 202 CHECK(int(f) == 20); 203 sim->get_float_from_s_register(3, &f); 204 CHECK(int(f) == 1); 205 sim->get_float_from_s_register(11, &f); 206 CHECK(int(f) == 17); 207 sim->get_float_from_s_register(30, &f); 208 CHECK(int(f) == 22); 209 sim->get_float_from_s_register(7, &f); 210 CHECK(int(f) == 31); 211 sim->get_double_from_d_register(13, &d); 212 CHECK(int(d) == 3); 213 sim->get_double_from_d_register(8, &d); 214 CHECK(int(d) == 9); 215 sim->get_float_from_s_register(23, &f); 216 CHECK(int(f) == 31); 217 sim->get_float_from_s_register(8, &f); 218 CHECK(int(f) == 13); 219 sim->get_float_from_s_register(5, &f); 220 CHECK(int(f) == 28); 221 sim->get_float_from_s_register(19, &f); 222 CHECK(int(f) == 31); 223 sim->get_float_from_s_register(6, &f); 224 CHECK(int(f) == 20); 225 sim->get_float_from_s_register(2, &f); 226 CHECK(int(f) == 0); 227 sim->get_double_from_d_register(6, &d); 228 CHECK(int(d) == 7); 229 sim->get_float_from_s_register(9, &f); 230 CHECK(int(f) == 13); 231 sim->get_float_from_s_register(4, &f); 232 CHECK(int(f) == 1); 233 sim->get_float_from_s_register(22, &f); 234 CHECK(int(f) == 29); 235 sim->get_float_from_s_register(24, &f); 236 CHECK(int(f) == 25); 237 return true; 238 } 239 END_TEST(testJitMoveEmitterCycles_autogen) 240 241 BEGIN_TEST(testJitMoveEmitterCycles_autogen2) { 242 using namespace js; 243 using namespace js::jit; 244 LifoAlloc lifo(LIFO_ALLOC_PRIMARY_CHUNK_SIZE, js::MallocArena); 245 TempAllocator alloc(&lifo); 246 JitContext jc(cx); 247 StackMacroAssembler masm(cx, alloc); 248 AutoCreatedBy acb(masm, __func__); 249 MoveEmitter mover(masm); 250 MoveResolver mr; 251 mr.setAllocator(alloc); 252 Simulator* sim = Simulator::Current(); 253 TRY(mr.addMove(MoveOperand(d10), MoveOperand(d0), MoveOp::DOUBLE)); 254 sim->set_d_register_from_double(10, 10); 255 TRY(mr.addMove(MoveOperand(s15), MoveOperand(s3), MoveOp::FLOAT32)); 256 sim->set_s_register_from_float(15, 15); 257 TRY(mr.addMove(MoveOperand(s2), MoveOperand(s28), MoveOp::FLOAT32)); 258 sim->set_s_register_from_float(2, 2); 259 TRY(mr.addMove(MoveOperand(s30), MoveOperand(s25), MoveOp::FLOAT32)); 260 sim->set_s_register_from_float(30, 30); 261 TRY(mr.addMove(MoveOperand(s16), MoveOperand(s2), MoveOp::FLOAT32)); 262 sim->set_s_register_from_float(16, 16); 263 TRY(mr.addMove(MoveOperand(s2), MoveOperand(s29), MoveOp::FLOAT32)); 264 sim->set_s_register_from_float(2, 2); 265 TRY(mr.addMove(MoveOperand(s17), MoveOperand(s10), MoveOp::FLOAT32)); 266 sim->set_s_register_from_float(17, 17); 267 TRY(mr.addMove(MoveOperand(s2), MoveOperand(s19), MoveOp::FLOAT32)); 268 sim->set_s_register_from_float(2, 2); 269 TRY(mr.addMove(MoveOperand(s9), MoveOperand(s26), MoveOp::FLOAT32)); 270 sim->set_s_register_from_float(9, 9); 271 TRY(mr.addMove(MoveOperand(s1), MoveOperand(s23), MoveOp::FLOAT32)); 272 sim->set_s_register_from_float(1, 1); 273 TRY(mr.addMove(MoveOperand(s8), MoveOperand(s6), MoveOp::FLOAT32)); 274 sim->set_s_register_from_float(8, 8); 275 TRY(mr.addMove(MoveOperand(s24), MoveOperand(s16), MoveOp::FLOAT32)); 276 sim->set_s_register_from_float(24, 24); 277 TRY(mr.addMove(MoveOperand(s19), MoveOperand(s4), MoveOp::FLOAT32)); 278 sim->set_s_register_from_float(19, 19); 279 TRY(mr.addMove(MoveOperand(d5), MoveOperand(d6), MoveOp::DOUBLE)); 280 sim->set_d_register_from_double(5, 5); 281 TRY(mr.addMove(MoveOperand(s18), MoveOperand(s15), MoveOp::FLOAT32)); 282 sim->set_s_register_from_float(18, 18); 283 TRY(mr.addMove(MoveOperand(s23), MoveOperand(s30), MoveOp::FLOAT32)); 284 sim->set_s_register_from_float(23, 23); 285 TRY(mr.addMove(MoveOperand(s27), MoveOperand(s17), MoveOp::FLOAT32)); 286 sim->set_s_register_from_float(27, 27); 287 TRY(mr.addMove(MoveOperand(d3), MoveOperand(d4), MoveOp::DOUBLE)); 288 sim->set_d_register_from_double(3, 3); 289 TRY(mr.addMove(MoveOperand(s14), MoveOperand(s27), MoveOp::FLOAT32)); 290 sim->set_s_register_from_float(14, 14); 291 TRY(mr.addMove(MoveOperand(s2), MoveOperand(s31), MoveOp::FLOAT32)); 292 sim->set_s_register_from_float(2, 2); 293 TRY(mr.addMove(MoveOperand(s2), MoveOperand(s24), MoveOp::FLOAT32)); 294 sim->set_s_register_from_float(2, 2); 295 TRY(mr.addMove(MoveOperand(s31), MoveOperand(s11), MoveOp::FLOAT32)); 296 sim->set_s_register_from_float(31, 31); 297 TRY(mr.addMove(MoveOperand(s0), MoveOperand(s18), MoveOp::FLOAT32)); 298 sim->set_s_register_from_float(0, 0); 299 TRY(mr.addMove(MoveOperand(s24), MoveOperand(s7), MoveOp::FLOAT32)); 300 sim->set_s_register_from_float(24, 24); 301 TRY(mr.addMove(MoveOperand(s0), MoveOperand(s21), MoveOp::FLOAT32)); 302 sim->set_s_register_from_float(0, 0); 303 TRY(mr.addMove(MoveOperand(s27), MoveOperand(s20), MoveOp::FLOAT32)); 304 sim->set_s_register_from_float(27, 27); 305 TRY(mr.addMove(MoveOperand(s14), MoveOperand(s5), MoveOp::FLOAT32)); 306 sim->set_s_register_from_float(14, 14); 307 TRY(mr.addMove(MoveOperand(s2), MoveOperand(s14), MoveOp::FLOAT32)); 308 sim->set_s_register_from_float(2, 2); 309 TRY(mr.addMove(MoveOperand(s12), MoveOperand(s22), MoveOp::FLOAT32)); 310 sim->set_s_register_from_float(12, 12); 311 // don't explode! 312 TRY(mr.resolve()); 313 mover.emit(mr); 314 mover.finish(); 315 masm.abiret(); 316 JitCode* code = linkAndAllocate(cx, &masm); 317 sim->skipCalleeSavedRegsCheck = true; 318 sim->call(code->raw(), 1, 1); 319 320 double d; 321 float f; 322 sim->get_double_from_d_register(0, &d); 323 CHECK(int(d) == 10); 324 sim->get_float_from_s_register(3, &f); 325 CHECK(int(f) == 15); 326 sim->get_float_from_s_register(28, &f); 327 CHECK(int(f) == 2); 328 sim->get_float_from_s_register(25, &f); 329 CHECK(int(f) == 30); 330 sim->get_float_from_s_register(2, &f); 331 CHECK(int(f) == 16); 332 sim->get_float_from_s_register(29, &f); 333 CHECK(int(f) == 2); 334 sim->get_float_from_s_register(10, &f); 335 CHECK(int(f) == 17); 336 sim->get_float_from_s_register(19, &f); 337 CHECK(int(f) == 2); 338 sim->get_float_from_s_register(26, &f); 339 CHECK(int(f) == 9); 340 sim->get_float_from_s_register(23, &f); 341 CHECK(int(f) == 1); 342 sim->get_float_from_s_register(6, &f); 343 CHECK(int(f) == 8); 344 sim->get_float_from_s_register(16, &f); 345 CHECK(int(f) == 24); 346 sim->get_float_from_s_register(4, &f); 347 CHECK(int(f) == 19); 348 sim->get_double_from_d_register(6, &d); 349 CHECK(int(d) == 5); 350 sim->get_float_from_s_register(15, &f); 351 CHECK(int(f) == 18); 352 sim->get_float_from_s_register(30, &f); 353 CHECK(int(f) == 23); 354 sim->get_float_from_s_register(17, &f); 355 CHECK(int(f) == 27); 356 sim->get_double_from_d_register(4, &d); 357 CHECK(int(d) == 3); 358 sim->get_float_from_s_register(27, &f); 359 CHECK(int(f) == 14); 360 sim->get_float_from_s_register(31, &f); 361 CHECK(int(f) == 2); 362 sim->get_float_from_s_register(24, &f); 363 CHECK(int(f) == 2); 364 sim->get_float_from_s_register(11, &f); 365 CHECK(int(f) == 31); 366 sim->get_float_from_s_register(18, &f); 367 CHECK(int(f) == 0); 368 sim->get_float_from_s_register(7, &f); 369 CHECK(int(f) == 24); 370 sim->get_float_from_s_register(21, &f); 371 CHECK(int(f) == 0); 372 sim->get_float_from_s_register(20, &f); 373 CHECK(int(f) == 27); 374 sim->get_float_from_s_register(5, &f); 375 CHECK(int(f) == 14); 376 sim->get_float_from_s_register(14, &f); 377 CHECK(int(f) == 2); 378 sim->get_float_from_s_register(22, &f); 379 CHECK(int(f) == 12); 380 return true; 381 } 382 END_TEST(testJitMoveEmitterCycles_autogen2) 383 384 BEGIN_TEST(testJitMoveEmitterCycles_autogen3) { 385 using namespace js; 386 using namespace js::jit; 387 LifoAlloc lifo(LIFO_ALLOC_PRIMARY_CHUNK_SIZE, js::MallocArena); 388 TempAllocator alloc(&lifo); 389 JitContext jc(cx); 390 StackMacroAssembler masm(cx, alloc); 391 AutoCreatedBy acb(masm, __func__); 392 MoveEmitter mover(masm); 393 MoveResolver mr; 394 mr.setAllocator(alloc); 395 Simulator* sim = Simulator::Current(); 396 TRY(mr.addMove(MoveOperand(s0), MoveOperand(s21), MoveOp::FLOAT32)); 397 sim->set_s_register_from_float(0, 0); 398 TRY(mr.addMove(MoveOperand(s2), MoveOperand(s26), MoveOp::FLOAT32)); 399 sim->set_s_register_from_float(2, 2); 400 TRY(mr.addMove(MoveOperand(s19), MoveOperand(s20), MoveOp::FLOAT32)); 401 sim->set_s_register_from_float(19, 19); 402 TRY(mr.addMove(MoveOperand(s4), MoveOperand(s24), MoveOp::FLOAT32)); 403 sim->set_s_register_from_float(4, 4); 404 TRY(mr.addMove(MoveOperand(s22), MoveOperand(s9), MoveOp::FLOAT32)); 405 sim->set_s_register_from_float(22, 22); 406 TRY(mr.addMove(MoveOperand(s5), MoveOperand(s28), MoveOp::FLOAT32)); 407 sim->set_s_register_from_float(5, 5); 408 TRY(mr.addMove(MoveOperand(s15), MoveOperand(s7), MoveOp::FLOAT32)); 409 sim->set_s_register_from_float(15, 15); 410 TRY(mr.addMove(MoveOperand(s26), MoveOperand(s14), MoveOp::FLOAT32)); 411 sim->set_s_register_from_float(26, 26); 412 TRY(mr.addMove(MoveOperand(s13), MoveOperand(s30), MoveOp::FLOAT32)); 413 sim->set_s_register_from_float(13, 13); 414 TRY(mr.addMove(MoveOperand(s26), MoveOperand(s22), MoveOp::FLOAT32)); 415 sim->set_s_register_from_float(26, 26); 416 TRY(mr.addMove(MoveOperand(s21), MoveOperand(s6), MoveOp::FLOAT32)); 417 sim->set_s_register_from_float(21, 21); 418 TRY(mr.addMove(MoveOperand(s23), MoveOperand(s31), MoveOp::FLOAT32)); 419 sim->set_s_register_from_float(23, 23); 420 TRY(mr.addMove(MoveOperand(s7), MoveOperand(s12), MoveOp::FLOAT32)); 421 sim->set_s_register_from_float(7, 7); 422 TRY(mr.addMove(MoveOperand(s14), MoveOperand(s10), MoveOp::FLOAT32)); 423 sim->set_s_register_from_float(14, 14); 424 TRY(mr.addMove(MoveOperand(d12), MoveOperand(d8), MoveOp::DOUBLE)); 425 sim->set_d_register_from_double(12, 12); 426 TRY(mr.addMove(MoveOperand(s5), MoveOperand(s1), MoveOp::FLOAT32)); 427 sim->set_s_register_from_float(5, 5); 428 TRY(mr.addMove(MoveOperand(d12), MoveOperand(d2), MoveOp::DOUBLE)); 429 sim->set_d_register_from_double(12, 12); 430 TRY(mr.addMove(MoveOperand(s3), MoveOperand(s8), MoveOp::FLOAT32)); 431 sim->set_s_register_from_float(3, 3); 432 TRY(mr.addMove(MoveOperand(s14), MoveOperand(s0), MoveOp::FLOAT32)); 433 sim->set_s_register_from_float(14, 14); 434 TRY(mr.addMove(MoveOperand(s28), MoveOperand(s29), MoveOp::FLOAT32)); 435 sim->set_s_register_from_float(28, 28); 436 TRY(mr.addMove(MoveOperand(d12), MoveOperand(d9), MoveOp::DOUBLE)); 437 sim->set_d_register_from_double(12, 12); 438 TRY(mr.addMove(MoveOperand(s29), MoveOperand(s2), MoveOp::FLOAT32)); 439 sim->set_s_register_from_float(29, 29); 440 TRY(mr.addMove(MoveOperand(s22), MoveOperand(s27), MoveOp::FLOAT32)); 441 sim->set_s_register_from_float(22, 22); 442 TRY(mr.addMove(MoveOperand(s19), MoveOperand(s3), MoveOp::FLOAT32)); 443 sim->set_s_register_from_float(19, 19); 444 TRY(mr.addMove(MoveOperand(s21), MoveOperand(s11), MoveOp::FLOAT32)); 445 sim->set_s_register_from_float(21, 21); 446 TRY(mr.addMove(MoveOperand(s22), MoveOperand(s13), MoveOp::FLOAT32)); 447 sim->set_s_register_from_float(22, 22); 448 TRY(mr.addMove(MoveOperand(s29), MoveOperand(s25), MoveOp::FLOAT32)); 449 sim->set_s_register_from_float(29, 29); 450 TRY(mr.addMove(MoveOperand(s29), MoveOperand(s15), MoveOp::FLOAT32)); 451 sim->set_s_register_from_float(29, 29); 452 TRY(mr.addMove(MoveOperand(s16), MoveOperand(s23), MoveOp::FLOAT32)); 453 sim->set_s_register_from_float(16, 16); 454 // don't explode! 455 TRY(mr.resolve()); 456 mover.emit(mr); 457 mover.finish(); 458 masm.abiret(); 459 JitCode* code = linkAndAllocate(cx, &masm); 460 sim->skipCalleeSavedRegsCheck = true; 461 sim->call(code->raw(), 1, 1); 462 463 float f; 464 double d; 465 sim->get_float_from_s_register(21, &f); 466 CHECK(int(f) == 0); 467 sim->get_float_from_s_register(26, &f); 468 CHECK(int(f) == 2); 469 sim->get_float_from_s_register(20, &f); 470 CHECK(int(f) == 19); 471 sim->get_float_from_s_register(24, &f); 472 CHECK(int(f) == 4); 473 sim->get_float_from_s_register(9, &f); 474 CHECK(int(f) == 22); 475 sim->get_float_from_s_register(28, &f); 476 CHECK(int(f) == 5); 477 sim->get_float_from_s_register(7, &f); 478 CHECK(int(f) == 15); 479 sim->get_float_from_s_register(14, &f); 480 CHECK(int(f) == 26); 481 sim->get_float_from_s_register(30, &f); 482 CHECK(int(f) == 13); 483 sim->get_float_from_s_register(22, &f); 484 CHECK(int(f) == 26); 485 sim->get_float_from_s_register(6, &f); 486 CHECK(int(f) == 21); 487 sim->get_float_from_s_register(31, &f); 488 CHECK(int(f) == 23); 489 sim->get_float_from_s_register(12, &f); 490 CHECK(int(f) == 7); 491 sim->get_float_from_s_register(10, &f); 492 CHECK(int(f) == 14); 493 sim->get_double_from_d_register(8, &d); 494 CHECK(int(d) == 12); 495 sim->get_float_from_s_register(1, &f); 496 CHECK(int(f) == 5); 497 sim->get_double_from_d_register(2, &d); 498 CHECK(int(d) == 12); 499 sim->get_float_from_s_register(8, &f); 500 CHECK(int(f) == 3); 501 sim->get_float_from_s_register(0, &f); 502 CHECK(int(f) == 14); 503 sim->get_float_from_s_register(29, &f); 504 CHECK(int(f) == 28); 505 sim->get_double_from_d_register(9, &d); 506 CHECK(int(d) == 12); 507 sim->get_float_from_s_register(2, &f); 508 CHECK(int(f) == 29); 509 sim->get_float_from_s_register(27, &f); 510 CHECK(int(f) == 22); 511 sim->get_float_from_s_register(3, &f); 512 CHECK(int(f) == 19); 513 sim->get_float_from_s_register(11, &f); 514 CHECK(int(f) == 21); 515 sim->get_float_from_s_register(13, &f); 516 CHECK(int(f) == 22); 517 sim->get_float_from_s_register(25, &f); 518 CHECK(int(f) == 29); 519 sim->get_float_from_s_register(15, &f); 520 CHECK(int(f) == 29); 521 sim->get_float_from_s_register(23, &f); 522 CHECK(int(f) == 16); 523 return true; 524 } 525 END_TEST(testJitMoveEmitterCycles_autogen3) 526 BEGIN_TEST(testJitMoveEmitterCycles_bug1299147_1) { 527 using namespace js; 528 using namespace js::jit; 529 LifoAlloc lifo(LIFO_ALLOC_PRIMARY_CHUNK_SIZE, js::MallocArena); 530 TempAllocator alloc(&lifo); 531 JitContext jc(cx); 532 StackMacroAssembler masm(cx, alloc); 533 AutoCreatedBy acb(masm, __func__); 534 MoveEmitter mover(masm); 535 MoveResolver mr; 536 mr.setAllocator(alloc); 537 Simulator* sim = Simulator::Current(); 538 // S2 -> S0 539 // S2 -> S6 540 // S3 -> S1 541 // S3 -> S7 542 // D0 -> D1 543 // D0 -> D2 544 TRY(mr.addMove(MoveOperand(s2), MoveOperand(s0), MoveOp::FLOAT32)); 545 TRY(mr.addMove(MoveOperand(s2), MoveOperand(s6), MoveOp::FLOAT32)); 546 sim->set_s_register_from_float(2, 2); 547 TRY(mr.addMove(MoveOperand(s3), MoveOperand(s1), MoveOp::FLOAT32)); 548 TRY(mr.addMove(MoveOperand(s3), MoveOperand(s7), MoveOp::FLOAT32)); 549 sim->set_s_register_from_float(3, 4); 550 TRY(mr.addMove(MoveOperand(d0), MoveOperand(d1), MoveOp::FLOAT32)); 551 TRY(mr.addMove(MoveOperand(d0), MoveOperand(d2), MoveOp::FLOAT32)); 552 sim->set_d_register_from_double(0, 1); 553 // don't explode! 554 TRY(mr.resolve()); 555 mover.emit(mr); 556 mover.finish(); 557 masm.abiret(); 558 JitCode* code = linkAndAllocate(cx, &masm); 559 sim->call(code->raw(), 1, 1); 560 float f; 561 double d; 562 sim->get_double_from_d_register(1, &d); 563 CHECK(d == 1); 564 sim->get_double_from_d_register(2, &d); 565 CHECK(d == 1); 566 sim->get_float_from_s_register(0, &f); 567 CHECK(int(f) == 2); 568 sim->get_float_from_s_register(6, &f); 569 CHECK(int(f) == 2); 570 sim->get_float_from_s_register(1, &f); 571 CHECK(int(f) == 4); 572 sim->get_float_from_s_register(7, &f); 573 CHECK(int(f) == 4); 574 return true; 575 } 576 END_TEST(testJitMoveEmitterCycles_bug1299147_1) 577 BEGIN_TEST(testJitMoveEmitterCycles_bug1299147) { 578 using namespace js; 579 using namespace js::jit; 580 LifoAlloc lifo(LIFO_ALLOC_PRIMARY_CHUNK_SIZE, js::MallocArena); 581 TempAllocator alloc(&lifo); 582 JitContext jc(cx); 583 StackMacroAssembler masm(cx, alloc); 584 AutoCreatedBy acb(masm, __func__); 585 MoveEmitter mover(masm); 586 MoveResolver mr; 587 mr.setAllocator(alloc); 588 Simulator* sim = Simulator::Current(); 589 // S2 -> S5 590 // S2 -> S6 591 // D0 -> D1 592 TRY(mr.addMove(MoveOperand(s2), MoveOperand(s5), MoveOp::FLOAT32)); 593 TRY(mr.addMove(MoveOperand(s2), MoveOperand(s6), MoveOp::FLOAT32)); 594 sim->set_s_register_from_float(2, 2); 595 TRY(mr.addMove(MoveOperand(d0), MoveOperand(d1), MoveOp::FLOAT32)); 596 sim->set_d_register_from_double(0, 1); 597 // don't explode! 598 TRY(mr.resolve()); 599 mover.emit(mr); 600 mover.finish(); 601 masm.abiret(); 602 JitCode* code = linkAndAllocate(cx, &masm); 603 sim->call(code->raw(), 1, 1); 604 float f; 605 double d; 606 sim->get_double_from_d_register(1, &d); 607 CHECK(d == 1); 608 sim->get_float_from_s_register(5, &f); 609 CHECK(int(f) == 2); 610 sim->get_float_from_s_register(6, &f); 611 CHECK(int(f) == 2); 612 return true; 613 } 614 END_TEST(testJitMoveEmitterCycles_bug1299147) 615 616 #endif // JS_SIMULATOR_ARM