1// This file is generated from a similarly-named Perl script in the BoringSSL 2// source tree. Do not edit by hand. 3 4#if defined(__has_feature) 5#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) 6#define OPENSSL_NO_ASM 7#endif 8#endif 9 10#if !defined(OPENSSL_NO_ASM) 11#if defined(__aarch64__) 12#if defined(BORINGSSL_PREFIX) 13#include <boringssl_prefix_symbols_asm.h> 14#endif 15.text 16 17// abi_test_trampoline loads callee-saved registers from |state|, calls |func| 18// with |argv|, then saves the callee-saved registers into |state|. It returns 19// the result of |func|. The |unwind| argument is unused. 20// uint64_t abi_test_trampoline(void (*func)(...), CallerState *state, 21// const uint64_t *argv, size_t argc, 22// uint64_t unwind); 23.type abi_test_trampoline, %function 24.globl abi_test_trampoline 25.hidden abi_test_trampoline 26.align 4 27abi_test_trampoline: 28.Labi_test_trampoline_begin: 29 // Stack layout (low to high addresses) 30 // x29,x30 (16 bytes) 31 // d8-d15 (64 bytes) 32 // x19-x28 (80 bytes) 33 // x1 (8 bytes) 34 // padding (8 bytes) 35 stp x29, x30, [sp, #-176]! 36 mov x29, sp 37 38 // Saved callee-saved registers and |state|. 39 stp d8, d9, [sp, #16] 40 stp d10, d11, [sp, #32] 41 stp d12, d13, [sp, #48] 42 stp d14, d15, [sp, #64] 43 stp x19, x20, [sp, #80] 44 stp x21, x22, [sp, #96] 45 stp x23, x24, [sp, #112] 46 stp x25, x26, [sp, #128] 47 stp x27, x28, [sp, #144] 48 str x1, [sp, #160] 49 50 // Load registers from |state|, with the exception of x29. x29 is the 51 // frame pointer and also callee-saved, but AAPCS64 allows platforms to 52 // mandate that x29 always point to a frame. iOS64 does so, which means 53 // we cannot fill x29 with entropy without violating ABI rules 54 // ourselves. x29 is tested separately below. 55 ldp d8, d9, [x1], #16 56 ldp d10, d11, [x1], #16 57 ldp d12, d13, [x1], #16 58 ldp d14, d15, [x1], #16 59 ldp x19, x20, [x1], #16 60 ldp x21, x22, [x1], #16 61 ldp x23, x24, [x1], #16 62 ldp x25, x26, [x1], #16 63 ldp x27, x28, [x1], #16 64 65 // Move parameters into temporary registers. 66 mov x9, x0 67 mov x10, x2 68 mov x11, x3 69 70 // Load parameters into registers. 71 cbz x11, .Largs_done 72 ldr x0, [x10], #8 73 subs x11, x11, #1 74 b.eq .Largs_done 75 ldr x1, [x10], #8 76 subs x11, x11, #1 77 b.eq .Largs_done 78 ldr x2, [x10], #8 79 subs x11, x11, #1 80 b.eq .Largs_done 81 ldr x3, [x10], #8 82 subs x11, x11, #1 83 b.eq .Largs_done 84 ldr x4, [x10], #8 85 subs x11, x11, #1 86 b.eq .Largs_done 87 ldr x5, [x10], #8 88 subs x11, x11, #1 89 b.eq .Largs_done 90 ldr x6, [x10], #8 91 subs x11, x11, #1 92 b.eq .Largs_done 93 ldr x7, [x10], #8 94 95.Largs_done: 96 blr x9 97 98 // Reload |state| and store registers. 99 ldr x1, [sp, #160] 100 stp d8, d9, [x1], #16 101 stp d10, d11, [x1], #16 102 stp d12, d13, [x1], #16 103 stp d14, d15, [x1], #16 104 stp x19, x20, [x1], #16 105 stp x21, x22, [x1], #16 106 stp x23, x24, [x1], #16 107 stp x25, x26, [x1], #16 108 stp x27, x28, [x1], #16 109 110 // |func| is required to preserve x29, the frame pointer. We cannot load 111 // random values into x29 (see comment above), so compare it against the 112 // expected value and zero the field of |state| if corrupted. 113 mov x9, sp 114 cmp x29, x9 115 b.eq .Lx29_ok 116 str xzr, [x1] 117 118.Lx29_ok: 119 // Restore callee-saved registers. 120 ldp d8, d9, [sp, #16] 121 ldp d10, d11, [sp, #32] 122 ldp d12, d13, [sp, #48] 123 ldp d14, d15, [sp, #64] 124 ldp x19, x20, [sp, #80] 125 ldp x21, x22, [sp, #96] 126 ldp x23, x24, [sp, #112] 127 ldp x25, x26, [sp, #128] 128 ldp x27, x28, [sp, #144] 129 130 ldp x29, x30, [sp], #176 131 ret 132.size abi_test_trampoline,.-abi_test_trampoline 133.type abi_test_clobber_x0, %function 134.globl abi_test_clobber_x0 135.hidden abi_test_clobber_x0 136.align 4 137abi_test_clobber_x0: 138 mov x0, xzr 139 ret 140.size abi_test_clobber_x0,.-abi_test_clobber_x0 141.type abi_test_clobber_x1, %function 142.globl abi_test_clobber_x1 143.hidden abi_test_clobber_x1 144.align 4 145abi_test_clobber_x1: 146 mov x1, xzr 147 ret 148.size abi_test_clobber_x1,.-abi_test_clobber_x1 149.type abi_test_clobber_x2, %function 150.globl abi_test_clobber_x2 151.hidden abi_test_clobber_x2 152.align 4 153abi_test_clobber_x2: 154 mov x2, xzr 155 ret 156.size abi_test_clobber_x2,.-abi_test_clobber_x2 157.type abi_test_clobber_x3, %function 158.globl abi_test_clobber_x3 159.hidden abi_test_clobber_x3 160.align 4 161abi_test_clobber_x3: 162 mov x3, xzr 163 ret 164.size abi_test_clobber_x3,.-abi_test_clobber_x3 165.type abi_test_clobber_x4, %function 166.globl abi_test_clobber_x4 167.hidden abi_test_clobber_x4 168.align 4 169abi_test_clobber_x4: 170 mov x4, xzr 171 ret 172.size abi_test_clobber_x4,.-abi_test_clobber_x4 173.type abi_test_clobber_x5, %function 174.globl abi_test_clobber_x5 175.hidden abi_test_clobber_x5 176.align 4 177abi_test_clobber_x5: 178 mov x5, xzr 179 ret 180.size abi_test_clobber_x5,.-abi_test_clobber_x5 181.type abi_test_clobber_x6, %function 182.globl abi_test_clobber_x6 183.hidden abi_test_clobber_x6 184.align 4 185abi_test_clobber_x6: 186 mov x6, xzr 187 ret 188.size abi_test_clobber_x6,.-abi_test_clobber_x6 189.type abi_test_clobber_x7, %function 190.globl abi_test_clobber_x7 191.hidden abi_test_clobber_x7 192.align 4 193abi_test_clobber_x7: 194 mov x7, xzr 195 ret 196.size abi_test_clobber_x7,.-abi_test_clobber_x7 197.type abi_test_clobber_x8, %function 198.globl abi_test_clobber_x8 199.hidden abi_test_clobber_x8 200.align 4 201abi_test_clobber_x8: 202 mov x8, xzr 203 ret 204.size abi_test_clobber_x8,.-abi_test_clobber_x8 205.type abi_test_clobber_x9, %function 206.globl abi_test_clobber_x9 207.hidden abi_test_clobber_x9 208.align 4 209abi_test_clobber_x9: 210 mov x9, xzr 211 ret 212.size abi_test_clobber_x9,.-abi_test_clobber_x9 213.type abi_test_clobber_x10, %function 214.globl abi_test_clobber_x10 215.hidden abi_test_clobber_x10 216.align 4 217abi_test_clobber_x10: 218 mov x10, xzr 219 ret 220.size abi_test_clobber_x10,.-abi_test_clobber_x10 221.type abi_test_clobber_x11, %function 222.globl abi_test_clobber_x11 223.hidden abi_test_clobber_x11 224.align 4 225abi_test_clobber_x11: 226 mov x11, xzr 227 ret 228.size abi_test_clobber_x11,.-abi_test_clobber_x11 229.type abi_test_clobber_x12, %function 230.globl abi_test_clobber_x12 231.hidden abi_test_clobber_x12 232.align 4 233abi_test_clobber_x12: 234 mov x12, xzr 235 ret 236.size abi_test_clobber_x12,.-abi_test_clobber_x12 237.type abi_test_clobber_x13, %function 238.globl abi_test_clobber_x13 239.hidden abi_test_clobber_x13 240.align 4 241abi_test_clobber_x13: 242 mov x13, xzr 243 ret 244.size abi_test_clobber_x13,.-abi_test_clobber_x13 245.type abi_test_clobber_x14, %function 246.globl abi_test_clobber_x14 247.hidden abi_test_clobber_x14 248.align 4 249abi_test_clobber_x14: 250 mov x14, xzr 251 ret 252.size abi_test_clobber_x14,.-abi_test_clobber_x14 253.type abi_test_clobber_x15, %function 254.globl abi_test_clobber_x15 255.hidden abi_test_clobber_x15 256.align 4 257abi_test_clobber_x15: 258 mov x15, xzr 259 ret 260.size abi_test_clobber_x15,.-abi_test_clobber_x15 261.type abi_test_clobber_x16, %function 262.globl abi_test_clobber_x16 263.hidden abi_test_clobber_x16 264.align 4 265abi_test_clobber_x16: 266 mov x16, xzr 267 ret 268.size abi_test_clobber_x16,.-abi_test_clobber_x16 269.type abi_test_clobber_x17, %function 270.globl abi_test_clobber_x17 271.hidden abi_test_clobber_x17 272.align 4 273abi_test_clobber_x17: 274 mov x17, xzr 275 ret 276.size abi_test_clobber_x17,.-abi_test_clobber_x17 277.type abi_test_clobber_x19, %function 278.globl abi_test_clobber_x19 279.hidden abi_test_clobber_x19 280.align 4 281abi_test_clobber_x19: 282 mov x19, xzr 283 ret 284.size abi_test_clobber_x19,.-abi_test_clobber_x19 285.type abi_test_clobber_x20, %function 286.globl abi_test_clobber_x20 287.hidden abi_test_clobber_x20 288.align 4 289abi_test_clobber_x20: 290 mov x20, xzr 291 ret 292.size abi_test_clobber_x20,.-abi_test_clobber_x20 293.type abi_test_clobber_x21, %function 294.globl abi_test_clobber_x21 295.hidden abi_test_clobber_x21 296.align 4 297abi_test_clobber_x21: 298 mov x21, xzr 299 ret 300.size abi_test_clobber_x21,.-abi_test_clobber_x21 301.type abi_test_clobber_x22, %function 302.globl abi_test_clobber_x22 303.hidden abi_test_clobber_x22 304.align 4 305abi_test_clobber_x22: 306 mov x22, xzr 307 ret 308.size abi_test_clobber_x22,.-abi_test_clobber_x22 309.type abi_test_clobber_x23, %function 310.globl abi_test_clobber_x23 311.hidden abi_test_clobber_x23 312.align 4 313abi_test_clobber_x23: 314 mov x23, xzr 315 ret 316.size abi_test_clobber_x23,.-abi_test_clobber_x23 317.type abi_test_clobber_x24, %function 318.globl abi_test_clobber_x24 319.hidden abi_test_clobber_x24 320.align 4 321abi_test_clobber_x24: 322 mov x24, xzr 323 ret 324.size abi_test_clobber_x24,.-abi_test_clobber_x24 325.type abi_test_clobber_x25, %function 326.globl abi_test_clobber_x25 327.hidden abi_test_clobber_x25 328.align 4 329abi_test_clobber_x25: 330 mov x25, xzr 331 ret 332.size abi_test_clobber_x25,.-abi_test_clobber_x25 333.type abi_test_clobber_x26, %function 334.globl abi_test_clobber_x26 335.hidden abi_test_clobber_x26 336.align 4 337abi_test_clobber_x26: 338 mov x26, xzr 339 ret 340.size abi_test_clobber_x26,.-abi_test_clobber_x26 341.type abi_test_clobber_x27, %function 342.globl abi_test_clobber_x27 343.hidden abi_test_clobber_x27 344.align 4 345abi_test_clobber_x27: 346 mov x27, xzr 347 ret 348.size abi_test_clobber_x27,.-abi_test_clobber_x27 349.type abi_test_clobber_x28, %function 350.globl abi_test_clobber_x28 351.hidden abi_test_clobber_x28 352.align 4 353abi_test_clobber_x28: 354 mov x28, xzr 355 ret 356.size abi_test_clobber_x28,.-abi_test_clobber_x28 357.type abi_test_clobber_x29, %function 358.globl abi_test_clobber_x29 359.hidden abi_test_clobber_x29 360.align 4 361abi_test_clobber_x29: 362 mov x29, xzr 363 ret 364.size abi_test_clobber_x29,.-abi_test_clobber_x29 365.type abi_test_clobber_d0, %function 366.globl abi_test_clobber_d0 367.hidden abi_test_clobber_d0 368.align 4 369abi_test_clobber_d0: 370 fmov d0, xzr 371 ret 372.size abi_test_clobber_d0,.-abi_test_clobber_d0 373.type abi_test_clobber_d1, %function 374.globl abi_test_clobber_d1 375.hidden abi_test_clobber_d1 376.align 4 377abi_test_clobber_d1: 378 fmov d1, xzr 379 ret 380.size abi_test_clobber_d1,.-abi_test_clobber_d1 381.type abi_test_clobber_d2, %function 382.globl abi_test_clobber_d2 383.hidden abi_test_clobber_d2 384.align 4 385abi_test_clobber_d2: 386 fmov d2, xzr 387 ret 388.size abi_test_clobber_d2,.-abi_test_clobber_d2 389.type abi_test_clobber_d3, %function 390.globl abi_test_clobber_d3 391.hidden abi_test_clobber_d3 392.align 4 393abi_test_clobber_d3: 394 fmov d3, xzr 395 ret 396.size abi_test_clobber_d3,.-abi_test_clobber_d3 397.type abi_test_clobber_d4, %function 398.globl abi_test_clobber_d4 399.hidden abi_test_clobber_d4 400.align 4 401abi_test_clobber_d4: 402 fmov d4, xzr 403 ret 404.size abi_test_clobber_d4,.-abi_test_clobber_d4 405.type abi_test_clobber_d5, %function 406.globl abi_test_clobber_d5 407.hidden abi_test_clobber_d5 408.align 4 409abi_test_clobber_d5: 410 fmov d5, xzr 411 ret 412.size abi_test_clobber_d5,.-abi_test_clobber_d5 413.type abi_test_clobber_d6, %function 414.globl abi_test_clobber_d6 415.hidden abi_test_clobber_d6 416.align 4 417abi_test_clobber_d6: 418 fmov d6, xzr 419 ret 420.size abi_test_clobber_d6,.-abi_test_clobber_d6 421.type abi_test_clobber_d7, %function 422.globl abi_test_clobber_d7 423.hidden abi_test_clobber_d7 424.align 4 425abi_test_clobber_d7: 426 fmov d7, xzr 427 ret 428.size abi_test_clobber_d7,.-abi_test_clobber_d7 429.type abi_test_clobber_d8, %function 430.globl abi_test_clobber_d8 431.hidden abi_test_clobber_d8 432.align 4 433abi_test_clobber_d8: 434 fmov d8, xzr 435 ret 436.size abi_test_clobber_d8,.-abi_test_clobber_d8 437.type abi_test_clobber_d9, %function 438.globl abi_test_clobber_d9 439.hidden abi_test_clobber_d9 440.align 4 441abi_test_clobber_d9: 442 fmov d9, xzr 443 ret 444.size abi_test_clobber_d9,.-abi_test_clobber_d9 445.type abi_test_clobber_d10, %function 446.globl abi_test_clobber_d10 447.hidden abi_test_clobber_d10 448.align 4 449abi_test_clobber_d10: 450 fmov d10, xzr 451 ret 452.size abi_test_clobber_d10,.-abi_test_clobber_d10 453.type abi_test_clobber_d11, %function 454.globl abi_test_clobber_d11 455.hidden abi_test_clobber_d11 456.align 4 457abi_test_clobber_d11: 458 fmov d11, xzr 459 ret 460.size abi_test_clobber_d11,.-abi_test_clobber_d11 461.type abi_test_clobber_d12, %function 462.globl abi_test_clobber_d12 463.hidden abi_test_clobber_d12 464.align 4 465abi_test_clobber_d12: 466 fmov d12, xzr 467 ret 468.size abi_test_clobber_d12,.-abi_test_clobber_d12 469.type abi_test_clobber_d13, %function 470.globl abi_test_clobber_d13 471.hidden abi_test_clobber_d13 472.align 4 473abi_test_clobber_d13: 474 fmov d13, xzr 475 ret 476.size abi_test_clobber_d13,.-abi_test_clobber_d13 477.type abi_test_clobber_d14, %function 478.globl abi_test_clobber_d14 479.hidden abi_test_clobber_d14 480.align 4 481abi_test_clobber_d14: 482 fmov d14, xzr 483 ret 484.size abi_test_clobber_d14,.-abi_test_clobber_d14 485.type abi_test_clobber_d15, %function 486.globl abi_test_clobber_d15 487.hidden abi_test_clobber_d15 488.align 4 489abi_test_clobber_d15: 490 fmov d15, xzr 491 ret 492.size abi_test_clobber_d15,.-abi_test_clobber_d15 493.type abi_test_clobber_d16, %function 494.globl abi_test_clobber_d16 495.hidden abi_test_clobber_d16 496.align 4 497abi_test_clobber_d16: 498 fmov d16, xzr 499 ret 500.size abi_test_clobber_d16,.-abi_test_clobber_d16 501.type abi_test_clobber_d17, %function 502.globl abi_test_clobber_d17 503.hidden abi_test_clobber_d17 504.align 4 505abi_test_clobber_d17: 506 fmov d17, xzr 507 ret 508.size abi_test_clobber_d17,.-abi_test_clobber_d17 509.type abi_test_clobber_d18, %function 510.globl abi_test_clobber_d18 511.hidden abi_test_clobber_d18 512.align 4 513abi_test_clobber_d18: 514 fmov d18, xzr 515 ret 516.size abi_test_clobber_d18,.-abi_test_clobber_d18 517.type abi_test_clobber_d19, %function 518.globl abi_test_clobber_d19 519.hidden abi_test_clobber_d19 520.align 4 521abi_test_clobber_d19: 522 fmov d19, xzr 523 ret 524.size abi_test_clobber_d19,.-abi_test_clobber_d19 525.type abi_test_clobber_d20, %function 526.globl abi_test_clobber_d20 527.hidden abi_test_clobber_d20 528.align 4 529abi_test_clobber_d20: 530 fmov d20, xzr 531 ret 532.size abi_test_clobber_d20,.-abi_test_clobber_d20 533.type abi_test_clobber_d21, %function 534.globl abi_test_clobber_d21 535.hidden abi_test_clobber_d21 536.align 4 537abi_test_clobber_d21: 538 fmov d21, xzr 539 ret 540.size abi_test_clobber_d21,.-abi_test_clobber_d21 541.type abi_test_clobber_d22, %function 542.globl abi_test_clobber_d22 543.hidden abi_test_clobber_d22 544.align 4 545abi_test_clobber_d22: 546 fmov d22, xzr 547 ret 548.size abi_test_clobber_d22,.-abi_test_clobber_d22 549.type abi_test_clobber_d23, %function 550.globl abi_test_clobber_d23 551.hidden abi_test_clobber_d23 552.align 4 553abi_test_clobber_d23: 554 fmov d23, xzr 555 ret 556.size abi_test_clobber_d23,.-abi_test_clobber_d23 557.type abi_test_clobber_d24, %function 558.globl abi_test_clobber_d24 559.hidden abi_test_clobber_d24 560.align 4 561abi_test_clobber_d24: 562 fmov d24, xzr 563 ret 564.size abi_test_clobber_d24,.-abi_test_clobber_d24 565.type abi_test_clobber_d25, %function 566.globl abi_test_clobber_d25 567.hidden abi_test_clobber_d25 568.align 4 569abi_test_clobber_d25: 570 fmov d25, xzr 571 ret 572.size abi_test_clobber_d25,.-abi_test_clobber_d25 573.type abi_test_clobber_d26, %function 574.globl abi_test_clobber_d26 575.hidden abi_test_clobber_d26 576.align 4 577abi_test_clobber_d26: 578 fmov d26, xzr 579 ret 580.size abi_test_clobber_d26,.-abi_test_clobber_d26 581.type abi_test_clobber_d27, %function 582.globl abi_test_clobber_d27 583.hidden abi_test_clobber_d27 584.align 4 585abi_test_clobber_d27: 586 fmov d27, xzr 587 ret 588.size abi_test_clobber_d27,.-abi_test_clobber_d27 589.type abi_test_clobber_d28, %function 590.globl abi_test_clobber_d28 591.hidden abi_test_clobber_d28 592.align 4 593abi_test_clobber_d28: 594 fmov d28, xzr 595 ret 596.size abi_test_clobber_d28,.-abi_test_clobber_d28 597.type abi_test_clobber_d29, %function 598.globl abi_test_clobber_d29 599.hidden abi_test_clobber_d29 600.align 4 601abi_test_clobber_d29: 602 fmov d29, xzr 603 ret 604.size abi_test_clobber_d29,.-abi_test_clobber_d29 605.type abi_test_clobber_d30, %function 606.globl abi_test_clobber_d30 607.hidden abi_test_clobber_d30 608.align 4 609abi_test_clobber_d30: 610 fmov d30, xzr 611 ret 612.size abi_test_clobber_d30,.-abi_test_clobber_d30 613.type abi_test_clobber_d31, %function 614.globl abi_test_clobber_d31 615.hidden abi_test_clobber_d31 616.align 4 617abi_test_clobber_d31: 618 fmov d31, xzr 619 ret 620.size abi_test_clobber_d31,.-abi_test_clobber_d31 621.type abi_test_clobber_v8_upper, %function 622.globl abi_test_clobber_v8_upper 623.hidden abi_test_clobber_v8_upper 624.align 4 625abi_test_clobber_v8_upper: 626 fmov v8.d[1], xzr 627 ret 628.size abi_test_clobber_v8_upper,.-abi_test_clobber_v8_upper 629.type abi_test_clobber_v9_upper, %function 630.globl abi_test_clobber_v9_upper 631.hidden abi_test_clobber_v9_upper 632.align 4 633abi_test_clobber_v9_upper: 634 fmov v9.d[1], xzr 635 ret 636.size abi_test_clobber_v9_upper,.-abi_test_clobber_v9_upper 637.type abi_test_clobber_v10_upper, %function 638.globl abi_test_clobber_v10_upper 639.hidden abi_test_clobber_v10_upper 640.align 4 641abi_test_clobber_v10_upper: 642 fmov v10.d[1], xzr 643 ret 644.size abi_test_clobber_v10_upper,.-abi_test_clobber_v10_upper 645.type abi_test_clobber_v11_upper, %function 646.globl abi_test_clobber_v11_upper 647.hidden abi_test_clobber_v11_upper 648.align 4 649abi_test_clobber_v11_upper: 650 fmov v11.d[1], xzr 651 ret 652.size abi_test_clobber_v11_upper,.-abi_test_clobber_v11_upper 653.type abi_test_clobber_v12_upper, %function 654.globl abi_test_clobber_v12_upper 655.hidden abi_test_clobber_v12_upper 656.align 4 657abi_test_clobber_v12_upper: 658 fmov v12.d[1], xzr 659 ret 660.size abi_test_clobber_v12_upper,.-abi_test_clobber_v12_upper 661.type abi_test_clobber_v13_upper, %function 662.globl abi_test_clobber_v13_upper 663.hidden abi_test_clobber_v13_upper 664.align 4 665abi_test_clobber_v13_upper: 666 fmov v13.d[1], xzr 667 ret 668.size abi_test_clobber_v13_upper,.-abi_test_clobber_v13_upper 669.type abi_test_clobber_v14_upper, %function 670.globl abi_test_clobber_v14_upper 671.hidden abi_test_clobber_v14_upper 672.align 4 673abi_test_clobber_v14_upper: 674 fmov v14.d[1], xzr 675 ret 676.size abi_test_clobber_v14_upper,.-abi_test_clobber_v14_upper 677.type abi_test_clobber_v15_upper, %function 678.globl abi_test_clobber_v15_upper 679.hidden abi_test_clobber_v15_upper 680.align 4 681abi_test_clobber_v15_upper: 682 fmov v15.d[1], xzr 683 ret 684.size abi_test_clobber_v15_upper,.-abi_test_clobber_v15_upper 685#endif 686#endif // !OPENSSL_NO_ASM 687