Index: runtime/vm/assembler_x64_test.cc |
=================================================================== |
--- runtime/vm/assembler_x64_test.cc (revision 44828) |
+++ runtime/vm/assembler_x64_test.cc (working copy) |
@@ -1389,6 +1389,42 @@ |
__ Bind(&donetest15b); |
} |
+ { |
+ Label donetest15c; |
+ const int64_t left = 0xff00000000000000; |
+ const int64_t right = 0xffffffffffffffff; |
+ const int64_t shifted = 0xf000000000000003; |
+ __ movq(RDX, Immediate(left)); |
+ __ movq(RAX, Immediate(right)); |
+ __ movq(RCX, Immediate(2)); |
+ __ shlq(RDX, RCX); // RDX = 0xff00000000000000 << 2 == 0xfc00000000000000 |
+ __ shldq(RDX, RAX, RCX); |
+ // RDX = high64(0xfc00000000000000:0xffffffffffffffff << 2) |
+ // == 0xf000000000000003 |
+ __ cmpq(RDX, Immediate(shifted)); |
+ __ j(EQUAL, &donetest15c); |
+ __ int3(); |
+ __ Bind(&donetest15c); |
+ } |
+ |
+ { |
+ Label donetest15d; |
+ const int64_t left = 0xff00000000000000; |
+ const int64_t right = 0xffffffffffffffff; |
+ const int64_t shifted = 0xcff0000000000000; |
+ __ movq(RDX, Immediate(left)); |
+ __ movq(RAX, Immediate(right)); |
+ __ movq(RCX, Immediate(2)); |
+ __ shrq(RDX, RCX); // RDX = 0xff00000000000000 >> 2 == 0x3fc0000000000000 |
+ __ shrdq(RDX, RAX, RCX); |
+ // RDX = low64(0xffffffffffffffff:0x3fc0000000000000 >> 2) |
+ // == 0xcff0000000000000 |
+ __ cmpq(RDX, Immediate(shifted)); |
+ __ j(EQUAL, &donetest15d); |
+ __ int3(); |
+ __ Bind(&donetest15d); |
+ } |
+ |
__ movl(RAX, Immediate(0)); |
__ ret(); |
} |