| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/qtdeclarative/src/qtdeclarative/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h |
| Source code | Switch to Preprocessed file |
| Line | Source | Count | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | /* | - | ||||||||||||||||||
| 2 | * Copyright (C) 2008, 2012 Apple Inc. All rights reserved. | - | ||||||||||||||||||
| 3 | * | - | ||||||||||||||||||
| 4 | * Redistribution and use in source and binary forms, with or without | - | ||||||||||||||||||
| 5 | * modification, are permitted provided that the following conditions | - | ||||||||||||||||||
| 6 | * are met: | - | ||||||||||||||||||
| 7 | * 1. Redistributions of source code must retain the above copyright | - | ||||||||||||||||||
| 8 | * notice, this list of conditions and the following disclaimer. | - | ||||||||||||||||||
| 9 | * 2. Redistributions in binary form must reproduce the above copyright | - | ||||||||||||||||||
| 10 | * notice, this list of conditions and the following disclaimer in the | - | ||||||||||||||||||
| 11 | * documentation and/or other materials provided with the distribution. | - | ||||||||||||||||||
| 12 | * | - | ||||||||||||||||||
| 13 | * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY | - | ||||||||||||||||||
| 14 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | - | ||||||||||||||||||
| 15 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | - | ||||||||||||||||||
| 16 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR | - | ||||||||||||||||||
| 17 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | - | ||||||||||||||||||
| 18 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | - | ||||||||||||||||||
| 19 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | - | ||||||||||||||||||
| 20 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | - | ||||||||||||||||||
| 21 | * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | - | ||||||||||||||||||
| 22 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | - | ||||||||||||||||||
| 23 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | - | ||||||||||||||||||
| 24 | */ | - | ||||||||||||||||||
| 25 | - | |||||||||||||||||||
| 26 | #ifndef MacroAssemblerX86_64_h | - | ||||||||||||||||||
| 27 | #define MacroAssemblerX86_64_h | - | ||||||||||||||||||
| 28 | - | |||||||||||||||||||
| 29 | #if ENABLE(ASSEMBLER) && CPU(X86_64) | - | ||||||||||||||||||
| 30 | - | |||||||||||||||||||
| 31 | #include "MacroAssemblerX86Common.h" | - | ||||||||||||||||||
| 32 | - | |||||||||||||||||||
| 33 | #define REPTACH_OFFSET_CALL_R11 3 | - | ||||||||||||||||||
| 34 | - | |||||||||||||||||||
| 35 | namespace JSC { | - | ||||||||||||||||||
| 36 | - | |||||||||||||||||||
| 37 | class MacroAssemblerX86_64 : public MacroAssemblerX86Common { | - | ||||||||||||||||||
| 38 | public: | - | ||||||||||||||||||
| 39 | static const Scale ScalePtr = TimesEight; | - | ||||||||||||||||||
| 40 | static const int PointerSize = 8; | - | ||||||||||||||||||
| 41 | - | |||||||||||||||||||
| 42 | using MacroAssemblerX86Common::add32; | - | ||||||||||||||||||
| 43 | using MacroAssemblerX86Common::and32; | - | ||||||||||||||||||
| 44 | using MacroAssemblerX86Common::branchAdd32; | - | ||||||||||||||||||
| 45 | using MacroAssemblerX86Common::or32; | - | ||||||||||||||||||
| 46 | using MacroAssemblerX86Common::sub32; | - | ||||||||||||||||||
| 47 | using MacroAssemblerX86Common::load32; | - | ||||||||||||||||||
| 48 | using MacroAssemblerX86Common::store32; | - | ||||||||||||||||||
| 49 | using MacroAssemblerX86Common::store8; | - | ||||||||||||||||||
| 50 | using MacroAssemblerX86Common::call; | - | ||||||||||||||||||
| 51 | using MacroAssemblerX86Common::jump; | - | ||||||||||||||||||
| 52 | using MacroAssemblerX86Common::addDouble; | - | ||||||||||||||||||
| 53 | using MacroAssemblerX86Common::loadDouble; | - | ||||||||||||||||||
| 54 | using MacroAssemblerX86Common::convertInt32ToDouble; | - | ||||||||||||||||||
| 55 | - | |||||||||||||||||||
| 56 | #if defined(V4_BOOTSTRAP) | - | ||||||||||||||||||
| 57 | void loadPtr(ImplicitAddress address, RegisterID dest) | - | ||||||||||||||||||
| 58 | { | - | ||||||||||||||||||
| 59 | load64(address, dest); | - | ||||||||||||||||||
| 60 | } | - | ||||||||||||||||||
| 61 | - | |||||||||||||||||||
| 62 | void subPtr(TrustedImm32 imm, RegisterID dest) | - | ||||||||||||||||||
| 63 | { | - | ||||||||||||||||||
| 64 | sub64(imm, dest); | - | ||||||||||||||||||
| 65 | } | - | ||||||||||||||||||
| 66 | - | |||||||||||||||||||
| 67 | void addPtr(TrustedImm32 imm, RegisterID dest) | - | ||||||||||||||||||
| 68 | { | - | ||||||||||||||||||
| 69 | add64(imm, dest); | - | ||||||||||||||||||
| 70 | } | - | ||||||||||||||||||
| 71 | - | |||||||||||||||||||
| 72 | void addPtr(TrustedImm32 imm, RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 73 | { | - | ||||||||||||||||||
| 74 | add64(imm, src, dest); | - | ||||||||||||||||||
| 75 | } | - | ||||||||||||||||||
| 76 | - | |||||||||||||||||||
| 77 | void storePtr(RegisterID src, ImplicitAddress address) | - | ||||||||||||||||||
| 78 | { | - | ||||||||||||||||||
| 79 | store64(src, address); | - | ||||||||||||||||||
| 80 | } | - | ||||||||||||||||||
| 81 | #endif | - | ||||||||||||||||||
| 82 | - | |||||||||||||||||||
| 83 | void add32(TrustedImm32 imm, AbsoluteAddress address) | - | ||||||||||||||||||
| 84 | { | - | ||||||||||||||||||
| 85 | move(TrustedImmPtr(address.m_ptr), scratchRegister); | - | ||||||||||||||||||
| 86 | add32(imm, Address(scratchRegister)); | - | ||||||||||||||||||
| 87 | } never executed: end of block | 0 | ||||||||||||||||||
| 88 | - | |||||||||||||||||||
| 89 | void and32(TrustedImm32 imm, AbsoluteAddress address) | - | ||||||||||||||||||
| 90 | { | - | ||||||||||||||||||
| 91 | move(TrustedImmPtr(address.m_ptr), scratchRegister); | - | ||||||||||||||||||
| 92 | and32(imm, Address(scratchRegister)); | - | ||||||||||||||||||
| 93 | } never executed: end of block | 0 | ||||||||||||||||||
| 94 | - | |||||||||||||||||||
| 95 | void add32(AbsoluteAddress address, RegisterID dest) | - | ||||||||||||||||||
| 96 | { | - | ||||||||||||||||||
| 97 | move(TrustedImmPtr(address.m_ptr), scratchRegister); | - | ||||||||||||||||||
| 98 | add32(Address(scratchRegister), dest); | - | ||||||||||||||||||
| 99 | } never executed: end of block | 0 | ||||||||||||||||||
| 100 | - | |||||||||||||||||||
| 101 | void or32(TrustedImm32 imm, AbsoluteAddress address) | - | ||||||||||||||||||
| 102 | { | - | ||||||||||||||||||
| 103 | move(TrustedImmPtr(address.m_ptr), scratchRegister); | - | ||||||||||||||||||
| 104 | or32(imm, Address(scratchRegister)); | - | ||||||||||||||||||
| 105 | } never executed: end of block | 0 | ||||||||||||||||||
| 106 | - | |||||||||||||||||||
| 107 | void or32(RegisterID reg, AbsoluteAddress address) | - | ||||||||||||||||||
| 108 | { | - | ||||||||||||||||||
| 109 | move(TrustedImmPtr(address.m_ptr), scratchRegister); | - | ||||||||||||||||||
| 110 | or32(reg, Address(scratchRegister)); | - | ||||||||||||||||||
| 111 | } never executed: end of block | 0 | ||||||||||||||||||
| 112 | - | |||||||||||||||||||
| 113 | void sub32(TrustedImm32 imm, AbsoluteAddress address) | - | ||||||||||||||||||
| 114 | { | - | ||||||||||||||||||
| 115 | move(TrustedImmPtr(address.m_ptr), scratchRegister); | - | ||||||||||||||||||
| 116 | sub32(imm, Address(scratchRegister)); | - | ||||||||||||||||||
| 117 | } never executed: end of block | 0 | ||||||||||||||||||
| 118 | - | |||||||||||||||||||
| 119 | void load32(const void* address, RegisterID dest) | - | ||||||||||||||||||
| 120 | { | - | ||||||||||||||||||
| 121 | if (dest == X86Registers::eax)
| 0 | ||||||||||||||||||
| 122 | m_assembler.movl_mEAX(address); never executed: m_assembler.movl_mEAX(address); | 0 | ||||||||||||||||||
| 123 | else { | - | ||||||||||||||||||
| 124 | move(TrustedImmPtr(address), dest); | - | ||||||||||||||||||
| 125 | load32(dest, dest); | - | ||||||||||||||||||
| 126 | } never executed: end of block | 0 | ||||||||||||||||||
| 127 | } | - | ||||||||||||||||||
| 128 | - | |||||||||||||||||||
| 129 | void addDouble(AbsoluteAddress address, FPRegisterID dest) | - | ||||||||||||||||||
| 130 | { | - | ||||||||||||||||||
| 131 | move(TrustedImmPtr(address.m_ptr), scratchRegister); | - | ||||||||||||||||||
| 132 | m_assembler.addsd_mr(0, scratchRegister, dest); | - | ||||||||||||||||||
| 133 | } never executed: end of block | 0 | ||||||||||||||||||
| 134 | - | |||||||||||||||||||
| 135 | void convertInt32ToDouble(TrustedImm32 imm, FPRegisterID dest) | - | ||||||||||||||||||
| 136 | { | - | ||||||||||||||||||
| 137 | move(imm, scratchRegister); | - | ||||||||||||||||||
| 138 | m_assembler.cvtsi2sd_rr(scratchRegister, dest); | - | ||||||||||||||||||
| 139 | } never executed: end of block | 0 | ||||||||||||||||||
| 140 | - | |||||||||||||||||||
| 141 | void convertUInt32ToDouble(RegisterID src, FPRegisterID dest, RegisterID /*scratch*/) | - | ||||||||||||||||||
| 142 | { | - | ||||||||||||||||||
| 143 | zeroExtend32ToPtr(src, src); | - | ||||||||||||||||||
| 144 | m_assembler.cvtsiq2sd_rr(src, dest); | - | ||||||||||||||||||
| 145 | } never executed: end of block | 0 | ||||||||||||||||||
| 146 | - | |||||||||||||||||||
| 147 | void store32(TrustedImm32 imm, void* address) | - | ||||||||||||||||||
| 148 | { | - | ||||||||||||||||||
| 149 | move(TrustedImmPtr(address), scratchRegister); | - | ||||||||||||||||||
| 150 | store32(imm, scratchRegister); | - | ||||||||||||||||||
| 151 | } never executed: end of block | 0 | ||||||||||||||||||
| 152 | - | |||||||||||||||||||
| 153 | void store8(TrustedImm32 imm, void* address) | - | ||||||||||||||||||
| 154 | { | - | ||||||||||||||||||
| 155 | move(TrustedImmPtr(address), scratchRegister); | - | ||||||||||||||||||
| 156 | store8(imm, Address(scratchRegister)); | - | ||||||||||||||||||
| 157 | } never executed: end of block | 0 | ||||||||||||||||||
| 158 | - | |||||||||||||||||||
| 159 | Call call() | - | ||||||||||||||||||
| 160 | { | - | ||||||||||||||||||
| 161 | DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister); | - | ||||||||||||||||||
| 162 | Call result = Call(m_assembler.call(scratchRegister), Call::Linkable); | - | ||||||||||||||||||
| 163 | ASSERT_UNUSED(label, differenceBetween(label, result) == REPTACH_OFFSET_CALL_R11); | - | ||||||||||||||||||
| 164 | return result; never executed: return result; | 0 | ||||||||||||||||||
| 165 | } | - | ||||||||||||||||||
| 166 | - | |||||||||||||||||||
| 167 | void callToRetrieveIP() | - | ||||||||||||||||||
| 168 | { | - | ||||||||||||||||||
| 169 | m_assembler.call(); | - | ||||||||||||||||||
| 170 | } never executed: end of block | 0 | ||||||||||||||||||
| 171 | - | |||||||||||||||||||
| 172 | // Address is a memory location containing the address to jump to | - | ||||||||||||||||||
| 173 | void jump(AbsoluteAddress address) | - | ||||||||||||||||||
| 174 | { | - | ||||||||||||||||||
| 175 | move(TrustedImmPtr(address.m_ptr), scratchRegister); | - | ||||||||||||||||||
| 176 | jump(Address(scratchRegister)); | - | ||||||||||||||||||
| 177 | } never executed: end of block | 0 | ||||||||||||||||||
| 178 | - | |||||||||||||||||||
| 179 | Call tailRecursiveCall() | - | ||||||||||||||||||
| 180 | { | - | ||||||||||||||||||
| 181 | DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister); | - | ||||||||||||||||||
| 182 | Jump newJump = Jump(m_assembler.jmp_r(scratchRegister)); | - | ||||||||||||||||||
| 183 | ASSERT_UNUSED(label, differenceBetween(label, newJump) == REPTACH_OFFSET_CALL_R11); | - | ||||||||||||||||||
| 184 | return Call::fromTailJump(newJump); never executed: return Call::fromTailJump(newJump); | 0 | ||||||||||||||||||
| 185 | } | - | ||||||||||||||||||
| 186 | - | |||||||||||||||||||
| 187 | Call makeTailRecursiveCall(Jump oldJump) | - | ||||||||||||||||||
| 188 | { | - | ||||||||||||||||||
| 189 | oldJump.link(this); | - | ||||||||||||||||||
| 190 | DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister); | - | ||||||||||||||||||
| 191 | Jump newJump = Jump(m_assembler.jmp_r(scratchRegister)); | - | ||||||||||||||||||
| 192 | ASSERT_UNUSED(label, differenceBetween(label, newJump) == REPTACH_OFFSET_CALL_R11); | - | ||||||||||||||||||
| 193 | return Call::fromTailJump(newJump); never executed: return Call::fromTailJump(newJump); | 0 | ||||||||||||||||||
| 194 | } | - | ||||||||||||||||||
| 195 | - | |||||||||||||||||||
| 196 | Jump branchAdd32(ResultCondition cond, TrustedImm32 src, AbsoluteAddress dest) | - | ||||||||||||||||||
| 197 | { | - | ||||||||||||||||||
| 198 | move(TrustedImmPtr(dest.m_ptr), scratchRegister); | - | ||||||||||||||||||
| 199 | add32(src, Address(scratchRegister)); | - | ||||||||||||||||||
| 200 | return Jump(m_assembler.jCC(x86Condition(cond))); never executed: return Jump(m_assembler.jCC(x86Condition(cond))); | 0 | ||||||||||||||||||
| 201 | } | - | ||||||||||||||||||
| 202 | - | |||||||||||||||||||
| 203 | void add64(RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 204 | { | - | ||||||||||||||||||
| 205 | m_assembler.addq_rr(src, dest); | - | ||||||||||||||||||
| 206 | } never executed: end of block | 0 | ||||||||||||||||||
| 207 | - | |||||||||||||||||||
| 208 | void add64(Address src, RegisterID dest) | - | ||||||||||||||||||
| 209 | { | - | ||||||||||||||||||
| 210 | m_assembler.addq_mr(src.offset, src.base, dest); | - | ||||||||||||||||||
| 211 | } never executed: end of block | 0 | ||||||||||||||||||
| 212 | - | |||||||||||||||||||
| 213 | void add64(AbsoluteAddress src, RegisterID dest) | - | ||||||||||||||||||
| 214 | { | - | ||||||||||||||||||
| 215 | move(TrustedImmPtr(src.m_ptr), scratchRegister); | - | ||||||||||||||||||
| 216 | add64(Address(scratchRegister), dest); | - | ||||||||||||||||||
| 217 | } never executed: end of block | 0 | ||||||||||||||||||
| 218 | - | |||||||||||||||||||
| 219 | void add64(TrustedImm32 imm, RegisterID srcDest) | - | ||||||||||||||||||
| 220 | { | - | ||||||||||||||||||
| 221 | m_assembler.addq_ir(imm.m_value, srcDest); | - | ||||||||||||||||||
| 222 | } executed 15352 times by 65 tests: end of blockExecuted by:
| 15352 | ||||||||||||||||||
| 223 | - | |||||||||||||||||||
| 224 | void add64(TrustedImm64 imm, RegisterID dest) | - | ||||||||||||||||||
| 225 | { | - | ||||||||||||||||||
| 226 | move(imm, scratchRegister); | - | ||||||||||||||||||
| 227 | add64(scratchRegister, dest); | - | ||||||||||||||||||
| 228 | } never executed: end of block | 0 | ||||||||||||||||||
| 229 | - | |||||||||||||||||||
| 230 | void add64(TrustedImm32 imm, RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 231 | { | - | ||||||||||||||||||
| 232 | m_assembler.leaq_mr(imm.m_value, src, dest); | - | ||||||||||||||||||
| 233 | } executed 51526 times by 62 tests: end of blockExecuted by:
| 51526 | ||||||||||||||||||
| 234 | - | |||||||||||||||||||
| 235 | void add64(TrustedImm32 imm, Address address) | - | ||||||||||||||||||
| 236 | { | - | ||||||||||||||||||
| 237 | m_assembler.addq_im(imm.m_value, address.offset, address.base); | - | ||||||||||||||||||
| 238 | } never executed: end of block | 0 | ||||||||||||||||||
| 239 | - | |||||||||||||||||||
| 240 | void add64(TrustedImm32 imm, AbsoluteAddress address) | - | ||||||||||||||||||
| 241 | { | - | ||||||||||||||||||
| 242 | move(TrustedImmPtr(address.m_ptr), scratchRegister); | - | ||||||||||||||||||
| 243 | add64(imm, Address(scratchRegister)); | - | ||||||||||||||||||
| 244 | } never executed: end of block | 0 | ||||||||||||||||||
| 245 | - | |||||||||||||||||||
| 246 | void and64(RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 247 | { | - | ||||||||||||||||||
| 248 | m_assembler.andq_rr(src, dest); | - | ||||||||||||||||||
| 249 | } never executed: end of block | 0 | ||||||||||||||||||
| 250 | - | |||||||||||||||||||
| 251 | void and64(TrustedImm32 imm, RegisterID srcDest) | - | ||||||||||||||||||
| 252 | { | - | ||||||||||||||||||
| 253 | m_assembler.andq_ir(imm.m_value, srcDest); | - | ||||||||||||||||||
| 254 | } never executed: end of block | 0 | ||||||||||||||||||
| 255 | - | |||||||||||||||||||
| 256 | void neg64(RegisterID dest) | - | ||||||||||||||||||
| 257 | { | - | ||||||||||||||||||
| 258 | m_assembler.negq_r(dest); | - | ||||||||||||||||||
| 259 | } never executed: end of block | 0 | ||||||||||||||||||
| 260 | - | |||||||||||||||||||
| 261 | void or64(RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 262 | { | - | ||||||||||||||||||
| 263 | m_assembler.orq_rr(src, dest); | - | ||||||||||||||||||
| 264 | } executed 9250 times by 48 tests: end of blockExecuted by:
| 9250 | ||||||||||||||||||
| 265 | - | |||||||||||||||||||
| 266 | void or64(TrustedImm64 imm, RegisterID dest) | - | ||||||||||||||||||
| 267 | { | - | ||||||||||||||||||
| 268 | move(imm, scratchRegister); | - | ||||||||||||||||||
| 269 | or64(scratchRegister, dest); | - | ||||||||||||||||||
| 270 | } executed 9250 times by 48 tests: end of blockExecuted by:
| 9250 | ||||||||||||||||||
| 271 | - | |||||||||||||||||||
| 272 | void or64(TrustedImm32 imm, RegisterID dest) | - | ||||||||||||||||||
| 273 | { | - | ||||||||||||||||||
| 274 | m_assembler.orq_ir(imm.m_value, dest); | - | ||||||||||||||||||
| 275 | } never executed: end of block | 0 | ||||||||||||||||||
| 276 | - | |||||||||||||||||||
| 277 | void or64(RegisterID op1, RegisterID op2, RegisterID dest) | - | ||||||||||||||||||
| 278 | { | - | ||||||||||||||||||
| 279 | if (op1 == op2)
| 0 | ||||||||||||||||||
| 280 | move(op1, dest); never executed: move(op1, dest); | 0 | ||||||||||||||||||
| 281 | else if (op1 == dest)
| 0 | ||||||||||||||||||
| 282 | or64(op2, dest); never executed: or64(op2, dest); | 0 | ||||||||||||||||||
| 283 | else { | - | ||||||||||||||||||
| 284 | move(op2, dest); | - | ||||||||||||||||||
| 285 | or64(op1, dest); | - | ||||||||||||||||||
| 286 | } never executed: end of block | 0 | ||||||||||||||||||
| 287 | } | - | ||||||||||||||||||
| 288 | - | |||||||||||||||||||
| 289 | void or64(TrustedImm32 imm, RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 290 | { | - | ||||||||||||||||||
| 291 | move(src, dest); | - | ||||||||||||||||||
| 292 | or64(imm, dest); | - | ||||||||||||||||||
| 293 | } never executed: end of block | 0 | ||||||||||||||||||
| 294 | - | |||||||||||||||||||
| 295 | void or64(TrustedImm64 imm, RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 296 | { | - | ||||||||||||||||||
| 297 | move(src, dest); | - | ||||||||||||||||||
| 298 | or64(imm, dest); | - | ||||||||||||||||||
| 299 | } executed 4326 times by 39 tests: end of blockExecuted by:
| 4326 | ||||||||||||||||||
| 300 | - | |||||||||||||||||||
| 301 | void rotateRight64(TrustedImm32 imm, RegisterID srcDst) | - | ||||||||||||||||||
| 302 | { | - | ||||||||||||||||||
| 303 | m_assembler.rorq_i8r(imm.m_value, srcDst); | - | ||||||||||||||||||
| 304 | } never executed: end of block | 0 | ||||||||||||||||||
| 305 | - | |||||||||||||||||||
| 306 | void sub64(RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 307 | { | - | ||||||||||||||||||
| 308 | m_assembler.subq_rr(src, dest); | - | ||||||||||||||||||
| 309 | } never executed: end of block | 0 | ||||||||||||||||||
| 310 | - | |||||||||||||||||||
| 311 | void sub64(TrustedImm32 imm, RegisterID dest) | - | ||||||||||||||||||
| 312 | { | - | ||||||||||||||||||
| 313 | m_assembler.subq_ir(imm.m_value, dest); | - | ||||||||||||||||||
| 314 | } executed 1229 times by 16 tests: end of blockExecuted by:
| 1229 | ||||||||||||||||||
| 315 | - | |||||||||||||||||||
| 316 | void sub64(TrustedImm64 imm, RegisterID dest) | - | ||||||||||||||||||
| 317 | { | - | ||||||||||||||||||
| 318 | move(imm, scratchRegister); | - | ||||||||||||||||||
| 319 | sub64(scratchRegister, dest); | - | ||||||||||||||||||
| 320 | } never executed: end of block | 0 | ||||||||||||||||||
| 321 | - | |||||||||||||||||||
| 322 | void xor64(RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 323 | { | - | ||||||||||||||||||
| 324 | m_assembler.xorq_rr(src, dest); | - | ||||||||||||||||||
| 325 | } never executed: end of block | 0 | ||||||||||||||||||
| 326 | - | |||||||||||||||||||
| 327 | void xor64(RegisterID src, Address dest) | - | ||||||||||||||||||
| 328 | { | - | ||||||||||||||||||
| 329 | m_assembler.xorq_rm(src, dest.offset, dest.base); | - | ||||||||||||||||||
| 330 | } never executed: end of block | 0 | ||||||||||||||||||
| 331 | - | |||||||||||||||||||
| 332 | void xor64(TrustedImm32 imm, RegisterID srcDest) | - | ||||||||||||||||||
| 333 | { | - | ||||||||||||||||||
| 334 | m_assembler.xorq_ir(imm.m_value, srcDest); | - | ||||||||||||||||||
| 335 | } never executed: end of block | 0 | ||||||||||||||||||
| 336 | - | |||||||||||||||||||
| 337 | void lshift64(TrustedImm32 imm, RegisterID dest) | - | ||||||||||||||||||
| 338 | { | - | ||||||||||||||||||
| 339 | m_assembler.shlq_i8r(imm.m_value, dest); | - | ||||||||||||||||||
| 340 | } never executed: end of block | 0 | ||||||||||||||||||
| 341 | - | |||||||||||||||||||
| 342 | void lshift64(RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 343 | { | - | ||||||||||||||||||
| 344 | if (src == X86Registers::ecx)
| 0 | ||||||||||||||||||
| 345 | m_assembler.shlq_CLr(dest); never executed: m_assembler.shlq_CLr(dest); | 0 | ||||||||||||||||||
| 346 | else { | - | ||||||||||||||||||
| 347 | ASSERT(src != dest); | - | ||||||||||||||||||
| 348 | - | |||||||||||||||||||
| 349 | // Can only shift by ecx, so we do some swapping if we see anything else. | - | ||||||||||||||||||
| 350 | swap(src, X86Registers::ecx); | - | ||||||||||||||||||
| 351 | m_assembler.shlq_CLr(dest == X86Registers::ecx ? src : dest); | - | ||||||||||||||||||
| 352 | swap(src, X86Registers::ecx); | - | ||||||||||||||||||
| 353 | } never executed: end of block | 0 | ||||||||||||||||||
| 354 | } | - | ||||||||||||||||||
| 355 | - | |||||||||||||||||||
| 356 | void rshift64(TrustedImm32 imm, RegisterID dest) | - | ||||||||||||||||||
| 357 | { | - | ||||||||||||||||||
| 358 | m_assembler.sarq_i8r(imm.m_value, dest); | - | ||||||||||||||||||
| 359 | } executed 8 times by 1 test: end of blockExecuted by:
| 8 | ||||||||||||||||||
| 360 | - | |||||||||||||||||||
| 361 | void rshift64(RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 362 | { | - | ||||||||||||||||||
| 363 | if (src == X86Registers::ecx)
| 0 | ||||||||||||||||||
| 364 | m_assembler.sarq_CLr(dest); never executed: m_assembler.sarq_CLr(dest); | 0 | ||||||||||||||||||
| 365 | else { | - | ||||||||||||||||||
| 366 | ASSERT(src != dest); | - | ||||||||||||||||||
| 367 | - | |||||||||||||||||||
| 368 | // Can only shift by ecx, so we do some swapping if we see anything else. | - | ||||||||||||||||||
| 369 | swap(src, X86Registers::ecx); | - | ||||||||||||||||||
| 370 | m_assembler.sarq_CLr(dest == X86Registers::ecx ? src : dest); | - | ||||||||||||||||||
| 371 | swap(src, X86Registers::ecx); | - | ||||||||||||||||||
| 372 | } never executed: end of block | 0 | ||||||||||||||||||
| 373 | } | - | ||||||||||||||||||
| 374 | - | |||||||||||||||||||
| 375 | void urshift64(RegisterID src, TrustedImm32 imm, RegisterID dest) | - | ||||||||||||||||||
| 376 | { | - | ||||||||||||||||||
| 377 | if (src != dest)
| 0-16462 | ||||||||||||||||||
| 378 | move(src, dest); executed 16462 times by 50 tests: move(src, dest);Executed by:
| 16462 | ||||||||||||||||||
| 379 | urshift64(imm, dest); | - | ||||||||||||||||||
| 380 | } executed 16462 times by 50 tests: end of blockExecuted by:
| 16462 | ||||||||||||||||||
| 381 | - | |||||||||||||||||||
| 382 | void urshift64(TrustedImm32 imm, RegisterID dest) | - | ||||||||||||||||||
| 383 | { | - | ||||||||||||||||||
| 384 | m_assembler.shrq_i8r(imm.m_value, dest); | - | ||||||||||||||||||
| 385 | } executed 16462 times by 50 tests: end of blockExecuted by:
| 16462 | ||||||||||||||||||
| 386 | - | |||||||||||||||||||
| 387 | void urshift64(RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 388 | { | - | ||||||||||||||||||
| 389 | if (src == X86Registers::ecx)
| 0 | ||||||||||||||||||
| 390 | m_assembler.shrq_CLr(dest); never executed: m_assembler.shrq_CLr(dest); | 0 | ||||||||||||||||||
| 391 | else { | - | ||||||||||||||||||
| 392 | ASSERT(src != dest); | - | ||||||||||||||||||
| 393 | - | |||||||||||||||||||
| 394 | // Can only shift by ecx, so we do some swapping if we see anything else. | - | ||||||||||||||||||
| 395 | swap(src, X86Registers::ecx); | - | ||||||||||||||||||
| 396 | m_assembler.shrq_CLr(dest == X86Registers::ecx ? src : dest); | - | ||||||||||||||||||
| 397 | swap(src, X86Registers::ecx); | - | ||||||||||||||||||
| 398 | } never executed: end of block | 0 | ||||||||||||||||||
| 399 | } | - | ||||||||||||||||||
| 400 | - | |||||||||||||||||||
| 401 | void load64(ImplicitAddress address, RegisterID dest) | - | ||||||||||||||||||
| 402 | { | - | ||||||||||||||||||
| 403 | m_assembler.movq_mr(address.offset, address.base, dest); | - | ||||||||||||||||||
| 404 | } executed 59260 times by 65 tests: end of blockExecuted by:
| 59260 | ||||||||||||||||||
| 405 | - | |||||||||||||||||||
| 406 | void load64(BaseIndex address, RegisterID dest) | - | ||||||||||||||||||
| 407 | { | - | ||||||||||||||||||
| 408 | m_assembler.movq_mr(address.offset, address.base, address.index, address.scale, dest); | - | ||||||||||||||||||
| 409 | } never executed: end of block | 0 | ||||||||||||||||||
| 410 | - | |||||||||||||||||||
| 411 | void load64(const void* address, RegisterID dest) | - | ||||||||||||||||||
| 412 | { | - | ||||||||||||||||||
| 413 | if (dest == X86Registers::eax)
| 0 | ||||||||||||||||||
| 414 | m_assembler.movq_mEAX(address); never executed: m_assembler.movq_mEAX(address); | 0 | ||||||||||||||||||
| 415 | else { | - | ||||||||||||||||||
| 416 | move(TrustedImmPtr(address), dest); | - | ||||||||||||||||||
| 417 | load64(dest, dest); | - | ||||||||||||||||||
| 418 | } never executed: end of block | 0 | ||||||||||||||||||
| 419 | } | - | ||||||||||||||||||
| 420 | - | |||||||||||||||||||
| 421 | DataLabel32 load64WithAddressOffsetPatch(Address address, RegisterID dest) | - | ||||||||||||||||||
| 422 | { | - | ||||||||||||||||||
| 423 | padBeforePatch(); | - | ||||||||||||||||||
| 424 | m_assembler.movq_mr_disp32(address.offset, address.base, dest); | - | ||||||||||||||||||
| 425 | return DataLabel32(this); never executed: return DataLabel32(this); | 0 | ||||||||||||||||||
| 426 | } | - | ||||||||||||||||||
| 427 | - | |||||||||||||||||||
| 428 | DataLabelCompact load64WithCompactAddressOffsetPatch(Address address, RegisterID dest) | - | ||||||||||||||||||
| 429 | { | - | ||||||||||||||||||
| 430 | padBeforePatch(); | - | ||||||||||||||||||
| 431 | m_assembler.movq_mr_disp8(address.offset, address.base, dest); | - | ||||||||||||||||||
| 432 | return DataLabelCompact(this); never executed: return DataLabelCompact(this); | 0 | ||||||||||||||||||
| 433 | } | - | ||||||||||||||||||
| 434 | - | |||||||||||||||||||
| 435 | void store64(RegisterID src, ImplicitAddress address) | - | ||||||||||||||||||
| 436 | { | - | ||||||||||||||||||
| 437 | m_assembler.movq_rm(src, address.offset, address.base); | - | ||||||||||||||||||
| 438 | } executed 86957 times by 65 tests: end of blockExecuted by:
| 86957 | ||||||||||||||||||
| 439 | - | |||||||||||||||||||
| 440 | void store64(RegisterID src, BaseIndex address) | - | ||||||||||||||||||
| 441 | { | - | ||||||||||||||||||
| 442 | m_assembler.movq_rm(src, address.offset, address.base, address.index, address.scale); | - | ||||||||||||||||||
| 443 | } never executed: end of block | 0 | ||||||||||||||||||
| 444 | - | |||||||||||||||||||
| 445 | void store64(RegisterID src, void* address) | - | ||||||||||||||||||
| 446 | { | - | ||||||||||||||||||
| 447 | if (src == X86Registers::eax)
| 0 | ||||||||||||||||||
| 448 | m_assembler.movq_EAXm(address); never executed: m_assembler.movq_EAXm(address); | 0 | ||||||||||||||||||
| 449 | else { | - | ||||||||||||||||||
| 450 | move(TrustedImmPtr(address), scratchRegister); | - | ||||||||||||||||||
| 451 | store64(src, scratchRegister); | - | ||||||||||||||||||
| 452 | } never executed: end of block | 0 | ||||||||||||||||||
| 453 | } | - | ||||||||||||||||||
| 454 | - | |||||||||||||||||||
| 455 | void store64(TrustedImm64 imm, ImplicitAddress address) | - | ||||||||||||||||||
| 456 | { | - | ||||||||||||||||||
| 457 | move(imm, scratchRegister); | - | ||||||||||||||||||
| 458 | store64(scratchRegister, address); | - | ||||||||||||||||||
| 459 | } executed 58 times by 7 tests: end of blockExecuted by:
| 58 | ||||||||||||||||||
| 460 | - | |||||||||||||||||||
| 461 | void store64(TrustedImm64 imm, BaseIndex address) | - | ||||||||||||||||||
| 462 | { | - | ||||||||||||||||||
| 463 | move(imm, scratchRegister); | - | ||||||||||||||||||
| 464 | m_assembler.movq_rm(scratchRegister, address.offset, address.base, address.index, address.scale); | - | ||||||||||||||||||
| 465 | } never executed: end of block | 0 | ||||||||||||||||||
| 466 | - | |||||||||||||||||||
| 467 | DataLabel32 store64WithAddressOffsetPatch(RegisterID src, Address address) | - | ||||||||||||||||||
| 468 | { | - | ||||||||||||||||||
| 469 | padBeforePatch(); | - | ||||||||||||||||||
| 470 | m_assembler.movq_rm_disp32(src, address.offset, address.base); | - | ||||||||||||||||||
| 471 | return DataLabel32(this); never executed: return DataLabel32(this); | 0 | ||||||||||||||||||
| 472 | } | - | ||||||||||||||||||
| 473 | - | |||||||||||||||||||
| 474 | void move64ToDouble(RegisterID src, FPRegisterID dest) | - | ||||||||||||||||||
| 475 | { | - | ||||||||||||||||||
| 476 | m_assembler.movq_rr(src, dest); | - | ||||||||||||||||||
| 477 | } never executed: end of block | 0 | ||||||||||||||||||
| 478 | - | |||||||||||||||||||
| 479 | void moveDoubleTo64(FPRegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 480 | { | - | ||||||||||||||||||
| 481 | m_assembler.movq_rr(src, dest); | - | ||||||||||||||||||
| 482 | } never executed: end of block | 0 | ||||||||||||||||||
| 483 | - | |||||||||||||||||||
| 484 | void compare64(RelationalCondition cond, RegisterID left, TrustedImm32 right, RegisterID dest) | - | ||||||||||||||||||
| 485 | { | - | ||||||||||||||||||
| 486 | if (((cond == Equal) || (cond == NotEqual)) && !right.m_value)
| 0-8 | ||||||||||||||||||
| 487 | m_assembler.testq_rr(left, left); executed 8 times by 1 test: m_assembler.testq_rr(left, left);Executed by:
| 8 | ||||||||||||||||||
| 488 | else | - | ||||||||||||||||||
| 489 | m_assembler.cmpq_ir(right.m_value, left); never executed: m_assembler.cmpq_ir(right.m_value, left); | 0 | ||||||||||||||||||
| 490 | m_assembler.setCC_r(x86Condition(cond), dest); | - | ||||||||||||||||||
| 491 | m_assembler.movzbl_rr(dest, dest); | - | ||||||||||||||||||
| 492 | } executed 8 times by 1 test: end of blockExecuted by:
| 8 | ||||||||||||||||||
| 493 | - | |||||||||||||||||||
| 494 | void compare64(RelationalCondition cond, RegisterID left, RegisterID right, RegisterID dest) | - | ||||||||||||||||||
| 495 | { | - | ||||||||||||||||||
| 496 | m_assembler.cmpq_rr(right, left); | - | ||||||||||||||||||
| 497 | m_assembler.setCC_r(x86Condition(cond), dest); | - | ||||||||||||||||||
| 498 | m_assembler.movzbl_rr(dest, dest); | - | ||||||||||||||||||
| 499 | } never executed: end of block | 0 | ||||||||||||||||||
| 500 | - | |||||||||||||||||||
| 501 | Jump branch64(RelationalCondition cond, RegisterID left, RegisterID right) | - | ||||||||||||||||||
| 502 | { | - | ||||||||||||||||||
| 503 | m_assembler.cmpq_rr(right, left); | - | ||||||||||||||||||
| 504 | return Jump(m_assembler.jCC(x86Condition(cond))); never executed: return Jump(m_assembler.jCC(x86Condition(cond))); | 0 | ||||||||||||||||||
| 505 | } | - | ||||||||||||||||||
| 506 | - | |||||||||||||||||||
| 507 | Jump branch64(RelationalCondition cond, RegisterID left, TrustedImm64 right) | - | ||||||||||||||||||
| 508 | { | - | ||||||||||||||||||
| 509 | if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) {
| 0-13188 | ||||||||||||||||||
| 510 | m_assembler.testq_rr(left, left); | - | ||||||||||||||||||
| 511 | return Jump(m_assembler.jCC(x86Condition(cond))); executed 13188 times by 64 tests: return Jump(m_assembler.jCC(x86Condition(cond)));Executed by:
| 13188 | ||||||||||||||||||
| 512 | } | - | ||||||||||||||||||
| 513 | move(right, scratchRegister); | - | ||||||||||||||||||
| 514 | return branch64(cond, left, scratchRegister); never executed: return branch64(cond, left, scratchRegister); | 0 | ||||||||||||||||||
| 515 | } | - | ||||||||||||||||||
| 516 | - | |||||||||||||||||||
| 517 | Jump branch64(RelationalCondition cond, RegisterID left, Address right) | - | ||||||||||||||||||
| 518 | { | - | ||||||||||||||||||
| 519 | m_assembler.cmpq_mr(right.offset, right.base, left); | - | ||||||||||||||||||
| 520 | return Jump(m_assembler.jCC(x86Condition(cond))); never executed: return Jump(m_assembler.jCC(x86Condition(cond))); | 0 | ||||||||||||||||||
| 521 | } | - | ||||||||||||||||||
| 522 | - | |||||||||||||||||||
| 523 | Jump branch64(RelationalCondition cond, AbsoluteAddress left, RegisterID right) | - | ||||||||||||||||||
| 524 | { | - | ||||||||||||||||||
| 525 | move(TrustedImmPtr(left.m_ptr), scratchRegister); | - | ||||||||||||||||||
| 526 | return branch64(cond, Address(scratchRegister), right); never executed: return branch64(cond, Address(scratchRegister), right); | 0 | ||||||||||||||||||
| 527 | } | - | ||||||||||||||||||
| 528 | - | |||||||||||||||||||
| 529 | Jump branch64(RelationalCondition cond, Address left, RegisterID right) | - | ||||||||||||||||||
| 530 | { | - | ||||||||||||||||||
| 531 | m_assembler.cmpq_rm(right, left.offset, left.base); | - | ||||||||||||||||||
| 532 | return Jump(m_assembler.jCC(x86Condition(cond))); never executed: return Jump(m_assembler.jCC(x86Condition(cond))); | 0 | ||||||||||||||||||
| 533 | } | - | ||||||||||||||||||
| 534 | - | |||||||||||||||||||
| 535 | Jump branch64(RelationalCondition cond, Address left, TrustedImm64 right) | - | ||||||||||||||||||
| 536 | { | - | ||||||||||||||||||
| 537 | move(right, scratchRegister); | - | ||||||||||||||||||
| 538 | return branch64(cond, left, scratchRegister); never executed: return branch64(cond, left, scratchRegister); | 0 | ||||||||||||||||||
| 539 | } | - | ||||||||||||||||||
| 540 | - | |||||||||||||||||||
| 541 | Jump branchTest64(ResultCondition cond, RegisterID reg, RegisterID mask) | - | ||||||||||||||||||
| 542 | { | - | ||||||||||||||||||
| 543 | m_assembler.testq_rr(reg, mask); | - | ||||||||||||||||||
| 544 | return Jump(m_assembler.jCC(x86Condition(cond))); never executed: return Jump(m_assembler.jCC(x86Condition(cond))); | 0 | ||||||||||||||||||
| 545 | } | - | ||||||||||||||||||
| 546 | - | |||||||||||||||||||
| 547 | Jump branchTest64(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) | - | ||||||||||||||||||
| 548 | { | - | ||||||||||||||||||
| 549 | // if we are only interested in the low seven bits, this can be tested with a testb | - | ||||||||||||||||||
| 550 | if (mask.m_value == -1)
| 0 | ||||||||||||||||||
| 551 | m_assembler.testq_rr(reg, reg); never executed: m_assembler.testq_rr(reg, reg); | 0 | ||||||||||||||||||
| 552 | else if ((mask.m_value & ~0x7f) == 0)
| 0 | ||||||||||||||||||
| 553 | m_assembler.testb_i8r(mask.m_value, reg); never executed: m_assembler.testb_i8r(mask.m_value, reg); | 0 | ||||||||||||||||||
| 554 | else | - | ||||||||||||||||||
| 555 | m_assembler.testq_i32r(mask.m_value, reg); never executed: m_assembler.testq_i32r(mask.m_value, reg); | 0 | ||||||||||||||||||
| 556 | return Jump(m_assembler.jCC(x86Condition(cond))); never executed: return Jump(m_assembler.jCC(x86Condition(cond))); | 0 | ||||||||||||||||||
| 557 | } | - | ||||||||||||||||||
| 558 | - | |||||||||||||||||||
| 559 | void test64(ResultCondition cond, RegisterID reg, TrustedImm32 mask, RegisterID dest) | - | ||||||||||||||||||
| 560 | { | - | ||||||||||||||||||
| 561 | if (mask.m_value == -1)
| 0 | ||||||||||||||||||
| 562 | m_assembler.testq_rr(reg, reg); never executed: m_assembler.testq_rr(reg, reg); | 0 | ||||||||||||||||||
| 563 | else if ((mask.m_value & ~0x7f) == 0)
| 0 | ||||||||||||||||||
| 564 | m_assembler.testb_i8r(mask.m_value, reg); never executed: m_assembler.testb_i8r(mask.m_value, reg); | 0 | ||||||||||||||||||
| 565 | else | - | ||||||||||||||||||
| 566 | m_assembler.testq_i32r(mask.m_value, reg); never executed: m_assembler.testq_i32r(mask.m_value, reg); | 0 | ||||||||||||||||||
| 567 | set32(x86Condition(cond), dest); | - | ||||||||||||||||||
| 568 | } never executed: end of block | 0 | ||||||||||||||||||
| 569 | - | |||||||||||||||||||
| 570 | void test64(ResultCondition cond, RegisterID reg, RegisterID mask, RegisterID dest) | - | ||||||||||||||||||
| 571 | { | - | ||||||||||||||||||
| 572 | m_assembler.testq_rr(reg, mask); | - | ||||||||||||||||||
| 573 | set32(x86Condition(cond), dest); | - | ||||||||||||||||||
| 574 | } never executed: end of block | 0 | ||||||||||||||||||
| 575 | - | |||||||||||||||||||
| 576 | Jump branchTest64(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1)) | - | ||||||||||||||||||
| 577 | { | - | ||||||||||||||||||
| 578 | load64(address.m_ptr, scratchRegister); | - | ||||||||||||||||||
| 579 | return branchTest64(cond, scratchRegister, mask); never executed: return branchTest64(cond, scratchRegister, mask); | 0 | ||||||||||||||||||
| 580 | } | - | ||||||||||||||||||
| 581 | - | |||||||||||||||||||
| 582 | Jump branchTest64(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) | - | ||||||||||||||||||
| 583 | { | - | ||||||||||||||||||
| 584 | if (mask.m_value == -1)
| 0 | ||||||||||||||||||
| 585 | m_assembler.cmpq_im(0, address.offset, address.base); never executed: m_assembler.cmpq_im(0, address.offset, address.base); | 0 | ||||||||||||||||||
| 586 | else | - | ||||||||||||||||||
| 587 | m_assembler.testq_i32m(mask.m_value, address.offset, address.base); never executed: m_assembler.testq_i32m(mask.m_value, address.offset, address.base); | 0 | ||||||||||||||||||
| 588 | return Jump(m_assembler.jCC(x86Condition(cond))); never executed: return Jump(m_assembler.jCC(x86Condition(cond))); | 0 | ||||||||||||||||||
| 589 | } | - | ||||||||||||||||||
| 590 | - | |||||||||||||||||||
| 591 | Jump branchTest64(ResultCondition cond, Address address, RegisterID reg) | - | ||||||||||||||||||
| 592 | { | - | ||||||||||||||||||
| 593 | m_assembler.testq_rm(reg, address.offset, address.base); | - | ||||||||||||||||||
| 594 | return Jump(m_assembler.jCC(x86Condition(cond))); never executed: return Jump(m_assembler.jCC(x86Condition(cond))); | 0 | ||||||||||||||||||
| 595 | } | - | ||||||||||||||||||
| 596 | - | |||||||||||||||||||
| 597 | Jump branchTest64(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) | - | ||||||||||||||||||
| 598 | { | - | ||||||||||||||||||
| 599 | if (mask.m_value == -1)
| 0 | ||||||||||||||||||
| 600 | m_assembler.cmpq_im(0, address.offset, address.base, address.index, address.scale); never executed: m_assembler.cmpq_im(0, address.offset, address.base, address.index, address.scale); | 0 | ||||||||||||||||||
| 601 | else | - | ||||||||||||||||||
| 602 | m_assembler.testq_i32m(mask.m_value, address.offset, address.base, address.index, address.scale); never executed: m_assembler.testq_i32m(mask.m_value, address.offset, address.base, address.index, address.scale); | 0 | ||||||||||||||||||
| 603 | return Jump(m_assembler.jCC(x86Condition(cond))); never executed: return Jump(m_assembler.jCC(x86Condition(cond))); | 0 | ||||||||||||||||||
| 604 | } | - | ||||||||||||||||||
| 605 | - | |||||||||||||||||||
| 606 | - | |||||||||||||||||||
| 607 | Jump branchAdd64(ResultCondition cond, TrustedImm32 imm, RegisterID dest) | - | ||||||||||||||||||
| 608 | { | - | ||||||||||||||||||
| 609 | add64(imm, dest); | - | ||||||||||||||||||
| 610 | return Jump(m_assembler.jCC(x86Condition(cond))); never executed: return Jump(m_assembler.jCC(x86Condition(cond))); | 0 | ||||||||||||||||||
| 611 | } | - | ||||||||||||||||||
| 612 | - | |||||||||||||||||||
| 613 | Jump branchAdd64(ResultCondition cond, RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 614 | { | - | ||||||||||||||||||
| 615 | add64(src, dest); | - | ||||||||||||||||||
| 616 | return Jump(m_assembler.jCC(x86Condition(cond))); never executed: return Jump(m_assembler.jCC(x86Condition(cond))); | 0 | ||||||||||||||||||
| 617 | } | - | ||||||||||||||||||
| 618 | - | |||||||||||||||||||
| 619 | Jump branchSub64(ResultCondition cond, TrustedImm32 imm, RegisterID dest) | - | ||||||||||||||||||
| 620 | { | - | ||||||||||||||||||
| 621 | sub64(imm, dest); | - | ||||||||||||||||||
| 622 | return Jump(m_assembler.jCC(x86Condition(cond))); never executed: return Jump(m_assembler.jCC(x86Condition(cond))); | 0 | ||||||||||||||||||
| 623 | } | - | ||||||||||||||||||
| 624 | - | |||||||||||||||||||
| 625 | Jump branchSub64(ResultCondition cond, RegisterID src, RegisterID dest) | - | ||||||||||||||||||
| 626 | { | - | ||||||||||||||||||
| 627 | sub64(src, dest); | - | ||||||||||||||||||
| 628 | return Jump(m_assembler.jCC(x86Condition(cond))); never executed: return Jump(m_assembler.jCC(x86Condition(cond))); | 0 | ||||||||||||||||||
| 629 | } | - | ||||||||||||||||||
| 630 | - | |||||||||||||||||||
| 631 | Jump branchSub64(ResultCondition cond, RegisterID src1, TrustedImm32 src2, RegisterID dest) | - | ||||||||||||||||||
| 632 | { | - | ||||||||||||||||||
| 633 | move(src1, dest); | - | ||||||||||||||||||
| 634 | return branchSub64(cond, src2, dest); never executed: return branchSub64(cond, src2, dest); | 0 | ||||||||||||||||||
| 635 | } | - | ||||||||||||||||||
| 636 | - | |||||||||||||||||||
| 637 | ConvertibleLoadLabel convertibleLoadPtr(Address address, RegisterID dest) | - | ||||||||||||||||||
| 638 | { | - | ||||||||||||||||||
| 639 | ConvertibleLoadLabel result = ConvertibleLoadLabel(this); | - | ||||||||||||||||||
| 640 | m_assembler.movq_mr(address.offset, address.base, dest); | - | ||||||||||||||||||
| 641 | return result; never executed: return result; | 0 | ||||||||||||||||||
| 642 | } | - | ||||||||||||||||||
| 643 | - | |||||||||||||||||||
| 644 | DataLabelPtr moveWithPatch(TrustedImmPtr initialValue, RegisterID dest) | - | ||||||||||||||||||
| 645 | { | - | ||||||||||||||||||
| 646 | padBeforePatch(); | - | ||||||||||||||||||
| 647 | m_assembler.movq_i64r(initialValue.asIntptr(), dest); | - | ||||||||||||||||||
| 648 | return DataLabelPtr(this); executed 609 times by 10 tests: return DataLabelPtr(this);Executed by:
| 609 | ||||||||||||||||||
| 649 | } | - | ||||||||||||||||||
| 650 | - | |||||||||||||||||||
| 651 | Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) | - | ||||||||||||||||||
| 652 | { | - | ||||||||||||||||||
| 653 | dataLabel = moveWithPatch(initialRightValue, scratchRegister); | - | ||||||||||||||||||
| 654 | return branch64(cond, left, scratchRegister); never executed: return branch64(cond, left, scratchRegister); | 0 | ||||||||||||||||||
| 655 | } | - | ||||||||||||||||||
| 656 | - | |||||||||||||||||||
| 657 | Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) | - | ||||||||||||||||||
| 658 | { | - | ||||||||||||||||||
| 659 | dataLabel = moveWithPatch(initialRightValue, scratchRegister); | - | ||||||||||||||||||
| 660 | return branch64(cond, left, scratchRegister); never executed: return branch64(cond, left, scratchRegister); | 0 | ||||||||||||||||||
| 661 | } | - | ||||||||||||||||||
| 662 | - | |||||||||||||||||||
| 663 | DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address) | - | ||||||||||||||||||
| 664 | { | - | ||||||||||||||||||
| 665 | DataLabelPtr label = moveWithPatch(initialValue, scratchRegister); | - | ||||||||||||||||||
| 666 | store64(scratchRegister, address); | - | ||||||||||||||||||
| 667 | return label; executed 610 times by 10 tests: return label;Executed by:
| 610 | ||||||||||||||||||
| 668 | } | - | ||||||||||||||||||
| 669 | - | |||||||||||||||||||
| 670 | using MacroAssemblerX86Common::branchTest8; | - | ||||||||||||||||||
| 671 | Jump branchTest8(ResultCondition cond, ExtendedAddress address, TrustedImm32 mask = TrustedImm32(-1)) | - | ||||||||||||||||||
| 672 | { | - | ||||||||||||||||||
| 673 | TrustedImmPtr addr(reinterpret_cast<void*>(address.offset)); | - | ||||||||||||||||||
| 674 | MacroAssemblerX86Common::move(addr, scratchRegister); | - | ||||||||||||||||||
| 675 | return MacroAssemblerX86Common::branchTest8(cond, BaseIndex(scratchRegister, address.base, TimesOne), mask); executed 3752 times by 3 tests: return MacroAssemblerX86Common::branchTest8(cond, BaseIndex(scratchRegister, address.base, TimesOne), mask);Executed by:
| 3752 | ||||||||||||||||||
| 676 | } | - | ||||||||||||||||||
| 677 | - | |||||||||||||||||||
| 678 | Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1)) | - | ||||||||||||||||||
| 679 | { | - | ||||||||||||||||||
| 680 | MacroAssemblerX86Common::move(TrustedImmPtr(address.m_ptr), scratchRegister); | - | ||||||||||||||||||
| 681 | return MacroAssemblerX86Common::branchTest8(cond, Address(scratchRegister), mask); never executed: return MacroAssemblerX86Common::branchTest8(cond, Address(scratchRegister), mask); | 0 | ||||||||||||||||||
| 682 | } | - | ||||||||||||||||||
| 683 | - | |||||||||||||||||||
| 684 | static bool supportsFloatingPoint() { return true; } never executed: return true; | 0 | ||||||||||||||||||
| 685 | // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate() | - | ||||||||||||||||||
| 686 | static bool supportsFloatingPointTruncate() { return true; } never executed: return true; | 0 | ||||||||||||||||||
| 687 | static bool supportsFloatingPointSqrt() { return true; } never executed: return true; | 0 | ||||||||||||||||||
| 688 | static bool supportsFloatingPointAbs() { return true; } never executed: return true; | 0 | ||||||||||||||||||
| 689 | - | |||||||||||||||||||
| 690 | static FunctionPtr readCallTarget(CodeLocationCall call) | - | ||||||||||||||||||
| 691 | { | - | ||||||||||||||||||
| 692 | return FunctionPtr(X86Assembler::readPointer(call.dataLabelPtrAtOffset(-REPTACH_OFFSET_CALL_R11).dataLocation())); never executed: return FunctionPtr(X86Assembler::readPointer(call.dataLabelPtrAtOffset(-3).dataLocation())); | 0 | ||||||||||||||||||
| 693 | } | - | ||||||||||||||||||
| 694 | - | |||||||||||||||||||
| 695 | static RegisterID scratchRegisterForBlinding() { return scratchRegister; } never executed: return scratchRegister; | 0 | ||||||||||||||||||
| 696 | - | |||||||||||||||||||
| 697 | static bool canJumpReplacePatchableBranchPtrWithPatch() { return true; } never executed: return true; | 0 | ||||||||||||||||||
| 698 | - | |||||||||||||||||||
| 699 | static CodeLocationLabel startOfBranchPtrWithPatchOnRegister(CodeLocationDataLabelPtr label) | - | ||||||||||||||||||
| 700 | { | - | ||||||||||||||||||
| 701 | const int rexBytes = 1; | - | ||||||||||||||||||
| 702 | const int opcodeBytes = 1; | - | ||||||||||||||||||
| 703 | const int immediateBytes = 8; | - | ||||||||||||||||||
| 704 | const int totalBytes = rexBytes + opcodeBytes + immediateBytes; | - | ||||||||||||||||||
| 705 | ASSERT(totalBytes >= maxJumpReplacementSize()); | - | ||||||||||||||||||
| 706 | return label.labelAtOffset(-totalBytes); never executed: return label.labelAtOffset(-totalBytes); | 0 | ||||||||||||||||||
| 707 | } | - | ||||||||||||||||||
| 708 | - | |||||||||||||||||||
| 709 | static CodeLocationLabel startOfPatchableBranchPtrWithPatchOnAddress(CodeLocationDataLabelPtr label) | - | ||||||||||||||||||
| 710 | { | - | ||||||||||||||||||
| 711 | return startOfBranchPtrWithPatchOnRegister(label); never executed: return startOfBranchPtrWithPatchOnRegister(label); | 0 | ||||||||||||||||||
| 712 | } | - | ||||||||||||||||||
| 713 | - | |||||||||||||||||||
| 714 | static void revertJumpReplacementToPatchableBranchPtrWithPatch(CodeLocationLabel instructionStart, Address, void* initialValue) | - | ||||||||||||||||||
| 715 | { | - | ||||||||||||||||||
| 716 | X86Assembler::revertJumpTo_movq_i64r(instructionStart.executableAddress(), reinterpret_cast<intptr_t>(initialValue), scratchRegister); | - | ||||||||||||||||||
| 717 | } never executed: end of block | 0 | ||||||||||||||||||
| 718 | - | |||||||||||||||||||
| 719 | static void revertJumpReplacementToBranchPtrWithPatch(CodeLocationLabel instructionStart, RegisterID, void* initialValue) | - | ||||||||||||||||||
| 720 | { | - | ||||||||||||||||||
| 721 | X86Assembler::revertJumpTo_movq_i64r(instructionStart.executableAddress(), reinterpret_cast<intptr_t>(initialValue), scratchRegister); | - | ||||||||||||||||||
| 722 | } never executed: end of block | 0 | ||||||||||||||||||
| 723 | - | |||||||||||||||||||
| 724 | private: | - | ||||||||||||||||||
| 725 | template <typename, template <typename> class> friend class LinkBufferBase; | - | ||||||||||||||||||
| 726 | friend class RepatchBuffer; | - | ||||||||||||||||||
| 727 | - | |||||||||||||||||||
| 728 | static void linkCall(void* code, Call call, FunctionPtr function) | - | ||||||||||||||||||
| 729 | { | - | ||||||||||||||||||
| 730 | if (!call.isFlagSet(Call::Near))
| 0 | ||||||||||||||||||
| 731 | X86Assembler::linkPointer(code, call.m_label.labelAtOffset(-REPTACH_OFFSET_CALL_R11), function.value()); never executed: X86Assembler::linkPointer(code, call.m_label.labelAtOffset(-3), function.value()); | 0 | ||||||||||||||||||
| 732 | else | - | ||||||||||||||||||
| 733 | X86Assembler::linkCall(code, call.m_label, function.value()); never executed: X86Assembler::linkCall(code, call.m_label, function.value()); | 0 | ||||||||||||||||||
| 734 | } | - | ||||||||||||||||||
| 735 | - | |||||||||||||||||||
| 736 | static void repatchCall(CodeLocationCall call, CodeLocationLabel destination) | - | ||||||||||||||||||
| 737 | { | - | ||||||||||||||||||
| 738 | X86Assembler::repatchPointer(call.dataLabelPtrAtOffset(-REPTACH_OFFSET_CALL_R11).dataLocation(), destination.executableAddress()); | - | ||||||||||||||||||
| 739 | } never executed: end of block | 0 | ||||||||||||||||||
| 740 | - | |||||||||||||||||||
| 741 | static void repatchCall(CodeLocationCall call, FunctionPtr destination) | - | ||||||||||||||||||
| 742 | { | - | ||||||||||||||||||
| 743 | X86Assembler::repatchPointer(call.dataLabelPtrAtOffset(-REPTACH_OFFSET_CALL_R11).dataLocation(), destination.executableAddress()); | - | ||||||||||||||||||
| 744 | } never executed: end of block | 0 | ||||||||||||||||||
| 745 | - | |||||||||||||||||||
| 746 | }; | - | ||||||||||||||||||
| 747 | - | |||||||||||||||||||
| 748 | } // namespace JSC | - | ||||||||||||||||||
| 749 | - | |||||||||||||||||||
| 750 | #endif // ENABLE(ASSEMBLER) | - | ||||||||||||||||||
| 751 | - | |||||||||||||||||||
| 752 | #endif // MacroAssemblerX86_64_h | - | ||||||||||||||||||
| Source code | Switch to Preprocessed file |