| Index: runtime/vm/assembler_x64.cc
|
| diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
|
| index b3a1d09638ab931f579d0e3dfe5dd4fab5d1d95a..9c4b45da8b44ad2ca12c72cab97e38fa69e36e34 100644
|
| --- a/runtime/vm/assembler_x64.cc
|
| +++ b/runtime/vm/assembler_x64.cc
|
| @@ -785,29 +785,57 @@ void Assembler::orps(XmmRegister dst, XmmRegister src) {
|
| }
|
|
|
| void Assembler::notps(XmmRegister dst) {
|
| - // { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
|
| - movq(TMP, Address(THR, Thread::float_not_address_offset()));
|
| + static const struct ALIGN16 {
|
| + uint32_t a;
|
| + uint32_t b;
|
| + uint32_t c;
|
| + uint32_t d;
|
| + } float_not_constant =
|
| + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
|
| + LoadImmediate(
|
| + TMP, Immediate(reinterpret_cast<intptr_t>(&float_not_constant)));
|
| xorps(dst, Address(TMP, 0));
|
| }
|
|
|
|
|
| void Assembler::negateps(XmmRegister dst) {
|
| - // { 0x80000000, 0x80000000, 0x80000000, 0x80000000 }
|
| - movq(TMP, Address(THR, Thread::float_negate_address_offset()));
|
| + static const struct ALIGN16 {
|
| + uint32_t a;
|
| + uint32_t b;
|
| + uint32_t c;
|
| + uint32_t d;
|
| + } float_negate_constant =
|
| + { 0x80000000, 0x80000000, 0x80000000, 0x80000000 };
|
| + LoadImmediate(
|
| + TMP, Immediate(reinterpret_cast<intptr_t>(&float_negate_constant)));
|
| xorps(dst, Address(TMP, 0));
|
| }
|
|
|
|
|
| void Assembler::absps(XmmRegister dst) {
|
| - // { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF }
|
| - movq(TMP, Address(THR, Thread::float_absolute_address_offset()));
|
| + static const struct ALIGN16 {
|
| + uint32_t a;
|
| + uint32_t b;
|
| + uint32_t c;
|
| + uint32_t d;
|
| + } float_absolute_constant =
|
| + { 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF };
|
| + LoadImmediate(
|
| + TMP, Immediate(reinterpret_cast<intptr_t>(&float_absolute_constant)));
|
| andps(dst, Address(TMP, 0));
|
| }
|
|
|
|
|
| void Assembler::zerowps(XmmRegister dst) {
|
| - // { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 }
|
| - movq(TMP, Address(THR, Thread::float_zerow_address_offset()));
|
| + static const struct ALIGN16 {
|
| + uint32_t a;
|
| + uint32_t b;
|
| + uint32_t c;
|
| + uint32_t d;
|
| + } float_zerow_constant =
|
| + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 };
|
| + LoadImmediate(
|
| + TMP, Immediate(reinterpret_cast<intptr_t>(&float_zerow_constant)));
|
| andps(dst, Address(TMP, 0));
|
| }
|
|
|
| @@ -989,8 +1017,13 @@ void Assembler::addpd(XmmRegister dst, XmmRegister src) {
|
|
|
|
|
| void Assembler::negatepd(XmmRegister dst) {
|
| - // { 0x8000000000000000LL, 0x8000000000000000LL }
|
| - movq(TMP, Address(THR, Thread::double_negate_address_offset()));
|
| + static const struct ALIGN16 {
|
| + uint64_t a;
|
| + uint64_t b;
|
| + } double_negate_constant =
|
| + { 0x8000000000000000LL, 0x8000000000000000LL };
|
| + LoadImmediate(
|
| + TMP, Immediate(reinterpret_cast<intptr_t>(&double_negate_constant)));
|
| xorpd(dst, Address(TMP, 0));
|
| }
|
|
|
| @@ -1032,8 +1065,13 @@ void Assembler::divpd(XmmRegister dst, XmmRegister src) {
|
|
|
|
|
| void Assembler::abspd(XmmRegister dst) {
|
| - // { 0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL }
|
| - movq(TMP, Address(THR, Thread::double_abs_address_offset()));
|
| + static const struct ALIGN16 {
|
| + uint64_t a;
|
| + uint64_t b;
|
| + } double_absolute_const =
|
| + { 0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL };
|
| + LoadImmediate(
|
| + TMP, Immediate(reinterpret_cast<intptr_t>(&double_absolute_const)));
|
| andpd(dst, Address(TMP, 0));
|
| }
|
|
|
| @@ -3122,15 +3160,25 @@ void Assembler::IncrementSmiField(const Address& dest, int64_t increment) {
|
|
|
|
|
| void Assembler::DoubleNegate(XmmRegister d) {
|
| - // {0x8000000000000000LL, 0x8000000000000000LL}
|
| - movq(TMP, Address(THR, Thread::double_negate_address_offset()));
|
| + static const struct ALIGN16 {
|
| + uint64_t a;
|
| + uint64_t b;
|
| + } double_negate_constant =
|
| + {0x8000000000000000LL, 0x8000000000000000LL};
|
| + LoadImmediate(
|
| + TMP, Immediate(reinterpret_cast<intptr_t>(&double_negate_constant)));
|
| xorpd(d, Address(TMP, 0));
|
| }
|
|
|
|
|
| void Assembler::DoubleAbs(XmmRegister reg) {
|
| - // {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL}
|
| - movq(TMP, Address(THR, Thread::double_abs_address_offset()));
|
| + static const struct ALIGN16 {
|
| + uint64_t a;
|
| + uint64_t b;
|
| + } double_abs_constant =
|
| + {0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL};
|
| + LoadImmediate(TMP,
|
| + Immediate(reinterpret_cast<intptr_t>(&double_abs_constant)));
|
| andpd(reg, Address(TMP, 0));
|
| }
|
|
|
|
|