/* Copyright (C) 2005-2009 Clozure Associates and contributors */ /* This file is part of Clozure CL. */ /* Clozure CL is licensed under the terms of the Lisp Lesser GNU Public */ /* License , known as the LLGPL and distributed with Clozure CL as the */ /* file "LICENSE". The LLGPL consists of a preamble and the LGPL, */ /* which is distributed with Clozure CL as the file "LGPL". Where these */ /* conflict, the preamble takes precedence. */ /* Clozure CL is referenced in the preamble as the "LIBRARY." */ /* The LLGPL is also available online at */ /* http://opensource.franz.com/preamble.html */ include(lisp.s) _beginfile .align 2 define(`_spentry',`ifdef(`__func_name',`_endfn',`') .p2align 3 _exportfn(_SP$1) .line __line__ ') define(`_endsubp',` _endfn(_SP$1) # __line__ ') define(`jump_builtin',` ref_nrs_value(builtin_functions,%fname) set_nargs($2) vrefr(%fname,%fname,$1) jump_fname() ') _spentry(bad_funcall) Xspentry_start: .globl C(bad_funcall) __(tra(C(bad_funcall))) __(uuo_error_not_callable) _endsubp(bad_funcall) /* %arg_z has overflowed by one bit. Make a bignum with 2 (32-bit) digits. */ _spentry(fix_overflow) C(fix_one_bit_overflow): __(movq $two_digit_bignum_header,%imm0) __(Misc_Alloc_Fixed(`',aligned_bignum_size(2))) __(unbox_fixnum(%arg_z,%imm0)) __(movq $0xe000000000000000,%imm1) __(mov %temp0,%arg_z) __(xorq %imm1,%imm0) __(movq %imm0,misc_data_offset(%arg_z)) __(ret) _endsubp(fix_overflow) /* Make a lisp integer (fixnum or two-digit bignum) from the signed */ /* 64-bit value in %imm0. */ _spentry(makes64) __(movq %imm0,%imm1) __(shlq $fixnumshift,%imm1) __(movq %imm1,%arg_z) __(sarq $fixnumshift,%imm1) __(cmpq %imm1,%imm0) __(jz 0f) __(movd %imm0,%mm0) __(movq $two_digit_bignum_header,%imm0) __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(2))) __(movq %mm0,misc_data_offset(%arg_z)) 0: __(repret) _endsubp(makes64) /* %imm1:%imm0 constitute a signed integer, almost certainly a bignum. */ /* Make a lisp integer out of those 128 bits .. */ _startfn(C(makes128)) /* We're likely to have to make a bignum out of the integer in %imm1 and */ /* %imm0. We'll need to use %imm0 and %imm1 to cons the bignum, and */ /* will need to do some arithmetic (determining significant bigits) */ /* on %imm0 and %imm1 in order to know how large that bignum needs to be. */ /* Cache %imm0 and %imm1 in %mm0 and %mm1. */ __(movd %imm0,%mm0) __(movd %imm1,%mm1) /* If %imm1 is just a sign extension of %imm0, make a 64-bit signed integer. */ __(sarq $63,%imm0) __(cmpq %imm0,%imm1) __(movd %mm0,%imm0) __(je _SPmakes64) /* Otherwise, if the high 32 bits of %imm1 are a sign-extension of the */ /* low 32 bits of %imm1, make a 3-digit bignum. If the upper 32 bits */ /* of %imm1 are significant, make a 4 digit bignum */ __(movq %imm1,%imm0) __(shlq $32,%imm0) __(sarq $32,%imm0) __(cmpq %imm0,%imm1) __(jz 3f) __(mov $four_digit_bignum_header,%imm0) __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(4))) __(movq %mm0,misc_data_offset(%arg_z)) __(movq %mm1,misc_data_offset+8(%arg_z)) __(ret) 3: __(mov $three_digit_bignum_header,%imm0) __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(3))) __(movq %mm0,misc_data_offset(%arg_z)) __(movd %mm1,misc_data_offset+8(%arg_z)) __(ret) _endfn /* %imm1:%imm0 constitute an unsigned integer, almost certainly a bignum. */ /* Make a lisp integer out of those 128 bits .. */ _startfn(C(makeu128)) /* We're likely to have to make a bignum out of the integer in %imm1 and */ /* %imm0. We'll need to use %imm0 and %imm1 to cons the bignum, and */ /* will need to do some arithmetic (determining significant bigits) */ /* on %imm0 and %imm1 in order to know how large that bignum needs to be. */ /* Cache %imm0 and %imm1 in %mm0 and %mm1. */ /* If the high word is 0, make an unsigned-byte 64 ... */ __(testq %imm1,%imm1) __(jz _SPmakeu64) __(movd %imm0,%mm0) __(movd %imm1,%mm1) __(js 5f) /* Sign bit set in %imm1. Need 5 digits */ __(bsrq %imm1,%imm0) __(rcmpb(%imm0_b,$31)) __(jae 4f) /* Some high bits in %imm1. Need 4 digits */ __(testl %imm1_l,%imm1_l) __(movd %mm0,%imm0) __(jz _SPmakeu64) /* Need 3 digits */ __(movq $three_digit_bignum_header,%imm0) __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(3))) __(movq %mm0,misc_data_offset(%arg_z)) __(movd %mm1,misc_data_offset+8(%arg_z)) __(ret) 4: __(movq $four_digit_bignum_header,%imm0) __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(4))) __(jmp 6f) 5: __(movq $five_digit_bignum_header,%imm0) __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(5))) 6: __(movq %mm0,misc_data_offset(%arg_z)) __(movq %mm0,misc_data_offset+8(%arg_z)) __(ret) _endfn _spentry(misc_ref) __(movb $tagmask,%imm0_b) __(andb %arg_y_b,%imm0_b) __(cmpb $tag_misc,%imm0_b) __(jne 0f) __(testb $fixnummask,%arg_z_b) __(jne 1f) __(movq misc_header_offset(%arg_y),%imm0) __(xorb %imm0_b,%imm0_b) __(shrq $num_subtag_bits-fixnumshift,%imm0) __(cmpq %imm0,%arg_z) __(jae 2f) __(movb misc_subtag_offset(%arg_y),%imm1_b) __(jmp C(misc_ref_common)) 0: __(uuo_error_reg_not_tag(Rarg_y,tag_misc)) 1: __(uuo_error_reg_not_fixnum(Rarg_z)) 2: __(uuo_error_vector_bounds(Rarg_z,Rarg_y)) _endsubp(misc_ref) /* %imm1.b = subtag, %arg_y = uvector, %arg_z = index. */ /* Bounds/type-checking done in caller */ _startfn(C(misc_ref_common)) __(movzbl %imm1_b,%imm1_l) __(lea local_label(misc_ref_jmp)(%rip),%imm2) __(jmp *(%imm2,%imm1,8)) .p2align 3 local_label(misc_ref_jmp): /* 00-0f */ .quad local_label(misc_ref_invalid) /* 00 even_fixnum */ .quad local_label(misc_ref_invalid) /* 01 imm_1 */ .quad local_label(misc_ref_invalid) /* 02 imm_2 */ .quad local_label(misc_ref_invalid) /* 03 cons */ .quad local_label(misc_ref_invalid) /* 04 tra_0 */ .quad local_label(misc_ref_invalid) /* 05 nodeheader_0 */ .quad local_label(misc_ref_invalid) /* 06 nodeheader_1 */ .quad local_label(misc_ref_invalid) /* 07 immheader_0 */ .quad local_label(misc_ref_invalid) /* 08 odd_fixnum */ .quad local_label(misc_ref_invalid) /* 09 immheader_1 */ .quad local_label(misc_ref_invalid) /* 0a immheader_2 */ .quad local_label(misc_ref_invalid) /* 0b nil */ .quad local_label(misc_ref_invalid) /* 0c tra_1 */ .quad local_label(misc_ref_invalid) /* 0d misc */ .quad local_label(misc_ref_invalid) /* 0e symbol */ .quad local_label(misc_ref_invalid) /* 0f function */ /* 10-1f */ .quad local_label(misc_ref_invalid) /* 10 even_fixnum */ .quad local_label(misc_ref_invalid) /* 11 imm_1 */ .quad local_label(misc_ref_invalid) /* 12 imm_2 */ .quad local_label(misc_ref_invalid) /* 13 cons */ .quad local_label(misc_ref_invalid) /* 14 tra_0 */ .quad local_label(misc_ref_node) /* 15 symbol_vector */ .quad local_label(misc_ref_node) /* 16 ratio */ .quad local_label(misc_ref_invalid) /* 17 immheader_0 */ .quad local_label(misc_ref_invalid) /* 18 odd_fixnum */ .quad local_label(misc_ref_u32) /* 19 bignum */ .quad local_label(misc_ref_u64) /* 1a macptr */ .quad local_label(misc_ref_invalid) /* 1b nil */ .quad local_label(misc_ref_invalid) /* 1c tra_1 */ .quad local_label(misc_ref_invalid) /* 1d misc */ .quad local_label(misc_ref_invalid) /* 1e symbol */ .quad local_label(misc_ref_invalid) /* 1f function */ /* 20-2f */ .quad local_label(misc_ref_invalid) /* 20 even_fixnum */ .quad local_label(misc_ref_invalid) /* 21 imm_1 */ .quad local_label(misc_ref_invalid) /* 22 imm_2 */ .quad local_label(misc_ref_invalid) /* 23 cons */ .quad local_label(misc_ref_invalid) /* 24 tra_0 */ .quad local_label(misc_ref_node) /* 25 catch_frame */ .quad local_label(misc_ref_node) /* 26 complex */ .quad local_label(misc_ref_invalid) /* 27 immheader_0 */ .quad local_label(misc_ref_invalid) /* 28 odd_fixnum */ .quad local_label(misc_ref_u32) /* 29 double_float */ .quad local_label(misc_ref_u64) /* 2a dead_macptr */ .quad local_label(misc_ref_invalid) /* 2b nil */ .quad local_label(misc_ref_invalid) /* 2c tra_1 */ .quad local_label(misc_ref_invalid) /* 2d misc */ .quad local_label(misc_ref_invalid) /* 2e symbol */ .quad local_label(misc_ref_invalid) /* 2f function */ /* 30-3f */ .quad local_label(misc_ref_invalid) /* 30 even_fixnum */ .quad local_label(misc_ref_invalid) /* 31 imm_1 */ .quad local_label(misc_ref_invalid) /* 32 imm_2 */ .quad local_label(misc_ref_invalid) /* 33 cons */ .quad local_label(misc_ref_invalid) /* 34 tra_0 */ .quad local_label(misc_ref_node) /* 35 hash_vector */ .quad local_label(misc_ref_node) /* 36 struct */ .quad local_label(misc_ref_invalid) /* 37 immheader_0 */ .quad local_label(misc_ref_invalid) /* 38 odd_fixnum */ .quad local_label(misc_ref_u32) /* 39 xcode_vector */ .quad local_label(misc_ref_invalid) /* 3a immheader_2 */ .quad local_label(misc_ref_invalid) /* 3b nil */ .quad local_label(misc_ref_invalid) /* 3c tra_1 */ .quad local_label(misc_ref_invalid) /* 3d misc */ .quad local_label(misc_ref_invalid) /* 3e symbol */ .quad local_label(misc_ref_invalid) /* 3f function */ /* 40-4f */ .quad local_label(misc_ref_invalid) /* 40 even_fixnum */ .quad local_label(misc_ref_invalid) /* 41 imm_1 */ .quad local_label(misc_ref_invalid) /* 42 imm_2 */ .quad local_label(misc_ref_invalid) /* 43 cons */ .quad local_label(misc_ref_invalid) /* 44 tra_0 */ .quad local_label(misc_ref_node) /* 45 pool */ .quad local_label(misc_ref_node) /* 46 istruct */ .quad local_label(misc_ref_invalid) /* 47 immheader_0 */ .quad local_label(misc_ref_invalid) /* 48 odd_fixnum */ .quad local_label(misc_ref_invalid) /* 49 immheader_1 */ .quad local_label(misc_ref_invalid) /* 4a immheader_2 */ .quad local_label(misc_ref_invalid) /* 4b nil */ .quad local_label(misc_ref_invalid) /* 4c tra_1 */ .quad local_label(misc_ref_invalid) /* 4d misc */ .quad local_label(misc_ref_invalid) /* 4e symbol */ .quad local_label(misc_ref_invalid) /* 4f function */ /* 50-5f */ .quad local_label(misc_ref_invalid) /* 50 even_fixnum */ .quad local_label(misc_ref_invalid) /* 51 imm_1 */ .quad local_label(misc_ref_invalid) /* 52 imm_2 */ .quad local_label(misc_ref_invalid) /* 53 cons */ .quad local_label(misc_ref_invalid) /* 54 tra_0 */ .quad local_label(misc_ref_node) /* 55 weak */ .quad local_label(misc_ref_node) /* 56 value_cell */ .quad local_label(misc_ref_invalid) /* 57 immheader_0 */ .quad local_label(misc_ref_invalid) /* 58 odd_fixnum */ .quad local_label(misc_ref_invalid) /* 59 immheader_1 */ .quad local_label(misc_ref_invalid) /* 5a immheader_2 */ .quad local_label(misc_ref_invalid) /* 5b nil */ .quad local_label(misc_ref_invalid) /* 5c tra_1 */ .quad local_label(misc_ref_invalid) /* 5d misc */ .quad local_label(misc_ref_invalid) /* 5e symbol */ .quad local_label(misc_ref_invalid) /* 5f function */ /* 60-6f */ .quad local_label(misc_ref_invalid) /* 60 even_fixnum */ .quad local_label(misc_ref_invalid) /* 61 imm_1 */ .quad local_label(misc_ref_invalid) /* 62 imm_2 */ .quad local_label(misc_ref_invalid) /* 63 cons */ .quad local_label(misc_ref_invalid) /* 64 tra_0 */ .quad local_label(misc_ref_node) /* 65 package */ .quad local_label(misc_ref_node) /* 66 xfunction */ .quad local_label(misc_ref_invalid) /* 67 immheader_0 */ .quad local_label(misc_ref_invalid) /* 68 odd_fixnum */ .quad local_label(misc_ref_invalid) /* 69 immheader_1 */ .quad local_label(misc_ref_invalid) /* 6a immheader_2 */ .quad local_label(misc_ref_invalid) /* 6b nil */ .quad local_label(misc_ref_invalid) /* 6c tra_1 */ .quad local_label(misc_ref_invalid) /* 6d misc */ .quad local_label(misc_ref_invalid) /* 6e symbol */ .quad local_label(misc_ref_invalid) /* 6f function */ /* 70-7f */ .quad local_label(misc_ref_invalid) /* 70 even_fixnum */ .quad local_label(misc_ref_invalid) /* 71 imm_1 */ .quad local_label(misc_ref_invalid) /* 72 imm_2 */ .quad local_label(misc_ref_invalid) /* 73 cons */ .quad local_label(misc_ref_invalid) /* 74 tra_0 */ .quad local_label(misc_ref_node) /* 75 slot_vector */ .quad local_label(misc_ref_node) /* 76 lock */ .quad local_label(misc_ref_invalid) /* 77 immheader_0 */ .quad local_label(misc_ref_invalid) /* 78 odd_fixnum */ .quad local_label(misc_ref_invalid) /* 79 immheader_1 */ .quad local_label(misc_ref_invalid) /* 7a immheader_2 */ .quad local_label(misc_ref_invalid) /* 7b nil */ .quad local_label(misc_ref_invalid) /* 7c tra_1 */ .quad local_label(misc_ref_invalid) /* 7d misc */ .quad local_label(misc_ref_invalid) /* 7e symbol */ .quad local_label(misc_ref_invalid) /* 7f function */ /* 80-8f */ .quad local_label(misc_ref_invalid) /* 80 even_fixnum */ .quad local_label(misc_ref_invalid) /* 81 imm_1 */ .quad local_label(misc_ref_invalid) /* 82 imm_2 */ .quad local_label(misc_ref_invalid) /* 83 cons */ .quad local_label(misc_ref_invalid) /* 84 tra_0 */ .quad local_label(misc_ref_node) /* 85 lisp_thread */ .quad local_label(misc_ref_node) /* 86 instance */ .quad local_label(misc_ref_invalid) /* 87 immheader_0 */ .quad local_label(misc_ref_invalid) /* 88 odd_fixnum */ .quad local_label(misc_ref_invalid) /* 89 immheader_1 */ .quad local_label(misc_ref_invalid) /* 8a immheader_2 */ .quad local_label(misc_ref_invalid) /* 8b nil */ .quad local_label(misc_ref_invalid) /* 8c tra_1 */ .quad local_label(misc_ref_invalid) /* 8d misc */ .quad local_label(misc_ref_invalid) /* 8e symbol */ .quad local_label(misc_ref_invalid) /* 8f function */ /* 90-9f */ .quad local_label(misc_ref_invalid) /* 90 even_fixnum */ .quad local_label(misc_ref_invalid) /* 91 imm_1 */ .quad local_label(misc_ref_invalid) /* 92 imm_2 */ .quad local_label(misc_ref_invalid) /* 93 cons */ .quad local_label(misc_ref_invalid) /* 94 tra_0 */ .quad local_label(misc_ref_function) /* 95 function_vector */ .quad local_label(misc_ref_invalid) /* 96 nodeheader_1 */ .quad local_label(misc_ref_invalid) /* 97 immheader_0 */ .quad local_label(misc_ref_invalid) /* 98 odd_fixnum */ .quad local_label(misc_ref_invalid) /* 99 immheader_1 */ .quad local_label(misc_ref_invalid) /* 9a immheader_2 */ .quad local_label(misc_ref_invalid) /* 9b nil */ .quad local_label(misc_ref_invalid) /* 9c tra_1 */ .quad local_label(misc_ref_invalid) /* 9d misc */ .quad local_label(misc_ref_invalid) /* 9e symbol */ .quad local_label(misc_ref_invalid) /* 9f function */ /* a0-af */ .quad local_label(misc_ref_invalid) /* a0 even_fixnum */ .quad local_label(misc_ref_invalid) /* a1 imm_1 */ .quad local_label(misc_ref_invalid) /* a2 imm_2 */ .quad local_label(misc_ref_invalid) /* a3 cons */ .quad local_label(misc_ref_invalid) /* a4 tra_0 */ .quad local_label(misc_ref_node) /* a5 arrayH */ .quad local_label(misc_ref_node) /* a6 vectorH */ .quad local_label(misc_ref_s16) /* a7 s16 */ .quad local_label(misc_ref_invalid) /* a8 odd_fixnum */ .quad local_label(misc_ref_invalid) /* a9 immheader_1 */ .quad local_label(misc_ref_invalid) /* aa immheader_2 */ .quad local_label(misc_ref_invalid) /* ab nil */ .quad local_label(misc_ref_invalid) /* ac tra_1 */ .quad local_label(misc_ref_invalid) /* ad misc */ .quad local_label(misc_ref_invalid) /* ae symbol */ .quad local_label(misc_ref_invalid) /* af function */ /* b0-bf */ .quad local_label(misc_ref_invalid) /* b0 even_fixnum */ .quad local_label(misc_ref_invalid) /* b1 imm_1 */ .quad local_label(misc_ref_invalid) /* b2 imm_2 */ .quad local_label(misc_ref_invalid) /* b3 cons */ .quad local_label(misc_ref_invalid) /* b4 tra_0 */ .quad local_label(misc_ref_invalid) /* b5 nodeheader_0 */ .quad local_label(misc_ref_node) /* b6 simple_vector */ .quad local_label(misc_ref_u16) /* b7 immheader_0 */ .quad local_label(misc_ref_invalid) /* b8 odd_fixnum */ .quad local_label(misc_ref_invalid) /* b9 immheader_1 */ .quad local_label(misc_ref_invalid) /* ba immheader_2 */ .quad local_label(misc_ref_invalid) /* bb nil */ .quad local_label(misc_ref_invalid) /* bc tra_1 */ .quad local_label(misc_ref_invalid) /* bd misc */ .quad local_label(misc_ref_invalid) /* be symbol */ .quad local_label(misc_ref_invalid) /* bf function */ /* c0-cf */ .quad local_label(misc_ref_invalid) /* c0 even_fixnum */ .quad local_label(misc_ref_invalid) /* c1 imm_1 */ .quad local_label(misc_ref_invalid) /* c2 imm_2 */ .quad local_label(misc_ref_invalid) /* c3 cons */ .quad local_label(misc_ref_invalid) /* c4 tra_0 */ .quad local_label(misc_ref_invalid) /* c5 nodeheader_0 */ .quad local_label(misc_ref_invalid) /* c6 nodeheader_1 */ .quad local_label(misc_ref_string) /* c7 simple_base_string */ .quad local_label(misc_ref_invalid) /* c8 odd_fixnum */ .quad local_label(misc_ref_new_string) /* c9 new_string_1 */ .quad local_label(misc_ref_fixnum_vector) /* ca fixnum_vector */ .quad local_label(misc_ref_invalid) /* cb nil */ .quad local_label(misc_ref_invalid) /* cc tra_1 */ .quad local_label(misc_ref_invalid) /* cd misc */ .quad local_label(misc_ref_invalid) /* ce symbol */ .quad local_label(misc_ref_invalid) /* cf function */ /* d0-df */ .quad local_label(misc_ref_invalid) /* d0 even_fixnum */ .quad local_label(misc_ref_invalid) /* d1 imm_1 */ .quad local_label(misc_ref_invalid) /* d2 imm_2 */ .quad local_label(misc_ref_invalid) /* d3 cons */ .quad local_label(misc_ref_invalid) /* d4 tra_0 */ .quad local_label(misc_ref_invalid) /* d5 nodeheader_0 */ .quad local_label(misc_ref_invalid) /* d6 nodeheader_1 */ .quad local_label(misc_ref_s8) /* d7 s8 */ .quad local_label(misc_ref_invalid) /* d8 odd_fixnum */ .quad local_label(misc_ref_s32) /* d9 s32 */ .quad local_label(misc_ref_s64) /* da s64 */ .quad local_label(misc_ref_invalid) /* db nil */ .quad local_label(misc_ref_invalid) /* dc tra_1 */ .quad local_label(misc_ref_invalid) /* dd misc */ .quad local_label(misc_ref_invalid) /* de symbol */ .quad local_label(misc_ref_invalid) /* df function */ /* e0-ef */ .quad local_label(misc_ref_invalid) /* e0 even_fixnum */ .quad local_label(misc_ref_invalid) /* e1 imm_1 */ .quad local_label(misc_ref_invalid) /* e2 imm_2 */ .quad local_label(misc_ref_invalid) /* e3 cons */ .quad local_label(misc_ref_invalid) /* e4 tra_0 */ .quad local_label(misc_ref_invalid) /* e5 nodeheader_0 */ .quad local_label(misc_ref_invalid) /* e6 nodeheader_1 */ .quad local_label(misc_ref_u8) /* e7 u8 */ .quad local_label(misc_ref_invalid) /* e8 odd_fixnum */ .quad local_label(misc_ref_u32) /* e9 u32 */ .quad local_label(misc_ref_u64) /* ea u64 */ .quad local_label(misc_ref_invalid) /* eb nil */ .quad local_label(misc_ref_invalid) /* ec tra_1 */ .quad local_label(misc_ref_invalid) /* ed misc */ .quad local_label(misc_ref_invalid) /* ee symbol */ .quad local_label(misc_ref_invalid) /* ef function */ /* f0-ff */ .quad local_label(misc_ref_invalid) /* f0 even_fixnum */ .quad local_label(misc_ref_invalid) /* f1 imm_1 */ .quad local_label(misc_ref_invalid) /* f2 imm_2 */ .quad local_label(misc_ref_invalid) /* f3 cons */ .quad local_label(misc_ref_invalid) /* f4 tra_0 */ .quad local_label(misc_ref_invalid) /* f5 nodeheader_0 */ .quad local_label(misc_ref_invalid) /* f6 nodeheader_1 */ .quad local_label(misc_ref_bit_vector) /* f7 bitvector */ .quad local_label(misc_ref_invalid) /* f8 odd_fixnum */ .quad local_label(misc_ref_single_float_vector) /* f9 single_float */ .quad local_label(misc_ref_double_float_vector) /* fa double_float */ .quad local_label(misc_ref_invalid) /* fb nil */ .quad local_label(misc_ref_invalid) /* fc tra_1 */ .quad local_label(misc_ref_invalid) /* fd misc */ .quad local_label(misc_ref_invalid) /* fe symbol */ .quad local_label(misc_ref_invalid) /* ff function */ /* Node vector. Functions are funny: the first N words */ /* are treated as (UNSIGNED-BYTE 64), where N is the low */ /* 32 bits of the first word. */ local_label(misc_ref_function): __(movl misc_data_offset(%arg_y),%imm0_l) __(shl $fixnumshift,%imm0) __(rcmpq(%arg_z,%imm0)) __(jb local_label(misc_ref_u64)) local_label(misc_ref_node): __(movq misc_data_offset(%arg_y,%arg_z),%arg_z) __(ret) local_label(misc_ref_u64): __(movq misc_data_offset(%arg_y,%arg_z),%imm0) __(jmp _SPmakeu64) local_label(misc_ref_double_float_vector): __(movsd misc_data_offset(%arg_y,%arg_z),%fp1) __(movq $double_float_header,%imm0) __(Misc_Alloc_Fixed(%arg_z,double_float.size)) __(movsd %fp1,double_float.value(%arg_z)) __(ret) local_label(misc_ref_fixnum_vector): __(movq misc_data_offset(%arg_y,%arg_z),%imm0) __(box_fixnum(%imm0,%arg_z)) __(ret) local_label(misc_ref_s64): __(movq misc_data_offset(%arg_y,%arg_z),%imm0) __(jmp _SPmakes64) local_label(misc_ref_u32): __(movq %arg_z,%imm0) __(shr $1,%imm0) __(movl misc_data_offset(%arg_y,%imm0),%imm0_l) __(box_fixnum(%imm0,%arg_z)) __(ret) local_label(misc_ref_s32): __(movq %arg_z,%imm0) __(shr $1,%imm0) __(movslq misc_data_offset(%arg_y,%imm0),%imm0) __(box_fixnum(%imm0,%arg_z)) __(ret) local_label(misc_ref_single_float_vector): __(movq %arg_z,%imm0) __(shr $1,%imm0) __(movsd misc_data_offset(%arg_y,%imm0),%fp1) __(movd %fp1,%imm0_l) __(shl $32,%imm0) __(lea subtag_single_float(%imm0),%arg_z) __(ret) local_label(misc_ref_u8): __(movq %arg_z,%imm0) __(shr $3,%imm0) __(movzbl misc_data_offset(%arg_y,%imm0),%imm0_l) __(box_fixnum(%imm0,%arg_z)) __(ret) local_label(misc_ref_s8): __(movq %arg_z,%imm0) __(shr $3,%imm0) __(movsbq misc_data_offset(%arg_y,%imm0),%imm0) __(box_fixnum(%imm0,%arg_z)) __(ret) local_label(misc_ref_string): __(movq %arg_z,%imm0) __(shr $3,%imm0) __(movzbl misc_data_offset(%arg_y,%imm0),%imm0_l) __(shlq $charcode_shift,%imm0) __(leaq subtag_character(%imm0),%arg_z) __(ret) local_label(misc_ref_new_string): __(movq %arg_z,%imm0) __(shr $1,%imm0) __(movl misc_data_offset(%arg_y,%imm0),%imm0_l) __(shlq $charcode_shift,%imm0) __(leaq subtag_character(%imm0),%arg_z) __(ret) local_label(misc_ref_u16): __(movq %arg_z,%imm0) __(shrq $2,%imm0) __(movzwl misc_data_offset(%arg_y,%imm0),%imm0_l) __(box_fixnum(%imm0,%arg_z)) __(ret) local_label(misc_ref_s16): __(movq %arg_z,%imm0) __(shrq $2,%imm0) __(movswq misc_data_offset(%arg_y,%imm0),%imm0) __(box_fixnum(%imm0,%arg_z)) __(ret) local_label(misc_ref_bit_vector): __(unbox_fixnum(%arg_z,%imm0)) __(btq %imm0,misc_data_offset(%arg_y)) __(setc %imm0_b) __(movzbl %imm0_b,%imm0_l) __(imull $fixnumone,%imm0_l,%arg_z_l) __(ret) local_label(misc_ref_invalid): __(movq $XBADVEC,%arg_x) __(set_nargs(3)) __(jmp _SPksignalerr) _endfn(C(misc_ref_common)) /* like misc_ref, only the boxed subtag is in arg_x. */ _spentry(subtag_misc_ref) __(movb $tagmask,%imm0_b) __(andb %arg_y_b,%imm0_b) __(cmpb $tag_misc,%imm0_b) __(jne 0f) __(testb $fixnummask,%arg_z_b) __(jne 1f) __(movq misc_header_offset(%arg_y),%imm0) __(xorb %imm0_b,%imm0_b) __(shrq $num_subtag_bits-fixnumshift,%imm0) __(cmpq %imm0,%arg_z) __(jae 2f) __(unbox_fixnum(%arg_x,%imm1)) __(jmp C(misc_ref_common)) 0: __(uuo_error_reg_not_tag(Rarg_y,tag_misc)) 1: __(uuo_error_reg_not_fixnum(Rarg_z)) 2: __(uuo_error_vector_bounds(Rarg_z,Rarg_y)) _endsubp(subtag_misc_ref) _spentry(subtag_misc_set) __(movb $tagmask,%imm0_b) __(andb %arg_x_b,%imm0_b) __(cmpb $tag_misc,%imm0_b) __(jne 0f) __(testb $fixnummask,%arg_y_b) __(jne 1f) __(movq misc_header_offset(%arg_x),%imm0) __(xorb %imm0_b,%imm0_b) __(shrq $num_subtag_bits-fixnumshift,%imm0) __(cmpq %imm0,%arg_y) __(jae 2f) __(unbox_fixnum(%temp0,%imm1)) __(jmp C(misc_set_common)) 0: __(uuo_error_reg_not_tag(Rarg_x,tag_misc)) 1: __(uuo_error_reg_not_fixnum(Rarg_y)) 2: __(uuo_error_vector_bounds(Rarg_y,Rarg_x)) _endsubp(subtag_misc_set) _spentry(misc_set) __(movb $tagmask,%imm0_b) __(andb %arg_x_b,%imm0_b) __(cmpb $tag_misc,%imm0_b) __(jne 0f) __(testb $fixnummask,%arg_y_b) __(jne 1f) __(movq misc_header_offset(%arg_x),%imm0) __(xorb %imm0_b,%imm0_b) __(shrq $num_subtag_bits-fixnumshift,%imm0) __(cmpq %imm0,%arg_y) __(jae 2f) __(movb misc_subtag_offset(%arg_x),%imm1_b) __(jmp C(misc_set_common)) 0: __(uuo_error_reg_not_tag(Rarg_x,tag_misc)) 1: __(uuo_error_reg_not_fixnum(Rarg_y)) 2: __(uuo_error_vector_bounds(Rarg_y,Rarg_x)) _endsubp(misc_set) _startfn(C(misc_set_common)) __(movzbl %imm1_b,%imm1_l) __(lea local_label(misc_set_jmp)(%rip),%imm2) __(jmp *(%imm2,%imm1,8)) .p2align 3 local_label(misc_set_jmp): /* 00-0f */ .quad local_label(misc_set_invalid) /* 00 even_fixnum */ .quad local_label(misc_set_invalid) /* 01 imm_1 */ .quad local_label(misc_set_invalid) /* 02 imm_2 */ .quad local_label(misc_set_invalid) /* 03 cons */ .quad local_label(misc_set_invalid) /* 04 tra_0 */ .quad local_label(misc_set_invalid) /* 05 nodeheader_0 */ .quad local_label(misc_set_invalid) /* 06 nodeheader_1 */ .quad local_label(misc_set_invalid) /* 07 immheader_0 */ .quad local_label(misc_set_invalid) /* 08 odd_fixnum */ .quad local_label(misc_set_invalid) /* 09 immheader_1 */ .quad local_label(misc_set_invalid) /* 0a immheader_2 */ .quad local_label(misc_set_invalid) /* 0b nil */ .quad local_label(misc_set_invalid) /* 0c tra_1 */ .quad local_label(misc_set_invalid) /* 0d misc */ .quad local_label(misc_set_invalid) /* 0e symbol */ .quad local_label(misc_set_invalid) /* 0f function */ /* 10-1f */ .quad local_label(misc_set_invalid) /* 10 even_fixnum */ .quad local_label(misc_set_invalid) /* 11 imm_1 */ .quad local_label(misc_set_invalid) /* 12 imm_2 */ .quad local_label(misc_set_invalid) /* 13 cons */ .quad local_label(misc_set_invalid) /* 14 tra_0 */ .quad _SPgvset /* 15 symbol_vector */ .quad _SPgvset /* 16 ratio */ .quad local_label(misc_set_invalid) /* 17 immheader_0 */ .quad local_label(misc_set_invalid) /* 18 odd_fixnum */ .quad local_label(misc_set_u32) /* 19 bignum */ .quad local_label(misc_set_u64) /* 1a macptr */ .quad local_label(misc_set_invalid) /* 1b nil */ .quad local_label(misc_set_invalid) /* 1c tra_1 */ .quad local_label(misc_set_invalid) /* 1d misc */ .quad local_label(misc_set_invalid) /* 1e symbol */ .quad local_label(misc_set_invalid) /* 1f function */ /* 20-2f */ .quad local_label(misc_set_invalid) /* 20 even_fixnum */ .quad local_label(misc_set_invalid) /* 21 imm_1 */ .quad local_label(misc_set_invalid) /* 22 imm_2 */ .quad local_label(misc_set_invalid) /* 23 cons */ .quad local_label(misc_set_invalid) /* 24 tra_0 */ .quad _SPgvset /* 25 catch_frame */ .quad _SPgvset /* 26 complex */ .quad local_label(misc_set_invalid) /* 27 immheader_0 */ .quad local_label(misc_set_invalid) /* 28 odd_fixnum */ .quad local_label(misc_set_u32) /* 29 double_float */ .quad local_label(misc_set_u64) /* 2a dead_macptr */ .quad local_label(misc_set_invalid) /* 2b nil */ .quad local_label(misc_set_invalid) /* 2c tra_1 */ .quad local_label(misc_set_invalid) /* 2d misc */ .quad local_label(misc_set_invalid) /* 2e symbol */ .quad local_label(misc_set_invalid) /* 2f function */ /* 30-3f */ .quad local_label(misc_set_invalid) /* 30 even_fixnum */ .quad local_label(misc_set_invalid) /* 31 imm_1 */ .quad local_label(misc_set_invalid) /* 32 imm_2 */ .quad local_label(misc_set_invalid) /* 33 cons */ .quad local_label(misc_set_invalid) /* 34 tra_0 */ .quad _SPgvset /* 35 hash_vector */ .quad _SPgvset /* 36 struct */ .quad local_label(misc_set_invalid) /* 37 immheader_0 */ .quad local_label(misc_set_invalid) /* 38 odd_fixnum */ .quad local_label(misc_set_u32) /* 39 xcode_vector */ .quad local_label(misc_set_invalid) /* 3a immheader_2 */ .quad local_label(misc_set_invalid) /* 3b nil */ .quad local_label(misc_set_invalid) /* 3c tra_1 */ .quad local_label(misc_set_invalid) /* 3d misc */ .quad local_label(misc_set_invalid) /* 3e symbol */ .quad local_label(misc_set_invalid) /* 3f function */ /* 40-4f */ .quad local_label(misc_set_invalid) /* 40 even_fixnum */ .quad local_label(misc_set_invalid) /* 41 imm_1 */ .quad local_label(misc_set_invalid) /* 42 imm_2 */ .quad local_label(misc_set_invalid) /* 43 cons */ .quad local_label(misc_set_invalid) /* 44 tra_0 */ .quad _SPgvset /* 45 pool */ .quad _SPgvset /* 46 istruct */ .quad local_label(misc_set_invalid) /* 47 immheader_0 */ .quad local_label(misc_set_invalid) /* 48 odd_fixnum */ .quad local_label(misc_set_invalid) /* 49 immheader_1 */ .quad local_label(misc_set_invalid) /* 4a immheader_2 */ .quad local_label(misc_set_invalid) /* 4b nil */ .quad local_label(misc_set_invalid) /* 4c tra_1 */ .quad local_label(misc_set_invalid) /* 4d misc */ .quad local_label(misc_set_invalid) /* 4e symbol */ .quad local_label(misc_set_invalid) /* 4f function */ /* 50-5f */ .quad local_label(misc_set_invalid) /* 50 even_fixnum */ .quad local_label(misc_set_invalid) /* 51 imm_1 */ .quad local_label(misc_set_invalid) /* 52 imm_2 */ .quad local_label(misc_set_invalid) /* 53 cons */ .quad local_label(misc_set_invalid) /* 54 tra_0 */ .quad _SPgvset /* 55 weak */ .quad _SPgvset /* 56 value_cell */ .quad local_label(misc_set_invalid) /* 57 immheader_0 */ .quad local_label(misc_set_invalid) /* 58 odd_fixnum */ .quad local_label(misc_set_invalid) /* 59 immheader_1 */ .quad local_label(misc_set_invalid) /* 5a immheader_2 */ .quad local_label(misc_set_invalid) /* 5b nil */ .quad local_label(misc_set_invalid) /* 5c tra_1 */ .quad local_label(misc_set_invalid) /* 5d misc */ .quad local_label(misc_set_invalid) /* 5e symbol */ .quad local_label(misc_set_invalid) /* 5f function */ /* 60-6f */ .quad local_label(misc_set_invalid) /* 60 even_fixnum */ .quad local_label(misc_set_invalid) /* 61 imm_1 */ .quad local_label(misc_set_invalid) /* 62 imm_2 */ .quad local_label(misc_set_invalid) /* 63 cons */ .quad local_label(misc_set_invalid) /* 64 tra_0 */ .quad _SPgvset /* 65 package */ .quad _SPgvset /* 66 xfunction */ .quad local_label(misc_set_invalid) /* 67 immheader_0 */ .quad local_label(misc_set_invalid) /* 68 odd_fixnum */ .quad local_label(misc_set_invalid) /* 69 immheader_1 */ .quad local_label(misc_set_invalid) /* 6a immheader_2 */ .quad local_label(misc_set_invalid) /* 6b nil */ .quad local_label(misc_set_invalid) /* 6c tra_1 */ .quad local_label(misc_set_invalid) /* 6d misc */ .quad local_label(misc_set_invalid) /* 6e symbol */ .quad local_label(misc_set_invalid) /* 6f function */ /* 70-7f */ .quad local_label(misc_set_invalid) /* 70 even_fixnum */ .quad local_label(misc_set_invalid) /* 71 imm_1 */ .quad local_label(misc_set_invalid) /* 72 imm_2 */ .quad local_label(misc_set_invalid) /* 73 cons */ .quad local_label(misc_set_invalid) /* 74 tra_0 */ .quad _SPgvset /* 75 slot_vector */ .quad _SPgvset /* 76 lock */ .quad local_label(misc_set_invalid) /* 77 immheader_0 */ .quad local_label(misc_set_invalid) /* 78 odd_fixnum */ .quad local_label(misc_set_invalid) /* 79 immheader_1 */ .quad local_label(misc_set_invalid) /* 7a immheader_2 */ .quad local_label(misc_set_invalid) /* 7b nil */ .quad local_label(misc_set_invalid) /* 7c tra_1 */ .quad local_label(misc_set_invalid) /* 7d misc */ .quad local_label(misc_set_invalid) /* 7e symbol */ .quad local_label(misc_set_invalid) /* 7f function */ /* 80-8f */ .quad local_label(misc_set_invalid) /* 80 even_fixnum */ .quad local_label(misc_set_invalid) /* 81 imm_1 */ .quad local_label(misc_set_invalid) /* 82 imm_2 */ .quad local_label(misc_set_invalid) /* 83 cons */ .quad local_label(misc_set_invalid) /* 84 tra_0 */ .quad _SPgvset /* 85 lisp_thread */ .quad _SPgvset /* 86 instance */ .quad local_label(misc_set_invalid) /* 87 immheader_0 */ .quad local_label(misc_set_invalid) /* 88 odd_fixnum */ .quad local_label(misc_set_invalid) /* 89 immheader_1 */ .quad local_label(misc_set_invalid) /* 8a immheader_2 */ .quad local_label(misc_set_invalid) /* 8b nil */ .quad local_label(misc_set_invalid) /* 8c tra_1 */ .quad local_label(misc_set_invalid) /* 8d misc */ .quad local_label(misc_set_invalid) /* 8e symbol */ .quad local_label(misc_set_invalid) /* 8f function */ /* 90-9f */ .quad local_label(misc_set_invalid) /* 90 even_fixnum */ .quad local_label(misc_set_invalid) /* 91 imm_1 */ .quad local_label(misc_set_invalid) /* 92 imm_2 */ .quad local_label(misc_set_invalid) /* 93 cons */ .quad local_label(misc_set_invalid) /* 94 tra_0 */ .quad local_label(misc_set_function) /* 95 function_vector */ .quad local_label(misc_set_invalid) /* 96 nodeheader_1 */ .quad local_label(misc_set_invalid) /* 97 immheader_0 */ .quad local_label(misc_set_invalid) /* 98 odd_fixnum */ .quad local_label(misc_set_invalid) /* 99 immheader_1 */ .quad local_label(misc_set_invalid) /* 9a immheader_2 */ .quad local_label(misc_set_invalid) /* 9b nil */ .quad local_label(misc_set_invalid) /* 9c tra_1 */ .quad local_label(misc_set_invalid) /* 9d misc */ .quad local_label(misc_set_invalid) /* 9e symbol */ .quad local_label(misc_set_invalid) /* 9f function */ /* a0-af */ .quad local_label(misc_set_invalid) /* a0 even_fixnum */ .quad local_label(misc_set_invalid) /* a1 imm_1 */ .quad local_label(misc_set_invalid) /* a2 imm_2 */ .quad local_label(misc_set_invalid) /* a3 cons */ .quad local_label(misc_set_invalid) /* a4 tra_0 */ .quad _SPgvset /* a5 arrayH */ .quad _SPgvset /* a6 vectorH */ .quad local_label(misc_set_s16) /* a7 s16 */ .quad local_label(misc_set_invalid) /* a8 odd_fixnum */ .quad local_label(misc_set_invalid) /* a9 immheader_1 */ .quad local_label(misc_set_invalid) /* aa immheader_2 */ .quad local_label(misc_set_invalid) /* ab nil */ .quad local_label(misc_set_invalid) /* ac tra_1 */ .quad local_label(misc_set_invalid) /* ad misc */ .quad local_label(misc_set_invalid) /* ae symbol */ .quad local_label(misc_set_invalid) /* af function */ /* b0-bf */ .quad local_label(misc_set_invalid) /* b0 even_fixnum */ .quad local_label(misc_set_invalid) /* b1 imm_1 */ .quad local_label(misc_set_invalid) /* b2 imm_2 */ .quad local_label(misc_set_invalid) /* b3 cons */ .quad local_label(misc_set_invalid) /* b4 tra_0 */ .quad local_label(misc_set_invalid) /* b5 nodeheader_0 */ .quad _SPgvset /* b6 simple_vector */ .quad local_label(misc_set_u16) /* b7 immheader_0 */ .quad local_label(misc_set_invalid) /* b8 odd_fixnum */ .quad local_label(misc_set_invalid) /* b9 immheader_1 */ .quad local_label(misc_set_invalid) /* ba immheader_2 */ .quad local_label(misc_set_invalid) /* bb nil */ .quad local_label(misc_set_invalid) /* bc tra_1 */ .quad local_label(misc_set_invalid) /* bd misc */ .quad local_label(misc_set_invalid) /* be symbol */ .quad local_label(misc_set_invalid) /* bf function */ /* c0-cf */ .quad local_label(misc_set_invalid) /* c0 even_fixnum */ .quad local_label(misc_set_invalid) /* c1 imm_1 */ .quad local_label(misc_set_invalid) /* c2 imm_2 */ .quad local_label(misc_set_invalid) /* c3 cons */ .quad local_label(misc_set_invalid) /* c4 tra_0 */ .quad local_label(misc_set_invalid) /* c5 nodeheader_0 */ .quad local_label(misc_set_invalid) /* c6 nodeheader_1 */ .quad local_label(misc_set_string) /* c7 simple_base_string */ .quad local_label(misc_set_invalid) /* c8 odd_fixnum */ .quad local_label(misc_set_new_string) /* c9 new_strin */ .quad local_label(misc_set_fixnum_vector) /* ca fixnum_vector */ .quad local_label(misc_set_invalid) /* cb nil */ .quad local_label(misc_set_invalid) /* cc tra_1 */ .quad local_label(misc_set_invalid) /* cd misc */ .quad local_label(misc_set_invalid) /* ce symbol */ .quad local_label(misc_set_invalid) /* cf function */ /* d0-df */ .quad local_label(misc_set_invalid) /* d0 even_fixnum */ .quad local_label(misc_set_invalid) /* d1 imm_1 */ .quad local_label(misc_set_invalid) /* d2 imm_2 */ .quad local_label(misc_set_invalid) /* d3 cons */ .quad local_label(misc_set_invalid) /* d4 tra_0 */ .quad local_label(misc_set_invalid) /* d5 nodeheader_0 */ .quad local_label(misc_set_invalid) /* d6 nodeheader_1 */ .quad local_label(misc_set_s8) /* d7 s8 */ .quad local_label(misc_set_invalid) /* d8 odd_fixnum */ .quad local_label(misc_set_s32) /* d9 s32 */ .quad local_label(misc_set_s64) /* da s64 */ .quad local_label(misc_set_invalid) /* db nil */ .quad local_label(misc_set_invalid) /* dc tra_1 */ .quad local_label(misc_set_invalid) /* dd misc */ .quad local_label(misc_set_invalid) /* de symbol */ .quad local_label(misc_set_invalid) /* df function */ /* e0-ef */ .quad local_label(misc_set_invalid) /* e0 even_fixnum */ .quad local_label(misc_set_invalid) /* e1 imm_1 */ .quad local_label(misc_set_invalid) /* e2 imm_2 */ .quad local_label(misc_set_invalid) /* e3 cons */ .quad local_label(misc_set_invalid) /* e4 tra_0 */ .quad local_label(misc_set_invalid) /* e5 nodeheader_0 */ .quad local_label(misc_set_invalid) /* e6 nodeheader_1 */ .quad local_label(misc_set_u8) /* e7 u8 */ .quad local_label(misc_set_invalid) /* e8 odd_fixnum */ .quad local_label(misc_set_u32) /* e9 u32 */ .quad local_label(misc_set_u64) /* ea u64 */ .quad local_label(misc_set_invalid) /* eb nil */ .quad local_label(misc_set_invalid) /* ec tra_1 */ .quad local_label(misc_set_invalid) /* ed misc */ .quad local_label(misc_set_invalid) /* ee symbol */ .quad local_label(misc_set_invalid) /* ef function */ /* f0-ff */ .quad local_label(misc_set_invalid) /* f0 even_fixnum */ .quad local_label(misc_set_invalid) /* f1 imm_1 */ .quad local_label(misc_set_invalid) /* f2 imm_2 */ .quad local_label(misc_set_invalid) /* f3 cons */ .quad local_label(misc_set_invalid) /* f4 tra_0 */ .quad local_label(misc_set_invalid) /* f5 nodeheader_0 */ .quad local_label(misc_set_invalid) /* f6 nodeheader_1 */ .quad local_label(misc_set_bit_vector) /* f7 bitvector */ .quad local_label(misc_set_invalid) /* f8 odd_fixnum */ .quad local_label(misc_set_single_float_vector) /* f9 single_float */ .quad local_label(misc_set_double_float_vector) /* fa double_float */ .quad local_label(misc_set_invalid) /* fb nil */ .quad local_label(misc_set_invalid) /* fc tra_1 */ .quad local_label(misc_set_invalid) /* fd misc */ .quad local_label(misc_set_invalid) /* fe symbol */ .quad local_label(misc_set_invalid) /* ff function */ local_label(misc_set_function): /* Functions are funny: the first N words */ /* are treated as (UNSIGNED-BYTE 64), where N is the low */ /* 32 bits of the first word. */ __(movl misc_data_offset(%arg_x),%imm0_l) __(shl $fixnumshift,%imm0) __(rcmpq(%arg_y,%imm0)) __(jae _SPgvset) local_label(misc_set_u64): __(movq $~(target_most_positive_fixnum << fixnumshift),%imm0) __(testq %arg_z,%imm0) __(movq %arg_z,%imm0) __(jne 1f) __(sarq $fixnumshift,%imm0) __(jmp 9f) 1: __(andb $tagmask,%imm0_b) __(cmpb $tag_misc,%imm0_b) __(jne local_label(misc_set_bad)) __(movb misc_subtag_offset(%arg_z),%imm0_b) __(cmpb $subtag_bignum,%imm0_b) __(jne local_label(misc_set_bad)) __(movq misc_header_offset(%arg_z),%imm0) __(cmpq $three_digit_bignum_header,%imm0) __(je 3f) __(cmpq $two_digit_bignum_header,%imm0) __(jne local_label(misc_set_bad)) __(movq misc_data_offset(%arg_z),%imm0) __(testq %imm0,%imm0) __(js local_label(misc_set_bad)) __(jmp 9f) 3: __(movq misc_data_offset(%arg_z),%imm0) __(cmpl $0,misc_data_offset+8(%arg_z)) __(jne local_label(misc_set_bad)) 9: __(movq %imm0,misc_data_offset(%arg_x,%arg_y)) __(ret) local_label(misc_set_fixnum_vector): __(movq %arg_z,%imm0) __(sarq $fixnumshift,%imm0) __(testb $fixnummask,%arg_z_b) __(jne local_label(misc_set_bad)) __(movq %imm0,misc_data_offset(%arg_x,%arg_y)) __(ret) local_label(misc_set_s64): __(movq %arg_z,%imm0) __(sarq $fixnumshift,%imm0) __(testb $fixnummask,%arg_z_b) __(je 9f) 1: __(movb %arg_z_b,%imm0_b) __(andb $tagmask,%imm0_b) __(cmpb $tag_misc,%imm0_b) __(jne local_label(misc_set_bad)) __(movb misc_subtag_offset(%arg_z),%imm0_b) __(cmpb $subtag_bignum,%imm0_b) __(jne local_label(misc_set_bad)) __(movq misc_header_offset(%arg_z),%imm0) __(cmpq $two_digit_bignum_header,%imm0) __(movq misc_data_offset(%arg_z),%imm0) __(jne local_label(misc_set_bad)) 9: __(movq %imm0,misc_data_offset(%arg_x,%arg_y)) __(ret) local_label(misc_set_bad): __(movq %arg_z,%arg_y) __(movq %arg_x,%arg_z) __(movq $XNOTELT,%arg_x) __(set_nargs(3)) __(jmp _SPksignalerr) local_label(misc_set_double_float_vector): __(extract_lisptag(%arg_z,%imm0)) __(cmpb $tag_misc,%imm0_b) __(jne local_label(misc_set_bad)) __(movb misc_subtag_offset(%arg_z),%imm0_b) __(cmpb $subtag_double_float,%imm0_b) __(jne local_label(misc_set_bad)) __(movq double_float.value(%arg_z),%imm0) __(movq %imm0,misc_dfloat_offset(%arg_x,%arg_y)) __(ret) local_label(misc_set_s32): __(movq %arg_z,%imm0) __(movq %arg_y,%imm1) __(shlq $64-(32+fixnumshift),%imm0) __(shrq $1,%imm1) __(sarq $64-(32+fixnumshift),%imm0) __(cmpq %imm0,%arg_z) __(jne local_label(misc_set_bad)) __(testb $fixnummask,%arg_z_b) __(jne local_label(misc_set_bad)) __(shr $fixnumshift,%imm0) __(movl %imm0_l,misc_data_offset(%arg_x,%imm1)) __(ret) local_label(misc_set_single_float_vector): __(cmpb $tag_single_float,%arg_z_b) __(movq %arg_z,%imm0) __(movq %arg_y,%imm1) __(jne local_label(misc_set_bad)) __(shrq $1,%imm1) __(shr $32,%imm0) __(movl %imm0_l,misc_data_offset(%arg_x,%imm1)) __(ret) local_label(misc_set_u32): __(movq %arg_y,%imm1) __(movq $~(0xffffffff< %arg_y %arg_z). */ _spentry(builtin_gt) __(movb %arg_z_b,%imm0_b) __(orb %arg_y_b,%imm0_b) __(testb $fixnummask,%imm0_b) __(jne 1f) __(rcmpq(%arg_y,%arg_z)) __(condition_to_boolean(g,%imm0,%arg_z)) __(ret) 1: __(jump_builtin(_builtin_gt,2)) _endsubp(builtin_gt) /* %arg_z <- (>= %arg_y %arg_z). */ _spentry(builtin_ge) __(movb %arg_z_b,%imm0_b) __(orb %arg_y_b,%imm0_b) __(testb $fixnummask,%imm0_b) __(jne 1f) __(rcmpq(%arg_y,%arg_z)) __(condition_to_boolean(ge,%imm0,%arg_z)) __(ret) 1: __(jump_builtin(_builtin_ge,2)) _endsubp(builtin_ge) /* %arg_z <- (< %arg_y %arg_z). */ _spentry(builtin_lt) __(movb %arg_z_b,%imm0_b) __(orb %arg_y_b,%imm0_b) __(testb $fixnummask,%imm0_b) __(jne 1f) __(rcmpq(%arg_y,%arg_z)) __(condition_to_boolean(l,%imm0,%arg_z)) __(ret) 1: __(jump_builtin(_builtin_lt,2)) _endsubp(builtin_lt) /* %arg_z <- (<= %arg_y %arg_z). */ _spentry(builtin_le) __(movb %arg_z_b,%imm0_b) __(orb %arg_y_b,%imm0_b) __(testb $fixnummask,%imm0_b) __(jne 1f) __(rcmpq(%arg_y,%arg_z)) __(condition_to_boolean(le,%imm0,%arg_z)) __(ret) 1: __(jump_builtin(_builtin_le,2)) _endsubp(builtin_le) _spentry(builtin_eql) 0: __(cmpq %arg_y,%arg_z) __(je 8f) /* Not EQ. Could only possibly be EQL if both are tag-misc */ /* and both have the same subtag */ __(extract_lisptag(%arg_y,%imm0)) __(extract_lisptag(%arg_z,%imm1)) __(cmpb $tag_misc,%imm0_b) __(jne 9f) __(cmpb %imm0_b,%imm1_b) __(jne 9f) __(extract_subtag(%arg_y,%imm0)) __(extract_subtag(%arg_z,%imm1)) __(cmpb %imm0_b,%imm1_b) __(jne 9f) __(cmpb $subtag_macptr,%imm0_b) __(je 1f) __(cmpb $subtag_double_float,%imm0_b) __(jne 2f) 1: __(movq misc_data_offset(%arg_y),%imm0) __(cmpq misc_data_offset(%arg_z),%imm0) __(movl $t_value,%arg_z_l) __(movl $nil_value,%imm0_l) __(cmovnel %imm0_l,%arg_z_l) __(ret) 2: __(cmpb $subtag_ratio,%imm0_b) __(je 3f) __(cmpb $subtag_complex,%imm0_b) __(jne 5f) 3: __(pushq %rbp) __(movq %rsp,%rsp) __(pushq ratio.denom(%arg_y)) __(pushq ratio.denom(%arg_z)) __(movq ratio.numer(%arg_y),%arg_y) __(movq ratio.numer(%arg_z),%arg_z) __(lea 4f(%rip),%ra0) __(pushq %ra0) __(jmp 0b) __(tra(4)) __(compare_reg_to_nil(%arg_z)) __(popq %arg_z) __(popq %arg_y) __(popq %rbp) __(je 9f) __(jmp 0b) 5: __(cmpb $subtag_bignum,%imm0_b) __(jne 9f) __(getvheader(%arg_y,%imm2)) __(cmpq misc_header_offset(%arg_z),%imm2) __(jne 9f) __(shrq $num_subtag_bits,%imm2) __(xorl %imm1_l,%imm1_l) 6: __(movl misc_data_offset(%arg_y,%imm1,4),%imm0_l) __(cmpl misc_data_offset(%arg_z,%imm1,4),%imm0_l) __(jne 9f) __(addq $1,%imm1) __(cmpq %imm1,%imm2) __(jne 6b) 8: __(movl $t_value,%arg_z_l) __(ret) 9: __(movl $nil_value,%arg_z_l) __(ret) _endsubp(builtin_eql) _spentry(builtin_length) __(extract_lisptag(%arg_z,%imm0)) __(cmpb $tag_list,%imm0_b) __(jz 2f) __(cmpb $tag_misc,%imm0_b) __(jnz 8f) __(extract_subtag(%arg_z,%imm0)) __(rcmpb(%imm0_b,$min_vector_subtag)) __(jb 8f) __(je 1f) /* (simple-array * (*)) */ __(movq %arg_z,%arg_y) __(vector_length(%arg_y,%arg_z)) __(ret) 1: /* vector header */ __(movq vectorH.logsize(%arg_z),%arg_z) __(ret) 2: /* list. Maybe null, maybe dotted or circular. */ __(movq $-fixnumone,%imm2) __(movq %arg_z,%temp0) /* fast pointer */ __(movq %arg_z,%temp1) /* slow pointer */ 3: __(extract_lisptag(%temp0,%imm0)) __(compare_reg_to_nil(%temp0)) __(leaq fixnumone(%imm2),%imm2) __(je 9f) __(cmpb $tag_list,%imm0_b) __(jne 8f) __(extract_lisptag(%temp1,%imm1)) __(testb $fixnumone,%imm2_b) __(_cdr(%temp0,%temp0)) __(je 3b) __(cmpb $tag_list,%imm1_b) __(jne 8f) __(_cdr(%temp1,%temp1)) __(cmpq %temp0,%temp1) __(jne 3b) 8: __(jump_builtin(_builtin_length,1)) 9: __(movq %imm2,%arg_z) __(ret) _endsubp(builtin_length) _spentry(builtin_seqtype) __(extract_lisptag(%arg_z,%imm0)) __(cmpb $tag_list,%imm0_b) __(jz 1f) __(cmpb $tag_misc,%imm0_b) __(jne 2f) __(movb misc_subtag_offset(%arg_z),%imm0_b) __(rcmpb(%imm0_b,$min_vector_subtag)) __(jb 2f) __(movl $nil_value,%arg_z_l) __(ret) 1: __(movl $t_value,%arg_z_l) __(ret) 2: __(jump_builtin(_builtin_seqtype,1)) _endsubp(builtin_seqtype) _spentry(builtin_assq) __(cmpb $fulltag_nil,%arg_z_b) __(jz 5f) 1: __(movb $tagmask,%imm0_b) __(andb %arg_z_b,%imm0_b) __(cmpb $tag_list,%imm0_b) __(jnz 2f) __(_car(%arg_z,%arg_x)) __(_cdr(%arg_z,%arg_z)) __(cmpb $fulltag_nil,%arg_x_b) __(jz 4f) __(movb $tagmask,%imm0_b) __(andb %arg_x_b,%imm0_b) __(cmpb $tag_list,%imm0_b) __(jnz 3f) __(_car(%arg_x,%temp0)) __(cmpq %temp0,%arg_y) __(jnz 4f) __(movq %arg_x,%arg_z) __(ret) 4: __(cmpb $fulltag_nil,%arg_z_b) 5: __(jnz 1b) __(repret) 2: __(uuo_error_reg_not_list(Rarg_z)) 3: __(uuo_error_reg_not_list(Rarg_x)) _endsubp(builtin_assq) _spentry(builtin_memq) __(cmpb $fulltag_nil,%arg_z_b) __(jmp 3f) 1: __(movb $tagmask,%imm0_b) __(andb %arg_z_b,%imm0_b) __(cmpb $tag_list,%imm0_b) __(jnz 2f) __(_car(%arg_z,%arg_x)) __(_cdr(%arg_z,%temp0)) __(cmpq %arg_x,%arg_y) __(jz 4f) __(cmpb $fulltag_nil,%temp0_b) __(movq %temp0,%arg_z) 3: __(jnz 1b) 4: __(repret) 2: __(uuo_error_reg_not_list(Rarg_z)) _endsubp(builtin_memq) __ifdef(`X8664') logbitp_max_bit = 61 __else logbitp_max_bit = 30 __endif _spentry(builtin_logbitp) __(movb %arg_z_b,%imm0_b) __(orb %arg_y_b,%imm0_b) __(testb $fixnummask,%imm0_b) __(jnz 1f) __(unbox_fixnum(%arg_y,%imm0)) __(movl $logbitp_max_bit-1+fixnumshift,%imm1_l) __(js 1f) /* bit number negative */ __(addb $fixnumshift,%imm0_b) __(cmpq $logbitp_max_bit< aligned on 16-byte boundary */ /* *backlink <- foreign %rsp */ /* unused */ /* scalar arg 0 passed in %rdi */ /* scalar arg 1 passed in %rsi */ /* scalar arg 2 passed in %rdx */ /* scalar arg 3 passed in %rcx */ /* scalar arg 4 passed in %r8 */ /* scalar arg 5 passed in %r9 */ /* *address of first memory arg */ /* ... */ /* possible scratch space */ /* *previous %rsp value */ /* Any floating-point args will have been loaded into %xmm0-%xmm7 by the caller. */ /* When this returns, the foreign %rsp will contain its previous value, and */ /* the function result will be in %rax (and possibly %rdx) or %xmm0 (+ %xmm1). */ _spentry(ffcall) LocalLabelPrefix`'ffcall: /* Unbox %arg_z. It's either a fixnum or macptr (or bignum) ; if not a fixnum, get the first word */ __(unbox_fixnum(%arg_z,%imm1)) __(testb $fixnummask,%arg_z_b) __(je 0f) __(movq macptr.address(%arg_z),%imm1) 0: /* Save lisp registers */ __(push %rbp) __(movq %rsp,%rbp) __(push %temp0) __(push %temp1) __(push %temp2) __(push %arg_x) __(push %arg_y) __(push %arg_z) __(push %fn) __ifndef(`TCR_IN_GPR') __(push %save3) __endif __(push %save2) __(push %save1) __(push %save0) /* 10 or 11 registers pushed after %rbp */ __(movq %rsp,rcontext(tcr.save_vsp)) __(movq %rbp,rcontext(tcr.save_rbp)) __(movq $TCR_STATE_FOREIGN,rcontext(tcr.valence)) __(movq rcontext(tcr.foreign_sp),%rsp) __ifdef(`WINDOWS') __(stmxcsr rcontext(tcr.lisp_mxcsr)) __else __(movq $0,rcontext(tcr.ffi_exception)) __endif __(emms) __ifdef(`WINDOWS') __(ldmxcsr rcontext(tcr.foreign_mxcsr)) __endif __(movq (%rsp),%rbp) __ifdef(`TCR_IN_GPR') /* Preserve TCR pointer */ __(movq %rcontext_reg, %csave0) __endif LocalLabelPrefix`'ffcall_setup: __(addq $2*node_size,%rsp) __(movq %imm1,%r11) __ifdef(`WINDOWS') /* Leave 0x20 bytes of register spill area on stack */ __(movq (%rsp),%carg0) __(movq 8(%rsp),%carg1) __(movq 16(%rsp),%carg2) __(movq 24(%rsp),%carg3) __else __(pop %carg0) __(pop %carg1) __(pop %carg2) __(pop %carg3) __(pop %carg4) __(pop %carg5) __endif LocalLabelPrefix`'ffcall_setup_end: LocalLabelPrefix`'ffcall_call: __(call *%r11) LocalLabelPrefix`'ffcall_call_end: __ifdef(`WINDOWS') __(add $0x20,%rsp) __endif __(movq %rbp,%rsp) __ifdef(`TCR_IN_GPR') __(movq %csave0, %rcontext_reg) __endif __(movq %rsp,rcontext(tcr.foreign_sp)) __ifndef(`TCR_IN_GPR') __(clr %save3) __endif __(clr %save2) __(clr %save1) __(clr %save0) __(clr %arg_z) __(clr %arg_y) __(clr %arg_x) __(clr %temp2) __(clr %temp1) __(clr %temp0) __(clr %fn) __(pxor %fpzero,%fpzero) __ifndef(`WINDOWS') /* If we got a floating-point exception during the ff-call, our handler will have set a flag, preserved lisp's MXCSR, and resumed execution with fp exceptions masked. */ __(btrq $TCR_FLAG_BIT_FOREIGN_FPE,rcontext(tcr.flags)) __(jnc 1f) __endif __(cmpb $0,C(bogus_fp_exceptions)(%rip)) __(je 0f) __(movl %arg_x_l,rcontext(tcr.ffi_exception)) __(jmp 1f) 0: __(stmxcsr rcontext(tcr.ffi_exception)) __ifndef(`WINDOWS') __(ldmxcsr rcontext(tcr.lisp_mxcsr)) /* preserved by the handler */ __endif 1: __(movq rcontext(tcr.save_vsp),%rsp) __(movq rcontext(tcr.save_rbp),%rbp) __(movq $TCR_STATE_LISP,rcontext(tcr.valence)) __(pop %save0) __(pop %save1) __(pop %save2) __ifndef(`TCR_IN_GPR') __(pop %save3) __endif __(pop %fn) __(pop %arg_z) __(pop %arg_y) __(pop %arg_x) __(pop %temp2) __(pop %temp1) __ifdef(`WINDOWS') __(ldmxcsr rcontext(tcr.lisp_mxcsr)) __endif __(check_pending_interrupt(%temp0)) __(pop %temp0) __(leave) __ifdef(`DARWIN') __(btrq $TCR_FLAG_BIT_FOREIGN_EXCEPTION,rcontext(tcr.flags)) __(jc 0f) __endif __(ret) __ifdef(`DARWIN') 0: /* Unboxed foreign exception (likely an NSException) in %imm0. */ /* Box it, then signal a lisp error. */ __(movq %imm0,%imm2) __(movq $macptr_header,%rax) __(Misc_Alloc_Fixed(%arg_z,macptr.size)) __(movq %imm2,macptr.address(%arg_z)) __(movq $XFOREIGNEXCEPTION,%arg_y) __(set_nargs(2)) __(jmp _SPksignalerr) __endif __ifdef(`DARWIN') /* Handle exceptions, for ObjC 2.0 */ LocalLabelPrefix`'ffcallLandingPad: __(movq %rax,%save1) __(cmpq $1,%rdx) __(je 1f) __(movq %rax,%rdi) LocalLabelPrefix`'ffcallUnwindResume: __(call *lisp_global(unwind_resume)) LocalLabelPrefix`'ffcallUnwindResume_end: 1: __(movq %save1,%rdi) LocalLabelPrefix`'ffcallBeginCatch: __(call *lisp_global(objc_2_begin_catch)) LocalLabelPrefix`'ffcallBeginCatch_end: __(movq (%rax),%save1) /* indirection is necessary because we don't provide type info in lsda */ LocalLabelPrefix`'ffcallEndCatch: __(call *lisp_global(objc_2_end_catch)) LocalLabelPrefix`'ffcallEndCatch_end: __(ref_global(get_tcr,%rax)) __(movq $1,%rdi) __(call *%rax) __(btsq $TCR_FLAG_BIT_FOREIGN_EXCEPTION,tcr.flags(%rax)) __(movq %save1,%rax) __(jmp LocalLabelPrefix`'ffcall_call_end) LocalLabelPrefix`'ffcall_end: __endif _endsubp(ffcall) __ifdef(`DARWIN') .section __DATA,__gcc_except_tab GCC_except_table0: .align 3 LLSDA1: .byte 0xff /* @LPStart format (omit) */ .byte 0x0 /* @TType format (absolute) */ .byte 0x4d /* uleb128 0x4d; @TType base offset */ .byte 0x3 /* call-site format (udata4) */ .byte 0x41 /* uleb128 0x41; Call-site table length */ .long Lffcall_setup-Lffcall /* region 0 start */ .long Lffcall_setup_end-Lffcall_setup /* length */ .long 0x0 /* landing pad */ .byte 0x0 /* uleb128 0x0; action */ .long Lffcall_call-Lffcall /* region 1 start */ .long Lffcall_call_end-Lffcall_call /* length */ .long LffcallLandingPad-Lffcall /* landing pad */ .byte 0x1 /* uleb128 0x1; action */ .long LffcallUnwindResume-Lffcall /* region 2 start */ .long LffcallUnwindResume_end-LffcallUnwindResume /* length */ .long 0x0 /* landing pad */ .byte 0x0 /* uleb128 0x0; action */ .long LffcallBeginCatch-Lffcall /* region 3 start */ .long LffcallBeginCatch_end-LffcallBeginCatch /* length */ .long 0 /* landing pad */ .byte 0x0 /* uleb128 0x0; action */ .long LffcallEndCatch-Lffcall .long LffcallEndCatch_end-LffcallEndCatch /* length */ .long 0x0 /* landing pad */ .byte 0x0 /* uleb128 0x0; action */ .byte 0x1 /* Action record table */ .byte 0x0 .align 3 .quad 0 /* _OBJC_EHTYPE_$_NSException */ .text __endif _spentry(ffcall_return_registers) LocalLabelPrefix`'ffcall_return_registers: /* Unbox %arg_z. It's either a fixnum or macptr (or bignum) ; if not a fixnum, get the first word */ __(unbox_fixnum(%arg_z,%imm1)) __(testb $fixnummask,%arg_z_b) __(je 0f) __(movq macptr.address(%arg_z),%imm1) 0: /* Save lisp registers */ __(push %rbp) __(movq %rsp,%rbp) __(push %temp0) __(push %temp1) __(push %temp2) __(push %arg_x) __(push %arg_y) __(push %arg_z) __ifndef(`TCR_IN_GPR') __(push %save3) __endif __(push %save2) __(push %save1) __(push %save0) __(movq macptr.address(%arg_y),%csave0) /* %rbx non-volatile */ __(push %fn) __(movq %rsp,rcontext(tcr.save_vsp)) __(movq %rbp,rcontext(tcr.save_rbp)) __(movq $TCR_STATE_FOREIGN,rcontext(tcr.valence)) __(movq $0,rcontext(tcr.ffi_exception)) __(movq rcontext(tcr.foreign_sp),%rsp) __(emms) __(movq (%rsp),%rbp) __ifdef(`TCR_IN_GPR') /* Preserve TCR pointer */ __(movq %rcontext_reg, %csave1) __endif __(movq %imm1,%r11) LocalLabelPrefix`'ffcall_return_registers_setup: __(addq $2*node_size,%rsp) __(pop %carg0) __(pop %carg1) __(pop %carg2) __(pop %carg3) __ifdef(`WINDOWS') __(sub $0x20, %rsp) /* Make room for arg register spill */ __else __(pop %carg4) __(pop %carg5) __endif LocalLabelPrefix`'ffcall_return_registers_setup_end: LocalLabelPrefix`'ffcall_return_registers_call: __(call *%r11) LocalLabelPrefix`'ffcall_return_registers_call_end: __ifdef(`WINDOWS') __(add $0x20, %rsp) __endif __(movq %rax,(%csave0)) __(movq %rdx,8(%csave0)) __(movsd %xmm0,16(%csave0)) __(movsd %xmm1,24(%csave0)) __(movq %rbp,%rsp) __ifdef(`TCR_IN_GPR') __(movq %csave1, %rcontext_reg) __endif __(movq %rsp,rcontext(tcr.foreign_sp)) __ifndef(`TCR_IN_GPR') __(clr %save3) __endif __(clr %save2) __(clr %save1) __(clr %save0) __(clr %arg_z) __(clr %arg_y) __(clr %arg_x) __(clr %temp2) __(clr %temp1) __(clr %temp0) __(clr %fn) __(pxor %fpzero,%fpzero) /* Check for fp exceptions as in .SPffcall, above. */ __(btrq $TCR_FLAG_BIT_FOREIGN_FPE,rcontext(tcr.flags)) __(jnc 1f) __(cmpb $0,C(bogus_fp_exceptions)(%rip)) __(je 0f) __(movl %arg_x_l,rcontext(tcr.ffi_exception)) __(jmp 1f) 0: __(stmxcsr rcontext(tcr.ffi_exception)) __(ldmxcsr rcontext(tcr.lisp_mxcsr)) 1: __(movq rcontext(tcr.save_vsp),%rsp) __(movq rcontext(tcr.save_rbp),%rbp) __(movq $TCR_STATE_LISP,rcontext(tcr.valence)) __(pop %fn) __(pop %save0) __(pop %save1) __(pop %save2) __ifndef(`TCR_IN_GPR') __(pop %save3) __endif __(pop %arg_z) __(pop %arg_y) __(pop %arg_x) __(pop %temp2) __(pop %temp1) __(check_pending_interrupt(%temp0)) __(pop %temp0) __(leave) __ifdef(`DARWIN') __(btrq $TCR_FLAG_BIT_FOREIGN_EXCEPTION,rcontext(tcr.flags)) __(jc 0f) __endif __(ret) __ifdef(`DARWIN') 0: /* Unboxed foreign exception (likely an NSException) in %imm0. */ /* Box it, then signal a lisp error. */ __(movq %imm0,%imm2) __(movq $macptr_header,%rax) __(Misc_Alloc_Fixed(%arg_z,macptr.size)) __(movq %imm2,macptr.address(%arg_z)) __(movq $XFOREIGNEXCEPTION,%arg_y) __(set_nargs(2)) __(jmp _SPksignalerr) __endif __ifdef(`DARWIN') /* Handle exceptions, for ObjC 2.0 */ LocalLabelPrefix`'ffcall_return_registersLandingPad: __(movq %rax,%save1) __(cmpq $1,%rdx) __(je 1f) __(movq %rax,%rdi) LocalLabelPrefix`'ffcall_return_registersUnwindResume: __(call *lisp_global(unwind_resume)) LocalLabelPrefix`'ffcall_return_registersUnwindResume_end: 1: __(movq %save1,%rdi) LocalLabelPrefix`'ffcall_return_registersBeginCatch: __(call *lisp_global(objc_2_begin_catch)) LocalLabelPrefix`'ffcall_return_registersBeginCatch_end: __(movq (%rax),%save1) /* indirection is necessary because we don't provide type info in lsda */ LocalLabelPrefix`'ffcall_return_registersEndCatch: __(call *lisp_global(objc_2_end_catch)) LocalLabelPrefix`'ffcall_return_registersEndCatch_end: __(ref_global(get_tcr,%rax)) __(movq $1,%rdi) __(call *%rax) __(btsq $TCR_FLAG_BIT_FOREIGN_EXCEPTION,tcr.flags(%rax)) __(movq %save1,%rax) __(jmp LocalLabelPrefix`'ffcall_return_registers_call_end) LocalLabelPrefix`'ffcall_return_registers_end: __endif _endsubp(ffcall_returning_registers) __ifdef(`DARWIN') .section __DATA,__gcc_except_tab GCC_except_table1: .align 3 LLSDA2: .byte 0xff /* @LPStart format (omit) */ .byte 0x0 /* @TType format (absolute) */ .byte 0x4d /* uleb128 0x4d; @TType base offset */ .byte 0x3 /* call-site format (udata4) */ .byte 0x41 /* uleb128 0x41; Call-site table length */ .long Lffcall_return_registers_setup-Lffcall_return_registers /* region 0 start */ .long Lffcall_return_registers_setup_end-Lffcall_return_registers_setup /* length */ .long 0x0 /* landing pad */ .byte 0x0 /* uleb128 0x0; action */ .long Lffcall_return_registers_call-Lffcall_return_registers /* region 1 start */ .long Lffcall_return_registers_call_end-Lffcall_return_registers_call /* length */ .long Lffcall_return_registersLandingPad-Lffcall_return_registers /* landing pad */ .byte 0x1 /* uleb128 0x1; action */ .long Lffcall_return_registersUnwindResume-Lffcall_return_registers /* region 2 start */ .long Lffcall_return_registersUnwindResume_end-Lffcall_return_registersUnwindResume /* length */ .long 0x0 /* landing pad */ .byte 0x0 /* uleb128 0x0; action */ .long Lffcall_return_registersBeginCatch-Lffcall_return_registers /* region 3 start */ .long Lffcall_return_registersBeginCatch_end-Lffcall_return_registersBeginCatch /* length */ .long 0 /* landing pad */ .byte 0x0 /* uleb128 0x0; action */ .long Lffcall_return_registersEndCatch-Lffcall_return_registers .long Lffcall_return_registersEndCatch_end-Lffcall_return_registersEndCatch /* length */ .long 0x0 /* landing pad */ .byte 0x0 /* uleb128 0x0; action */ .byte 0x1 /* Action record table */ .byte 0x0 .align 3 .quad 0 /* _OBJC_EHTYPE_$_NSException */ .text __endif _spentry(syscall) /* Save lisp registers */ __(push %rbp) __(movq %rsp,%rbp) __(push %temp0) __(push %temp1) __(push %temp2) __(push %arg_x) __(push %arg_y) __(push %arg_z) __ifndef(`TCR_IN_GPR') __(push %save3) __endif __(push %save2) __(push %save1) __(push %save0) __(push %fn) __(movq %rsp,rcontext(tcr.save_vsp)) __(movq %rbp,rcontext(tcr.save_rbp)) __(movq $TCR_STATE_FOREIGN,rcontext(tcr.valence)) __(movq rcontext(tcr.foreign_sp),%rsp) __(emms) __(movq (%rsp),%rbp) __(addq $2*node_size,%rsp) __ifdef(`TCR_IN_GPR') __(movq %rcontext_reg,%csave0) __endif __ifdef(`WINDOWS') __(pop %carg0) __(pop %carg1) __(pop %carg2) __(pop %carg3) __(subq $0x20,%rsp) __(orq $-1,%cret) __(addq $0x20,%rsp) __else __(unbox_fixnum(%arg_z,%rax)) __(pop %rdi) __(pop %rsi) __(pop %rdx) __(pop %r10) /* syscalls take 4th param in %r10, not %rcx */ __(pop %r8) __(pop %r9) __(syscall) __ifdef(`SYSCALL_SETS_CARRY_ON_ERROR') __(jnc 0f) __(negq %rax) 0: __endif __endif __ifdef(`TCR_IN_GPR') __(movq %csave0,%rcontext_reg) __endif __(movq %rbp,%rsp) __(movq %rsp,rcontext(tcr.foreign_sp)) __ifndef(`TCR_IN_GPR') __(clr %save3) __endif __(clr %save2) __(clr %save1) __(clr %save0) __(clr %arg_z) __(clr %arg_y) __(clr %arg_x) __(clr %temp2) __(clr %temp1) __(clr %temp0) __(clr %fn) __(pxor %fpzero,%fpzero) __(movq rcontext(tcr.save_vsp),%rsp) __(movq rcontext(tcr.save_rbp),%rbp) __(movq $TCR_STATE_LISP,rcontext(tcr.valence)) __(pop %fn) __(pop %save0) __(pop %save1) __(pop %save2) __ifndef(`TCR_IN_GPR') __(pop %save3) __endif __(pop %arg_z) __(pop %arg_y) __(pop %arg_x) __(pop %temp2) __(pop %temp1) __(check_pending_interrupt(%temp0)) __(pop %temp0) __(leave) __(ret) _endsubp(syscall) /* We need to reserve a frame here if (a) nothing else was already pushed and (b) */ /* we push something (e.g., more than 3 args in the lexpr) */ _spentry(spread_lexprz) new_local_labels() __(movq (%arg_z),%imm0) __(testl %nargs,%nargs) /* anything pushed by caller ? */ __(leaq node_size(%arg_z,%imm0),%imm1) __(jne 0f) /* yes, caller has already created frame. */ __(cmpw $(nargregs*node_size),%imm0_w) /* will we push anything ? */ __(jbe 0f) __(push $reserved_frame_marker) __(push $reserved_frame_marker) 0: __(addw %imm0_w,%nargs_w) __(cmpw $(nargregs*node_size),%imm0_w) __(jae 9f) __(cmpw $(2*node_size),%imm0_w) __(je 2f) __(testw %imm0_w,%imm0_w) __(jne 1f) /* lexpr count was 0; vpop the args that */ /* were pushed by the caller */ __(testl %nargs,%nargs) __(je local_label(all_args_popped)) __(pop %arg_z) local_label(maybe_pop_yx): __(cmpl $(1*node_size),%nargs) __(je local_label(all_args_popped)) __(pop %arg_y) __(cmpl $(2*node_size),%nargs) __(je local_label(all_args_popped)) local_label(pop_arg_x): __(pop %arg_x) local_label(all_args_popped): /* If all args fit in registers but some were pushed */ /* by the caller, discard the reserved frame that the caller */ /* pushed. */ __(cmpw %imm0_w,%nargs_w) __(je local_label(go)) __(cmpl $(nargregs*node_size),%nargs) __(ja local_label(go)) __(addq $(2*node_size),%rsp) local_label(go): __(jmp *%ra0) /* vpush args from the lexpr until we have only */ /* three left, then assign them to arg_x, arg_y, */ /* and arg_z. */ 8: __(cmpw $(4*node_size),%imm0_w) __(lea -1*node_size(%imm0),%imm0) __(push -node_size(%imm1)) __(lea -1*node_size(%imm1),%imm1) 9: __(jne 8b) __(movq -node_size*1(%imm1),%arg_x) __(movq -node_size*2(%imm1),%arg_y) __(movq -node_size*3(%imm1),%arg_z) __(jmp *%ra0) /* lexpr count is two: set arg_y, arg_z from the */ /* lexpr, maybe vpop arg_x */ 2: __(cmpl $(2*node_size),%nargs) __(movq -node_size*1(%imm1),%arg_y) __(movq -node_size*2(%imm1),%arg_z) __(jne local_label(pop_arg_x)) __(jmp *%ra0) /* lexpr count is one: set arg_z from the lexpr, */ /* maybe vpop arg_y, arg_x */ 1: __(movq -node_size*1(%imm1),%arg_z) __(jmp local_label(maybe_pop_yx)) _endsubp(spread_lexprz) /* Callback index in %r11 */ _spentry(callback) __(push %rbp) __(movq %rsp,%rbp) /* C scalar args */ __(push %carg0) /* -8(%rbp) */ __(push %carg1) __(push %carg2) __(push %carg3) __ifndef(`WINDOWS') __(push %carg4) __(push %carg5) __endif /* FP arg regs */ __ifdef(`WINDOWS') __(subq $4*8,%rsp) __(movq %xmm0,3*8(%rsp)) /* -40(%rbp) */ __(movq %xmm1,2*8(%rsp)) __(movq %xmm2,1*8(%rsp)) __(movq %xmm3,0*8(%rsp)) __else __(subq $8*8,%rsp) __(movq %xmm0,7*8(%rsp)) /* -56(%rbp) */ __(movq %xmm1,6*8(%rsp)) __(movq %xmm2,5*8(%rsp)) __(movq %xmm3,4*8(%rsp)) __(movq %xmm4,3*8(%rsp)) __(movq %xmm5,2*8(%rsp)) __(movq %xmm6,1*8(%rsp)) __(movq %xmm7,0*8(%rsp)) __endif __ifndef(`WINDOWS') __endif /* Save caller's mxcsr */ __(subq $16,%rsp) __(stmxcsr (%rsp)) __(andb $~mxcsr_all_exceptions,(%rsp)) /* C NVRs */ __(push %csave0) __(push %csave1) __(push %csave2) __(push %csave3) __(push %csave4) __ifdef(`WINDOWS') __(push %csave5) __(push %csave6) __endif __(push %rbp) __(movq %r11,%csave0) __ifdef(`HAVE_TLS') /* TCR initialized for lisp ? */ __ifndef(`TCR_IN_GPR') /* FIXME */ __(movq %fs:current_tcr@TPOFF,%rax) __(testq %rax,%rax) __(jne 1f) __endif __endif __(ref_global(get_tcr,%rax)) __(movq $1,%carg0) __ifdef(`WINDOWS') __(sub $0x20, %rsp) __endif __(call *%rax) __ifdef(`WINDOWS') __(add $0x20, %rsp) __endif __ifdef(`TCR_IN_GPR') __(movq %rax, %rcontext_reg) __endif 1: /* Align foreign stack for lisp */ __(pushq rcontext(tcr.save_rbp)) /* mark cstack frame's "owner" */ __(pushq rcontext(tcr.foreign_sp)) /* init lisp registers */ __(movq %csave0,%rax) __(movq %rsp,rcontext(tcr.foreign_sp)) __ifndef(`TCR_IN_GPR') __(clr %save3) __endif __(clr %save2) __(clr %save1) __(clr %save0) __(clr %arg_z) __(clr %arg_y) __(clr %arg_x) __(clr %temp2) __(clr %temp1) __(clr %temp0) __(clr %fn) __(pxor %fpzero,%fpzero) __(movq rcontext(tcr.save_vsp),%rsp) __(box_fixnum(%rax,%arg_y)) __(movq %rbp,%arg_z) __(movq rcontext(tcr.save_rbp),%rbp) __(movq $TCR_STATE_LISP,rcontext(tcr.valence)) __(movq (%rsp),%save0) __(movq 8(%rsp),%save1) __(movq 16(%rsp),%save2) __ifndef(`TCR_IN_GPR') __(movq 24(%rsp),%save3) __endif __(ldmxcsr rcontext(tcr.lisp_mxcsr)) __(movq $nrs.callbacks,%fname) __(lea local_label(back_from_callback)(%rip),%ra0) __(set_nargs(2)) __(push %ra0) __(jump_fname()) __(tra(local_label(back_from_callback))) __(movq %rsp,rcontext(tcr.save_vsp)) __(movq %rbp,rcontext(tcr.save_rbp)) __(movq rcontext(tcr.foreign_sp),%rsp) __(stmxcsr rcontext(tcr.lisp_mxcsr)) __(movq $TCR_STATE_FOREIGN,rcontext(tcr.valence)) __(emms) __(pop rcontext(tcr.foreign_sp)) __(addq $node_size,%rsp) __(ldmxcsr rcontext(tcr.foreign_mxcsr)) __(pop %rbp) __ifdef(`WINDOWS') __(pop %csave6) __(pop %csave5) __endif __(pop %csave4) __(pop %csave3) __(pop %csave2) __(pop %csave1) __(pop %csave0) __(ldmxcsr (%rsp)) __(addq $16,%rsp) __(movq -8(%rbp),%rax) __(movq -16(%rbp),%rdx) __(movq -24(%rbp),%xmm0) __(movq -32(%rbp),%xmm1) __(leave) __(ret) _endsubp(callback) /* arg_x = array, arg_y = i, arg_z = j. Typecheck everything. We don't know whether the array is alleged to be simple or not, and don't know anythng about the element type. */ _spentry(aref2) __(testb $fixnummask,%arg_y_b) __(jne 0f) __(testb $fixnummask,%arg_z_b) __(jne 1f) __(extract_typecode(%arg_x,%imm0)) __(cmpb $subtag_arrayH,%imm0_b) __(jne 2f) __(cmpq $2< 1 (and we know that it was < 3), it must have */ /* been 2. Set arg_x, then vpush the remaining args. */ __(cmpl $fixnumone,%nargs) __(jle local_label(set_y_z)) local_label(set_arg_x): __(subq $node_size,%temp1) __(movq misc_data_offset(%fn,%temp1),%arg_x) __(addl $fixnumone,%nargs) __(subq $fixnumone,%imm0) __(jne local_label(vpush_remaining)) __(jmp local_label(go)) /* Maybe set arg_y or arg_z, preceding args */ local_label(set_y_z): __(jne local_label(set_arg_z)) /* Set arg_y, maybe arg_x, preceding args */ local_label(set_arg_y): __(subq $node_size,%temp1) __(movq misc_data_offset(%fn,%temp1),%arg_y) __(addl $fixnumone,%nargs) __(subq $fixnum_one,%imm0) __(jnz local_label(set_arg_x)) __(jmp local_label(go)) local_label(set_arg_z): __(subq $node_size,%temp1) __(movq misc_data_offset(%fn,%temp1),%arg_z) __(addl $fixnumone,%nargs) __(subq $fixnum_one,%imm0) __(jne local_label(set_arg_y)) local_label(go): __(movq misc_data_offset+(4*node_size)(%fn),%fn) __(push %ra0) __(jmp *%fn) local_label(regs_only): __(leaq 5<