Changeset 6531
- Timestamp:
- May 9, 2007, 2:03:33 AM (18 years ago)
- File:
-
- 1 edited
-
trunk/ccl/lisp-kernel/x86-spentry64.s (modified) (143 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/lisp-kernel/x86-spentry64.s
r6253 r6531 37 37 jump_fname() 38 38 ]) 39 40 39 41 40 42 _spentry(bad_funcall) … … 55 57 __(xorq %imm1,%imm0) 56 58 __(movq %imm0,misc_data_offset(%arg_z)) 57 __( jmp *%ra0)59 __(ret) 58 60 _endsubp(fix_overflow) 59 61 60 62 61 63 /* Make a lisp integer (fixnum or two-digit bignum) from the signed */ 62 64 /* 64-bit value in %imm0. */ … … 73 75 __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(2))) 74 76 __(movq %mm0,misc_data_offset(%arg_z)) 75 0: __( jmp *%ra0)77 0: __(repret) 76 78 _endsubp(makes64) 77 79 80 78 81 79 82 /* %imm1:%imm0 constitute a signed integer, almost certainly a bignum. */ … … 111 114 __(movq %mm0,misc_data_offset(%arg_z)) 112 115 __(movq %mm1,misc_data_offset+8(%arg_z)) 113 __( jmp *%ra0)116 __(ret) 114 117 3: __(mov $three_digit_bignum_header,%imm0) 115 118 __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(3))) 116 119 __(movq %mm0,misc_data_offset(%arg_z)) 117 120 __(movd %mm1,misc_data_offset+8(%arg_z)) 118 __( jmp *%ra0)121 __(ret) 119 122 _endfn 120 123 124 121 125 /* %imm1:%imm0 constitute an unsigned integer, almost certainly a bignum. */ 122 126 /* Make a lisp integer out of those 128 bits .. */ … … 152 156 __(movq %mm0,misc_data_offset(%arg_z)) 153 157 __(movd %mm1,misc_data_offset+8(%arg_z)) 154 __( jmp *%ra0)158 __(ret) 155 159 4: __(movq $four_digit_bignum_header,%imm0) 156 160 __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(4))) … … 160 164 6: __(movq %mm0,misc_data_offset(%arg_z)) 161 165 __(movq %mm0,misc_data_offset+8(%arg_z)) 162 __( jmpq *%ra0)166 __(ret) 163 167 _endfn 164 168 … … 186 190 _startfn(C(misc_ref_common)) 187 191 __(movzbl %imm1_b,%imm1_l) 188 __(lea local_label(misc_ref_jmp)(%rip),% temp2)189 __(jmp *(% temp2,%imm1,8))192 __(lea local_label(misc_ref_jmp)(%rip),%imm2) 193 __(jmp *(%imm2,%imm1,8)) 190 194 .p2align 3 191 195 local_label(misc_ref_jmp): … … 475 479 local_label(misc_ref_node): 476 480 __(movq misc_data_offset(%arg_y,%arg_z),%arg_z) 477 __( jmp *%ra0)481 __(ret) 478 482 local_label(misc_ref_u64): 479 483 __(movq misc_data_offset(%arg_y,%arg_z),%imm0) … … 484 488 __(Misc_Alloc_Fixed(%arg_z,double_float.size)) 485 489 __(movsd %fp1,double_float.value(%arg_z)) 486 __( jmp *%ra0)490 __(ret) 487 491 local_label(misc_ref_fixnum_vector): 488 492 __(movq misc_data_offset(%arg_y,%arg_z),%imm0) 489 493 __(box_fixnum(%imm0,%arg_z)) 490 __( jmp *%ra0)494 __(ret) 491 495 local_label(misc_ref_s64): 492 496 __(movq misc_data_offset(%arg_y,%arg_z),%imm0) … … 497 501 __(movl misc_data_offset(%arg_y,%imm0),%imm0_l) 498 502 __(box_fixnum(%imm0,%arg_z)) 499 __( jmp *%ra0)503 __(ret) 500 504 local_label(misc_ref_s32): 501 505 __(movq %arg_z,%imm0) … … 503 507 __(movslq misc_data_offset(%arg_y,%imm0),%imm0) 504 508 __(box_fixnum(%imm0,%arg_z)) 505 __( jmp *%ra0)509 __(ret) 506 510 local_label(misc_ref_single_float_vector): 507 511 __(movq %arg_z,%imm0) … … 511 515 __(shl $32,%imm0) 512 516 __(lea subtag_single_float(%imm0),%arg_z) 513 __( jmp *%ra0)517 __(ret) 514 518 local_label(misc_ref_u8): 515 519 __(movq %arg_z,%imm0) … … 517 521 __(movzbl misc_data_offset(%arg_y,%imm0),%imm0_l) 518 522 __(box_fixnum(%imm0,%arg_z)) 519 __( jmp *%ra0)523 __(ret) 520 524 local_label(misc_ref_s8): 521 525 __(movq %arg_z,%imm0) … … 523 527 __(movsbq misc_data_offset(%arg_y,%imm0),%imm0) 524 528 __(box_fixnum(%imm0,%arg_z)) 525 __( jmp *%ra0)529 __(ret) 526 530 local_label(misc_ref_string): 527 531 __(movq %arg_z,%imm0) … … 530 534 __(shlq $charcode_shift,%imm0) 531 535 __(leaq subtag_character(%imm0),%arg_z) 532 __( jmp *%ra0)536 __(ret) 533 537 local_label(misc_ref_new_string): 534 538 __(movq %arg_z,%imm0) … … 537 541 __(shlq $charcode_shift,%imm0) 538 542 __(leaq subtag_character(%imm0),%arg_z) 539 __( jmp *%ra0)543 __(ret) 540 544 local_label(misc_ref_u16): 541 545 __(movq %arg_z,%imm0) … … 543 547 __(movzwl misc_data_offset(%arg_y,%imm0),%imm0_l) 544 548 __(box_fixnum(%imm0,%arg_z)) 545 __( jmp *%ra0)549 __(ret) 546 550 local_label(misc_ref_s16): 547 551 __(movq %arg_z,%imm0) … … 549 553 __(movswq misc_data_offset(%arg_y,%imm0),%imm0) 550 554 __(box_fixnum(%imm0,%arg_z)) 551 __( jmp *%ra0)555 __(ret) 552 556 local_label(misc_ref_bit_vector): 553 557 __(unbox_fixnum(%arg_z,%imm0)) … … 560 564 __(andl $fixnum_one,%imm0_l) 561 565 __(movq %imm0,%arg_z) 562 __( jmp *%ra0)566 __(ret) 563 567 local_label(misc_ref_invalid): 564 568 __(movq $XBADVEC,%arg_x) … … 628 632 _startfn(C(misc_set_common)) 629 633 __(movzbl %imm1_b,%imm1_l) 630 __(lea local_label(misc_set_jmp)(%rip),% temp2)631 __(jmp *(% temp2,%imm1,8))634 __(lea local_label(misc_set_jmp)(%rip),%imm2) 635 __(jmp *(%imm2,%imm1,8)) 632 636 .p2align 3 633 637 local_label(misc_set_jmp): … … 939 943 __(jne local_label(misc_set_bad)) 940 944 9: __(movq %imm0,misc_data_offset(%arg_x,%arg_y)) 941 __( jmp *%ra0)945 __(ret) 942 946 local_label(misc_set_fixnum_vector): 943 947 __(movq %arg_z,%imm0) … … 946 950 __(jne local_label(misc_set_bad)) 947 951 __(movq %imm0,misc_data_offset(%arg_x,%arg_y)) 948 __( jmp *%ra0)952 __(ret) 949 953 local_label(misc_set_s64): 950 954 __(movq %arg_z,%imm0) … … 964 968 __(jne local_label(misc_set_bad)) 965 969 9: __(movq %imm0,misc_data_offset(%arg_x,%arg_y)) 966 __( jmp *%ra0)970 __(ret) 967 971 local_label(misc_set_bad): 968 972 __(movq %arg_z,%arg_y) … … 980 984 __(movq double_float.value(%arg_z),%imm0) 981 985 __(movq %imm0,misc_dfloat_offset(%arg_x,%arg_y)) 982 __( jmp *%ra0)986 __(ret) 983 987 local_label(misc_set_s32): 984 988 __(movq %arg_z,%imm0) … … 993 997 __(shr $fixnumshift,%imm0) 994 998 __(movl %imm0_l,misc_data_offset(%arg_x,%imm1)) 995 __( jmp *%ra0)999 __(ret) 996 1000 local_label(misc_set_single_float_vector): 997 1001 __(cmpb $tag_single_float,%arg_z_b) … … 1002 1006 __(shr $32,%imm0) 1003 1007 __(movl %imm0_l,misc_data_offset(%arg_x,%imm1)) 1004 __( jmp *%ra0)1008 __(ret) 1005 1009 local_label(misc_set_u32): 1006 1010 __(movq %arg_y,%imm1) … … 1011 1015 __(unbox_fixnum(%arg_z,%imm0)) 1012 1016 __(movl %imm0_l,misc_data_offset(%arg_x,%imm1)) 1013 __( jmp *%ra0)1017 __(ret) 1014 1018 local_label(misc_set_bit_vector): 1015 1019 __(testq $~fixnumone,%arg_z) … … 1023 1027 local_label(misc_set_set_bit): 1024 1028 __(btsq %imm0,misc_data_offset(%arg_x,%imm1,8)) 1025 __( jmp *%ra0)1029 __(ret) 1026 1030 local_label(misc_set_clr_bit): 1027 1031 __(btrq %imm0,misc_data_offset(%arg_x,%imm1,8)) 1028 __( jmp *%ra0)1032 __(ret) 1029 1033 local_label(misc_set_u8): 1030 1034 __(testq $~(0xff<<fixnumshift),%arg_z) … … 1034 1038 __(shrq $3,%imm1) 1035 1039 __(movb %imm0_b,misc_data_offset(%arg_x,%imm1)) 1036 __( jmp *%ra0)1040 __(ret) 1037 1041 local_label(misc_set_s8): 1038 1042 __(movq %arg_z,%imm0) … … 1047 1051 __(shrq $3,%imm1) 1048 1052 __(movb %imm0_b,misc_data_offset(%arg_x,%imm1)) 1049 __( jmp *%ra0)1053 __(ret) 1050 1054 local_label(misc_set_string): 1051 1055 __(cmpb $subtag_character,%arg_z_b) … … 1056 1060 __(shrq $3,%imm1) 1057 1061 __(movb %imm0_b,misc_data_offset(%arg_x,%imm1)) 1058 __( jmp *%ra0)1062 __(ret) 1059 1063 local_label(misc_set_new_string): 1060 1064 __(cmpb $subtag_character,%arg_z_b) … … 1065 1069 __(shrq $1,%imm1) 1066 1070 __(movl %imm0_l,misc_data_offset(%arg_x,%imm1)) 1067 __( jmp *%ra0)1071 __(ret) 1068 1072 local_label(misc_set_s16): 1069 1073 __(movq %arg_z,%imm0) … … 1078 1082 __(shrq $fixnumshift,%imm0) 1079 1083 __(movw %imm0_w,misc_data_offset(%arg_x,%imm1)) 1080 __( jmp *%ra0)1084 __(ret) 1081 1085 local_label(misc_set_u16): 1082 1086 __(movq %arg_y,%imm1) … … 1086 1090 __(unbox_fixnum(%arg_z,%imm0)) 1087 1091 __(movw %imm0_w,misc_data_offset(%arg_x,%imm1)) 1088 __( jmp *%ra0)1092 __(ret) 1089 1093 local_label(misc_set_invalid): 1090 1094 __(push $XSETBADVEC) … … 1100 1104 .globl C(ret1valn) 1101 1105 __(tra(C(ret1valn))) 1102 __(pop%ra0)1103 __(push %arg_z)1106 __(movq (%rsp),%ra0) 1107 __(movq %arg_z,(%rsp)) 1104 1108 __(set_nargs(1)) 1105 1109 __(jmpq *%ra0) … … 1118 1122 __(cmovneq -node_size(%rsp,%nargs_q),%arg_z) 1119 1123 __(leaveq) 1120 __(popq %ra0)1121 __(jmp *%ra0) 1124 __(ret) 1125 1122 1126 1123 1127 /* actually need to return values ; always need to copy */ … … 1155 1159 1156 1160 _spentry(mkcatch1v) 1157 __( Make_Catch(0))1158 __( jmp *%ra0)1161 __(nMake_Catch(0)) 1162 __(ret) 1159 1163 _endsubp(mkcatch1v) 1160 1164 … … 1164 1168 __(jmp *%ra0) 1165 1169 _endsubp(mkunwind) 1170 1171 /* this takes a return address in %ra0; it's "new" in that it does the 1172 double binding of *interrupt-level* out-of-line */ 1173 _spentry(nmkunwind) 1174 __(movq %rcontext:tcr.tlb_pointer,%arg_x) 1175 __(movq INTERRUPT_LEVEL_BINDING_INDEX(%arg_x),%arg_y) 1176 __(push %arg_y) 1177 __(push $INTERRUPT_LEVEL_BINDING_INDEX) 1178 __(push %rcontext:tcr.db_link) 1179 __(movq %rsp,%rcontext:tcr.db_link) 1180 __(movq $-1<<fixnumshift,INTERRUPT_LEVEL_BINDING_INDEX(%arg_x)) 1181 __(movq $undefined,%arg_z) 1182 __(Make_Catch(fixnumone)) 1183 __(movq %arg_y,%arg_z) 1184 __(jmp _SPbind_interrupt_level) 1185 _endsubp(nmkunwind) 1166 1186 1167 1187 _spentry(mkcatchmv) 1168 __( Make_Catch(fixnumone))1169 __( jmp *%ra0)1188 __(nMake_Catch(fixnumone)) 1189 __(ret) 1170 1190 _endsubp(mkcatchmv) 1171 1191 1172 1192 _spentry(throw) 1173 1193 __(movq %rcontext:tcr.catch_top,%imm1) … … 1204 1224 __(jz local_label(_threw_one_value_dont_unbind)) 1205 1225 __(lea local_label(_threw_one_value_dont_unbind)(%rip),%ra0) 1226 __(push %ra0) 1206 1227 __(jmp _SPunbind_to) 1207 1228 __(tra(local_label(_threw_one_value_dont_unbind))) … … 1233 1254 __(cmpq %imm0,%imm1) 1234 1255 __(je local_label(_threw_multiple_dont_unbind)) 1235 __(leaq local_label(_threw_multiple_dont_unbind)(%rip),%r10) 1256 __(leaq local_label(_threw_multiple_dont_unbind)(%rip),%ra0) 1257 __(push %ra0) 1236 1258 __(jmp _SPunbind_to) 1237 1259 __(tra(local_label(_threw_multiple_dont_unbind))) … … 1285 1307 __(push %ra0) 1286 1308 __(leaq local_label(_nthrowv_back_from_unbind)(%rip),%ra0) 1309 __(push %ra0) 1287 1310 __(jmp _SPunbind_to) 1288 1311 __(tra(local_label(_nthrowv_back_from_unbind))) … … 1371 1394 /* Ready to call cleanup code. set up tra, jmp to %xfn */ 1372 1395 __(leaq local_label(_nthrowv_called_cleanup)(%rip),%ra0) 1396 __(push %ra0) 1373 1397 __(movb $0,%rcontext:tcr.unwinding) 1374 1398 __(jmp *%xfn) … … 1421 1445 __(push %ra0) 1422 1446 __(leaq local_label(_nthrow1v_back_from_unbind)(%rip),%ra0) 1447 __(push %ra0) 1423 1448 __(jmp _SPunbind_to) 1424 1449 __(tra(local_label(_nthrow1v_back_from_unbind))) … … 1479 1504 __(leaq local_label(_nthrow1v_called_cleanup)(%rip),%ra0) 1480 1505 __(movb $0,%rcontext:tcr.unwinding) 1506 __(push %ra0) 1481 1507 __(jmp *%xfn) 1482 1508 __(tra(local_label(_nthrow1v_called_cleanup))) … … 1522 1548 __(movq $XSYMNOBIND,%arg_y) 1523 1549 __(set_nargs(2)) 1550 __(push %ra0) 1524 1551 __(jmp _SPksignalerr) 1525 1552 _endsubp(bind) … … 1552 1579 9: __(movq $XSYMNOBIND,%arg_y) 1553 1580 __(set_nargs(2)) 1581 __(push %ra0) 1554 1582 __(jmp _SPksignalerr) 1555 1583 _endsubp(bind_self) … … 1572 1600 9: __(movq $XSYMNOBIND,%arg_y) 1573 1601 __(set_nargs(2)) 1602 __(push %ra0) 1574 1603 __(jmp _SPksignalerr) 1575 1604 _endsubp(bind_nil) … … 1606 1635 9: __(movq $XSYMNOBIND,%arg_y) 1607 1636 __(set_nargs(2)) 1637 __(push %ra0) 1608 1638 __(jmp _SPksignalerr) 1609 1639 _endsubp(bind_self_boundp_check) … … 1720 1750 /* setting the bit needs to be done atomically, unless we're sure that other */ 1721 1751 /* threads are suspended.) */ 1722 /* We can unconditionally set the suspended thread's RIP to its RA0. */1752 /* We can unconditionally set the suspended thread's RIP to the return address. */ 1723 1753 1724 1754 … … 1729 1759 __(_rplaca(%arg_y,%arg_z)) 1730 1760 __(ja 1f) 1731 0: __( jmp *%ra0)1761 0: __(repret) 1732 1762 1: __(movq %arg_y,%imm0) 1733 1763 __(subq lisp_global(heap_start),%imm0) … … 1742 1772 __(lock) 1743 1773 __(btsq %imm0,(%temp0,%imm1,8)) 1744 __( jmp *%ra0)1774 __(ret) 1745 1775 _endsubp(rplaca) 1746 1776 … … 1751 1781 __(_rplacd(%arg_y,%arg_z)) 1752 1782 __(ja 1f) 1753 0: __( jmp *%ra0)1783 0: __(repret) 1754 1784 1: __(movq %arg_y,%imm0) 1755 1785 __(subq lisp_global(heap_start),%imm0) … … 1764 1794 __(lock) 1765 1795 __(btsq %imm0,(%temp0,%imm1,8)) 1766 __( jmp *%ra0)1796 __(ret) 1767 1797 _endsubp(rplacd) 1768 1798 … … 1776 1806 __(movq %arg_z,misc_data_offset(%arg_x,%arg_y)) 1777 1807 __(ja 1f) 1778 0: __( jmp *%ra0)1808 0: __(repret) 1779 1809 1: __(lea misc_data_offset(%arg_x,%arg_y),%imm0) 1780 1810 __(subq lisp_global(heap_start),%imm0) … … 1789 1819 __(lock) 1790 1820 __(btsq %imm0,(%temp0,%imm1,8)) 1791 __( jmp *%ra0)1821 __(ret) 1792 1822 _endsubp(gvset) 1793 1823 … … 1803 1833 __(movq %arg_z,misc_data_offset(%arg_x,%arg_y)) 1804 1834 __(ja 1f) 1805 0: __( jmp *%ra0)1835 0: __(repret) 1806 1836 1: __(lea misc_data_offset(%arg_x,%arg_y),%imm0) 1807 1837 __(subq lisp_global(heap_start),%imm0) … … 1826 1856 __(lock) 1827 1857 __(btsq %imm0,(%temp0,%imm1,8)) 1828 __( jmp *%ra0)1858 __(ret) 1829 1859 _endsubp(set_hash_key) 1830 1860 … … 1863 1893 C(egc_write_barrier_end): 1864 1894 2: __(movl $t_value,%arg_z_l) 1865 __( jmp *%ra0)1895 __(ret) 1866 1896 3: __(movl $nil_value,%arg_z_l) 1867 __( jmp *%ra0)1897 __(ret) 1868 1898 _endsubp(store_node_conditional) 1869 1899 … … 1904 1934 8: __(movq $XIMPROPERLIST,%arg_y) 1905 1935 __(set_nargs(2)) 1936 __(push %ra0) 1906 1937 __(jmp _SPksignalerr) 1907 1938 9: /* Whew */ … … 1922 1953 __(jne 2f) 1923 1954 __(TSP_Alloc_Fixed(2*node_size,%imm0)) 1924 __( jmp *%ra0)1955 __(ret) 1925 1956 2: __(movq %imm0,%imm1) 1926 1957 __(add %imm1,%imm1) … … 1952 1983 __(jne 3b) 1953 1984 __(movq %temp1,%rcontext:tcr.db_link) 1954 __( jmp *%ra0)1985 __(ret) 1955 1986 _endsubp(progvsave) 1956 1987 … … 2016 2047 __(movq %imm0,tsp_frame.fixed_overhead(%temp0)) 2017 2048 __(leaq tsp_frame.fixed_overhead+fulltag_misc(%temp0),%arg_z) 2018 __( jmp *%ra0)2049 __(ret) 2019 2050 local_label(stack_misc_alloc_heap_alloc_ivector): 2020 2051 __(movq %rcontext:tcr.foreign_sp,%imm1) … … 2031 2062 __(movq %imm0,(%temp0)) 2032 2063 __(leaq fulltag_misc(%temp0),%arg_z) 2033 __( jmp *%ra0)2064 __(ret) 2034 2065 local_label(stack_misc_alloc_heap_alloc_gvector): 2035 2066 __(TSP_Alloc_Fixed(0,%imm0)) … … 2074 2105 2075 2106 _spentry(values) 2107 __(movq (%temp0),%ra0) 2076 2108 __(ref_global(ret1val_addr,%imm1)) 2077 2109 __(cmpq %imm1,%ra0) … … 2082 2114 __(cmovneq -node_size(%rsp,%nargs_q),%arg_z) 2083 2115 __(movq %temp0,%rsp) 2084 __( jmp *%ra0)2085 0: __(movq (%temp0),%ra0)2086 __(lea node_size(%temp0),%temp0)2116 __(ret) 2117 0: __(movq 8(%temp0),%ra0) 2118 __(addq $2*node_size,%temp0) 2087 2119 __(lea (%rsp,%nargs_q),%imm0) 2088 2120 __(jmp 2f) 2089 1: __( lea -node_size(%imm0),%imm0)2121 1: __(subq $node_size,%imm0) 2090 2122 __(movq (%imm0),%temp1) 2091 __( lea -node_size(%temp0),%temp0)2123 __(subq $node_size,%temp0) 2092 2124 __(movq %temp1,(%temp0)) 2093 2125 2: __(cmpq %imm0,%rsp) … … 2312 2344 __(movl $XBADKEYS,%arg_y_l) 2313 2345 __(set_nargs(2)) 2346 __(push %ra0) 2314 2347 __(jmp _SPksignalerr) 2315 2348 9: __(jmp *%ra0) … … 2387 2420 2388 2421 2389 /* Prepend all but the first four (3 words of code, inner fn) and last */2390 /* (lfbits) elements of %fn to the "arglist". */2391 2392 _spentry(call_closure)2393 __(subq $fulltag_function-fulltag_misc,%fn)2394 __(vector_length(%fn,%imm0))2395 __(movzwl %nargs,%nargs_l)2396 2397 __(subq $5<<fixnumshift,%imm0) /* imm0 = inherited arg count */2398 __(cmpw $nargregs<<fixnumshift,%nargs)2399 __(jna,pt local_label(no_insert))2400 2401 /* Some arguments have already been pushed. Push imm0's worth */2402 /* of NILs, copy those arguments that have already been vpushed from */2403 /* the old TOS to the new, then insert all of the inerited args */2404 /* and go to the function. */2405 2406 __(movq %imm0,%imm1)2407 local_label(push_nil_loop):2408 __(push $nil_value)2409 __(sub $fixnumone,%imm1)2410 __(jne local_label(push_nil_loop))2411 2412 /* Need to use arg regs as temporaries here. */2413 __(movq %rsp,%temp1)2414 __(push %arg_z)2415 __(push %arg_y)2416 __(push %arg_x)2417 __(lea 3*node_size(%rsp,%imm0),%arg_x)2418 __(lea -nargregs<<fixnumshift(%nargs_q),%arg_y)2419 local_label(copy_already_loop):2420 __(movq (%arg_x),%arg_z)2421 __(addq $fixnumone,%arg_x)2422 __(movq %arg_z,(%temp1))2423 __(addq $fixnumone,%temp1)2424 __(subq $fixnumone,%arg_y)2425 __(jne local_label(copy_already_loop))2426 2427 __(movl $4<<fixnumshift,%imm1_l) /* skip code, new fn */2428 local_label(insert_loop):2429 __(movq misc_data_offset(%fn,%imm1),%arg_z)2430 __(addq $node_size,%imm1)2431 __(addw $fixnum_one,%nargs)2432 __(subq $node_size,%arg_x)2433 __(movq %arg_z,(%arg_x))2434 __(subq $fixnum_one,%imm0)2435 __(jne local_label(insert_loop))2436 2437 /* Recover the argument registers, pushed earlier */2438 __(pop %arg_x)2439 __(pop %arg_y)2440 __(pop %arg_z)2441 __(jmp local_label(go))2442 2443 /* Here if nothing was pushed by the caller. If we're */2444 /* going to push anything, we have to reserve a stack */2445 /* frame first. (We'll need to push something if the */2446 /* sum of %nargs and %imm0 is greater than nargregs) */2447 2448 local_label(no_insert):2449 __(lea (%nargs_q,%imm0),%imm1)2450 __(cmpq $nargregs<<fixnumshift,%imm1)2451 __(jna local_label(no_insert_no_frame))2452 /* Reserve space for a stack frame */2453 __(push $reserved_frame_marker)2454 __(push $reserved_frame_marker)2455 local_label(no_insert_no_frame):2456 /* nargregs or fewer args were already vpushed. */2457 /* if exactly nargregs, vpush remaining inherited vars. */2458 __(cmpw $nargregs<<fixnumshift,%nargs)2459 __(movl $4<<fixnumshift,%imm1_l) /* skip code, new fn */2460 __(leaq 4<<fixnumshift(%imm0),%temp1)2461 __(jnz local_label(set_regs))2462 local_label(vpush_remaining):2463 __(push misc_data_offset(%fn,%imm1))2464 __(addq $node_size,%imm1)2465 __(addw $fixnumone,%nargs)2466 __(subq $node_size,%imm0)2467 __(jnz local_label(vpush_remaining))2468 __(jmp local_label(go))2469 local_label(set_regs):2470 /* if nargs was > 1 (and we know that it was < 3), it must have */2471 /* been 2. Set arg_x, then vpush the remaining args. */2472 __(cmpw $fixnumone,%nargs)2473 __(jle local_label(set_y_z))2474 local_label(set_arg_x):2475 __(subq $node_size,%temp1)2476 __(movq misc_data_offset(%fn,%temp1),%arg_x)2477 __(addw $fixnumone,%nargs)2478 __(subq $fixnumone,%imm0)2479 __(jne local_label(vpush_remaining))2480 __(jmp local_label(go))2481 /* Maybe set arg_y or arg_z, preceding args */2482 local_label(set_y_z):2483 __(jne local_label(set_arg_z))2484 /* Set arg_y, maybe arg_x, preceding args */2485 local_label(set_arg_y):2486 __(subq $node_size,%temp1)2487 __(movq misc_data_offset(%fn,%temp1),%arg_y)2488 __(addw $fixnumone,%nargs)2489 __(subq $fixnum_one,%imm0)2490 __(jnz local_label(set_arg_x))2491 __(jmp local_label(go))2492 local_label(set_arg_z):2493 __(subq $node_size,%temp1)2494 __(movq misc_data_offset(%fn,%temp1),%arg_z)2495 __(addw $fixnumone,%nargs)2496 __(subq $fixnum_one,%imm0)2497 __(jne local_label(set_arg_y))2498 local_label(go):2499 __(movq misc_data_offset+(3*node_size)(%fn),%fn)2500 __(jmp *%fn)2501 _endsubp(call_closure)2502 2422 2503 2423 _spentry(getxlong) … … 2548 2468 __(movq $XNOSPREAD,%arg_y) 2549 2469 __(set_nargs(2)) 2470 __(push %ra0) 2550 2471 __(jmp _SPksignalerr) 2551 2472 _endsubp(spreadargz) … … 2570 2491 __(lea (%rbp,%imm1),%rsp) 2571 2492 __(movq 8(%rbp),%ra0) 2572 __(movq 0(%rbp),%rbp) 2493 __(movq (%rbp),%rbp) 2494 __(pushq %ra0) 2573 2495 __(do_funcall()) 2574 2496 /* All args in regs; exactly the same as the tfuncallvsp case */ 2575 2497 9: 2576 2498 __(leave) 2577 __(pop %ra0)2578 2499 __(do_funcall()) 2579 2500 _endsubp(tfuncallgen) … … 2594 2515 __(lea (%rbp,%imm1),%rsp) 2595 2516 __(movq 8(%rbp),%ra0) 2596 __(movq 0(%rbp),%rbp) 2517 __(movq (%rbp),%rbp) 2518 __(push %ra0) 2597 2519 __(do_funcall()) 2598 2520 _endsubp(tfuncallslide) … … 2601 2523 _spentry(tfuncallvsp) 2602 2524 __(leave) 2603 __(pop %ra0)2604 2525 __(do_funcall()) 2605 2526 _endsubp(tfuncallvsp) … … 2621 2542 __(lea (%rbp,%imm1),%rsp) 2622 2543 __(movq 8(%rbp),%ra0) 2623 __(movq 0(%rbp),%rbp) 2544 __(movq (%rbp),%rbp) 2545 __(pushq %ra0) 2624 2546 __(jump_fname()) 2625 2547 /* All args in regs; exactly the same as the tcallsymvsp case */ 2626 2548 9: 2627 2549 __(leave) 2628 __(pop %ra0)2629 2550 __(jump_fname()) 2630 2551 _endsubp(tcallsymgen) … … 2645 2566 __(movq 8(%rbp),%ra0) 2646 2567 __(movq 0(%rbp),%rbp) 2568 __(pushq %ra0) 2647 2569 __(jump_fname()) 2648 2570 _endsubp(tcallsymslide) … … 2650 2572 _spentry(tcallsymvsp) 2651 2573 __(leave) 2652 __(pop %ra0)2653 2574 __(jump_fname()) 2654 2575 _endsubp(tcallsymvsp) … … 2672 2593 __(movq lisp_frame.savera0(%rbp),%ra0) 2673 2594 __(movq lisp_frame.backlink(%rbp),%rbp) 2595 __(pushq %ra0) 2674 2596 __(jmp *%fn) 2675 2597 /* All args in regs; exactly the same as the tcallnfnvsp case */ … … 2677 2599 __(movq %temp0,%fn) 2678 2600 __(leave) 2679 __(pop %ra0)2680 2601 __(jmp *%fn) 2681 2602 _endsubp(tcallnfngen) … … 2697 2618 __(movq lisp_frame.savera0(%rbp),%ra0) 2698 2619 __(movq lisp_frame.backlink(%rbp),%rbp) 2620 __(pushq %ra0) 2699 2621 __(jmp *%fn) 2700 2622 _endsubp(tcallnfnslide) … … 2703 2625 __(movq %temp0,%fn) 2704 2626 __(leave) 2705 __(pop %ra0)2706 2627 __(jmp *%fn) 2707 2628 _endsubp(tcallnfnvsp) … … 2726 2647 __(movsd %fpzero,macptr.domain(%arg_z)) 2727 2648 __(movsd %fpzero,macptr.type(%arg_z)) 2728 __( jmp *%ra0)2649 __(ret) 2729 2650 1: __(movq %rcontext:tcr.foreign_sp,%imm1) 2730 2651 __(subq $dnode_size,%rcontext:tcr.foreign_sp) … … 2756 2677 2: __(cmpq %imm0,%imm1) 2757 2678 __(jne 1b) 2758 __( jmp *%ra0)2679 __(repret) 2759 2680 9: __(movq %rcontext:tcr.foreign_sp,%imm1) 2760 2681 __(subq $dnode_size,%rcontext:tcr.foreign_sp) … … 2783 2704 __(jge 0b) 2784 2705 __(movq %temp1,%arg_z) 2785 __( jmp *%ra0)2706 __(ret) 2786 2707 2: __(TSP_Alloc_Fixed(0,%imm0)) 2787 2708 __(jmp 4f) … … 2790 2711 __(jge 3b) 2791 2712 __(movq %temp1,%arg_z) 2792 __( jmp *%ra0)2713 __(ret) 2793 2714 _endsubp(makestacklist) 2794 2715 … … 2859 2780 __(dnode_align(%imm1,node_size,%imm1)) 2860 2781 __(Misc_Alloc(%arg_z)) 2861 __( jmp *%ra0)2782 __(ret) 2862 2783 local_label(misc_alloc_not_u56): 2863 2784 __(uuo_error_reg_not_type(Rarg_y,error_object_not_unsigned_byte_56)) … … 3053 2974 __(movq %whole_reg,%arg_z) 3054 2975 __(set_nargs(2)) 2976 __(push %ra0) 3055 2977 __(jmp _SPksignalerr) 3056 2978 _endfn(C(destbind1)) … … 3066 2988 __(movq %whole_reg,%arg_z) 3067 2989 __(set_nargs(2)) 2990 __(push %ra0) 3068 2991 __(jmp _SPksignalerr) 3069 2992 _endsubp(macro_bind) … … 3097 3020 __(shr $num_subtag_bits,%imm0) 3098 3021 __(movslq misc_data_offset-4(%arg_z,%imm0,4),%imm0) 3099 8: __( jmp *%ra0)3022 8: __(repret) 3100 3023 9: __(uuo_error_reg_not_type(Rarg_z,error_object_not_integer)) 3101 3024 _endsubp(integer_sign) … … 3258 3181 3259 3182 _spentry(misc_alloc_init) 3260 __(push %ra0)3261 3183 __(push %rbp) 3262 3184 __(movq %rsp,%rbp) … … 3265 3187 __(movq %arg_x,%arg_y) 3266 3188 __(lea local_label(misc_alloc_init_back)(%rip),%ra0) 3189 __(push %ra0) 3267 3190 __(jmp _SPmisc_alloc) 3268 3191 __(tra(local_label(misc_alloc_init_back))) 3269 3192 __(pop %arg_y) 3270 3193 __(leave) 3271 __(pop %ra0)3272 3194 __(movq $nrs.init_misc,%fname) 3273 3195 __(set_nargs(2)) … … 3276 3198 3277 3199 _spentry(stack_misc_alloc_init) 3278 __(push %ra0)3279 3200 __(push %rbp) 3280 3201 __(movq %rsp,%rbp) … … 3283 3204 __(movq %arg_x,%arg_y) 3284 3205 __(lea local_label(stack_misc_alloc_init_back)(%rip),%ra0) 3206 __(push %ra0) 3285 3207 __(jmp _SPstack_misc_alloc) 3286 3208 __(tra(local_label(stack_misc_alloc_init_back))) 3287 3209 __(pop %arg_y) 3288 3210 __(leave) 3289 __(pop %ra0)3290 3211 __(movq $nrs.init_misc,%fname) 3291 3212 __(set_nargs(2)) … … 3299 3220 C(popj): 3300 3221 __(leave) 3301 __(pop %ra0) 3302 __(jmp *%ra0) 3222 __(ret) 3303 3223 _endsubp(popj) 3304 3224 … … 3311 3231 __(jne 1f) 3312 3232 __(sarq $fixnumshift,%imm0) 3313 __( jmp *%ra0)3233 __(ret) 3314 3234 1: __(andb $tagmask,%imm0_b) 3315 3235 __(cmpb $tag_misc,%imm0_b) … … 3326 3246 __(testq %imm0,%imm0) 3327 3247 __(js 9f) 3328 __( jmp *%ra0)3248 __(repret) 3329 3249 3: __(movq misc_data_offset(%arg_z),%imm0) 3330 3250 __(cmpl $0,misc_data_offset+8(%arg_z)) 3331 3251 __(jne 9f) 3332 __( jmp *%ra0)3252 __(repret) 3333 3253 9: __(uuo_error_reg_not_type(Rarg_z,error_object_not_u64)) 3334 3254 _endsubp(getu64) … … 3350 3270 __(movq misc_data_offset(%arg_z),%imm0) 3351 3271 __(jne 9f) 3352 8: __( jmp *%ra0)3272 8: __(repret) 3353 3273 9: __(uuo_error_reg_not_type(Rarg_z,error_object_not_u64)) 3354 3274 _endsubp(gets64) … … 3370 3290 __(Misc_Alloc(%arg_z)) 3371 3291 __(movq %mm0,misc_data_offset(%arg_z)) 3372 __( jmp *%ra0)3292 __(ret) 3373 3293 3: __(movl $three_digit_bignum_header,%imm0_l) 3374 3294 __(movl $aligned_bignum_size(3),%imm1_l) 3375 3295 __(Misc_Alloc(%arg_z)) 3376 3296 __(movq %mm0,misc_data_offset(%arg_z)) 3377 9: __( jmp *%ra0)3297 9: __(repret) 3378 3298 _endsubp(makeu64) 3379 3299 … … 3390 3310 __(jne 8f) 3391 3311 7: __(movq symbol.vcell(%arg_y),%arg_z) 3392 8: __( jmp *%ra0)3312 8: __(repret) 3393 3313 _endsubp(specref) 3394 3314 … … 3403 3323 __(je 1f) 3404 3324 __(movq %arg_z,(%imm1,%imm0)) 3405 __( jmp *%ra0)3325 __(ret) 3406 3326 1: __(lea fulltag_misc-fulltag_symbol(%arg_y),%arg_x) 3407 3327 __(movq $1<<fixnumshift,%arg_y) … … 3422 3342 __(jne,pt 9f) 3423 3343 __(uuo_error_reg_unbound(Rarg_y)) 3424 9: __( jmp *%ra0)3344 9: __(repret) 3425 3345 _endsubp(specrefcheck) 3426 3346 … … 3457 3377 __(movq %arg_y,(%arg_x,%temp1)) 3458 3378 __(movq %imm1,%rcontext:tcr.db_link) 3459 __( jmp *%ra0)3379 __(ret) 3460 3380 _endsubp(unbind) 3461 3381 … … 3471 3391 __(jne 1b) 3472 3392 __(movq %imm1,%rcontext:tcr.db_link) 3473 __( jmp *%ra0)3393 __(ret) 3474 3394 _endsubp(unbind_n) 3475 3395 … … 3485 3405 __(jne 1b) 3486 3406 __(movq %imm1,%rcontext:tcr.db_link) 3487 __( jmp *%ra0)3407 __(ret) 3488 3408 _endsubp(unbind_to) 3489 3409 … … 3548 3468 __(movq %imm1,%rcontext:tcr.db_link) 3549 3469 __(js,pn 1f) 3550 0: __( jmp *%ra0)3470 0: __(repret) 3551 3471 1: __(testq %temp0,%temp0) 3552 3472 __(js 0b) 3553 3473 __(check_pending_enabled_interrupt(2f)) 3554 2: __( jmp *%ra0)3474 2: __(repret) 3555 3475 _endsubp(unbind_interrupt_level) 3556 3476 … … 3562 3482 __(shrq $fixnumshift,%imm0) 3563 3483 __(jne _SPunbind_n) 3564 __( jmp *%ra0)3484 __(repret) 3565 3485 _endsubp(progvrestore) 3566 3486 … … 3575 3495 __(addq %arg_y,%arg_z) 3576 3496 __(jo,pn C(fix_one_bit_overflow)) 3577 __( jmp *%ra0)3497 __(repret) 3578 3498 1: __(jump_builtin(_builtin_plus,2)) 3579 3499 _endsubp(builtin_plus) … … 3590 3510 __(subq %arg_y,%arg_z) 3591 3511 __(jo,pn C(fix_one_bit_overflow)) 3592 __( jmp *%ra0)3512 __(repret) 3593 3513 1: __(jump_builtin(_builtin_minus,2)) 3594 3514 _endsubp(builtin_minus) … … 3607 3527 __(jo 1f) 3608 3528 __(mov %imm0,%arg_z) 3609 __( jmp *%ra0)3529 __(ret) 3610 3530 1: __(unbox_fixnum(%arg_z,%imm0)) 3611 3531 __(unbox_fixnum(%arg_y,%imm1)) … … 3626 3546 __(rcmpq(%arg_z,%arg_y)) 3627 3547 __(condition_to_boolean(e,%imm0,%arg_z)) 3628 __( jmp *%ra0)3548 __(ret) 3629 3549 1: __(jump_builtin(_builtin_eq,2)) 3630 3550 _endsubp(builtin_eq) … … 3638 3558 __(rcmpq(%arg_z,%arg_y)) 3639 3559 __(condition_to_boolean(ne,%imm0,%arg_z)) 3640 __( jmp *%ra0)3560 __(ret) 3641 3561 1: __(jump_builtin(_builtin_ne,2)) 3642 3562 _endsubp(builtin_ne) … … 3650 3570 __(rcmpq(%arg_y,%arg_z)) 3651 3571 __(condition_to_boolean(g,%imm0,%arg_z)) 3652 __( jmp *%ra0)3572 __(ret) 3653 3573 1: __(jump_builtin(_builtin_gt,2)) 3654 3574 _endsubp(builtin_gt) … … 3662 3582 __(rcmpq(%arg_y,%arg_z)) 3663 3583 __(condition_to_boolean(ge,%imm0,%arg_z)) 3664 __( jmp *%ra0)3584 __(ret) 3665 3585 1: __(jump_builtin(_builtin_ge,2)) 3666 3586 _endsubp(builtin_ge) … … 3674 3594 __(rcmpq(%arg_y,%arg_z)) 3675 3595 __(condition_to_boolean(l,%imm0,%arg_z)) 3676 __( jmp *%ra0)3596 __(ret) 3677 3597 1: __(jump_builtin(_builtin_lt,2)) 3678 3598 _endsubp(builtin_lt) … … 3686 3606 __(rcmpq(%arg_y,%arg_z)) 3687 3607 __(condition_to_boolean(le,%imm0,%arg_z)) 3688 __( jmp *%ra0)3608 __(ret) 3689 3609 1: __(jump_builtin(_builtin_le,2)) 3690 3610 _endsubp(builtin_le) … … 3707 3627 __(jump_builtin(_builtin_eql,2)) 3708 3628 1: __(movl $t_value,%arg_z_l) 3709 __( jmp *%ra0)3629 __(ret) 3710 3630 2: __(movl $nil_value,%arg_z_l) 3711 __( jmp *%ra0)3631 __(ret) 3712 3632 _endsubp(builtin_eql) 3713 3633 … … 3725 3645 __(movq %arg_z,%arg_y) 3726 3646 __(vector_length(%arg_y,%arg_z)) 3727 __( jmp *%ra0)3647 __(ret) 3728 3648 1: /* vector header */ 3729 3649 __(movq vectorH.logsize(%arg_z),%arg_z) 3730 __( jmp *%ra0)3650 __(ret) 3731 3651 2: /* list. Maybe null, maybe dotted or circular. */ 3732 __(movq $-fixnumone,% temp2)3652 __(movq $-fixnumone,%imm2) 3733 3653 __(movq %arg_z,%temp0) /* fast pointer */ 3734 3654 __(movq %arg_z,%temp1) /* slow pointer */ 3735 3655 3: __(extract_lisptag(%temp0,%imm0)) 3736 3656 __(compare_reg_to_nil(%temp0)) 3737 __(leaq fixnumone(% temp2),%temp2)3657 __(leaq fixnumone(%imm2),%imm2) 3738 3658 __(je 9f) 3739 3659 __(cmpb $tag_list,%imm0_b) 3740 3660 __(jne 8f) 3741 3661 __(extract_lisptag(%temp1,%imm1)) 3742 __(testb $fixnumone,% temp2_b)3662 __(testb $fixnumone,%imm2_b) 3743 3663 __(_cdr(%temp0,%temp0)) 3744 3664 __(je 3b) … … 3751 3671 __(jump_builtin(_builtin_length,1)) 3752 3672 9: 3753 __(movq % temp2,%arg_z)3754 __( jmp *%ra0)3673 __(movq %imm2,%arg_z) 3674 __(ret) 3755 3675 _endsubp(builtin_length) 3756 3676 … … 3766 3686 __(jb 2f) 3767 3687 __(movl $nil_value,%arg_z_l) 3768 __( jmp *%ra0)3688 __(ret) 3769 3689 1: __(movl $t_value,%arg_z_l) 3770 __( jmp *%ra0)3690 __(ret) 3771 3691 2: 3772 3692 __(jump_builtin(_builtin_seqtype,1)) … … 3794 3714 __(jnz 4f) 3795 3715 __(movq %arg_x,%arg_z) 3796 __( jmp *%ra0)3716 __(ret) 3797 3717 4: __(cmpb $fulltag_nil,%arg_z_b) 3798 3718 5: __(jnz 1b) 3799 __( jmp *%ra0)3719 __(repret) 3800 3720 _endsubp(builtin_assq) 3801 3721 … … 3815 3735 __(movq %temp0,%arg_z) 3816 3736 3: __(jnz 1b) 3817 4: __( jmp *%ra0)3737 4: __(repret) 3818 3738 _endsubp(builtin_memq) 3819 3739 … … 3837 3757 __(bt %imm0,%arg_z) 3838 3758 __(condition_to_boolean(b,%imm0,%arg_z)) 3839 __( jmp *%ra0)3759 __(ret) 3840 3760 1: __(jump_builtin(_builtin_logbitp,2)) 3841 3761 _endsubp(builtin_logbitp) … … 3847 3767 __(jne 1f) 3848 3768 __(orq %arg_y,%arg_z) 3849 __( jmp *%ra0)3769 __(ret) 3850 3770 1: 3851 3771 __(jump_builtin(_builtin_logior,2)) … … 3859 3779 __(jne 1f) 3860 3780 __(andq %arg_y,%arg_z) 3861 __( jmp *%ra0)3781 __(ret) 3862 3782 1: 3863 3783 __(jump_builtin(_builtin_logand,2)) … … 3869 3789 __(negq %arg_z) 3870 3790 __(jo,pn C(fix_one_bit_overflow)) 3871 __( jmp *%ra0)3791 __(repret) 3872 3792 1: 3873 3793 __(jump_builtin(_builtin_negate,1)) … … 3880 3800 __(jne 1f) 3881 3801 __(xorq %arg_y,%arg_z) 3882 __( jmp *%ra0)3802 __(ret) 3883 3803 1: 3884 3804 __(jump_builtin(_builtin_logxor,2)) … … 3894 3814 _endsubp(builtin_aset1) 3895 3815 3896 /* We have to be a little careful here %cl has to be used for */3897 /* the (unboxed) shift count in all variable-length shifts, and */3898 /* %temp2 = %rcx. Zero all but the low 8 (or 6) bits of %rcx, */3899 /* so that the shift count doesn't confuse the GC. */3900 3816 3901 3817 _spentry(builtin_ash) … … 3909 3825 __(jnz 1f) 3910 3826 __(movq %arg_y,%arg_z) /* shift by 0 */ 3911 __( jmp *%ra0)3827 __(ret) 3912 3828 1: __(jns 3f) 3913 3829 __(rcmpq(%imm0,$-63)) … … 3915 3831 __(sar $63,%imm1) 3916 3832 __(box_fixnum(%imm1,%arg_z)) 3917 __( jmp *%ra0)3833 __(ret) 3918 3834 2: /* Right-shift by small fixnum */ 3919 3835 __(negb %imm0_b) 3920 3836 __(movzbl %imm0_b,%ecx) 3921 3837 __(sar %cl,%imm1) 3922 __(xorl %ecx,%ecx)3923 3838 __(box_fixnum(%imm1,%arg_z)) 3924 __( jmp *%ra0)3839 __(ret) 3925 3840 3: /* Left shift by fixnum. We cant shift by more than 63 bits, though */ 3926 3841 /* shifting by 64 is actually easy. */ … … 3938 3853 __(shld %cl,%imm0,%imm1) 3939 3854 __(shl %cl,%imm0) 3940 __(xorb %cl,%cl)3941 3855 __(jmp C(makes128)) 3942 3856 5: __(shld %cl,%imm0,%imm1) 3943 3857 __(shl %cl,%imm0) 3944 __(xorb %cl,%cl)3945 3858 __(jmp C(makes128)) 3946 3859 9: … … 3987 3900 0: 3988 3901 /* Save lisp registers */ 3902 __(push %rbp) 3903 __(movq %rsp,%rbp) 3989 3904 __(push %temp0) 3990 3905 __(push %temp1) … … 3996 3911 __(push %save1) 3997 3912 __(push %save2) 3998 __(push %save3) 3913 __(push %save3) /* 10 registers pushed after %rbp */ 3999 3914 __(push %fn) 4000 __(push %ra0)4001 __(push %rbp)4002 __(movq %rsp,%rbp)4003 3915 __(movq %rsp,%rcontext:tcr.save_vsp) 4004 3916 __(movq %rbp,%rcontext:tcr.save_rbp) … … 4059 3971 __(clr %temp0) 4060 3972 __(clr %fn) 4061 __(clr %ra0)4062 3973 __(pxor %fpzero,%fpzero) 4063 3974 /* Darwin's math library seems to be pretty casual … … 4070 3981 __(movq $TCR_STATE_LISP,%rcontext:tcr.valence) 4071 3982 __(movq %rcontext:tcr.save_vsp,%rsp) 4072 __(pop %rbp) 4073 __(pop %ra0) 3983 __(movq %rcontext:tcr.save_rbp,%rbp) 4074 3984 __(pop %fn) 4075 3985 __(pop %save3) … … 4085 3995 __(check_pending_interrupt(%temp0)) 4086 3996 __(pop %temp0) 4087 __(jmp *%ra0) 3997 __(leave) 3998 __(ret) 4088 3999 _endsubp(ffcall) 4089 4000 … … 4097 4008 0: 4098 4009 /* Save lisp registers */ 4010 __(push %rbp) 4011 __(movq %rsp,%rbp) 4099 4012 __(push %temp0) 4100 4013 __(push %temp1) … … 4109 4022 __(movq macptr.address(%arg_y),%rbx) /* %rbx non-volatile */ 4110 4023 __(push %fn) 4111 __(push %ra0)4112 __(push %rbp)4113 __(movq %rsp,%rbp)4114 4024 __(movq %rsp,%rcontext:tcr.save_vsp) 4115 4025 __(movq %rbp,%rcontext:tcr.save_rbp) … … 4174 4084 __(clr %temp0) 4175 4085 __(clr %fn) 4176 __(clr %ra0)4177 4086 __(pxor %fpzero,%fpzero) 4178 4087 /* Darwin's math library seems to be pretty casual … … 4185 4094 __(movq $TCR_STATE_LISP,%rcontext:tcr.valence) 4186 4095 __(movq %rcontext:tcr.save_vsp,%rsp) 4187 __(pop %rbp) 4188 __(pop %ra0) 4096 __(movq %rcontext:tcr.save_rbp,%rbp) 4189 4097 __(pop %fn) 4190 4098 __(pop %save3) … … 4200 4108 __(check_pending_interrupt(%temp0)) 4201 4109 __(pop %temp0) 4202 __(jmp *%ra0) 4110 __(leave) 4111 __(ret) 4203 4112 _endsubp(ffcall_returning_registers) 4204 4113 4205 4114 _spentry(syscall) 4206 4115 /* Save lisp registers */ 4116 __(push %rbp) 4117 __(movq %rsp,%rbp) 4207 4118 __(push %temp0) 4208 4119 __(push %temp1) … … 4216 4127 __(push %save3) 4217 4128 __(push %fn) 4218 __(push %ra0)4219 __(push %rbp)4220 __(movq %rsp,%rbp)4221 4129 __(movq %rsp,%rcontext:tcr.save_vsp) 4130 __(movq %rbp,%rcontext:tcr.save_rbp) 4222 4131 __(movq %rcontext:tcr.foreign_sp,%rsp) 4223 4132 __(movq $TCR_STATE_FOREIGN,%rcontext:tcr.valence) … … 4251 4160 __(clr %temp0) 4252 4161 __(clr %fn) 4253 __(clr %ra0)4254 4162 __(pxor %fpzero,%fpzero) 4255 4163 __(movq $TCR_STATE_LISP,%rcontext:tcr.valence) 4256 4164 __(movq %rcontext:tcr.save_vsp,%rsp) 4257 __(pop %rbp) 4258 __(pop %ra0) 4165 __(movq %rcontext:tcr.save_rbp,%rbp) 4259 4166 __(pop %fn) 4260 4167 __(pop %save3) … … 4269 4176 __(check_pending_interrupt(%temp0)) 4270 4177 __(pop %temp0) 4271 __(jmp *%ra0) 4178 __(leave) 4179 __(ret) 4272 4180 _endsubp(syscall) 4273 4181 … … 4405 4313 __(clr %temp0) 4406 4314 __(clr %fn) 4407 __(clr %ra0)4408 4315 __(pxor %fpzero,%fpzero) 4409 4316 __(movq $TCR_STATE_LISP,%rcontext:tcr.valence) … … 4416 4323 __(movq %rcontext:tcr.save_rbp,%rbp) 4417 4324 __(movq $nrs.callbacks,%fname) 4325 __(lea local_label(back_from_callback)(%rip),%ra0) 4418 4326 __(set_nargs(2)) 4419 __(lea local_label(back_from_callback)(%rip),%ra0)4327 __(push %ra0) 4420 4328 __(jump_fname()) 4421 4329 __(tra(local_label(back_from_callback))) … … 4604 4512 __(jmp 8b) 4605 4513 _endsubp(aset3) 4514 4606 4515 4516 4517 4518 /* Prepend all but the first five (4 words of code, inner fn) and last */ 4519 /* (lfbits) elements of %fn to the "arglist". */ 4520 4521 _spentry(call_closure) 4522 new_local_labels() 4523 __(subq $fulltag_function-fulltag_misc,%fn) 4524 __(vector_length(%fn,%imm0)) 4525 __(movzwl %nargs,%nargs_l) 4526 4527 __(subq $6<<fixnumshift,%imm0) /* imm0 = inherited arg count */ 4528 __(lea (%nargs_q,%imm0),%imm1) 4529 __(cmpw $nargregs<<fixnumshift,%imm1_w) 4530 __(jna,pt local_label(regs_only)) 4531 __(pop %ra0) 4532 __(cmpw $nargregs<<fixnumshift,%nargs) 4533 __(jna,pt local_label(no_insert)) 4534 4535 /* Some arguments have already been pushed. Push imm0's worth */ 4536 /* of NILs, copy those arguments that have already been vpushed from */ 4537 /* the old TOS to the new, then insert all of the inerited args */ 4538 /* and go to the function. */ 4539 4540 __(movq %imm0,%imm1) 4541 local_label(push_nil_loop): 4542 __(push $nil_value) 4543 __(sub $fixnumone,%imm1) 4544 __(jne local_label(push_nil_loop)) 4545 4546 /* Need to use arg regs as temporaries here. */ 4547 __(movq %rsp,%temp1) 4548 __(push %arg_z) 4549 __(push %arg_y) 4550 __(push %arg_x) 4551 __(lea 3*node_size(%rsp,%imm0),%arg_x) 4552 __(lea -nargregs<<fixnumshift(%nargs_q),%arg_y) 4553 local_label(copy_already_loop): 4554 __(movq (%arg_x),%arg_z) 4555 __(addq $fixnumone,%arg_x) 4556 __(movq %arg_z,(%temp1)) 4557 __(addq $fixnumone,%temp1) 4558 __(subq $fixnumone,%arg_y) 4559 __(jne local_label(copy_already_loop)) 4560 4561 __(movl $5<<fixnumshift,%imm1_l) /* skip code, new fn */ 4562 local_label(insert_loop): 4563 __(movq misc_data_offset(%fn,%imm1),%arg_z) 4564 __(addq $node_size,%imm1) 4565 __(addw $fixnum_one,%nargs) 4566 __(subq $node_size,%arg_x) 4567 __(movq %arg_z,(%arg_x)) 4568 __(subq $fixnum_one,%imm0) 4569 __(jne local_label(insert_loop)) 4570 4571 /* Recover the argument registers, pushed earlier */ 4572 __(pop %arg_x) 4573 __(pop %arg_y) 4574 __(pop %arg_z) 4575 __(jmp local_label(go)) 4576 4577 /* Here if nothing was pushed by the caller. If we're */ 4578 /* going to push anything, we have to reserve a stack */ 4579 /* frame first. (We'll need to push something if the */ 4580 /* sum of %nargs and %imm0 is greater than nargregs) */ 4581 4582 local_label(no_insert): 4583 __(lea (%nargs_q,%imm0),%imm1) 4584 __(cmpq $nargregs<<fixnumshift,%imm1) 4585 __(jna local_label(no_insert_no_frame)) 4586 /* Reserve space for a stack frame */ 4587 __(push $reserved_frame_marker) 4588 __(push $reserved_frame_marker) 4589 local_label(no_insert_no_frame): 4590 /* nargregs or fewer args were already vpushed. */ 4591 /* if exactly nargregs, vpush remaining inherited vars. */ 4592 __(cmpw $nargregs<<fixnumshift,%nargs) 4593 __(movl $5<<fixnumshift,%imm1_l) /* skip code, new fn */ 4594 __(leaq 5<<fixnumshift(%imm0),%temp1) 4595 __(jnz local_label(set_regs)) 4596 local_label(vpush_remaining): 4597 __(push misc_data_offset(%fn,%imm1)) 4598 __(addq $node_size,%imm1) 4599 __(addw $fixnumone,%nargs) 4600 __(subq $node_size,%imm0) 4601 __(jnz local_label(vpush_remaining)) 4602 __(jmp local_label(go)) 4603 local_label(set_regs): 4604 /* if nargs was > 1 (and we know that it was < 3), it must have */ 4605 /* been 2. Set arg_x, then vpush the remaining args. */ 4606 __(cmpw $fixnumone,%nargs) 4607 __(jle local_label(set_y_z)) 4608 local_label(set_arg_x): 4609 __(subq $node_size,%temp1) 4610 __(movq misc_data_offset(%fn,%temp1),%arg_x) 4611 __(addw $fixnumone,%nargs) 4612 __(subq $fixnumone,%imm0) 4613 __(jne local_label(vpush_remaining)) 4614 __(jmp local_label(go)) 4615 /* Maybe set arg_y or arg_z, preceding args */ 4616 local_label(set_y_z): 4617 __(jne local_label(set_arg_z)) 4618 /* Set arg_y, maybe arg_x, preceding args */ 4619 local_label(set_arg_y): 4620 __(subq $node_size,%temp1) 4621 __(movq misc_data_offset(%fn,%temp1),%arg_y) 4622 __(addw $fixnumone,%nargs) 4623 __(subq $fixnum_one,%imm0) 4624 __(jnz local_label(set_arg_x)) 4625 __(jmp local_label(go)) 4626 local_label(set_arg_z): 4627 __(subq $node_size,%temp1) 4628 __(movq misc_data_offset(%fn,%temp1),%arg_z) 4629 __(addw $fixnumone,%nargs) 4630 __(subq $fixnum_one,%imm0) 4631 __(jne local_label(set_arg_y)) 4632 local_label(go): 4633 __(movq misc_data_offset+(4*node_size)(%fn),%fn) 4634 __(push %ra0) 4635 __(jmp *%fn) 4636 local_label(regs_only): 4637 __(leaq 5<<fixnumshift(%imm0),%temp1) 4638 __(testw %nargs,%nargs) 4639 __(jne local_label(some_args)) 4640 __(cmpw $node_size,%imm0) 4641 __(movq misc_data_offset-node_size(%fn,%temp1),%arg_z) 4642 __(je local_label(rgo)) 4643 __(cmpw $2*node_size,%imm0) 4644 __(movq misc_data_offset-(node_size*2)(%fn,%temp1),%arg_y) 4645 __(je local_label(rgo)) 4646 __(movq misc_data_offset-(node_size*3)(%fn,%temp1),%arg_x) 4647 local_label(rgo): 4648 __(addw %imm0_w,%nargs) 4649 __(jmp *misc_data_offset+(4*node_size)(%fn)) 4650 local_label(some_args): 4651 __(cmpw $2*node_size,%nargs) 4652 __(jz local_label(rtwo)) 4653 /* One arg was passed, could be one or two inherited args */ 4654 __(cmpw $node_size,%imm0) 4655 __(movq misc_data_offset-node_size(%fn,%temp1),%arg_y) 4656 __(je local_label(rgo)) 4657 __(movq misc_data_offset-(node_size*2)(%fn,%temp1),%arg_x) 4658 __(jmp local_label(rgo)) 4659 local_label(rtwo): 4660 __(movq misc_data_offset-node_size(%fn,%temp1),%arg_x) 4661 __(jmp local_label(rgo)) 4662 _endsubp(call_closure) 4663 4607 4664 4608 4665 _spentry(poweropen_callbackX)
Note:
See TracChangeset
for help on using the changeset viewer.
