| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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_X64) | 6 #if defined(TARGET_ARCH_X64) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/os.h" | 9 #include "vm/os.h" |
| 10 #include "vm/unit_test.h" | 10 #include "vm/unit_test.h" |
| 11 #include "vm/virtual_memory.h" | 11 #include "vm/virtual_memory.h" |
| 12 | 12 |
| 13 namespace dart { | 13 namespace dart { |
| 14 | 14 |
| 15 #define __ assembler-> | 15 #define __ assembler-> |
| 16 | 16 |
| 17 | 17 |
| 18 ASSEMBLER_TEST_GENERATE(ReadArgument, assembler) { | 18 ASSEMBLER_TEST_GENERATE(ReadArgument, assembler) { |
| 19 __ pushq(RDI); // First argument is passed in register rdi. | 19 __ pushq(RDI); // First argument is passed in register rdi. |
| 20 __ movq(RAX, Address(RSP, 0)); | 20 __ movq(RAX, Address(RSP, 0)); |
| 21 __ popq(RDX); | 21 __ popq(RDX); |
| 22 __ ret(); | 22 __ ret(); |
| 23 } | 23 } |
| 24 | 24 |
| 25 | 25 |
| 26 ASSEMBLER_TEST_RUN(ReadArgument, entry) { | 26 ASSEMBLER_TEST_RUN(ReadArgument, test) { |
| 27 typedef int64_t (*ReadArgumentCode)(int64_t n); | 27 typedef int64_t (*ReadArgumentCode)(int64_t n); |
| 28 ReadArgumentCode id = reinterpret_cast<ReadArgumentCode>(entry); | 28 ReadArgumentCode id = reinterpret_cast<ReadArgumentCode>(test->entry()); |
| 29 EXPECT_EQ(42, id(42)); | 29 EXPECT_EQ(42, id(42)); |
| 30 EXPECT_EQ(87, id(87)); | 30 EXPECT_EQ(87, id(87)); |
| 31 static const int64_t kLargeConstant = 0x1234567812345678LL; | 31 static const int64_t kLargeConstant = 0x1234567812345678LL; |
| 32 EXPECT_EQ(kLargeConstant, id(kLargeConstant)); | 32 EXPECT_EQ(kLargeConstant, id(kLargeConstant)); |
| 33 } | 33 } |
| 34 | 34 |
| 35 | 35 |
| 36 ASSEMBLER_TEST_GENERATE(AddressingModes, assembler) { | 36 ASSEMBLER_TEST_GENERATE(AddressingModes, assembler) { |
| 37 __ movq(RAX, Address(RSP, 0)); | 37 __ movq(RAX, Address(RSP, 0)); |
| 38 __ movq(RAX, Address(RBP, 0)); | 38 __ movq(RAX, Address(RBP, 0)); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 __ movq(RAX, Address(R12, R13, TIMES_2, 256 * kWordSize)); | 196 __ movq(RAX, Address(R12, R13, TIMES_2, 256 * kWordSize)); |
| 197 | 197 |
| 198 __ movq(RAX, Address(R13, RBP, TIMES_2, 256 * kWordSize)); | 198 __ movq(RAX, Address(R13, RBP, TIMES_2, 256 * kWordSize)); |
| 199 __ movq(RAX, Address(R13, RAX, TIMES_2, 256 * kWordSize)); | 199 __ movq(RAX, Address(R13, RAX, TIMES_2, 256 * kWordSize)); |
| 200 __ movq(RAX, Address(R13, R10, TIMES_2, 256 * kWordSize)); | 200 __ movq(RAX, Address(R13, R10, TIMES_2, 256 * kWordSize)); |
| 201 __ movq(RAX, Address(R13, R12, TIMES_2, 256 * kWordSize)); | 201 __ movq(RAX, Address(R13, R12, TIMES_2, 256 * kWordSize)); |
| 202 __ movq(RAX, Address(R13, R13, TIMES_2, 256 * kWordSize)); | 202 __ movq(RAX, Address(R13, R13, TIMES_2, 256 * kWordSize)); |
| 203 } | 203 } |
| 204 | 204 |
| 205 | 205 |
| 206 ASSEMBLER_TEST_RUN(AddressingModes, entry) { | 206 ASSEMBLER_TEST_RUN(AddressingModes, test) { |
| 207 // Avoid running the code since it is constructed to lead to crashes. | 207 // Avoid running the code since it is constructed to lead to crashes. |
| 208 } | 208 } |
| 209 | 209 |
| 210 | 210 |
| 211 ASSEMBLER_TEST_GENERATE(JumpAroundCrash, assembler) { | 211 ASSEMBLER_TEST_GENERATE(JumpAroundCrash, assembler) { |
| 212 Label done; | 212 Label done; |
| 213 // Make sure all the condition jumps work. | 213 // Make sure all the condition jumps work. |
| 214 for (Condition condition = OVERFLOW; | 214 for (Condition condition = OVERFLOW; |
| 215 condition <= GREATER; | 215 condition <= GREATER; |
| 216 condition = static_cast<Condition>(condition + 1)) { | 216 condition = static_cast<Condition>(condition + 1)) { |
| 217 __ j(condition, &done); | 217 __ j(condition, &done); |
| 218 } | 218 } |
| 219 // This isn't strictly necessary, but we do an unconditional | 219 // This isn't strictly necessary, but we do an unconditional |
| 220 // jump around the crashing code anyway. | 220 // jump around the crashing code anyway. |
| 221 __ jmp(&done); | 221 __ jmp(&done); |
| 222 | 222 |
| 223 // Be sure to skip this crashing code. | 223 // Be sure to skip this crashing code. |
| 224 __ movq(RAX, Immediate(0)); | 224 __ movq(RAX, Immediate(0)); |
| 225 __ movq(Address(RAX, 0), RAX); | 225 __ movq(Address(RAX, 0), RAX); |
| 226 | 226 |
| 227 __ Bind(&done); | 227 __ Bind(&done); |
| 228 __ ret(); | 228 __ ret(); |
| 229 } | 229 } |
| 230 | 230 |
| 231 | 231 |
| 232 ASSEMBLER_TEST_RUN(JumpAroundCrash, entry) { | 232 ASSEMBLER_TEST_RUN(JumpAroundCrash, test) { |
| 233 Instr* instr = Instr::At(entry); | 233 Instr* instr = Instr::At(test->entry()); |
| 234 EXPECT(!instr->IsBreakPoint()); | 234 EXPECT(!instr->IsBreakPoint()); |
| 235 typedef void (*JumpAroundCrashCode)(); | 235 typedef void (*JumpAroundCrashCode)(); |
| 236 reinterpret_cast<JumpAroundCrashCode>(entry)(); | 236 reinterpret_cast<JumpAroundCrashCode>(test->entry())(); |
| 237 } | 237 } |
| 238 | 238 |
| 239 | 239 |
| 240 ASSEMBLER_TEST_GENERATE(SimpleLoop, assembler) { | 240 ASSEMBLER_TEST_GENERATE(SimpleLoop, assembler) { |
| 241 __ movq(RAX, Immediate(0)); | 241 __ movq(RAX, Immediate(0)); |
| 242 __ movq(RCX, Immediate(0)); | 242 __ movq(RCX, Immediate(0)); |
| 243 Label loop; | 243 Label loop; |
| 244 __ Bind(&loop); | 244 __ Bind(&loop); |
| 245 __ addq(RAX, Immediate(2)); | 245 __ addq(RAX, Immediate(2)); |
| 246 __ incq(RCX); | 246 __ incq(RCX); |
| 247 __ cmpq(RCX, Immediate(87)); | 247 __ cmpq(RCX, Immediate(87)); |
| 248 __ j(LESS, &loop); | 248 __ j(LESS, &loop); |
| 249 __ ret(); | 249 __ ret(); |
| 250 } | 250 } |
| 251 | 251 |
| 252 | 252 |
| 253 ASSEMBLER_TEST_RUN(SimpleLoop, entry) { | 253 ASSEMBLER_TEST_RUN(SimpleLoop, test) { |
| 254 typedef int (*SimpleLoopCode)(); | 254 typedef int (*SimpleLoopCode)(); |
| 255 EXPECT_EQ(2 * 87, reinterpret_cast<SimpleLoopCode>(entry)()); | 255 EXPECT_EQ(2 * 87, reinterpret_cast<SimpleLoopCode>(test->entry())()); |
| 256 } | 256 } |
| 257 | 257 |
| 258 | 258 |
| 259 ASSEMBLER_TEST_GENERATE(Increment, assembler) { | 259 ASSEMBLER_TEST_GENERATE(Increment, assembler) { |
| 260 __ movq(RAX, Immediate(0)); | 260 __ movq(RAX, Immediate(0)); |
| 261 __ pushq(RAX); | 261 __ pushq(RAX); |
| 262 __ incl(Address(RSP, 0)); | 262 __ incl(Address(RSP, 0)); |
| 263 __ incq(Address(RSP, 0)); | 263 __ incq(Address(RSP, 0)); |
| 264 __ movq(RCX, Address(RSP, 0)); | 264 __ movq(RCX, Address(RSP, 0)); |
| 265 __ incq(RCX); | 265 __ incq(RCX); |
| 266 __ popq(RAX); | 266 __ popq(RAX); |
| 267 __ movq(RAX, RCX); | 267 __ movq(RAX, RCX); |
| 268 __ ret(); | 268 __ ret(); |
| 269 } | 269 } |
| 270 | 270 |
| 271 | 271 |
| 272 ASSEMBLER_TEST_RUN(Increment, entry) { | 272 ASSEMBLER_TEST_RUN(Increment, test) { |
| 273 typedef int (*IncrementCode)(); | 273 typedef int (*IncrementCode)(); |
| 274 EXPECT_EQ(3, reinterpret_cast<IncrementCode>(entry)()); | 274 EXPECT_EQ(3, reinterpret_cast<IncrementCode>(test->entry())()); |
| 275 } | 275 } |
| 276 | 276 |
| 277 | 277 |
| 278 ASSEMBLER_TEST_GENERATE(IncrementLong, assembler) { | 278 ASSEMBLER_TEST_GENERATE(IncrementLong, assembler) { |
| 279 __ movq(RAX, Immediate(0xffffffff)); | 279 __ movq(RAX, Immediate(0xffffffff)); |
| 280 __ pushq(RAX); | 280 __ pushq(RAX); |
| 281 __ incq(Address(RSP, 0)); | 281 __ incq(Address(RSP, 0)); |
| 282 __ movq(RCX, Address(RSP, 0)); | 282 __ movq(RCX, Address(RSP, 0)); |
| 283 __ incq(RCX); | 283 __ incq(RCX); |
| 284 __ popq(RAX); | 284 __ popq(RAX); |
| 285 __ movq(RAX, RCX); | 285 __ movq(RAX, RCX); |
| 286 __ ret(); | 286 __ ret(); |
| 287 } | 287 } |
| 288 | 288 |
| 289 | 289 |
| 290 ASSEMBLER_TEST_RUN(IncrementLong, entry) { | 290 ASSEMBLER_TEST_RUN(IncrementLong, test) { |
| 291 typedef int64_t (*IncrementCodeLong)(); | 291 typedef int64_t (*IncrementCodeLong)(); |
| 292 EXPECT_EQ(0x100000001, reinterpret_cast<IncrementCodeLong>(entry)()); | 292 EXPECT_EQ(0x100000001, reinterpret_cast<IncrementCodeLong>(test->entry())()); |
| 293 } | 293 } |
| 294 | 294 |
| 295 | 295 |
| 296 ASSEMBLER_TEST_GENERATE(Decrement, assembler) { | 296 ASSEMBLER_TEST_GENERATE(Decrement, assembler) { |
| 297 __ movq(RAX, Immediate(3)); | 297 __ movq(RAX, Immediate(3)); |
| 298 __ pushq(RAX); | 298 __ pushq(RAX); |
| 299 __ decl(Address(RSP, 0)); | 299 __ decl(Address(RSP, 0)); |
| 300 __ decq(Address(RSP, 0)); | 300 __ decq(Address(RSP, 0)); |
| 301 __ movq(RCX, Address(RSP, 0)); | 301 __ movq(RCX, Address(RSP, 0)); |
| 302 __ decq(RCX); | 302 __ decq(RCX); |
| 303 __ popq(RAX); | 303 __ popq(RAX); |
| 304 __ movq(RAX, RCX); | 304 __ movq(RAX, RCX); |
| 305 __ ret(); | 305 __ ret(); |
| 306 } | 306 } |
| 307 | 307 |
| 308 | 308 |
| 309 ASSEMBLER_TEST_RUN(Decrement, entry) { | 309 ASSEMBLER_TEST_RUN(Decrement, test) { |
| 310 typedef int (*DecrementCode)(); | 310 typedef int (*DecrementCode)(); |
| 311 EXPECT_EQ(0, reinterpret_cast<DecrementCode>(entry)()); | 311 EXPECT_EQ(0, reinterpret_cast<DecrementCode>(test->entry())()); |
| 312 } | 312 } |
| 313 | 313 |
| 314 | 314 |
| 315 ASSEMBLER_TEST_GENERATE(DecrementLong, assembler) { | 315 ASSEMBLER_TEST_GENERATE(DecrementLong, assembler) { |
| 316 __ movq(RAX, Immediate(0x100000001)); | 316 __ movq(RAX, Immediate(0x100000001)); |
| 317 __ pushq(RAX); | 317 __ pushq(RAX); |
| 318 __ decq(Address(RSP, 0)); | 318 __ decq(Address(RSP, 0)); |
| 319 __ movq(RCX, Address(RSP, 0)); | 319 __ movq(RCX, Address(RSP, 0)); |
| 320 __ decq(RCX); | 320 __ decq(RCX); |
| 321 __ popq(RAX); | 321 __ popq(RAX); |
| 322 __ movq(RAX, RCX); | 322 __ movq(RAX, RCX); |
| 323 __ ret(); | 323 __ ret(); |
| 324 } | 324 } |
| 325 | 325 |
| 326 | 326 |
| 327 ASSEMBLER_TEST_RUN(DecrementLong, entry) { | 327 ASSEMBLER_TEST_RUN(DecrementLong, test) { |
| 328 typedef int64_t (*DecrementCodeLong)(); | 328 typedef int64_t (*DecrementCodeLong)(); |
| 329 EXPECT_EQ(0xffffffff, reinterpret_cast<DecrementCodeLong>(entry)()); | 329 EXPECT_EQ(0xffffffff, reinterpret_cast<DecrementCodeLong>(test->entry())()); |
| 330 } | 330 } |
| 331 | 331 |
| 332 | 332 |
| 333 ASSEMBLER_TEST_GENERATE(SignedMultiply, assembler) { | 333 ASSEMBLER_TEST_GENERATE(SignedMultiply, assembler) { |
| 334 __ movl(RAX, Immediate(2)); | 334 __ movl(RAX, Immediate(2)); |
| 335 __ movl(RCX, Immediate(4)); | 335 __ movl(RCX, Immediate(4)); |
| 336 __ imull(RAX, RCX); | 336 __ imull(RAX, RCX); |
| 337 __ imull(RAX, Immediate(1000)); | 337 __ imull(RAX, Immediate(1000)); |
| 338 __ ret(); | 338 __ ret(); |
| 339 } | 339 } |
| 340 | 340 |
| 341 | 341 |
| 342 ASSEMBLER_TEST_RUN(SignedMultiply, entry) { | 342 ASSEMBLER_TEST_RUN(SignedMultiply, test) { |
| 343 typedef int (*SignedMultiply)(); | 343 typedef int (*SignedMultiply)(); |
| 344 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply>(entry)()); | 344 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply>(test->entry())()); |
| 345 } | 345 } |
| 346 | 346 |
| 347 | 347 |
| 348 ASSEMBLER_TEST_GENERATE(SignedMultiply64, assembler) { | 348 ASSEMBLER_TEST_GENERATE(SignedMultiply64, assembler) { |
| 349 __ pushq(R15); // Callee saved. | 349 __ pushq(R15); // Callee saved. |
| 350 __ movq(RAX, Immediate(2)); | 350 __ movq(RAX, Immediate(2)); |
| 351 __ movq(RCX, Immediate(4)); | 351 __ movq(RCX, Immediate(4)); |
| 352 __ imulq(RAX, RCX); | 352 __ imulq(RAX, RCX); |
| 353 | 353 |
| 354 __ movq(R8, Immediate(2)); | 354 __ movq(R8, Immediate(2)); |
| 355 __ movq(R9, Immediate(4)); | 355 __ movq(R9, Immediate(4)); |
| 356 __ pushq(R9); | 356 __ pushq(R9); |
| 357 __ imulq(R8, Address(RSP, 0)); | 357 __ imulq(R8, Address(RSP, 0)); |
| 358 __ popq(R9); | 358 __ popq(R9); |
| 359 __ addq(RAX, R8); | 359 __ addq(RAX, R8); |
| 360 | 360 |
| 361 __ movq(R10, Immediate(2)); | 361 __ movq(R10, Immediate(2)); |
| 362 __ movq(R11, Immediate(4)); | 362 __ movq(R11, Immediate(4)); |
| 363 __ imulq(R10, R11); | 363 __ imulq(R10, R11); |
| 364 __ addq(RAX, R10); | 364 __ addq(RAX, R10); |
| 365 | 365 |
| 366 __ movq(R15, Immediate(2)); | 366 __ movq(R15, Immediate(2)); |
| 367 __ imulq(R15, Immediate(4)); | 367 __ imulq(R15, Immediate(4)); |
| 368 __ addq(RAX, R15); | 368 __ addq(RAX, R15); |
| 369 __ popq(R15); | 369 __ popq(R15); |
| 370 __ ret(); | 370 __ ret(); |
| 371 } | 371 } |
| 372 | 372 |
| 373 | 373 |
| 374 ASSEMBLER_TEST_RUN(SignedMultiply64, entry) { | 374 ASSEMBLER_TEST_RUN(SignedMultiply64, test) { |
| 375 typedef int64_t (*SignedMultiply64)(); | 375 typedef int64_t (*SignedMultiply64)(); |
| 376 EXPECT_EQ(32, reinterpret_cast<SignedMultiply64>(entry)()); | 376 EXPECT_EQ(32, reinterpret_cast<SignedMultiply64>(test->entry())()); |
| 377 } | 377 } |
| 378 | 378 |
| 379 | 379 |
| 380 static const int64_t kLargeConstant = 0x1234567887654321; | 380 static const int64_t kLargeConstant = 0x1234567887654321; |
| 381 static const int64_t kAnotherLargeConstant = 987654321987654321LL; | 381 static const int64_t kAnotherLargeConstant = 987654321987654321LL; |
| 382 static const int64_t kProductLargeConstants = 0x5bbb29a7f52fbbd1; | 382 static const int64_t kProductLargeConstants = 0x5bbb29a7f52fbbd1; |
| 383 | 383 |
| 384 | 384 |
| 385 ASSEMBLER_TEST_GENERATE(SignedMultiplyLong, assembler) { | 385 ASSEMBLER_TEST_GENERATE(SignedMultiplyLong, assembler) { |
| 386 Label done; | 386 Label done; |
| 387 __ movq(RAX, Immediate(kLargeConstant)); | 387 __ movq(RAX, Immediate(kLargeConstant)); |
| 388 __ movq(RCX, Immediate(kAnotherLargeConstant)); | 388 __ movq(RCX, Immediate(kAnotherLargeConstant)); |
| 389 __ imulq(RAX, RCX); | 389 __ imulq(RAX, RCX); |
| 390 __ imulq(RCX, Immediate(kLargeConstant)); | 390 __ imulq(RCX, Immediate(kLargeConstant)); |
| 391 __ cmpq(RAX, RCX); | 391 __ cmpq(RAX, RCX); |
| 392 __ j(EQUAL, &done); | 392 __ j(EQUAL, &done); |
| 393 __ int3(); | 393 __ int3(); |
| 394 __ Bind(&done); | 394 __ Bind(&done); |
| 395 __ ret(); | 395 __ ret(); |
| 396 } | 396 } |
| 397 | 397 |
| 398 | 398 |
| 399 ASSEMBLER_TEST_RUN(SignedMultiplyLong, entry) { | 399 ASSEMBLER_TEST_RUN(SignedMultiplyLong, test) { |
| 400 typedef int64_t (*SignedMultiplyLong)(); | 400 typedef int64_t (*SignedMultiplyLong)(); |
| 401 EXPECT_EQ(kProductLargeConstants, | 401 EXPECT_EQ(kProductLargeConstants, |
| 402 reinterpret_cast<SignedMultiplyLong>(entry)()); | 402 reinterpret_cast<SignedMultiplyLong>(test->entry())()); |
| 403 } | 403 } |
| 404 | 404 |
| 405 | 405 |
| 406 ASSEMBLER_TEST_GENERATE(OverflowSignedMultiply, assembler) { | 406 ASSEMBLER_TEST_GENERATE(OverflowSignedMultiply, assembler) { |
| 407 __ movl(RDX, Immediate(0)); | 407 __ movl(RDX, Immediate(0)); |
| 408 __ movl(RAX, Immediate(0x0fffffff)); | 408 __ movl(RAX, Immediate(0x0fffffff)); |
| 409 __ movl(RCX, Immediate(0x0fffffff)); | 409 __ movl(RCX, Immediate(0x0fffffff)); |
| 410 __ imull(RAX, RCX); | 410 __ imull(RAX, RCX); |
| 411 __ imull(RAX, RDX); | 411 __ imull(RAX, RDX); |
| 412 __ ret(); | 412 __ ret(); |
| 413 } | 413 } |
| 414 | 414 |
| 415 | 415 |
| 416 ASSEMBLER_TEST_RUN(OverflowSignedMultiply, entry) { | 416 ASSEMBLER_TEST_RUN(OverflowSignedMultiply, test) { |
| 417 typedef int (*OverflowSignedMultiply)(); | 417 typedef int (*OverflowSignedMultiply)(); |
| 418 EXPECT_EQ(0, reinterpret_cast<OverflowSignedMultiply>(entry)()); | 418 EXPECT_EQ(0, reinterpret_cast<OverflowSignedMultiply>(test->entry())()); |
| 419 } | 419 } |
| 420 | 420 |
| 421 | 421 |
| 422 ASSEMBLER_TEST_GENERATE(SignedMultiply1, assembler) { | 422 ASSEMBLER_TEST_GENERATE(SignedMultiply1, assembler) { |
| 423 __ movl(RDX, Immediate(2)); | 423 __ movl(RDX, Immediate(2)); |
| 424 __ movl(RCX, Immediate(4)); | 424 __ movl(RCX, Immediate(4)); |
| 425 __ imull(RDX, RCX); | 425 __ imull(RDX, RCX); |
| 426 __ imull(RDX, Immediate(1000)); | 426 __ imull(RDX, Immediate(1000)); |
| 427 __ movl(RAX, RDX); | 427 __ movl(RAX, RDX); |
| 428 __ ret(); | 428 __ ret(); |
| 429 } | 429 } |
| 430 | 430 |
| 431 | 431 |
| 432 ASSEMBLER_TEST_RUN(SignedMultiply1, entry) { | 432 ASSEMBLER_TEST_RUN(SignedMultiply1, test) { |
| 433 typedef int (*SignedMultiply1)(); | 433 typedef int (*SignedMultiply1)(); |
| 434 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply1>(entry)()); | 434 EXPECT_EQ(8000, reinterpret_cast<SignedMultiply1>(test->entry())()); |
| 435 } | 435 } |
| 436 | 436 |
| 437 | 437 |
| 438 ASSEMBLER_TEST_GENERATE(SignedMultiply2, assembler) { | 438 ASSEMBLER_TEST_GENERATE(SignedMultiply2, assembler) { |
| 439 __ pushq(R15); // Callee saved. | 439 __ pushq(R15); // Callee saved. |
| 440 __ movl(R15, Immediate(2)); | 440 __ movl(R15, Immediate(2)); |
| 441 __ imull(R15, Immediate(1000)); | 441 __ imull(R15, Immediate(1000)); |
| 442 __ movl(RAX, R15); | 442 __ movl(RAX, R15); |
| 443 __ popq(R15); | 443 __ popq(R15); |
| 444 __ ret(); | 444 __ ret(); |
| 445 } | 445 } |
| 446 | 446 |
| 447 | 447 |
| 448 ASSEMBLER_TEST_RUN(SignedMultiply2, entry) { | 448 ASSEMBLER_TEST_RUN(SignedMultiply2, test) { |
| 449 typedef int (*SignedMultiply2)(); | 449 typedef int (*SignedMultiply2)(); |
| 450 EXPECT_EQ(2000, reinterpret_cast<SignedMultiply2>(entry)()); | 450 EXPECT_EQ(2000, reinterpret_cast<SignedMultiply2>(test->entry())()); |
| 451 } | 451 } |
| 452 | 452 |
| 453 | 453 |
| 454 ASSEMBLER_TEST_GENERATE(SignedDivide, assembler) { | 454 ASSEMBLER_TEST_GENERATE(SignedDivide, assembler) { |
| 455 __ movl(RAX, Immediate(-87)); | 455 __ movl(RAX, Immediate(-87)); |
| 456 __ movl(RDX, Immediate(123)); | 456 __ movl(RDX, Immediate(123)); |
| 457 __ cdq(); | 457 __ cdq(); |
| 458 __ movl(RCX, Immediate(42)); | 458 __ movl(RCX, Immediate(42)); |
| 459 __ idivl(RCX); | 459 __ idivl(RCX); |
| 460 __ ret(); | 460 __ ret(); |
| 461 } | 461 } |
| 462 | 462 |
| 463 | 463 |
| 464 ASSEMBLER_TEST_RUN(SignedDivide, entry) { | 464 ASSEMBLER_TEST_RUN(SignedDivide, test) { |
| 465 typedef int32_t (*SignedDivide)(); | 465 typedef int32_t (*SignedDivide)(); |
| 466 EXPECT_EQ(-87 / 42, reinterpret_cast<SignedDivide>(entry)()); | 466 EXPECT_EQ(-87 / 42, reinterpret_cast<SignedDivide>(test->entry())()); |
| 467 } | 467 } |
| 468 | 468 |
| 469 | 469 |
| 470 ASSEMBLER_TEST_GENERATE(SignedDivideLong, assembler) { | 470 ASSEMBLER_TEST_GENERATE(SignedDivideLong, assembler) { |
| 471 __ movq(RAX, Immediate(kLargeConstant)); | 471 __ movq(RAX, Immediate(kLargeConstant)); |
| 472 __ movq(RDX, Immediate(123)); | 472 __ movq(RDX, Immediate(123)); |
| 473 __ cqo(); // Clear RDX. | 473 __ cqo(); // Clear RDX. |
| 474 __ movq(RCX, Immediate(42)); | 474 __ movq(RCX, Immediate(42)); |
| 475 __ idivq(RCX); | 475 __ idivq(RCX); |
| 476 __ ret(); | 476 __ ret(); |
| 477 } | 477 } |
| 478 | 478 |
| 479 | 479 |
| 480 ASSEMBLER_TEST_RUN(SignedDivideLong, entry) { | 480 ASSEMBLER_TEST_RUN(SignedDivideLong, test) { |
| 481 typedef int64_t (*SignedDivideLong)(); | 481 typedef int64_t (*SignedDivideLong)(); |
| 482 EXPECT_EQ(kLargeConstant / 42, reinterpret_cast<SignedDivideLong>(entry)()); | 482 EXPECT_EQ(kLargeConstant / 42, |
| 483 reinterpret_cast<SignedDivideLong>(test->entry())()); |
| 483 } | 484 } |
| 484 | 485 |
| 485 | 486 |
| 486 ASSEMBLER_TEST_GENERATE(Negate, assembler) { | 487 ASSEMBLER_TEST_GENERATE(Negate, assembler) { |
| 487 __ movl(RCX, Immediate(42)); | 488 __ movl(RCX, Immediate(42)); |
| 488 __ negl(RCX); | 489 __ negl(RCX); |
| 489 __ movl(RAX, RCX); | 490 __ movl(RAX, RCX); |
| 490 __ ret(); | 491 __ ret(); |
| 491 } | 492 } |
| 492 | 493 |
| 493 | 494 |
| 494 ASSEMBLER_TEST_RUN(Negate, entry) { | 495 ASSEMBLER_TEST_RUN(Negate, test) { |
| 495 typedef int (*Negate)(); | 496 typedef int (*Negate)(); |
| 496 EXPECT_EQ(-42, reinterpret_cast<Negate>(entry)()); | 497 EXPECT_EQ(-42, reinterpret_cast<Negate>(test->entry())()); |
| 497 } | 498 } |
| 498 | 499 |
| 499 | 500 |
| 500 ASSEMBLER_TEST_GENERATE(MoveExtend, assembler) { | 501 ASSEMBLER_TEST_GENERATE(MoveExtend, assembler) { |
| 501 __ movq(RDX, Immediate(0xffff)); | 502 __ movq(RDX, Immediate(0xffff)); |
| 502 __ movzxb(RAX, RDX); // RAX = 0xff | 503 __ movzxb(RAX, RDX); // RAX = 0xff |
| 503 __ movsxw(R8, RDX); // R8 = -1 | 504 __ movsxw(R8, RDX); // R8 = -1 |
| 504 __ movzxw(RCX, RDX); // RCX = 0xffff | 505 __ movzxw(RCX, RDX); // RCX = 0xffff |
| 505 __ addq(R8, RCX); | 506 __ addq(R8, RCX); |
| 506 __ addq(RAX, R8); | 507 __ addq(RAX, R8); |
| 507 __ ret(); | 508 __ ret(); |
| 508 } | 509 } |
| 509 | 510 |
| 510 | 511 |
| 511 ASSEMBLER_TEST_RUN(MoveExtend, entry) { | 512 ASSEMBLER_TEST_RUN(MoveExtend, test) { |
| 512 typedef int (*MoveExtend)(); | 513 typedef int (*MoveExtend)(); |
| 513 EXPECT_EQ(0xff - 1 + 0xffff, reinterpret_cast<MoveExtend>(entry)()); | 514 EXPECT_EQ(0xff - 1 + 0xffff, reinterpret_cast<MoveExtend>(test->entry())()); |
| 514 } | 515 } |
| 515 | 516 |
| 516 | 517 |
| 517 ASSEMBLER_TEST_GENERATE(MoveExtendMemory, assembler) { | 518 ASSEMBLER_TEST_GENERATE(MoveExtendMemory, assembler) { |
| 518 __ movq(RDX, Immediate(0x123456781234ffff)); | 519 __ movq(RDX, Immediate(0x123456781234ffff)); |
| 519 | 520 |
| 520 __ pushq(RDX); | 521 __ pushq(RDX); |
| 521 __ movzxb(RAX, Address(RSP, 0)); // RAX = 0xff | 522 __ movzxb(RAX, Address(RSP, 0)); // RAX = 0xff |
| 522 __ movsxw(R8, Address(RSP, 0)); // R8 = -1 | 523 __ movsxw(R8, Address(RSP, 0)); // R8 = -1 |
| 523 __ movzxw(RCX, Address(RSP, 0)); // RCX = 0xffff | 524 __ movzxw(RCX, Address(RSP, 0)); // RCX = 0xffff |
| 524 __ addq(RSP, Immediate(kWordSize)); | 525 __ addq(RSP, Immediate(kWordSize)); |
| 525 | 526 |
| 526 __ addq(R8, RCX); | 527 __ addq(R8, RCX); |
| 527 __ addq(RAX, R8); | 528 __ addq(RAX, R8); |
| 528 __ ret(); | 529 __ ret(); |
| 529 } | 530 } |
| 530 | 531 |
| 531 | 532 |
| 532 ASSEMBLER_TEST_RUN(MoveExtendMemory, entry) { | 533 ASSEMBLER_TEST_RUN(MoveExtendMemory, test) { |
| 533 typedef int (*MoveExtendMemory)(); | 534 typedef int (*MoveExtendMemory)(); |
| 534 EXPECT_EQ(0xff - 1 + 0xffff, reinterpret_cast<MoveExtendMemory>(entry)()); | 535 EXPECT_EQ(0xff - 1 + 0xffff, |
| 536 reinterpret_cast<MoveExtendMemory>(test->entry())()); |
| 535 } | 537 } |
| 536 | 538 |
| 537 | 539 |
| 538 ASSEMBLER_TEST_GENERATE(MoveWord, assembler) { | 540 ASSEMBLER_TEST_GENERATE(MoveWord, assembler) { |
| 539 __ xorq(RAX, RAX); | 541 __ xorq(RAX, RAX); |
| 540 __ pushq(Immediate(0)); | 542 __ pushq(Immediate(0)); |
| 541 __ movq(RAX, RSP); | 543 __ movq(RAX, RSP); |
| 542 __ movq(RCX, Immediate(-1)); | 544 __ movq(RCX, Immediate(-1)); |
| 543 __ movw(Address(RAX, 0), RCX); | 545 __ movw(Address(RAX, 0), RCX); |
| 544 __ movzxw(RAX, Address(RAX, 0)); // RAX = 0xffff | 546 __ movzxw(RAX, Address(RAX, 0)); // RAX = 0xffff |
| 545 __ addq(RSP, Immediate(kWordSize)); | 547 __ addq(RSP, Immediate(kWordSize)); |
| 546 __ ret(); | 548 __ ret(); |
| 547 } | 549 } |
| 548 | 550 |
| 549 | 551 |
| 550 ASSEMBLER_TEST_RUN(MoveWord, entry) { | 552 ASSEMBLER_TEST_RUN(MoveWord, test) { |
| 551 typedef int (*MoveWord)(); | 553 typedef int (*MoveWord)(); |
| 552 EXPECT_EQ(0xffff, reinterpret_cast<MoveWord>(entry)()); | 554 EXPECT_EQ(0xffff, reinterpret_cast<MoveWord>(test->entry())()); |
| 553 } | 555 } |
| 554 | 556 |
| 555 | 557 |
| 556 ASSEMBLER_TEST_GENERATE(MoveWordRex, assembler) { | 558 ASSEMBLER_TEST_GENERATE(MoveWordRex, assembler) { |
| 557 __ pushq(Immediate(0)); | 559 __ pushq(Immediate(0)); |
| 558 __ movq(R8, RSP); | 560 __ movq(R8, RSP); |
| 559 __ movq(R9, Immediate(-1)); | 561 __ movq(R9, Immediate(-1)); |
| 560 __ movw(Address(R8, 0), R9); | 562 __ movw(Address(R8, 0), R9); |
| 561 __ movzxw(R8, Address(R8, 0)); // 0xffff | 563 __ movzxw(R8, Address(R8, 0)); // 0xffff |
| 562 __ xorq(RAX, RAX); | 564 __ xorq(RAX, RAX); |
| 563 __ addq(RAX, R8); // RAX = 0xffff | 565 __ addq(RAX, R8); // RAX = 0xffff |
| 564 __ addq(RSP, Immediate(kWordSize)); | 566 __ addq(RSP, Immediate(kWordSize)); |
| 565 __ ret(); | 567 __ ret(); |
| 566 } | 568 } |
| 567 | 569 |
| 568 | 570 |
| 569 ASSEMBLER_TEST_RUN(MoveWordRex, entry) { | 571 ASSEMBLER_TEST_RUN(MoveWordRex, test) { |
| 570 typedef int (*MoveWordRex)(); | 572 typedef int (*MoveWordRex)(); |
| 571 EXPECT_EQ(0xffff, reinterpret_cast<MoveWordRex>(entry)()); | 573 EXPECT_EQ(0xffff, reinterpret_cast<MoveWordRex>(test->entry())()); |
| 572 } | 574 } |
| 573 | 575 |
| 574 | 576 |
| 575 ASSEMBLER_TEST_GENERATE(Bitwise, assembler) { | 577 ASSEMBLER_TEST_GENERATE(Bitwise, assembler) { |
| 576 __ movl(RCX, Immediate(42)); | 578 __ movl(RCX, Immediate(42)); |
| 577 __ xorl(RCX, RCX); | 579 __ xorl(RCX, RCX); |
| 578 __ orl(RCX, Immediate(256)); | 580 __ orl(RCX, Immediate(256)); |
| 579 __ movl(RAX, Immediate(4)); | 581 __ movl(RAX, Immediate(4)); |
| 580 __ orl(RCX, RAX); | 582 __ orl(RCX, RAX); |
| 581 __ movl(RAX, Immediate(0xfff0)); | 583 __ movl(RAX, Immediate(0xfff0)); |
| 582 __ andl(RCX, RAX); | 584 __ andl(RCX, RAX); |
| 583 __ movl(RAX, Immediate(1)); | 585 __ movl(RAX, Immediate(1)); |
| 584 __ orl(RCX, RAX); | 586 __ orl(RCX, RAX); |
| 585 __ movl(RAX, RCX); | 587 __ movl(RAX, RCX); |
| 586 __ ret(); | 588 __ ret(); |
| 587 } | 589 } |
| 588 | 590 |
| 589 | 591 |
| 590 ASSEMBLER_TEST_RUN(Bitwise, entry) { | 592 ASSEMBLER_TEST_RUN(Bitwise, test) { |
| 591 typedef int (*Bitwise)(); | 593 typedef int (*Bitwise)(); |
| 592 EXPECT_EQ(256 + 1, reinterpret_cast<Bitwise>(entry)()); | 594 EXPECT_EQ(256 + 1, reinterpret_cast<Bitwise>(test->entry())()); |
| 593 } | 595 } |
| 594 | 596 |
| 595 | 597 |
| 596 ASSEMBLER_TEST_GENERATE(Bitwise64, assembler) { | 598 ASSEMBLER_TEST_GENERATE(Bitwise64, assembler) { |
| 597 Label error; | 599 Label error; |
| 598 __ movq(RAX, Immediate(42)); | 600 __ movq(RAX, Immediate(42)); |
| 599 __ pushq(RAX); | 601 __ pushq(RAX); |
| 600 __ xorq(RAX, Address(RSP, 0)); | 602 __ xorq(RAX, Address(RSP, 0)); |
| 601 __ popq(RCX); | 603 __ popq(RCX); |
| 602 __ cmpq(RAX, Immediate(0)); | 604 __ cmpq(RAX, Immediate(0)); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 624 __ xorq(RCX, Immediate(0)); | 626 __ xorq(RCX, Immediate(0)); |
| 625 __ popq(RAX); | 627 __ popq(RAX); |
| 626 __ movq(RAX, RCX); | 628 __ movq(RAX, RCX); |
| 627 __ ret(); | 629 __ ret(); |
| 628 __ Bind(&error); | 630 __ Bind(&error); |
| 629 __ movq(RAX, Immediate(-1)); | 631 __ movq(RAX, Immediate(-1)); |
| 630 __ ret(); | 632 __ ret(); |
| 631 } | 633 } |
| 632 | 634 |
| 633 | 635 |
| 634 ASSEMBLER_TEST_RUN(Bitwise64, entry) { | 636 ASSEMBLER_TEST_RUN(Bitwise64, test) { |
| 635 typedef int (*Bitwise64)(); | 637 typedef int (*Bitwise64)(); |
| 636 EXPECT_EQ(256 + 1, reinterpret_cast<Bitwise64>(entry)()); | 638 EXPECT_EQ(256 + 1, reinterpret_cast<Bitwise64>(test->entry())()); |
| 637 } | 639 } |
| 638 | 640 |
| 639 | 641 |
| 640 ASSEMBLER_TEST_GENERATE(LogicalOps, assembler) { | 642 ASSEMBLER_TEST_GENERATE(LogicalOps, assembler) { |
| 641 Label donetest1; | 643 Label donetest1; |
| 642 __ movl(RAX, Immediate(4)); | 644 __ movl(RAX, Immediate(4)); |
| 643 __ andl(RAX, Immediate(2)); | 645 __ andl(RAX, Immediate(2)); |
| 644 __ cmpl(RAX, Immediate(0)); | 646 __ cmpl(RAX, Immediate(0)); |
| 645 __ j(EQUAL, &donetest1); | 647 __ j(EQUAL, &donetest1); |
| 646 // Be sure to skip this crashing code. | 648 // Be sure to skip this crashing code. |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 826 // Be sure to skip this crashing code. | 828 // Be sure to skip this crashing code. |
| 827 __ movl(RAX, Immediate(0)); | 829 __ movl(RAX, Immediate(0)); |
| 828 __ movl(Address(RAX, 0), RAX); | 830 __ movl(Address(RAX, 0), RAX); |
| 829 __ Bind(&donetest13a); | 831 __ Bind(&donetest13a); |
| 830 | 832 |
| 831 __ movl(RAX, Immediate(0)); | 833 __ movl(RAX, Immediate(0)); |
| 832 __ ret(); | 834 __ ret(); |
| 833 } | 835 } |
| 834 | 836 |
| 835 | 837 |
| 836 ASSEMBLER_TEST_RUN(LogicalOps, entry) { | 838 ASSEMBLER_TEST_RUN(LogicalOps, test) { |
| 837 typedef int (*LogicalOpsCode)(); | 839 typedef int (*LogicalOpsCode)(); |
| 838 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(entry)()); | 840 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(test->entry())()); |
| 839 } | 841 } |
| 840 | 842 |
| 841 | 843 |
| 842 ASSEMBLER_TEST_GENERATE(LogicalOps64, assembler) { | 844 ASSEMBLER_TEST_GENERATE(LogicalOps64, assembler) { |
| 843 Label donetest1; | 845 Label donetest1; |
| 844 __ movq(RAX, Immediate(4)); | 846 __ movq(RAX, Immediate(4)); |
| 845 __ andq(RAX, Immediate(2)); | 847 __ andq(RAX, Immediate(2)); |
| 846 __ cmpq(RAX, Immediate(0)); | 848 __ cmpq(RAX, Immediate(0)); |
| 847 __ j(EQUAL, &donetest1); | 849 __ j(EQUAL, &donetest1); |
| 848 __ int3(); | 850 __ int3(); |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1016 __ j(EQUAL, &donetest15); | 1018 __ j(EQUAL, &donetest15); |
| 1017 __ int3(); | 1019 __ int3(); |
| 1018 __ Bind(&donetest15); | 1020 __ Bind(&donetest15); |
| 1019 __ popq(R15); // Callee saved. | 1021 __ popq(R15); // Callee saved. |
| 1020 | 1022 |
| 1021 __ movq(RAX, Immediate(0)); | 1023 __ movq(RAX, Immediate(0)); |
| 1022 __ ret(); | 1024 __ ret(); |
| 1023 } | 1025 } |
| 1024 | 1026 |
| 1025 | 1027 |
| 1026 ASSEMBLER_TEST_RUN(LogicalOps64, entry) { | 1028 ASSEMBLER_TEST_RUN(LogicalOps64, test) { |
| 1027 typedef int (*LogicalOpsCode)(); | 1029 typedef int (*LogicalOpsCode)(); |
| 1028 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(entry)()); | 1030 EXPECT_EQ(0, reinterpret_cast<LogicalOpsCode>(test->entry())()); |
| 1029 } | 1031 } |
| 1030 | 1032 |
| 1031 | 1033 |
| 1032 ASSEMBLER_TEST_GENERATE(LogicalTestL, assembler) { | 1034 ASSEMBLER_TEST_GENERATE(LogicalTestL, assembler) { |
| 1033 Label donetest1; | 1035 Label donetest1; |
| 1034 __ movl(RAX, Immediate(4)); | 1036 __ movl(RAX, Immediate(4)); |
| 1035 __ movl(RCX, Immediate(2)); | 1037 __ movl(RCX, Immediate(2)); |
| 1036 __ testl(RAX, RCX); | 1038 __ testl(RAX, RCX); |
| 1037 __ j(EQUAL, &donetest1); | 1039 __ j(EQUAL, &donetest1); |
| 1038 // Be sure to skip this crashing code. | 1040 // Be sure to skip this crashing code. |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1066 // Be sure to skip this crashing code. | 1068 // Be sure to skip this crashing code. |
| 1067 __ movl(RAX, Immediate(0)); | 1069 __ movl(RAX, Immediate(0)); |
| 1068 __ movl(Address(RAX, 0), RAX); | 1070 __ movl(Address(RAX, 0), RAX); |
| 1069 __ Bind(&donetest4); | 1071 __ Bind(&donetest4); |
| 1070 | 1072 |
| 1071 __ movl(RAX, Immediate(0)); | 1073 __ movl(RAX, Immediate(0)); |
| 1072 __ ret(); | 1074 __ ret(); |
| 1073 } | 1075 } |
| 1074 | 1076 |
| 1075 | 1077 |
| 1076 ASSEMBLER_TEST_RUN(LogicalTestL, entry) { | 1078 ASSEMBLER_TEST_RUN(LogicalTestL, test) { |
| 1077 typedef int (*LogicalTestCode)(); | 1079 typedef int (*LogicalTestCode)(); |
| 1078 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(entry)()); | 1080 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(test->entry())()); |
| 1079 } | 1081 } |
| 1080 | 1082 |
| 1081 | 1083 |
| 1082 ASSEMBLER_TEST_GENERATE(LogicalTestQ, assembler) { | 1084 ASSEMBLER_TEST_GENERATE(LogicalTestQ, assembler) { |
| 1083 Label donetest1; | 1085 Label donetest1; |
| 1084 __ movq(RAX, Immediate(4)); | 1086 __ movq(RAX, Immediate(4)); |
| 1085 __ movq(RCX, Immediate(2)); | 1087 __ movq(RCX, Immediate(2)); |
| 1086 __ testq(RAX, RCX); | 1088 __ testq(RAX, RCX); |
| 1087 __ j(EQUAL, &donetest1); | 1089 __ j(EQUAL, &donetest1); |
| 1088 // Be sure to skip this crashing code. | 1090 // Be sure to skip this crashing code. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1134 // Be sure to skip this crashing code. | 1136 // Be sure to skip this crashing code. |
| 1135 __ movq(RAX, Immediate(0)); | 1137 __ movq(RAX, Immediate(0)); |
| 1136 __ movq(Address(RAX, 0), RAX); | 1138 __ movq(Address(RAX, 0), RAX); |
| 1137 __ Bind(&donetest6); | 1139 __ Bind(&donetest6); |
| 1138 | 1140 |
| 1139 __ movq(RAX, Immediate(0)); | 1141 __ movq(RAX, Immediate(0)); |
| 1140 __ ret(); | 1142 __ ret(); |
| 1141 } | 1143 } |
| 1142 | 1144 |
| 1143 | 1145 |
| 1144 ASSEMBLER_TEST_RUN(LogicalTestQ, entry) { | 1146 ASSEMBLER_TEST_RUN(LogicalTestQ, test) { |
| 1145 typedef int (*LogicalTestCode)(); | 1147 typedef int (*LogicalTestCode)(); |
| 1146 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(entry)()); | 1148 EXPECT_EQ(0, reinterpret_cast<LogicalTestCode>(test->entry())()); |
| 1147 } | 1149 } |
| 1148 | 1150 |
| 1149 | 1151 |
| 1150 ASSEMBLER_TEST_GENERATE(CompareSwapEQ, assembler) { | 1152 ASSEMBLER_TEST_GENERATE(CompareSwapEQ, assembler) { |
| 1151 __ movq(RAX, Immediate(0)); | 1153 __ movq(RAX, Immediate(0)); |
| 1152 __ pushq(RAX); | 1154 __ pushq(RAX); |
| 1153 __ movq(RAX, Immediate(4)); | 1155 __ movq(RAX, Immediate(4)); |
| 1154 __ movq(RCX, Immediate(0)); | 1156 __ movq(RCX, Immediate(0)); |
| 1155 __ movq(Address(RSP, 0), RAX); | 1157 __ movq(Address(RSP, 0), RAX); |
| 1156 __ lock_cmpxchgq(Address(RSP, 0), RCX); | 1158 __ lock_cmpxchgq(Address(RSP, 0), RCX); |
| 1157 __ popq(RAX); | 1159 __ popq(RAX); |
| 1158 __ ret(); | 1160 __ ret(); |
| 1159 } | 1161 } |
| 1160 | 1162 |
| 1161 | 1163 |
| 1162 ASSEMBLER_TEST_RUN(CompareSwapEQ, entry) { | 1164 ASSEMBLER_TEST_RUN(CompareSwapEQ, test) { |
| 1163 typedef int (*CompareSwapEQCode)(); | 1165 typedef int (*CompareSwapEQCode)(); |
| 1164 EXPECT_EQ(0, reinterpret_cast<CompareSwapEQCode>(entry)()); | 1166 EXPECT_EQ(0, reinterpret_cast<CompareSwapEQCode>(test->entry())()); |
| 1165 } | 1167 } |
| 1166 | 1168 |
| 1167 | 1169 |
| 1168 ASSEMBLER_TEST_GENERATE(CompareSwapNEQ, assembler) { | 1170 ASSEMBLER_TEST_GENERATE(CompareSwapNEQ, assembler) { |
| 1169 __ movq(RAX, Immediate(0)); | 1171 __ movq(RAX, Immediate(0)); |
| 1170 __ pushq(RAX); | 1172 __ pushq(RAX); |
| 1171 __ movq(RAX, Immediate(2)); | 1173 __ movq(RAX, Immediate(2)); |
| 1172 __ movq(RCX, Immediate(4)); | 1174 __ movq(RCX, Immediate(4)); |
| 1173 __ movq(Address(RSP, 0), RCX); | 1175 __ movq(Address(RSP, 0), RCX); |
| 1174 __ lock_cmpxchgq(Address(RSP, 0), RCX); | 1176 __ lock_cmpxchgq(Address(RSP, 0), RCX); |
| 1175 __ popq(RAX); | 1177 __ popq(RAX); |
| 1176 __ ret(); | 1178 __ ret(); |
| 1177 } | 1179 } |
| 1178 | 1180 |
| 1179 | 1181 |
| 1180 ASSEMBLER_TEST_RUN(CompareSwapNEQ, entry) { | 1182 ASSEMBLER_TEST_RUN(CompareSwapNEQ, test) { |
| 1181 typedef int (*CompareSwapNEQCode)(); | 1183 typedef int (*CompareSwapNEQCode)(); |
| 1182 EXPECT_EQ(4, reinterpret_cast<CompareSwapNEQCode>(entry)()); | 1184 EXPECT_EQ(4, reinterpret_cast<CompareSwapNEQCode>(test->entry())()); |
| 1183 } | 1185 } |
| 1184 | 1186 |
| 1185 | 1187 |
| 1186 ASSEMBLER_TEST_GENERATE(Exchange, assembler) { | 1188 ASSEMBLER_TEST_GENERATE(Exchange, assembler) { |
| 1187 __ movq(RAX, Immediate(kLargeConstant)); | 1189 __ movq(RAX, Immediate(kLargeConstant)); |
| 1188 __ movq(RDX, Immediate(kAnotherLargeConstant)); | 1190 __ movq(RDX, Immediate(kAnotherLargeConstant)); |
| 1189 __ xchgq(RAX, RDX); | 1191 __ xchgq(RAX, RDX); |
| 1190 __ subq(RAX, RDX); | 1192 __ subq(RAX, RDX); |
| 1191 __ ret(); | 1193 __ ret(); |
| 1192 } | 1194 } |
| 1193 | 1195 |
| 1194 | 1196 |
| 1195 ASSEMBLER_TEST_RUN(Exchange, entry) { | 1197 ASSEMBLER_TEST_RUN(Exchange, test) { |
| 1196 typedef int64_t (*Exchange)(); | 1198 typedef int64_t (*Exchange)(); |
| 1197 EXPECT_EQ(kAnotherLargeConstant - kLargeConstant, | 1199 EXPECT_EQ(kAnotherLargeConstant - kLargeConstant, |
| 1198 reinterpret_cast<Exchange>(entry)()); | 1200 reinterpret_cast<Exchange>(test->entry())()); |
| 1199 } | 1201 } |
| 1200 | 1202 |
| 1201 | 1203 |
| 1202 ASSEMBLER_TEST_GENERATE(LargeConstant, assembler) { | 1204 ASSEMBLER_TEST_GENERATE(LargeConstant, assembler) { |
| 1203 __ movq(RAX, Immediate(kLargeConstant)); | 1205 __ movq(RAX, Immediate(kLargeConstant)); |
| 1204 __ ret(); | 1206 __ ret(); |
| 1205 } | 1207 } |
| 1206 | 1208 |
| 1207 | 1209 |
| 1208 ASSEMBLER_TEST_RUN(LargeConstant, entry) { | 1210 ASSEMBLER_TEST_RUN(LargeConstant, test) { |
| 1209 typedef int64_t (*LargeConstantCode)(); | 1211 typedef int64_t (*LargeConstantCode)(); |
| 1210 EXPECT_EQ(kLargeConstant, reinterpret_cast<LargeConstantCode>(entry)()); | 1212 EXPECT_EQ(kLargeConstant, |
| 1213 reinterpret_cast<LargeConstantCode>(test->entry())()); |
| 1211 } | 1214 } |
| 1212 | 1215 |
| 1213 | 1216 |
| 1214 static int ComputeStackSpaceReservation(int needed, int fixed) { | 1217 static int ComputeStackSpaceReservation(int needed, int fixed) { |
| 1215 static const int kFrameAlignment = OS::ActivationFrameAlignment(); | 1218 static const int kFrameAlignment = OS::ActivationFrameAlignment(); |
| 1216 return (kFrameAlignment > 0) | 1219 return (kFrameAlignment > 0) |
| 1217 ? Utils::RoundUp(needed + fixed, kFrameAlignment) - fixed | 1220 ? Utils::RoundUp(needed + fixed, kFrameAlignment) - fixed |
| 1218 : needed; | 1221 : needed; |
| 1219 } | 1222 } |
| 1220 | 1223 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1239 __ AddImmediate(RSP, Immediate(space)); | 1242 __ AddImmediate(RSP, Immediate(space)); |
| 1240 space = ComputeStackSpaceReservation(0, 8); | 1243 space = ComputeStackSpaceReservation(0, 8); |
| 1241 __ AddImmediate(RSP, Immediate(-space)); | 1244 __ AddImmediate(RSP, Immediate(-space)); |
| 1242 __ movl(RDI, RAX); | 1245 __ movl(RDI, RAX); |
| 1243 __ call(&call2); | 1246 __ call(&call2); |
| 1244 __ AddImmediate(RSP, Immediate(space)); | 1247 __ AddImmediate(RSP, Immediate(space)); |
| 1245 __ ret(); | 1248 __ ret(); |
| 1246 } | 1249 } |
| 1247 | 1250 |
| 1248 | 1251 |
| 1249 ASSEMBLER_TEST_RUN(CallSimpleLeaf, entry) { | 1252 ASSEMBLER_TEST_RUN(CallSimpleLeaf, test) { |
| 1250 typedef int (*CallSimpleLeafCode)(); | 1253 typedef int (*CallSimpleLeafCode)(); |
| 1251 EXPECT_EQ(42 + 87, reinterpret_cast<CallSimpleLeafCode>(entry)()); | 1254 EXPECT_EQ(42 + 87, reinterpret_cast<CallSimpleLeafCode>(test->entry())()); |
| 1252 } | 1255 } |
| 1253 | 1256 |
| 1254 | 1257 |
| 1255 ASSEMBLER_TEST_GENERATE(JumpSimpleLeaf, assembler) { | 1258 ASSEMBLER_TEST_GENERATE(JumpSimpleLeaf, assembler) { |
| 1256 ExternalLabel call1("LeafReturn42", reinterpret_cast<uword>(LeafReturn42)); | 1259 ExternalLabel call1("LeafReturn42", reinterpret_cast<uword>(LeafReturn42)); |
| 1257 Label L; | 1260 Label L; |
| 1258 int space = ComputeStackSpaceReservation(0, 8); | 1261 int space = ComputeStackSpaceReservation(0, 8); |
| 1259 __ AddImmediate(RSP, Immediate(-space)); | 1262 __ AddImmediate(RSP, Immediate(-space)); |
| 1260 __ call(&L); | 1263 __ call(&L); |
| 1261 __ AddImmediate(RSP, Immediate(space)); | 1264 __ AddImmediate(RSP, Immediate(space)); |
| 1262 __ ret(); | 1265 __ ret(); |
| 1263 __ Bind(&L); | 1266 __ Bind(&L); |
| 1264 __ jmp(&call1); | 1267 __ jmp(&call1); |
| 1265 } | 1268 } |
| 1266 | 1269 |
| 1267 | 1270 |
| 1268 ASSEMBLER_TEST_RUN(JumpSimpleLeaf, entry) { | 1271 ASSEMBLER_TEST_RUN(JumpSimpleLeaf, test) { |
| 1269 typedef int (*JumpSimpleLeafCode)(); | 1272 typedef int (*JumpSimpleLeafCode)(); |
| 1270 EXPECT_EQ(42, reinterpret_cast<JumpSimpleLeafCode>(entry)()); | 1273 EXPECT_EQ(42, reinterpret_cast<JumpSimpleLeafCode>(test->entry())()); |
| 1271 } | 1274 } |
| 1272 | 1275 |
| 1273 | 1276 |
| 1274 ASSEMBLER_TEST_GENERATE(SingleFPMoves, assembler) { | 1277 ASSEMBLER_TEST_GENERATE(SingleFPMoves, assembler) { |
| 1275 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f))); | 1278 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f))); |
| 1276 __ movd(XMM0, RAX); | 1279 __ movd(XMM0, RAX); |
| 1277 __ movss(XMM1, XMM0); | 1280 __ movss(XMM1, XMM0); |
| 1278 __ movss(XMM2, XMM1); | 1281 __ movss(XMM2, XMM1); |
| 1279 __ movss(XMM3, XMM2); | 1282 __ movss(XMM3, XMM2); |
| 1280 __ movss(XMM4, XMM3); | 1283 __ movss(XMM4, XMM3); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1319 __ movss(XMM3, XMM4); | 1322 __ movss(XMM3, XMM4); |
| 1320 __ movss(XMM2, XMM3); | 1323 __ movss(XMM2, XMM3); |
| 1321 __ movss(XMM1, XMM2); | 1324 __ movss(XMM1, XMM2); |
| 1322 __ movss(XMM0, XMM1); | 1325 __ movss(XMM0, XMM1); |
| 1323 __ popq(RAX); | 1326 __ popq(RAX); |
| 1324 __ popq(R15); // Callee saved. | 1327 __ popq(R15); // Callee saved. |
| 1325 __ ret(); | 1328 __ ret(); |
| 1326 } | 1329 } |
| 1327 | 1330 |
| 1328 | 1331 |
| 1329 ASSEMBLER_TEST_RUN(SingleFPMoves, entry) { | 1332 ASSEMBLER_TEST_RUN(SingleFPMoves, test) { |
| 1330 typedef float (*SingleFPMovesCode)(); | 1333 typedef float (*SingleFPMovesCode)(); |
| 1331 EXPECT_EQ(234, reinterpret_cast<SingleFPMovesCode>(entry)()); | 1334 EXPECT_EQ(234, reinterpret_cast<SingleFPMovesCode>(test->entry())()); |
| 1332 } | 1335 } |
| 1333 | 1336 |
| 1334 | 1337 |
| 1335 ASSEMBLER_TEST_GENERATE(SingleFPMoves2, assembler) { | 1338 ASSEMBLER_TEST_GENERATE(SingleFPMoves2, assembler) { |
| 1336 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f))); | 1339 __ movq(RAX, Immediate(bit_cast<int32_t, float>(234.0f))); |
| 1337 __ movd(XMM0, RAX); | 1340 __ movd(XMM0, RAX); |
| 1338 __ movd(XMM8, RAX); | 1341 __ movd(XMM8, RAX); |
| 1339 __ movss(XMM1, XMM8); | 1342 __ movss(XMM1, XMM8); |
| 1340 __ pushq(RAX); | 1343 __ pushq(RAX); |
| 1341 __ movq(Address(RSP, 0), Immediate(0)); | 1344 __ movq(Address(RSP, 0), Immediate(0)); |
| 1342 __ movss(XMM0, Address(RSP, 0)); | 1345 __ movss(XMM0, Address(RSP, 0)); |
| 1343 __ movss(Address(RSP, 0), XMM1); | 1346 __ movss(Address(RSP, 0), XMM1); |
| 1344 __ movss(XMM0, Address(RSP, 0)); | 1347 __ movss(XMM0, Address(RSP, 0)); |
| 1345 __ movq(Address(RSP, 0), Immediate(0)); | 1348 __ movq(Address(RSP, 0), Immediate(0)); |
| 1346 __ movss(XMM9, XMM8); | 1349 __ movss(XMM9, XMM8); |
| 1347 __ movss(Address(RSP, 0), XMM9); | 1350 __ movss(Address(RSP, 0), XMM9); |
| 1348 __ movss(XMM8, Address(RSP, 0)); | 1351 __ movss(XMM8, Address(RSP, 0)); |
| 1349 __ movss(XMM0, XMM8); | 1352 __ movss(XMM0, XMM8); |
| 1350 __ popq(RAX); | 1353 __ popq(RAX); |
| 1351 __ ret(); | 1354 __ ret(); |
| 1352 } | 1355 } |
| 1353 | 1356 |
| 1354 | 1357 |
| 1355 ASSEMBLER_TEST_RUN(SingleFPMoves2, entry) { | 1358 ASSEMBLER_TEST_RUN(SingleFPMoves2, test) { |
| 1356 typedef float (*SingleFPMoves2Code)(); | 1359 typedef float (*SingleFPMoves2Code)(); |
| 1357 EXPECT_EQ(234, reinterpret_cast<SingleFPMoves2Code>(entry)()); | 1360 EXPECT_EQ(234, reinterpret_cast<SingleFPMoves2Code>(test->entry())()); |
| 1358 } | 1361 } |
| 1359 | 1362 |
| 1360 | 1363 |
| 1361 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) { | 1364 ASSEMBLER_TEST_GENERATE(SingleFPOperations, assembler) { |
| 1362 __ pushq(RBX); | 1365 __ pushq(RBX); |
| 1363 __ pushq(RCX); | 1366 __ pushq(RCX); |
| 1364 __ movq(RBX, Immediate(bit_cast<int32_t, float>(12.3f))); | 1367 __ movq(RBX, Immediate(bit_cast<int32_t, float>(12.3f))); |
| 1365 __ movd(XMM0, RBX); | 1368 __ movd(XMM0, RBX); |
| 1366 __ movd(XMM8, RBX); | 1369 __ movd(XMM8, RBX); |
| 1367 __ movq(RCX, Immediate(bit_cast<int32_t, float>(3.4f))); | 1370 __ movq(RCX, Immediate(bit_cast<int32_t, float>(3.4f))); |
| 1368 __ movd(XMM1, RCX); | 1371 __ movd(XMM1, RCX); |
| 1369 __ movd(XMM9, RCX); | 1372 __ movd(XMM9, RCX); |
| 1370 __ addss(XMM0, XMM1); // 15.7f | 1373 __ addss(XMM0, XMM1); // 15.7f |
| 1371 __ mulss(XMM0, XMM1); // 53.38f | 1374 __ mulss(XMM0, XMM1); // 53.38f |
| 1372 __ subss(XMM0, XMM1); // 49.98f | 1375 __ subss(XMM0, XMM1); // 49.98f |
| 1373 __ divss(XMM0, XMM1); // 14.7f | 1376 __ divss(XMM0, XMM1); // 14.7f |
| 1374 __ addss(XMM8, XMM9); // 15.7f | 1377 __ addss(XMM8, XMM9); // 15.7f |
| 1375 __ mulss(XMM8, XMM9); // 53.38f | 1378 __ mulss(XMM8, XMM9); // 53.38f |
| 1376 __ subss(XMM8, XMM9); // 49.98f | 1379 __ subss(XMM8, XMM9); // 49.98f |
| 1377 __ divss(XMM8, XMM9); // 14.7f | 1380 __ divss(XMM8, XMM9); // 14.7f |
| 1378 __ subss(XMM0, XMM8); // 0.0f | 1381 __ subss(XMM0, XMM8); // 0.0f |
| 1379 __ popq(RCX); | 1382 __ popq(RCX); |
| 1380 __ popq(RBX); | 1383 __ popq(RBX); |
| 1381 __ ret(); | 1384 __ ret(); |
| 1382 } | 1385 } |
| 1383 | 1386 |
| 1384 | 1387 |
| 1385 ASSEMBLER_TEST_RUN(SingleFPOperations, entry) { | 1388 ASSEMBLER_TEST_RUN(SingleFPOperations, test) { |
| 1386 typedef float (*SingleFPOperationsCode)(); | 1389 typedef float (*SingleFPOperationsCode)(); |
| 1387 float res = reinterpret_cast<SingleFPOperationsCode>(entry)(); | 1390 float res = reinterpret_cast<SingleFPOperationsCode>(test->entry())(); |
| 1388 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); | 1391 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); |
| 1389 } | 1392 } |
| 1390 | 1393 |
| 1391 ASSEMBLER_TEST_GENERATE(PackedFPOperations, assembler) { | 1394 ASSEMBLER_TEST_GENERATE(PackedFPOperations, assembler) { |
| 1392 __ movq(RAX, Immediate(bit_cast<int32_t, float>(12.3f))); | 1395 __ movq(RAX, Immediate(bit_cast<int32_t, float>(12.3f))); |
| 1393 __ movd(XMM10, RAX); | 1396 __ movd(XMM10, RAX); |
| 1394 __ shufps(XMM10, XMM10, Immediate(0x0)); | 1397 __ shufps(XMM10, XMM10, Immediate(0x0)); |
| 1395 __ movq(RAX, Immediate(bit_cast<int32_t, float>(3.4f))); | 1398 __ movq(RAX, Immediate(bit_cast<int32_t, float>(3.4f))); |
| 1396 __ movd(XMM9, RAX); | 1399 __ movd(XMM9, RAX); |
| 1397 __ shufps(XMM9, XMM9, Immediate(0x0)); | 1400 __ shufps(XMM9, XMM9, Immediate(0x0)); |
| 1398 __ addps(XMM10, XMM9); // 15.7f | 1401 __ addps(XMM10, XMM9); // 15.7f |
| 1399 __ mulps(XMM10, XMM9); // 53.38f | 1402 __ mulps(XMM10, XMM9); // 53.38f |
| 1400 __ subps(XMM10, XMM9); // 49.98f | 1403 __ subps(XMM10, XMM9); // 49.98f |
| 1401 __ divps(XMM10, XMM9); // 14.7f | 1404 __ divps(XMM10, XMM9); // 14.7f |
| 1402 __ movaps(XMM0, XMM10); | 1405 __ movaps(XMM0, XMM10); |
| 1403 __ shufps(XMM0, XMM0, Immediate(0x55)); // Copy second lane into all 4 lanes. | 1406 __ shufps(XMM0, XMM0, Immediate(0x55)); // Copy second lane into all 4 lanes. |
| 1404 __ ret(); | 1407 __ ret(); |
| 1405 } | 1408 } |
| 1406 | 1409 |
| 1407 | 1410 |
| 1408 ASSEMBLER_TEST_RUN(PackedFPOperations, entry) { | 1411 ASSEMBLER_TEST_RUN(PackedFPOperations, test) { |
| 1409 typedef float (*PackedFPOperationsCode)(); | 1412 typedef float (*PackedFPOperationsCode)(); |
| 1410 float res = reinterpret_cast<PackedFPOperationsCode>(entry)(); | 1413 float res = reinterpret_cast<PackedFPOperationsCode>(test->entry())(); |
| 1411 EXPECT_FLOAT_EQ(14.7f, res, 0.001f); | 1414 EXPECT_FLOAT_EQ(14.7f, res, 0.001f); |
| 1412 } | 1415 } |
| 1413 | 1416 |
| 1414 | 1417 |
| 1415 ASSEMBLER_TEST_GENERATE(PackedFPOperations2, assembler) { | 1418 ASSEMBLER_TEST_GENERATE(PackedFPOperations2, assembler) { |
| 1416 __ movq(RAX, Immediate(bit_cast<int32_t, float>(4.0f))); | 1419 __ movq(RAX, Immediate(bit_cast<int32_t, float>(4.0f))); |
| 1417 __ movd(XMM0, RAX); | 1420 __ movd(XMM0, RAX); |
| 1418 __ shufps(XMM0, XMM0, Immediate(0x0)); | 1421 __ shufps(XMM0, XMM0, Immediate(0x0)); |
| 1419 | 1422 |
| 1420 __ movaps(XMM11, XMM0); // Copy XMM0 | 1423 __ movaps(XMM11, XMM0); // Copy XMM0 |
| 1421 __ reciprocalps(XMM11); // 0.25 | 1424 __ reciprocalps(XMM11); // 0.25 |
| 1422 __ sqrtps(XMM11); // 0.5 | 1425 __ sqrtps(XMM11); // 0.5 |
| 1423 __ rsqrtps(XMM0); // ~0.5 | 1426 __ rsqrtps(XMM0); // ~0.5 |
| 1424 __ subps(XMM0, XMM11); // ~0.0 | 1427 __ subps(XMM0, XMM11); // ~0.0 |
| 1425 __ shufps(XMM0, XMM0, Immediate(0x00)); // Copy second lane into all 4 lanes. | 1428 __ shufps(XMM0, XMM0, Immediate(0x00)); // Copy second lane into all 4 lanes. |
| 1426 __ ret(); | 1429 __ ret(); |
| 1427 } | 1430 } |
| 1428 | 1431 |
| 1429 | 1432 |
| 1430 ASSEMBLER_TEST_RUN(PackedFPOperations2, entry) { | 1433 ASSEMBLER_TEST_RUN(PackedFPOperations2, test) { |
| 1431 typedef float (*PackedFPOperations2Code)(); | 1434 typedef float (*PackedFPOperations2Code)(); |
| 1432 float res = reinterpret_cast<PackedFPOperations2Code>(entry)(); | 1435 float res = reinterpret_cast<PackedFPOperations2Code>(test->entry())(); |
| 1433 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); | 1436 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); |
| 1434 } | 1437 } |
| 1435 | 1438 |
| 1436 | 1439 |
| 1437 ASSEMBLER_TEST_GENERATE(PackedCompareEQ, assembler) { | 1440 ASSEMBLER_TEST_GENERATE(PackedCompareEQ, assembler) { |
| 1438 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); | 1441 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); |
| 1439 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); | 1442 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); |
| 1440 __ cmppseq(XMM0, XMM1); | 1443 __ cmppseq(XMM0, XMM1); |
| 1441 __ pushq(RAX); | 1444 __ pushq(RAX); |
| 1442 __ movss(Address(RSP, 0), XMM0); | 1445 __ movss(Address(RSP, 0), XMM0); |
| 1443 __ popq(RAX); | 1446 __ popq(RAX); |
| 1444 __ ret(); | 1447 __ ret(); |
| 1445 } | 1448 } |
| 1446 | 1449 |
| 1447 | 1450 |
| 1448 ASSEMBLER_TEST_RUN(PackedCompareEQ, entry) { | 1451 ASSEMBLER_TEST_RUN(PackedCompareEQ, test) { |
| 1449 typedef uint32_t (*PackedCompareEQCode)(); | 1452 typedef uint32_t (*PackedCompareEQCode)(); |
| 1450 uint32_t res = reinterpret_cast<PackedCompareEQCode>(entry)(); | 1453 uint32_t res = reinterpret_cast<PackedCompareEQCode>(test->entry())(); |
| 1451 EXPECT_EQ(static_cast<uword>(0x0), res); | 1454 EXPECT_EQ(static_cast<uword>(0x0), res); |
| 1452 } | 1455 } |
| 1453 | 1456 |
| 1454 | 1457 |
| 1455 ASSEMBLER_TEST_GENERATE(PackedCompareNEQ, assembler) { | 1458 ASSEMBLER_TEST_GENERATE(PackedCompareNEQ, assembler) { |
| 1456 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); | 1459 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); |
| 1457 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); | 1460 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); |
| 1458 __ cmppsneq(XMM0, XMM1); | 1461 __ cmppsneq(XMM0, XMM1); |
| 1459 __ pushq(RAX); | 1462 __ pushq(RAX); |
| 1460 __ movss(Address(RSP, 0), XMM0); | 1463 __ movss(Address(RSP, 0), XMM0); |
| 1461 __ popq(RAX); | 1464 __ popq(RAX); |
| 1462 __ ret(); | 1465 __ ret(); |
| 1463 } | 1466 } |
| 1464 | 1467 |
| 1465 | 1468 |
| 1466 ASSEMBLER_TEST_RUN(PackedCompareNEQ, entry) { | 1469 ASSEMBLER_TEST_RUN(PackedCompareNEQ, test) { |
| 1467 typedef uint32_t (*PackedCompareNEQCode)(); | 1470 typedef uint32_t (*PackedCompareNEQCode)(); |
| 1468 uint32_t res = reinterpret_cast<PackedCompareNEQCode>(entry)(); | 1471 uint32_t res = reinterpret_cast<PackedCompareNEQCode>(test->entry())(); |
| 1469 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); | 1472 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); |
| 1470 } | 1473 } |
| 1471 | 1474 |
| 1472 | 1475 |
| 1473 ASSEMBLER_TEST_GENERATE(PackedCompareLT, assembler) { | 1476 ASSEMBLER_TEST_GENERATE(PackedCompareLT, assembler) { |
| 1474 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); | 1477 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); |
| 1475 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); | 1478 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); |
| 1476 __ cmppslt(XMM0, XMM1); | 1479 __ cmppslt(XMM0, XMM1); |
| 1477 __ pushq(RAX); | 1480 __ pushq(RAX); |
| 1478 __ movss(Address(RSP, 0), XMM0); | 1481 __ movss(Address(RSP, 0), XMM0); |
| 1479 __ popq(RAX); | 1482 __ popq(RAX); |
| 1480 __ ret(); | 1483 __ ret(); |
| 1481 } | 1484 } |
| 1482 | 1485 |
| 1483 | 1486 |
| 1484 ASSEMBLER_TEST_RUN(PackedCompareLT, entry) { | 1487 ASSEMBLER_TEST_RUN(PackedCompareLT, test) { |
| 1485 typedef uint32_t (*PackedCompareLTCode)(); | 1488 typedef uint32_t (*PackedCompareLTCode)(); |
| 1486 uint32_t res = reinterpret_cast<PackedCompareLTCode>(entry)(); | 1489 uint32_t res = reinterpret_cast<PackedCompareLTCode>(test->entry())(); |
| 1487 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); | 1490 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); |
| 1488 } | 1491 } |
| 1489 | 1492 |
| 1490 | 1493 |
| 1491 ASSEMBLER_TEST_GENERATE(PackedCompareLE, assembler) { | 1494 ASSEMBLER_TEST_GENERATE(PackedCompareLE, assembler) { |
| 1492 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); | 1495 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); |
| 1493 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); | 1496 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); |
| 1494 __ cmppsle(XMM0, XMM1); | 1497 __ cmppsle(XMM0, XMM1); |
| 1495 __ pushq(RAX); | 1498 __ pushq(RAX); |
| 1496 __ movss(Address(RSP, 0), XMM0); | 1499 __ movss(Address(RSP, 0), XMM0); |
| 1497 __ popq(RAX); | 1500 __ popq(RAX); |
| 1498 __ ret(); | 1501 __ ret(); |
| 1499 } | 1502 } |
| 1500 | 1503 |
| 1501 | 1504 |
| 1502 ASSEMBLER_TEST_RUN(PackedCompareLE, entry) { | 1505 ASSEMBLER_TEST_RUN(PackedCompareLE, test) { |
| 1503 typedef uint32_t (*PackedCompareLECode)(); | 1506 typedef uint32_t (*PackedCompareLECode)(); |
| 1504 uint32_t res = reinterpret_cast<PackedCompareLECode>(entry)(); | 1507 uint32_t res = reinterpret_cast<PackedCompareLECode>(test->entry())(); |
| 1505 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); | 1508 EXPECT_EQ(static_cast<uword>(0xFFFFFFFF), res); |
| 1506 } | 1509 } |
| 1507 | 1510 |
| 1508 | 1511 |
| 1509 ASSEMBLER_TEST_GENERATE(PackedCompareNLT, assembler) { | 1512 ASSEMBLER_TEST_GENERATE(PackedCompareNLT, assembler) { |
| 1510 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); | 1513 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); |
| 1511 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); | 1514 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); |
| 1512 __ cmppsnlt(XMM0, XMM1); | 1515 __ cmppsnlt(XMM0, XMM1); |
| 1513 __ pushq(RAX); | 1516 __ pushq(RAX); |
| 1514 __ movss(Address(RSP, 0), XMM0); | 1517 __ movss(Address(RSP, 0), XMM0); |
| 1515 __ popq(RAX); | 1518 __ popq(RAX); |
| 1516 __ ret(); | 1519 __ ret(); |
| 1517 } | 1520 } |
| 1518 | 1521 |
| 1519 | 1522 |
| 1520 ASSEMBLER_TEST_RUN(PackedCompareNLT, entry) { | 1523 ASSEMBLER_TEST_RUN(PackedCompareNLT, test) { |
| 1521 typedef uint32_t (*PackedCompareNLTCode)(); | 1524 typedef uint32_t (*PackedCompareNLTCode)(); |
| 1522 uint32_t res = reinterpret_cast<PackedCompareNLTCode>(entry)(); | 1525 uint32_t res = reinterpret_cast<PackedCompareNLTCode>(test->entry())(); |
| 1523 EXPECT_EQ(static_cast<uword>(0x0), res); | 1526 EXPECT_EQ(static_cast<uword>(0x0), res); |
| 1524 } | 1527 } |
| 1525 | 1528 |
| 1526 | 1529 |
| 1527 ASSEMBLER_TEST_GENERATE(PackedCompareNLE, assembler) { | 1530 ASSEMBLER_TEST_GENERATE(PackedCompareNLE, assembler) { |
| 1528 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); | 1531 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); |
| 1529 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); | 1532 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); |
| 1530 __ cmppsnle(XMM0, XMM1); | 1533 __ cmppsnle(XMM0, XMM1); |
| 1531 __ pushq(RAX); | 1534 __ pushq(RAX); |
| 1532 __ movss(Address(RSP, 0), XMM0); | 1535 __ movss(Address(RSP, 0), XMM0); |
| 1533 __ popq(RAX); | 1536 __ popq(RAX); |
| 1534 __ ret(); | 1537 __ ret(); |
| 1535 } | 1538 } |
| 1536 | 1539 |
| 1537 | 1540 |
| 1538 ASSEMBLER_TEST_RUN(PackedCompareNLE, entry) { | 1541 ASSEMBLER_TEST_RUN(PackedCompareNLE, test) { |
| 1539 typedef uint32_t (*PackedCompareNLECode)(); | 1542 typedef uint32_t (*PackedCompareNLECode)(); |
| 1540 uint32_t res = reinterpret_cast<PackedCompareNLECode>(entry)(); | 1543 uint32_t res = reinterpret_cast<PackedCompareNLECode>(test->entry())(); |
| 1541 EXPECT_EQ(static_cast<uword>(0x0), res); | 1544 EXPECT_EQ(static_cast<uword>(0x0), res); |
| 1542 } | 1545 } |
| 1543 | 1546 |
| 1544 | 1547 |
| 1545 ASSEMBLER_TEST_GENERATE(PackedNegate, assembler) { | 1548 ASSEMBLER_TEST_GENERATE(PackedNegate, assembler) { |
| 1546 __ movl(RAX, Immediate(bit_cast<int32_t, float>(12.3f))); | 1549 __ movl(RAX, Immediate(bit_cast<int32_t, float>(12.3f))); |
| 1547 __ movd(XMM0, RAX); | 1550 __ movd(XMM0, RAX); |
| 1548 __ shufps(XMM0, XMM0, Immediate(0x0)); | 1551 __ shufps(XMM0, XMM0, Immediate(0x0)); |
| 1549 __ negateps(XMM0); | 1552 __ negateps(XMM0); |
| 1550 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes. | 1553 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes. |
| 1551 __ ret(); | 1554 __ ret(); |
| 1552 } | 1555 } |
| 1553 | 1556 |
| 1554 | 1557 |
| 1555 ASSEMBLER_TEST_RUN(PackedNegate, entry) { | 1558 ASSEMBLER_TEST_RUN(PackedNegate, test) { |
| 1556 typedef float (*PackedNegateCode)(); | 1559 typedef float (*PackedNegateCode)(); |
| 1557 float res = reinterpret_cast<PackedNegateCode>(entry)(); | 1560 float res = reinterpret_cast<PackedNegateCode>(test->entry())(); |
| 1558 EXPECT_FLOAT_EQ(-12.3f, res, 0.001f); | 1561 EXPECT_FLOAT_EQ(-12.3f, res, 0.001f); |
| 1559 } | 1562 } |
| 1560 | 1563 |
| 1561 | 1564 |
| 1562 ASSEMBLER_TEST_GENERATE(PackedAbsolute, assembler) { | 1565 ASSEMBLER_TEST_GENERATE(PackedAbsolute, assembler) { |
| 1563 __ movl(RAX, Immediate(bit_cast<int32_t, float>(-15.3f))); | 1566 __ movl(RAX, Immediate(bit_cast<int32_t, float>(-15.3f))); |
| 1564 __ movd(XMM0, RAX); | 1567 __ movd(XMM0, RAX); |
| 1565 __ shufps(XMM0, XMM0, Immediate(0x0)); | 1568 __ shufps(XMM0, XMM0, Immediate(0x0)); |
| 1566 __ absps(XMM0); | 1569 __ absps(XMM0); |
| 1567 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes. | 1570 __ shufps(XMM0, XMM0, Immediate(0xAA)); // Copy third lane into all 4 lanes. |
| 1568 __ ret(); | 1571 __ ret(); |
| 1569 } | 1572 } |
| 1570 | 1573 |
| 1571 | 1574 |
| 1572 ASSEMBLER_TEST_RUN(PackedAbsolute, entry) { | 1575 ASSEMBLER_TEST_RUN(PackedAbsolute, test) { |
| 1573 typedef float (*PackedAbsoluteCode)(); | 1576 typedef float (*PackedAbsoluteCode)(); |
| 1574 float res = reinterpret_cast<PackedAbsoluteCode>(entry)(); | 1577 float res = reinterpret_cast<PackedAbsoluteCode>(test->entry())(); |
| 1575 EXPECT_FLOAT_EQ(15.3f, res, 0.001f); | 1578 EXPECT_FLOAT_EQ(15.3f, res, 0.001f); |
| 1576 } | 1579 } |
| 1577 | 1580 |
| 1578 | 1581 |
| 1579 ASSEMBLER_TEST_GENERATE(PackedSetWZero, assembler) { | 1582 ASSEMBLER_TEST_GENERATE(PackedSetWZero, assembler) { |
| 1580 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(12.3f))); | 1583 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(12.3f))); |
| 1581 __ zerowps(XMM0); | 1584 __ zerowps(XMM0); |
| 1582 __ shufps(XMM0, XMM0, Immediate(0xFF)); // Copy the W lane which is now 0.0. | 1585 __ shufps(XMM0, XMM0, Immediate(0xFF)); // Copy the W lane which is now 0.0. |
| 1583 __ ret(); | 1586 __ ret(); |
| 1584 } | 1587 } |
| 1585 | 1588 |
| 1586 | 1589 |
| 1587 ASSEMBLER_TEST_RUN(PackedSetWZero, entry) { | 1590 ASSEMBLER_TEST_RUN(PackedSetWZero, test) { |
| 1588 typedef float (*PackedSetWZeroCode)(); | 1591 typedef float (*PackedSetWZeroCode)(); |
| 1589 float res = reinterpret_cast<PackedSetWZeroCode>(entry)(); | 1592 float res = reinterpret_cast<PackedSetWZeroCode>(test->entry())(); |
| 1590 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); | 1593 EXPECT_FLOAT_EQ(0.0f, res, 0.001f); |
| 1591 } | 1594 } |
| 1592 | 1595 |
| 1593 | 1596 |
| 1594 ASSEMBLER_TEST_GENERATE(PackedMin, assembler) { | 1597 ASSEMBLER_TEST_GENERATE(PackedMin, assembler) { |
| 1595 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); | 1598 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); |
| 1596 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); | 1599 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); |
| 1597 __ minps(XMM0, XMM1); | 1600 __ minps(XMM0, XMM1); |
| 1598 __ ret(); | 1601 __ ret(); |
| 1599 } | 1602 } |
| 1600 | 1603 |
| 1601 | 1604 |
| 1602 ASSEMBLER_TEST_RUN(PackedMin, entry) { | 1605 ASSEMBLER_TEST_RUN(PackedMin, test) { |
| 1603 typedef float (*PackedMinCode)(); | 1606 typedef float (*PackedMinCode)(); |
| 1604 float res = reinterpret_cast<PackedMinCode>(entry)(); | 1607 float res = reinterpret_cast<PackedMinCode>(test->entry())(); |
| 1605 EXPECT_FLOAT_EQ(2.0f, res, 0.001f); | 1608 EXPECT_FLOAT_EQ(2.0f, res, 0.001f); |
| 1606 } | 1609 } |
| 1607 | 1610 |
| 1608 | 1611 |
| 1609 ASSEMBLER_TEST_GENERATE(PackedMax, assembler) { | 1612 ASSEMBLER_TEST_GENERATE(PackedMax, assembler) { |
| 1610 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); | 1613 __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(2.0f))); |
| 1611 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); | 1614 __ set1ps(XMM1, RAX, Immediate(bit_cast<int32_t, float>(4.0f))); |
| 1612 __ maxps(XMM0, XMM1); | 1615 __ maxps(XMM0, XMM1); |
| 1613 __ ret(); | 1616 __ ret(); |
| 1614 } | 1617 } |
| 1615 | 1618 |
| 1616 | 1619 |
| 1617 ASSEMBLER_TEST_RUN(PackedMax, entry) { | 1620 ASSEMBLER_TEST_RUN(PackedMax, test) { |
| 1618 typedef float (*PackedMaxCode)(); | 1621 typedef float (*PackedMaxCode)(); |
| 1619 float res = reinterpret_cast<PackedMaxCode>(entry)(); | 1622 float res = reinterpret_cast<PackedMaxCode>(test->entry())(); |
| 1620 EXPECT_FLOAT_EQ(4.0f, res, 0.001f); | 1623 EXPECT_FLOAT_EQ(4.0f, res, 0.001f); |
| 1621 } | 1624 } |
| 1622 | 1625 |
| 1623 | 1626 |
| 1624 ASSEMBLER_TEST_GENERATE(PackedLogicalOr, assembler) { | 1627 ASSEMBLER_TEST_GENERATE(PackedLogicalOr, assembler) { |
| 1625 static const struct ALIGN16 { | 1628 static const struct ALIGN16 { |
| 1626 uint32_t a; | 1629 uint32_t a; |
| 1627 uint32_t b; | 1630 uint32_t b; |
| 1628 uint32_t c; | 1631 uint32_t c; |
| 1629 uint32_t d; | 1632 uint32_t d; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1641 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2))); | 1644 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2))); |
| 1642 __ movups(XMM1, Address(RAX, 0)); | 1645 __ movups(XMM1, Address(RAX, 0)); |
| 1643 __ orps(XMM0, XMM1); | 1646 __ orps(XMM0, XMM1); |
| 1644 __ pushq(RAX); | 1647 __ pushq(RAX); |
| 1645 __ movss(Address(RSP, 0), XMM0); | 1648 __ movss(Address(RSP, 0), XMM0); |
| 1646 __ popq(RAX); | 1649 __ popq(RAX); |
| 1647 __ ret(); | 1650 __ ret(); |
| 1648 } | 1651 } |
| 1649 | 1652 |
| 1650 | 1653 |
| 1651 ASSEMBLER_TEST_RUN(PackedLogicalOr, entry) { | 1654 ASSEMBLER_TEST_RUN(PackedLogicalOr, test) { |
| 1652 typedef uint32_t (*PackedLogicalOrCode)(); | 1655 typedef uint32_t (*PackedLogicalOrCode)(); |
| 1653 uint32_t res = reinterpret_cast<PackedLogicalOrCode>(entry)(); | 1656 uint32_t res = reinterpret_cast<PackedLogicalOrCode>(test->entry())(); |
| 1654 EXPECT_EQ(0xFFFFFFFF, res); | 1657 EXPECT_EQ(0xFFFFFFFF, res); |
| 1655 } | 1658 } |
| 1656 | 1659 |
| 1657 | 1660 |
| 1658 ASSEMBLER_TEST_GENERATE(PackedLogicalAnd, assembler) { | 1661 ASSEMBLER_TEST_GENERATE(PackedLogicalAnd, assembler) { |
| 1659 static const struct ALIGN16 { | 1662 static const struct ALIGN16 { |
| 1660 uint32_t a; | 1663 uint32_t a; |
| 1661 uint32_t b; | 1664 uint32_t b; |
| 1662 uint32_t c; | 1665 uint32_t c; |
| 1663 uint32_t d; | 1666 uint32_t d; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1674 __ movups(XMM0, Address(RAX, 0)); | 1677 __ movups(XMM0, Address(RAX, 0)); |
| 1675 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2))); | 1678 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant2))); |
| 1676 __ andps(XMM0, Address(RAX, 0)); | 1679 __ andps(XMM0, Address(RAX, 0)); |
| 1677 __ pushq(RAX); | 1680 __ pushq(RAX); |
| 1678 __ movss(Address(RSP, 0), XMM0); | 1681 __ movss(Address(RSP, 0), XMM0); |
| 1679 __ popq(RAX); | 1682 __ popq(RAX); |
| 1680 __ ret(); | 1683 __ ret(); |
| 1681 } | 1684 } |
| 1682 | 1685 |
| 1683 | 1686 |
| 1684 ASSEMBLER_TEST_RUN(PackedLogicalAnd, entry) { | 1687 ASSEMBLER_TEST_RUN(PackedLogicalAnd, test) { |
| 1685 typedef uint32_t (*PackedLogicalAndCode)(); | 1688 typedef uint32_t (*PackedLogicalAndCode)(); |
| 1686 uint32_t res = reinterpret_cast<PackedLogicalAndCode>(entry)(); | 1689 uint32_t res = reinterpret_cast<PackedLogicalAndCode>(test->entry())(); |
| 1687 EXPECT_EQ(static_cast<uword>(0x0000F000), res); | 1690 EXPECT_EQ(static_cast<uword>(0x0000F000), res); |
| 1688 } | 1691 } |
| 1689 | 1692 |
| 1690 | 1693 |
| 1691 ASSEMBLER_TEST_GENERATE(PackedLogicalNot, assembler) { | 1694 ASSEMBLER_TEST_GENERATE(PackedLogicalNot, assembler) { |
| 1692 static const struct ALIGN16 { | 1695 static const struct ALIGN16 { |
| 1693 uint32_t a; | 1696 uint32_t a; |
| 1694 uint32_t b; | 1697 uint32_t b; |
| 1695 uint32_t c; | 1698 uint32_t c; |
| 1696 uint32_t d; | 1699 uint32_t d; |
| 1697 } constant1 = | 1700 } constant1 = |
| 1698 { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; | 1701 { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; |
| 1699 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1))); | 1702 __ movq(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1))); |
| 1700 __ movups(XMM9, Address(RAX, 0)); | 1703 __ movups(XMM9, Address(RAX, 0)); |
| 1701 __ notps(XMM9); | 1704 __ notps(XMM9); |
| 1702 __ movaps(XMM0, XMM9); | 1705 __ movaps(XMM0, XMM9); |
| 1703 __ pushq(RAX); | 1706 __ pushq(RAX); |
| 1704 __ movss(Address(RSP, 0), XMM0); | 1707 __ movss(Address(RSP, 0), XMM0); |
| 1705 __ popq(RAX); | 1708 __ popq(RAX); |
| 1706 __ ret(); | 1709 __ ret(); |
| 1707 } | 1710 } |
| 1708 | 1711 |
| 1709 | 1712 |
| 1710 ASSEMBLER_TEST_RUN(PackedLogicalNot, entry) { | 1713 ASSEMBLER_TEST_RUN(PackedLogicalNot, test) { |
| 1711 typedef uint32_t (*PackedLogicalNotCode)(); | 1714 typedef uint32_t (*PackedLogicalNotCode)(); |
| 1712 uint32_t res = reinterpret_cast<PackedLogicalNotCode>(entry)(); | 1715 uint32_t res = reinterpret_cast<PackedLogicalNotCode>(test->entry())(); |
| 1713 EXPECT_EQ(static_cast<uword>(0x0), res); | 1716 EXPECT_EQ(static_cast<uword>(0x0), res); |
| 1714 } | 1717 } |
| 1715 | 1718 |
| 1716 ASSEMBLER_TEST_GENERATE(DoubleFPMoves, assembler) { | 1719 ASSEMBLER_TEST_GENERATE(DoubleFPMoves, assembler) { |
| 1717 __ movq(RAX, Immediate(bit_cast<int64_t, double>(1024.67))); | 1720 __ movq(RAX, Immediate(bit_cast<int64_t, double>(1024.67))); |
| 1718 __ pushq(R15); // Callee saved. | 1721 __ pushq(R15); // Callee saved. |
| 1719 __ pushq(RAX); | 1722 __ pushq(RAX); |
| 1720 __ movsd(XMM0, Address(RSP, 0)); | 1723 __ movsd(XMM0, Address(RSP, 0)); |
| 1721 __ movsd(XMM1, XMM0); | 1724 __ movsd(XMM1, XMM0); |
| 1722 __ movsd(XMM2, XMM1); | 1725 __ movsd(XMM2, XMM1); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1761 __ movaps(XMM3, XMM4); | 1764 __ movaps(XMM3, XMM4); |
| 1762 __ movaps(XMM2, XMM3); | 1765 __ movaps(XMM2, XMM3); |
| 1763 __ movaps(XMM1, XMM2); | 1766 __ movaps(XMM1, XMM2); |
| 1764 __ movaps(XMM0, XMM1); | 1767 __ movaps(XMM0, XMM1); |
| 1765 __ popq(RAX); | 1768 __ popq(RAX); |
| 1766 __ popq(R15); // Callee saved. | 1769 __ popq(R15); // Callee saved. |
| 1767 __ ret(); | 1770 __ ret(); |
| 1768 } | 1771 } |
| 1769 | 1772 |
| 1770 | 1773 |
| 1771 ASSEMBLER_TEST_RUN(DoubleFPMoves, entry) { | 1774 ASSEMBLER_TEST_RUN(DoubleFPMoves, test) { |
| 1772 typedef double (*DoubleFPMovesCode)(); | 1775 typedef double (*DoubleFPMovesCode)(); |
| 1773 EXPECT_FLOAT_EQ(1024.67, reinterpret_cast<DoubleFPMovesCode>(entry)(), 0.001); | 1776 EXPECT_FLOAT_EQ(1024.67, |
| 1777 reinterpret_cast<DoubleFPMovesCode>(test->entry())(), 0.001); |
| 1774 } | 1778 } |
| 1775 | 1779 |
| 1776 | 1780 |
| 1777 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) { | 1781 ASSEMBLER_TEST_GENERATE(DoubleFPOperations, assembler) { |
| 1778 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3))); | 1782 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3))); |
| 1779 __ pushq(RAX); | 1783 __ pushq(RAX); |
| 1780 __ movsd(XMM0, Address(RSP, 0)); | 1784 __ movsd(XMM0, Address(RSP, 0)); |
| 1781 __ movsd(XMM8, Address(RSP, 0)); | 1785 __ movsd(XMM8, Address(RSP, 0)); |
| 1782 __ movq(RAX, Immediate(bit_cast<int64_t, double>(3.4))); | 1786 __ movq(RAX, Immediate(bit_cast<int64_t, double>(3.4))); |
| 1783 __ movq(Address(RSP, 0), RAX); | 1787 __ movq(Address(RSP, 0), RAX); |
| 1784 __ movsd(XMM12, Address(RSP, 0)); | 1788 __ movsd(XMM12, Address(RSP, 0)); |
| 1785 __ addsd(XMM8, XMM12); // 15.7 | 1789 __ addsd(XMM8, XMM12); // 15.7 |
| 1786 __ mulsd(XMM8, XMM12); // 53.38 | 1790 __ mulsd(XMM8, XMM12); // 53.38 |
| 1787 __ subsd(XMM8, XMM12); // 49.98 | 1791 __ subsd(XMM8, XMM12); // 49.98 |
| 1788 __ divsd(XMM8, XMM12); // 14.7 | 1792 __ divsd(XMM8, XMM12); // 14.7 |
| 1789 __ sqrtsd(XMM8, XMM8); // 3.834 | 1793 __ sqrtsd(XMM8, XMM8); // 3.834 |
| 1790 __ movsd(XMM1, Address(RSP, 0)); | 1794 __ movsd(XMM1, Address(RSP, 0)); |
| 1791 __ addsd(XMM0, XMM1); // 15.7 | 1795 __ addsd(XMM0, XMM1); // 15.7 |
| 1792 __ mulsd(XMM0, XMM1); // 53.38 | 1796 __ mulsd(XMM0, XMM1); // 53.38 |
| 1793 __ subsd(XMM0, XMM1); // 49.98 | 1797 __ subsd(XMM0, XMM1); // 49.98 |
| 1794 __ divsd(XMM0, XMM1); // 14.7 | 1798 __ divsd(XMM0, XMM1); // 14.7 |
| 1795 __ sqrtsd(XMM0, XMM0); // 3.834057902 | 1799 __ sqrtsd(XMM0, XMM0); // 3.834057902 |
| 1796 __ addsd(XMM0, XMM8); // 7.6681 | 1800 __ addsd(XMM0, XMM8); // 7.6681 |
| 1797 __ popq(RAX); | 1801 __ popq(RAX); |
| 1798 __ ret(); | 1802 __ ret(); |
| 1799 } | 1803 } |
| 1800 | 1804 |
| 1801 | 1805 |
| 1802 ASSEMBLER_TEST_RUN(DoubleFPOperations, entry) { | 1806 ASSEMBLER_TEST_RUN(DoubleFPOperations, test) { |
| 1803 typedef double (*SingleFPOperationsCode)(); | 1807 typedef double (*SingleFPOperationsCode)(); |
| 1804 double res = reinterpret_cast<SingleFPOperationsCode>(entry)(); | 1808 double res = reinterpret_cast<SingleFPOperationsCode>(test->entry())(); |
| 1805 EXPECT_FLOAT_EQ(7.668, res, 0.001); | 1809 EXPECT_FLOAT_EQ(7.668, res, 0.001); |
| 1806 } | 1810 } |
| 1807 | 1811 |
| 1808 | 1812 |
| 1809 ASSEMBLER_TEST_GENERATE(Int32ToDoubleConversion, assembler) { | 1813 ASSEMBLER_TEST_GENERATE(Int32ToDoubleConversion, assembler) { |
| 1810 __ movl(RDX, Immediate(6)); | 1814 __ movl(RDX, Immediate(6)); |
| 1811 __ cvtsi2sd(XMM0, RDX); | 1815 __ cvtsi2sd(XMM0, RDX); |
| 1812 __ movl(RDX, Immediate(8)); | 1816 __ movl(RDX, Immediate(8)); |
| 1813 __ cvtsi2sd(XMM8, RDX); | 1817 __ cvtsi2sd(XMM8, RDX); |
| 1814 __ subsd(XMM0, XMM8); | 1818 __ subsd(XMM0, XMM8); |
| 1815 __ ret(); | 1819 __ ret(); |
| 1816 } | 1820 } |
| 1817 | 1821 |
| 1818 | 1822 |
| 1819 ASSEMBLER_TEST_RUN(Int32ToDoubleConversion, entry) { | 1823 ASSEMBLER_TEST_RUN(Int32ToDoubleConversion, test) { |
| 1820 typedef double (*IntToDoubleConversionCode)(); | 1824 typedef double (*IntToDoubleConversionCode)(); |
| 1821 double res = reinterpret_cast<IntToDoubleConversionCode>(entry)(); | 1825 double res = reinterpret_cast<IntToDoubleConversionCode>(test->entry())(); |
| 1822 EXPECT_FLOAT_EQ(-2.0, res, 0.001); | 1826 EXPECT_FLOAT_EQ(-2.0, res, 0.001); |
| 1823 } | 1827 } |
| 1824 | 1828 |
| 1825 | 1829 |
| 1826 ASSEMBLER_TEST_GENERATE(Int64ToDoubleConversion, assembler) { | 1830 ASSEMBLER_TEST_GENERATE(Int64ToDoubleConversion, assembler) { |
| 1827 __ movq(RDX, Immediate(12LL << 32)); | 1831 __ movq(RDX, Immediate(12LL << 32)); |
| 1828 __ cvtsi2sd(XMM0, RDX); | 1832 __ cvtsi2sd(XMM0, RDX); |
| 1829 __ movsd(XMM15, XMM0); // Move to high register | 1833 __ movsd(XMM15, XMM0); // Move to high register |
| 1830 __ addsd(XMM0, XMM0); // Stomp XMM0 | 1834 __ addsd(XMM0, XMM0); // Stomp XMM0 |
| 1831 __ movsd(XMM0, XMM15); // Move back to XMM0 | 1835 __ movsd(XMM0, XMM15); // Move back to XMM0 |
| 1832 __ ret(); | 1836 __ ret(); |
| 1833 } | 1837 } |
| 1834 | 1838 |
| 1835 | 1839 |
| 1836 ASSEMBLER_TEST_RUN(Int64ToDoubleConversion, entry) { | 1840 ASSEMBLER_TEST_RUN(Int64ToDoubleConversion, test) { |
| 1837 typedef double (*Int64ToDoubleConversionCode)(); | 1841 typedef double (*Int64ToDoubleConversionCode)(); |
| 1838 double res = reinterpret_cast<Int64ToDoubleConversionCode>(entry)(); | 1842 double res = reinterpret_cast<Int64ToDoubleConversionCode>(test->entry())(); |
| 1839 EXPECT_FLOAT_EQ(static_cast<double>(12LL << 32), res, 0.001); | 1843 EXPECT_FLOAT_EQ(static_cast<double>(12LL << 32), res, 0.001); |
| 1840 } | 1844 } |
| 1841 | 1845 |
| 1842 | 1846 |
| 1843 ASSEMBLER_TEST_GENERATE(DoubleToInt64Conversion, assembler) { | 1847 ASSEMBLER_TEST_GENERATE(DoubleToInt64Conversion, assembler) { |
| 1844 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3))); | 1848 __ movq(RAX, Immediate(bit_cast<int64_t, double>(12.3))); |
| 1845 __ pushq(RAX); | 1849 __ pushq(RAX); |
| 1846 __ movsd(XMM9, Address(RSP, 0)); | 1850 __ movsd(XMM9, Address(RSP, 0)); |
| 1847 __ movsd(XMM6, Address(RSP, 0)); | 1851 __ movsd(XMM6, Address(RSP, 0)); |
| 1848 __ popq(RAX); | 1852 __ popq(RAX); |
| 1849 __ cvttsd2siq(R10, XMM6); | 1853 __ cvttsd2siq(R10, XMM6); |
| 1850 __ cvttsd2siq(RDX, XMM6); | 1854 __ cvttsd2siq(RDX, XMM6); |
| 1851 __ cvttsd2siq(R10, XMM9); | 1855 __ cvttsd2siq(R10, XMM9); |
| 1852 __ cvttsd2siq(RDX, XMM9); | 1856 __ cvttsd2siq(RDX, XMM9); |
| 1853 __ subq(RDX, R10); | 1857 __ subq(RDX, R10); |
| 1854 __ movq(RAX, RDX); | 1858 __ movq(RAX, RDX); |
| 1855 __ ret(); | 1859 __ ret(); |
| 1856 } | 1860 } |
| 1857 | 1861 |
| 1858 | 1862 |
| 1859 ASSEMBLER_TEST_RUN(DoubleToInt64Conversion, entry) { | 1863 ASSEMBLER_TEST_RUN(DoubleToInt64Conversion, test) { |
| 1860 typedef int64_t (*DoubleToInt64ConversionCode)(); | 1864 typedef int64_t (*DoubleToInt64ConversionCode)(); |
| 1861 int64_t res = reinterpret_cast<DoubleToInt64ConversionCode>(entry)(); | 1865 int64_t res = reinterpret_cast<DoubleToInt64ConversionCode>(test->entry())(); |
| 1862 EXPECT_EQ(0, res); | 1866 EXPECT_EQ(0, res); |
| 1863 } | 1867 } |
| 1864 | 1868 |
| 1865 | 1869 |
| 1866 ASSEMBLER_TEST_GENERATE(TestObjectCompare, assembler) { | 1870 ASSEMBLER_TEST_GENERATE(TestObjectCompare, assembler) { |
| 1867 ObjectStore* object_store = Isolate::Current()->object_store(); | 1871 ObjectStore* object_store = Isolate::Current()->object_store(); |
| 1868 const Object& obj = Object::ZoneHandle(object_store->smi_class()); | 1872 const Object& obj = Object::ZoneHandle(object_store->smi_class()); |
| 1869 Label fail; | 1873 Label fail; |
| 1870 __ LoadObject(RAX, obj); | 1874 __ LoadObject(RAX, obj); |
| 1871 __ CompareObject(RAX, obj); | 1875 __ CompareObject(RAX, obj); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1888 __ CompareObject(RCX, smi); | 1892 __ CompareObject(RCX, smi); |
| 1889 __ j(NOT_EQUAL, &fail); | 1893 __ j(NOT_EQUAL, &fail); |
| 1890 __ movl(RAX, Immediate(1)); // OK | 1894 __ movl(RAX, Immediate(1)); // OK |
| 1891 __ ret(); | 1895 __ ret(); |
| 1892 __ Bind(&fail); | 1896 __ Bind(&fail); |
| 1893 __ movl(RAX, Immediate(0)); // Fail. | 1897 __ movl(RAX, Immediate(0)); // Fail. |
| 1894 __ ret(); | 1898 __ ret(); |
| 1895 } | 1899 } |
| 1896 | 1900 |
| 1897 | 1901 |
| 1898 ASSEMBLER_TEST_RUN(TestObjectCompare, entry) { | 1902 ASSEMBLER_TEST_RUN(TestObjectCompare, test) { |
| 1899 typedef bool (*TestObjectCompare)(); | 1903 typedef bool (*TestObjectCompare)(); |
| 1900 bool res = reinterpret_cast<TestObjectCompare>(entry)(); | 1904 bool res = reinterpret_cast<TestObjectCompare>(test->entry())(); |
| 1901 EXPECT_EQ(true, res); | 1905 EXPECT_EQ(true, res); |
| 1902 } | 1906 } |
| 1903 | 1907 |
| 1904 | 1908 |
| 1905 ASSEMBLER_TEST_GENERATE(TestNop, assembler) { | 1909 ASSEMBLER_TEST_GENERATE(TestNop, assembler) { |
| 1906 __ nop(1); | 1910 __ nop(1); |
| 1907 __ nop(2); | 1911 __ nop(2); |
| 1908 __ nop(3); | 1912 __ nop(3); |
| 1909 __ nop(4); | 1913 __ nop(4); |
| 1910 __ nop(5); | 1914 __ nop(5); |
| 1911 __ nop(6); | 1915 __ nop(6); |
| 1912 __ nop(7); | 1916 __ nop(7); |
| 1913 __ nop(8); | 1917 __ nop(8); |
| 1914 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. | 1918 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. |
| 1915 __ ret(); | 1919 __ ret(); |
| 1916 } | 1920 } |
| 1917 | 1921 |
| 1918 | 1922 |
| 1919 ASSEMBLER_TEST_RUN(TestNop, entry) { | 1923 ASSEMBLER_TEST_RUN(TestNop, test) { |
| 1920 typedef int (*TestNop)(); | 1924 typedef int (*TestNop)(); |
| 1921 int res = reinterpret_cast<TestNop>(entry)(); | 1925 int res = reinterpret_cast<TestNop>(test->entry())(); |
| 1922 EXPECT_EQ(36, res); // 36 nop bytes emitted. | 1926 EXPECT_EQ(36, res); // 36 nop bytes emitted. |
| 1923 } | 1927 } |
| 1924 | 1928 |
| 1925 | 1929 |
| 1926 ASSEMBLER_TEST_GENERATE(TestAlign0, assembler) { | 1930 ASSEMBLER_TEST_GENERATE(TestAlign0, assembler) { |
| 1927 __ Align(4, 0); | 1931 __ Align(4, 0); |
| 1928 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. | 1932 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. |
| 1929 __ ret(); | 1933 __ ret(); |
| 1930 } | 1934 } |
| 1931 | 1935 |
| 1932 | 1936 |
| 1933 ASSEMBLER_TEST_RUN(TestAlign0, entry) { | 1937 ASSEMBLER_TEST_RUN(TestAlign0, test) { |
| 1934 typedef int (*TestAlign0)(); | 1938 typedef int (*TestAlign0)(); |
| 1935 int res = reinterpret_cast<TestAlign0>(entry)(); | 1939 int res = reinterpret_cast<TestAlign0>(test->entry())(); |
| 1936 EXPECT_EQ(0, res); // 0 bytes emitted. | 1940 EXPECT_EQ(0, res); // 0 bytes emitted. |
| 1937 } | 1941 } |
| 1938 | 1942 |
| 1939 | 1943 |
| 1940 ASSEMBLER_TEST_GENERATE(TestAlign1, assembler) { | 1944 ASSEMBLER_TEST_GENERATE(TestAlign1, assembler) { |
| 1941 __ nop(1); | 1945 __ nop(1); |
| 1942 __ Align(4, 0); | 1946 __ Align(4, 0); |
| 1943 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. | 1947 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. |
| 1944 __ ret(); | 1948 __ ret(); |
| 1945 } | 1949 } |
| 1946 | 1950 |
| 1947 | 1951 |
| 1948 ASSEMBLER_TEST_RUN(TestAlign1, entry) { | 1952 ASSEMBLER_TEST_RUN(TestAlign1, test) { |
| 1949 typedef int (*TestAlign1)(); | 1953 typedef int (*TestAlign1)(); |
| 1950 int res = reinterpret_cast<TestAlign1>(entry)(); | 1954 int res = reinterpret_cast<TestAlign1>(test->entry())(); |
| 1951 EXPECT_EQ(4, res); // 4 bytes emitted. | 1955 EXPECT_EQ(4, res); // 4 bytes emitted. |
| 1952 } | 1956 } |
| 1953 | 1957 |
| 1954 | 1958 |
| 1955 ASSEMBLER_TEST_GENERATE(TestAlign1Offset1, assembler) { | 1959 ASSEMBLER_TEST_GENERATE(TestAlign1Offset1, assembler) { |
| 1956 __ nop(1); | 1960 __ nop(1); |
| 1957 __ Align(4, 1); | 1961 __ Align(4, 1); |
| 1958 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. | 1962 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. |
| 1959 __ ret(); | 1963 __ ret(); |
| 1960 } | 1964 } |
| 1961 | 1965 |
| 1962 | 1966 |
| 1963 ASSEMBLER_TEST_RUN(TestAlign1Offset1, entry) { | 1967 ASSEMBLER_TEST_RUN(TestAlign1Offset1, test) { |
| 1964 typedef int (*TestAlign1Offset1)(); | 1968 typedef int (*TestAlign1Offset1)(); |
| 1965 int res = reinterpret_cast<TestAlign1Offset1>(entry)(); | 1969 int res = reinterpret_cast<TestAlign1Offset1>(test->entry())(); |
| 1966 EXPECT_EQ(3, res); // 3 bytes emitted. | 1970 EXPECT_EQ(3, res); // 3 bytes emitted. |
| 1967 } | 1971 } |
| 1968 | 1972 |
| 1969 | 1973 |
| 1970 ASSEMBLER_TEST_GENERATE(TestAlignLarge, assembler) { | 1974 ASSEMBLER_TEST_GENERATE(TestAlignLarge, assembler) { |
| 1971 __ nop(1); | 1975 __ nop(1); |
| 1972 __ Align(16, 0); | 1976 __ Align(16, 0); |
| 1973 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. | 1977 __ movq(RAX, Immediate(assembler->CodeSize())); // Return code size. |
| 1974 __ ret(); | 1978 __ ret(); |
| 1975 } | 1979 } |
| 1976 | 1980 |
| 1977 | 1981 |
| 1978 ASSEMBLER_TEST_RUN(TestAlignLarge, entry) { | 1982 ASSEMBLER_TEST_RUN(TestAlignLarge, test) { |
| 1979 typedef int (*TestAlignLarge)(); | 1983 typedef int (*TestAlignLarge)(); |
| 1980 int res = reinterpret_cast<TestAlignLarge>(entry)(); | 1984 int res = reinterpret_cast<TestAlignLarge>(test->entry())(); |
| 1981 EXPECT_EQ(16, res); // 16 bytes emitted. | 1985 EXPECT_EQ(16, res); // 16 bytes emitted. |
| 1982 } | 1986 } |
| 1983 | 1987 |
| 1984 | 1988 |
| 1985 ASSEMBLER_TEST_GENERATE(TestAdds, assembler) { | 1989 ASSEMBLER_TEST_GENERATE(TestAdds, assembler) { |
| 1986 __ movq(RAX, Immediate(4)); | 1990 __ movq(RAX, Immediate(4)); |
| 1987 __ pushq(RAX); | 1991 __ pushq(RAX); |
| 1988 __ addq(Address(RSP, 0), Immediate(5)); | 1992 __ addq(Address(RSP, 0), Immediate(5)); |
| 1989 // TOS: 9 | 1993 // TOS: 9 |
| 1990 __ addq(Address(RSP, 0), Immediate(-2)); | 1994 __ addq(Address(RSP, 0), Immediate(-2)); |
| 1991 // TOS: 7 | 1995 // TOS: 7 |
| 1992 __ movq(RCX, Immediate(3)); | 1996 __ movq(RCX, Immediate(3)); |
| 1993 __ addq(Address(RSP, 0), RCX); | 1997 __ addq(Address(RSP, 0), RCX); |
| 1994 // TOS: 10 | 1998 // TOS: 10 |
| 1995 __ movq(RAX, Immediate(10)); | 1999 __ movq(RAX, Immediate(10)); |
| 1996 __ addq(RAX, Address(RSP, 0)); | 2000 __ addq(RAX, Address(RSP, 0)); |
| 1997 // RAX: 20 | 2001 // RAX: 20 |
| 1998 __ popq(RCX); | 2002 __ popq(RCX); |
| 1999 __ ret(); | 2003 __ ret(); |
| 2000 } | 2004 } |
| 2001 | 2005 |
| 2002 | 2006 |
| 2003 ASSEMBLER_TEST_RUN(TestAdds, entry) { | 2007 ASSEMBLER_TEST_RUN(TestAdds, test) { |
| 2004 typedef int (*TestAdds)(); | 2008 typedef int (*TestAdds)(); |
| 2005 int res = reinterpret_cast<TestAdds>(entry)(); | 2009 int res = reinterpret_cast<TestAdds>(test->entry())(); |
| 2006 EXPECT_EQ(20, res); | 2010 EXPECT_EQ(20, res); |
| 2007 } | 2011 } |
| 2008 | 2012 |
| 2009 | 2013 |
| 2010 ASSEMBLER_TEST_GENERATE(TestNot, assembler) { | 2014 ASSEMBLER_TEST_GENERATE(TestNot, assembler) { |
| 2011 __ movq(RAX, Immediate(0xFFFFFFFF00000000)); | 2015 __ movq(RAX, Immediate(0xFFFFFFFF00000000)); |
| 2012 __ notq(RAX); | 2016 __ notq(RAX); |
| 2013 __ ret(); | 2017 __ ret(); |
| 2014 } | 2018 } |
| 2015 | 2019 |
| 2016 | 2020 |
| 2017 ASSEMBLER_TEST_RUN(TestNot, entry) { | 2021 ASSEMBLER_TEST_RUN(TestNot, test) { |
| 2018 typedef int (*TestNot)(); | 2022 typedef int (*TestNot)(); |
| 2019 unsigned int res = reinterpret_cast<TestNot>(entry)(); | 2023 unsigned int res = reinterpret_cast<TestNot>(test->entry())(); |
| 2020 EXPECT_EQ(0xFFFFFFFF, res); | 2024 EXPECT_EQ(0xFFFFFFFF, res); |
| 2021 } | 2025 } |
| 2022 | 2026 |
| 2023 | 2027 |
| 2024 ASSEMBLER_TEST_GENERATE(XorpdZeroing, assembler) { | 2028 ASSEMBLER_TEST_GENERATE(XorpdZeroing, assembler) { |
| 2025 __ pushq(RAX); | 2029 __ pushq(RAX); |
| 2026 __ movsd(Address(RSP, 0), XMM0); | 2030 __ movsd(Address(RSP, 0), XMM0); |
| 2027 __ xorpd(XMM0, Address(RSP, 0)); | 2031 __ xorpd(XMM0, Address(RSP, 0)); |
| 2028 __ popq(RAX); | 2032 __ popq(RAX); |
| 2029 __ ret(); | 2033 __ ret(); |
| 2030 } | 2034 } |
| 2031 | 2035 |
| 2032 | 2036 |
| 2033 ASSEMBLER_TEST_RUN(XorpdZeroing, entry) { | 2037 ASSEMBLER_TEST_RUN(XorpdZeroing, test) { |
| 2034 typedef double (*XorpdZeroingCode)(double d); | 2038 typedef double (*XorpdZeroingCode)(double d); |
| 2035 double res = reinterpret_cast<XorpdZeroingCode>(entry)(12.56e3); | 2039 double res = reinterpret_cast<XorpdZeroingCode>(test->entry())(12.56e3); |
| 2036 EXPECT_FLOAT_EQ(0.0, res, 0.0001); | 2040 EXPECT_FLOAT_EQ(0.0, res, 0.0001); |
| 2037 } | 2041 } |
| 2038 | 2042 |
| 2039 | 2043 |
| 2040 ASSEMBLER_TEST_GENERATE(XorpdZeroing2, assembler) { | 2044 ASSEMBLER_TEST_GENERATE(XorpdZeroing2, assembler) { |
| 2041 Label done; | 2045 Label done; |
| 2042 __ xorpd(XMM15, XMM15); | 2046 __ xorpd(XMM15, XMM15); |
| 2043 __ xorpd(XMM0, XMM0); | 2047 __ xorpd(XMM0, XMM0); |
| 2044 __ xorpd(XMM0, XMM15); | 2048 __ xorpd(XMM0, XMM15); |
| 2045 __ comisd(XMM0, XMM15); | 2049 __ comisd(XMM0, XMM15); |
| 2046 __ j(ZERO, &done); | 2050 __ j(ZERO, &done); |
| 2047 __ int3(); | 2051 __ int3(); |
| 2048 __ Bind(&done); | 2052 __ Bind(&done); |
| 2049 __ ret(); | 2053 __ ret(); |
| 2050 } | 2054 } |
| 2051 | 2055 |
| 2052 | 2056 |
| 2053 ASSEMBLER_TEST_RUN(XorpdZeroing2, entry) { | 2057 ASSEMBLER_TEST_RUN(XorpdZeroing2, test) { |
| 2054 typedef double (*XorpdZeroing2Code)(double d); | 2058 typedef double (*XorpdZeroing2Code)(double d); |
| 2055 double res = reinterpret_cast<XorpdZeroing2Code>(entry)(12.56e3); | 2059 double res = reinterpret_cast<XorpdZeroing2Code>(test->entry())(12.56e3); |
| 2056 EXPECT_FLOAT_EQ(0.0, res, 0.0001); | 2060 EXPECT_FLOAT_EQ(0.0, res, 0.0001); |
| 2057 } | 2061 } |
| 2058 | 2062 |
| 2059 | 2063 |
| 2060 ASSEMBLER_TEST_GENERATE(Pxor, assembler) { | 2064 ASSEMBLER_TEST_GENERATE(Pxor, assembler) { |
| 2061 __ pxor(XMM0, XMM0); | 2065 __ pxor(XMM0, XMM0); |
| 2062 __ ret(); | 2066 __ ret(); |
| 2063 } | 2067 } |
| 2064 | 2068 |
| 2065 | 2069 |
| 2066 ASSEMBLER_TEST_RUN(Pxor, entry) { | 2070 ASSEMBLER_TEST_RUN(Pxor, test) { |
| 2067 typedef double (*PxorCode)(double d); | 2071 typedef double (*PxorCode)(double d); |
| 2068 double res = reinterpret_cast<PxorCode>(entry)(12.3456e3); | 2072 double res = reinterpret_cast<PxorCode>(test->entry())(12.3456e3); |
| 2069 EXPECT_FLOAT_EQ(0.0, res, 0.0); | 2073 EXPECT_FLOAT_EQ(0.0, res, 0.0); |
| 2070 } | 2074 } |
| 2071 | 2075 |
| 2072 | 2076 |
| 2073 ASSEMBLER_TEST_GENERATE(SquareRootDouble, assembler) { | 2077 ASSEMBLER_TEST_GENERATE(SquareRootDouble, assembler) { |
| 2074 __ sqrtsd(XMM0, XMM0); | 2078 __ sqrtsd(XMM0, XMM0); |
| 2075 __ ret(); | 2079 __ ret(); |
| 2076 } | 2080 } |
| 2077 | 2081 |
| 2078 | 2082 |
| 2079 ASSEMBLER_TEST_RUN(SquareRootDouble, entry) { | 2083 ASSEMBLER_TEST_RUN(SquareRootDouble, test) { |
| 2080 typedef double (*SquareRootDoubleCode)(double d); | 2084 typedef double (*SquareRootDoubleCode)(double d); |
| 2081 const double kDoubleConst = .7; | 2085 const double kDoubleConst = .7; |
| 2082 double res = reinterpret_cast<SquareRootDoubleCode>(entry)(kDoubleConst); | 2086 double res = |
| 2087 reinterpret_cast<SquareRootDoubleCode>(test->entry())(kDoubleConst); |
| 2083 EXPECT_FLOAT_EQ(sqrt(kDoubleConst), res, 0.0001); | 2088 EXPECT_FLOAT_EQ(sqrt(kDoubleConst), res, 0.0001); |
| 2084 } | 2089 } |
| 2085 | 2090 |
| 2086 | 2091 |
| 2087 // Called from assembler_test.cc. | 2092 // Called from assembler_test.cc. |
| 2088 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { | 2093 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { |
| 2089 __ pushq(CTX); | 2094 __ pushq(CTX); |
| 2090 __ movq(CTX, RDI); | 2095 __ movq(CTX, RDI); |
| 2091 __ StoreIntoObject(RDX, | 2096 __ StoreIntoObject(RDX, |
| 2092 FieldAddress(RDX, GrowableObjectArray::data_offset()), | 2097 FieldAddress(RDX, GrowableObjectArray::data_offset()), |
| 2093 RSI); | 2098 RSI); |
| 2094 __ popq(CTX); | 2099 __ popq(CTX); |
| 2095 __ ret(); | 2100 __ ret(); |
| 2096 } | 2101 } |
| 2097 | 2102 |
| 2098 | 2103 |
| 2099 ASSEMBLER_TEST_GENERATE(DoubleFPUStackMoves, assembler) { | 2104 ASSEMBLER_TEST_GENERATE(DoubleFPUStackMoves, assembler) { |
| 2100 int64_t l = bit_cast<int64_t, double>(1024.67); | 2105 int64_t l = bit_cast<int64_t, double>(1024.67); |
| 2101 __ movq(RAX, Immediate(l)); | 2106 __ movq(RAX, Immediate(l)); |
| 2102 __ pushq(RAX); | 2107 __ pushq(RAX); |
| 2103 __ fldl(Address(RSP, 0)); | 2108 __ fldl(Address(RSP, 0)); |
| 2104 __ movq(Address(RSP, 0), Immediate(0)); | 2109 __ movq(Address(RSP, 0), Immediate(0)); |
| 2105 __ fstpl(Address(RSP, 0)); | 2110 __ fstpl(Address(RSP, 0)); |
| 2106 __ popq(RAX); | 2111 __ popq(RAX); |
| 2107 __ ret(); | 2112 __ ret(); |
| 2108 } | 2113 } |
| 2109 | 2114 |
| 2110 | 2115 |
| 2111 ASSEMBLER_TEST_RUN(DoubleFPUStackMoves, entry) { | 2116 ASSEMBLER_TEST_RUN(DoubleFPUStackMoves, test) { |
| 2112 typedef int64_t (*DoubleFPUStackMovesCode)(); | 2117 typedef int64_t (*DoubleFPUStackMovesCode)(); |
| 2113 int64_t res = reinterpret_cast<DoubleFPUStackMovesCode>(entry)(); | 2118 int64_t res = reinterpret_cast<DoubleFPUStackMovesCode>(test->entry())(); |
| 2114 EXPECT_FLOAT_EQ(1024.67, (bit_cast<double, int64_t>(res)), 0.001); | 2119 EXPECT_FLOAT_EQ(1024.67, (bit_cast<double, int64_t>(res)), 0.001); |
| 2115 } | 2120 } |
| 2116 | 2121 |
| 2117 | 2122 |
| 2118 ASSEMBLER_TEST_GENERATE(Sine, assembler) { | 2123 ASSEMBLER_TEST_GENERATE(Sine, assembler) { |
| 2119 __ pushq(RAX); | 2124 __ pushq(RAX); |
| 2120 __ movsd(Address(RSP, 0), XMM0); | 2125 __ movsd(Address(RSP, 0), XMM0); |
| 2121 __ fldl(Address(RSP, 0)); | 2126 __ fldl(Address(RSP, 0)); |
| 2122 __ fsin(); | 2127 __ fsin(); |
| 2123 __ fstpl(Address(RSP, 0)); | 2128 __ fstpl(Address(RSP, 0)); |
| 2124 __ movsd(XMM0, Address(RSP, 0)); | 2129 __ movsd(XMM0, Address(RSP, 0)); |
| 2125 __ popq(RAX); | 2130 __ popq(RAX); |
| 2126 __ ret(); | 2131 __ ret(); |
| 2127 } | 2132 } |
| 2128 | 2133 |
| 2129 | 2134 |
| 2130 ASSEMBLER_TEST_RUN(Sine, entry) { | 2135 ASSEMBLER_TEST_RUN(Sine, test) { |
| 2131 typedef double (*SineCode)(double d); | 2136 typedef double (*SineCode)(double d); |
| 2132 const double kDoubleConst = 0.7; | 2137 const double kDoubleConst = 0.7; |
| 2133 double res = reinterpret_cast<SineCode>(entry)(kDoubleConst); | 2138 double res = reinterpret_cast<SineCode>(test->entry())(kDoubleConst); |
| 2134 EXPECT_FLOAT_EQ(sin(kDoubleConst), res, 0.0001); | 2139 EXPECT_FLOAT_EQ(sin(kDoubleConst), res, 0.0001); |
| 2135 } | 2140 } |
| 2136 | 2141 |
| 2137 | 2142 |
| 2138 ASSEMBLER_TEST_GENERATE(Cosine, assembler) { | 2143 ASSEMBLER_TEST_GENERATE(Cosine, assembler) { |
| 2139 __ pushq(RAX); | 2144 __ pushq(RAX); |
| 2140 __ movsd(Address(RSP, 0), XMM0); | 2145 __ movsd(Address(RSP, 0), XMM0); |
| 2141 __ fldl(Address(RSP, 0)); | 2146 __ fldl(Address(RSP, 0)); |
| 2142 __ fcos(); | 2147 __ fcos(); |
| 2143 __ fstpl(Address(RSP, 0)); | 2148 __ fstpl(Address(RSP, 0)); |
| 2144 __ movsd(XMM0, Address(RSP, 0)); | 2149 __ movsd(XMM0, Address(RSP, 0)); |
| 2145 __ popq(RAX); | 2150 __ popq(RAX); |
| 2146 __ ret(); | 2151 __ ret(); |
| 2147 } | 2152 } |
| 2148 | 2153 |
| 2149 | 2154 |
| 2150 ASSEMBLER_TEST_RUN(Cosine, entry) { | 2155 ASSEMBLER_TEST_RUN(Cosine, test) { |
| 2151 typedef double (*CosineCode)(double f); | 2156 typedef double (*CosineCode)(double f); |
| 2152 const double kDoubleConst = 0.7; | 2157 const double kDoubleConst = 0.7; |
| 2153 double res = reinterpret_cast<CosineCode>(entry)(kDoubleConst); | 2158 double res = reinterpret_cast<CosineCode>(test->entry())(kDoubleConst); |
| 2154 EXPECT_FLOAT_EQ(cos(kDoubleConst), res, 0.0001); | 2159 EXPECT_FLOAT_EQ(cos(kDoubleConst), res, 0.0001); |
| 2155 } | 2160 } |
| 2156 | 2161 |
| 2157 | 2162 |
| 2158 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) { | 2163 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion, assembler) { |
| 2159 __ movq(RDX, Immediate(6)); | 2164 __ movq(RDX, Immediate(6)); |
| 2160 __ cvtsi2sd(XMM0, RDX); | 2165 __ cvtsi2sd(XMM0, RDX); |
| 2161 __ ret(); | 2166 __ ret(); |
| 2162 } | 2167 } |
| 2163 | 2168 |
| 2164 | 2169 |
| 2165 ASSEMBLER_TEST_RUN(IntToDoubleConversion, entry) { | 2170 ASSEMBLER_TEST_RUN(IntToDoubleConversion, test) { |
| 2166 typedef double (*IntToDoubleConversionCode)(); | 2171 typedef double (*IntToDoubleConversionCode)(); |
| 2167 double res = reinterpret_cast<IntToDoubleConversionCode>(entry)(); | 2172 double res = reinterpret_cast<IntToDoubleConversionCode>(test->entry())(); |
| 2168 EXPECT_FLOAT_EQ(6.0, res, 0.001); | 2173 EXPECT_FLOAT_EQ(6.0, res, 0.001); |
| 2169 } | 2174 } |
| 2170 | 2175 |
| 2171 | 2176 |
| 2172 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion2, assembler) { | 2177 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion2, assembler) { |
| 2173 __ pushq(RDI); | 2178 __ pushq(RDI); |
| 2174 __ fildl(Address(RSP, 0)); | 2179 __ fildl(Address(RSP, 0)); |
| 2175 __ fstpl(Address(RSP, 0)); | 2180 __ fstpl(Address(RSP, 0)); |
| 2176 __ movsd(XMM0, Address(RSP, 0)); | 2181 __ movsd(XMM0, Address(RSP, 0)); |
| 2177 __ popq(RAX); | 2182 __ popq(RAX); |
| 2178 __ ret(); | 2183 __ ret(); |
| 2179 } | 2184 } |
| 2180 | 2185 |
| 2181 | 2186 |
| 2182 ASSEMBLER_TEST_RUN(IntToDoubleConversion2, entry) { | 2187 ASSEMBLER_TEST_RUN(IntToDoubleConversion2, test) { |
| 2183 typedef double (*IntToDoubleConversion2Code)(int i); | 2188 typedef double (*IntToDoubleConversion2Code)(int i); |
| 2184 double res = reinterpret_cast<IntToDoubleConversion2Code>(entry)(3); | 2189 double res = reinterpret_cast<IntToDoubleConversion2Code>(test->entry())(3); |
| 2185 EXPECT_FLOAT_EQ(3.0, res, 0.001); | 2190 EXPECT_FLOAT_EQ(3.0, res, 0.001); |
| 2186 } | 2191 } |
| 2187 | 2192 |
| 2188 ASSEMBLER_TEST_GENERATE(DoubleToDoubleTrunc, assembler) { | 2193 ASSEMBLER_TEST_GENERATE(DoubleToDoubleTrunc, assembler) { |
| 2189 __ roundsd(XMM0, XMM0, Assembler::kRoundToZero); | 2194 __ roundsd(XMM0, XMM0, Assembler::kRoundToZero); |
| 2190 __ ret(); | 2195 __ ret(); |
| 2191 } | 2196 } |
| 2192 | 2197 |
| 2193 | 2198 |
| 2194 ASSEMBLER_TEST_RUN(DoubleToDoubleTrunc, entry) { | 2199 ASSEMBLER_TEST_RUN(DoubleToDoubleTrunc, test) { |
| 2195 typedef double (*DoubleToDoubleTruncCode)(double d); | 2200 typedef double (*DoubleToDoubleTruncCode)(double d); |
| 2196 double res = reinterpret_cast<DoubleToDoubleTruncCode>(entry)(12.3); | 2201 double res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(12.3); |
| 2197 EXPECT_EQ(12.0, res); | 2202 EXPECT_EQ(12.0, res); |
| 2198 res = reinterpret_cast<DoubleToDoubleTruncCode>(entry)(12.8); | 2203 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(12.8); |
| 2199 EXPECT_EQ(12.0, res); | 2204 EXPECT_EQ(12.0, res); |
| 2200 res = reinterpret_cast<DoubleToDoubleTruncCode>(entry)(-12.3); | 2205 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(-12.3); |
| 2201 EXPECT_EQ(-12.0, res); | 2206 EXPECT_EQ(-12.0, res); |
| 2202 res = reinterpret_cast<DoubleToDoubleTruncCode>(entry)(-12.8); | 2207 res = reinterpret_cast<DoubleToDoubleTruncCode>(test->entry())(-12.8); |
| 2203 EXPECT_EQ(-12.0, res); | 2208 EXPECT_EQ(-12.0, res); |
| 2204 } | 2209 } |
| 2205 | 2210 |
| 2206 | 2211 |
| 2207 ASSEMBLER_TEST_GENERATE(DoubleAbs, assembler) { | 2212 ASSEMBLER_TEST_GENERATE(DoubleAbs, assembler) { |
| 2208 __ DoubleAbs(XMM0); | 2213 __ DoubleAbs(XMM0); |
| 2209 __ ret(); | 2214 __ ret(); |
| 2210 } | 2215 } |
| 2211 | 2216 |
| 2212 | 2217 |
| 2213 ASSEMBLER_TEST_RUN(DoubleAbs, entry) { | 2218 ASSEMBLER_TEST_RUN(DoubleAbs, test) { |
| 2214 typedef double (*DoubleAbsCode)(double d); | 2219 typedef double (*DoubleAbsCode)(double d); |
| 2215 double val = -12.45; | 2220 double val = -12.45; |
| 2216 double res = reinterpret_cast<DoubleAbsCode>(entry)(val); | 2221 double res = reinterpret_cast<DoubleAbsCode>(test->entry())(val); |
| 2217 EXPECT_FLOAT_EQ(-val, res, 0.001); | 2222 EXPECT_FLOAT_EQ(-val, res, 0.001); |
| 2218 val = 12.45; | 2223 val = 12.45; |
| 2219 res = reinterpret_cast<DoubleAbsCode>(entry)(val); | 2224 res = reinterpret_cast<DoubleAbsCode>(test->entry())(val); |
| 2220 EXPECT_FLOAT_EQ(val, res, 0.001); | 2225 EXPECT_FLOAT_EQ(val, res, 0.001); |
| 2221 } | 2226 } |
| 2222 | 2227 |
| 2223 | 2228 |
| 2224 ASSEMBLER_TEST_GENERATE(DoubleToDoubleRound, assembler) { | 2229 ASSEMBLER_TEST_GENERATE(DoubleToDoubleRound, assembler) { |
| 2225 __ DoubleRound(XMM0, XMM0, XMM1); | 2230 __ DoubleRound(XMM0, XMM0, XMM1); |
| 2226 __ ret(); | 2231 __ ret(); |
| 2227 } | 2232 } |
| 2228 | 2233 |
| 2229 | 2234 |
| 2230 ASSEMBLER_TEST_RUN(DoubleToDoubleRound, entry) { | 2235 ASSEMBLER_TEST_RUN(DoubleToDoubleRound, test) { |
| 2231 typedef double (*DoubleToDoubleRoundCode)(double d); | 2236 typedef double (*DoubleToDoubleRoundCode)(double d); |
| 2232 double res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(12.3); | 2237 double res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(12.3); |
| 2233 EXPECT_EQ(12.0, res); | 2238 EXPECT_EQ(12.0, res); |
| 2234 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(12.8); | 2239 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(12.8); |
| 2235 EXPECT_EQ(13.0, res); | 2240 EXPECT_EQ(13.0, res); |
| 2236 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(0.5); | 2241 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(0.5); |
| 2237 EXPECT_EQ(1.0, res); | 2242 EXPECT_EQ(1.0, res); |
| 2238 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-12.3); | 2243 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(-12.3); |
| 2239 EXPECT_EQ(-12.0, res); | 2244 EXPECT_EQ(-12.0, res); |
| 2240 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-12.8); | 2245 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(-12.8); |
| 2241 EXPECT_EQ(-13.0, res); | 2246 EXPECT_EQ(-13.0, res); |
| 2242 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-0.5); | 2247 res = reinterpret_cast<DoubleToDoubleRoundCode>(test->entry())(-0.5); |
| 2243 EXPECT_EQ(-1.0, res); | 2248 EXPECT_EQ(-1.0, res); |
| 2244 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(0.49999999999999994); | 2249 res = reinterpret_cast<DoubleToDoubleRoundCode>( |
| 2250 test->entry())(0.49999999999999994); |
| 2245 EXPECT_EQ(0.0, res); | 2251 EXPECT_EQ(0.0, res); |
| 2246 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-0.49999999999999994); | 2252 res = reinterpret_cast<DoubleToDoubleRoundCode>( |
| 2253 test->entry())(-0.49999999999999994); |
| 2247 EXPECT_EQ(-0.0, res); | 2254 EXPECT_EQ(-0.0, res); |
| 2248 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(9007199254740991.0); | 2255 res = reinterpret_cast<DoubleToDoubleRoundCode>( |
| 2256 test->entry())(9007199254740991.0); |
| 2249 EXPECT_EQ(9007199254740991.0, res); | 2257 EXPECT_EQ(9007199254740991.0, res); |
| 2250 res = reinterpret_cast<DoubleToDoubleRoundCode>(entry)(-9007199254740991.0); | 2258 res = reinterpret_cast<DoubleToDoubleRoundCode>( |
| 2259 test->entry())(-9007199254740991.0); |
| 2251 EXPECT_EQ(-9007199254740991.0, res); | 2260 EXPECT_EQ(-9007199254740991.0, res); |
| 2252 } | 2261 } |
| 2253 | 2262 |
| 2254 | 2263 |
| 2255 ASSEMBLER_TEST_GENERATE(ExtractSignBits, assembler) { | 2264 ASSEMBLER_TEST_GENERATE(ExtractSignBits, assembler) { |
| 2256 __ movmskpd(RAX, XMM0); | 2265 __ movmskpd(RAX, XMM0); |
| 2257 __ andq(RAX, Immediate(0x1)); | 2266 __ andq(RAX, Immediate(0x1)); |
| 2258 __ ret(); | 2267 __ ret(); |
| 2259 } | 2268 } |
| 2260 | 2269 |
| 2261 | 2270 |
| 2262 ASSEMBLER_TEST_RUN(ExtractSignBits, entry) { | 2271 ASSEMBLER_TEST_RUN(ExtractSignBits, test) { |
| 2263 typedef int (*ExtractSignBits)(double d); | 2272 typedef int (*ExtractSignBits)(double d); |
| 2264 int res = reinterpret_cast<ExtractSignBits>(entry)(1.0); | 2273 int res = reinterpret_cast<ExtractSignBits>(test->entry())(1.0); |
| 2265 EXPECT_EQ(0, res); | 2274 EXPECT_EQ(0, res); |
| 2266 res = reinterpret_cast<ExtractSignBits>(entry)(-1.0); | 2275 res = reinterpret_cast<ExtractSignBits>(test->entry())(-1.0); |
| 2267 EXPECT_EQ(1, res); | 2276 EXPECT_EQ(1, res); |
| 2268 res = reinterpret_cast<ExtractSignBits>(entry)(-0.0); | 2277 res = reinterpret_cast<ExtractSignBits>(test->entry())(-0.0); |
| 2269 EXPECT_EQ(1, res); | 2278 EXPECT_EQ(1, res); |
| 2270 } | 2279 } |
| 2271 | 2280 |
| 2272 } // namespace dart | 2281 } // namespace dart |
| 2273 | 2282 |
| 2274 #endif // defined TARGET_ARCH_X64 | 2283 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |