aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode.c
diff options
context:
space:
mode:
authorPaul Eggert2016-08-09 00:37:41 -0700
committerPaul Eggert2016-08-09 01:31:23 -0700
commite09dc1112b1f209d8141fc847edf23bd9cfa5ae1 (patch)
tree80adec2a76cf77ec0de6de512cf3312e13b1b2d4 /src/bytecode.c
parent644fc17b9ae181174a842e3876e887666d505666 (diff)
downloademacs-e09dc1112b1f209d8141fc847edf23bd9cfa5ae1.tar.gz
emacs-e09dc1112b1f209d8141fc847edf23bd9cfa5ae1.zip
Simplify exec_byte_code via moving decls etc.
* src/bytecode.c (exec_byte_code): Simplify, mostly by moving initializers into decls, and by omitting some unnecessary changes to ‘top’. This improves performance a bit on x86-64, as it happens.
Diffstat (limited to 'src/bytecode.c')
-rw-r--r--src/bytecode.c438
1 files changed, 136 insertions, 302 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index 995d37c09d5..e2d8ab706c7 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -337,25 +337,15 @@ Lisp_Object
337exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, 337exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
338 Lisp_Object args_template, ptrdiff_t nargs, Lisp_Object *args) 338 Lisp_Object args_template, ptrdiff_t nargs, Lisp_Object *args)
339{ 339{
340 USE_SAFE_ALLOCA;
341#ifdef BYTE_CODE_METER 340#ifdef BYTE_CODE_METER
342 int volatile this_op = 0; 341 int volatile this_op = 0;
343 int prev_op;
344#endif 342#endif
345 int op;
346 /* Lisp_Object v1, v2; */
347 Lisp_Object *vectorp;
348 ptrdiff_t const_length;
349 ptrdiff_t bytestr_length;
350 Lisp_Object *top;
351 Lisp_Object result;
352 enum handlertype type;
353 343
354 CHECK_STRING (bytestr); 344 CHECK_STRING (bytestr);
355 CHECK_VECTOR (vector); 345 CHECK_VECTOR (vector);
356 CHECK_NATNUM (maxdepth); 346 CHECK_NATNUM (maxdepth);
357 347
358 const_length = ASIZE (vector); 348 ptrdiff_t const_length = ASIZE (vector);
359 349
360 if (STRING_MULTIBYTE (bytestr)) 350 if (STRING_MULTIBYTE (bytestr))
361 /* BYTESTR must have been produced by Emacs 20.2 or the earlier 351 /* BYTESTR must have been produced by Emacs 20.2 or the earlier
@@ -365,15 +355,16 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
365 convert them back to the originally intended unibyte form. */ 355 convert them back to the originally intended unibyte form. */
366 bytestr = Fstring_as_unibyte (bytestr); 356 bytestr = Fstring_as_unibyte (bytestr);
367 357
368 bytestr_length = SBYTES (bytestr); 358 ptrdiff_t bytestr_length = SBYTES (bytestr);
369 vectorp = XVECTOR (vector)->contents; 359 Lisp_Object *vectorp = XVECTOR (vector)->contents;
370 360
371 unsigned char quitcounter = 1; 361 unsigned char quitcounter = 1;
372 EMACS_INT stack_items = XFASTINT (maxdepth) + 1; 362 EMACS_INT stack_items = XFASTINT (maxdepth) + 1;
363 USE_SAFE_ALLOCA;
373 Lisp_Object *stack_base; 364 Lisp_Object *stack_base;
374 SAFE_ALLOCA_LISP_EXTRA (stack_base, stack_items, bytestr_length); 365 SAFE_ALLOCA_LISP_EXTRA (stack_base, stack_items, bytestr_length);
375 Lisp_Object *stack_lim = stack_base + stack_items; 366 Lisp_Object *stack_lim = stack_base + stack_items;
376 top = stack_base; 367 Lisp_Object *top = stack_base;
377 memcpy (stack_lim, SDATA (bytestr), bytestr_length); 368 memcpy (stack_lim, SDATA (bytestr), bytestr_length);
378 void *void_stack_lim = stack_lim; 369 void *void_stack_lim = stack_lim;
379 unsigned char const *bytestr_data = void_stack_lim; 370 unsigned char const *bytestr_data = void_stack_lim;
@@ -402,20 +393,21 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
402 PUSH (Qnil); 393 PUSH (Qnil);
403 } 394 }
404 395
405 while (1) 396 while (true)
406 { 397 {
398 int op;
399 enum handlertype type;
400
407 if (BYTE_CODE_SAFE && ! (stack_base <= top && top < stack_lim)) 401 if (BYTE_CODE_SAFE && ! (stack_base <= top && top < stack_lim))
408 emacs_abort (); 402 emacs_abort ();
409 403
410#ifdef BYTE_CODE_METER 404#ifdef BYTE_CODE_METER
411 prev_op = this_op; 405 int prev_op = this_op;
412 this_op = op = FETCH; 406 this_op = op = FETCH;
413 METER_CODE (prev_op, op); 407 METER_CODE (prev_op, op);
414#else 408#elif !defined BYTE_CODE_THREADED
415#ifndef BYTE_CODE_THREADED
416 op = FETCH; 409 op = FETCH;
417#endif 410#endif
418#endif
419 411
420 /* The interpreter can be compiled one of two ways: as an 412 /* The interpreter can be compiled one of two ways: as an
421 ordinary switch-based interpreter, or as a threaded 413 ordinary switch-based interpreter, or as a threaded
@@ -496,7 +488,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
496 CASE (Bvarref3): 488 CASE (Bvarref3):
497 CASE (Bvarref4): 489 CASE (Bvarref4):
498 CASE (Bvarref5): 490 CASE (Bvarref5):
499 op = op - Bvarref; 491 op -= Bvarref;
500 goto varref; 492 goto varref;
501 493
502 /* This seems to be the most frequently executed byte-code 494 /* This seems to be the most frequently executed byte-code
@@ -505,79 +497,51 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
505 op = FETCH; 497 op = FETCH;
506 varref: 498 varref:
507 { 499 {
508 Lisp_Object v1, v2; 500 Lisp_Object v1 = vectorp[op], v2;
509 501 if (!SYMBOLP (v1)
510 v1 = vectorp[op]; 502 || XSYMBOL (v1)->redirect != SYMBOL_PLAINVAL
511 if (SYMBOLP (v1)) 503 || (v2 = SYMBOL_VAL (XSYMBOL (v1)), EQ (v2, Qunbound)))
512 { 504 v2 = Fsymbol_value (v1);
513 if (XSYMBOL (v1)->redirect != SYMBOL_PLAINVAL
514 || (v2 = SYMBOL_VAL (XSYMBOL (v1)),
515 EQ (v2, Qunbound)))
516 {
517 v2 = Fsymbol_value (v1);
518 }
519 }
520 else
521 {
522 v2 = Fsymbol_value (v1);
523 }
524 PUSH (v2); 505 PUSH (v2);
525 NEXT; 506 NEXT;
526 } 507 }
527 508
528 CASE (Bgotoifnil): 509 CASE (Bgotoifnil):
529 { 510 {
530 Lisp_Object v1; 511 Lisp_Object v1 = POP;
531 op = FETCH2; 512 op = FETCH2;
532 v1 = POP;
533 if (NILP (v1)) 513 if (NILP (v1))
534 goto op_branch; 514 goto op_branch;
535 NEXT; 515 NEXT;
536 } 516 }
537 517
538 CASE (Bcar): 518 CASE (Bcar):
539 { 519 if (CONSP (TOP))
540 Lisp_Object v1; 520 TOP = XCAR (TOP);
541 v1 = TOP; 521 else if (!NILP (TOP))
542 if (CONSP (v1)) 522 wrong_type_argument (Qlistp, TOP);
543 TOP = XCAR (v1); 523 NEXT;
544 else if (NILP (v1))
545 TOP = Qnil;
546 else
547 {
548 wrong_type_argument (Qlistp, v1);
549 }
550 NEXT;
551 }
552 524
553 CASE (Beq): 525 CASE (Beq):
554 { 526 {
555 Lisp_Object v1; 527 Lisp_Object v1 = POP;
556 v1 = POP;
557 TOP = EQ (v1, TOP) ? Qt : Qnil; 528 TOP = EQ (v1, TOP) ? Qt : Qnil;
558 NEXT; 529 NEXT;
559 } 530 }
560 531
561 CASE (Bmemq): 532 CASE (Bmemq):
562 { 533 {
563 Lisp_Object v1; 534 Lisp_Object v1 = POP;
564 v1 = POP;
565 TOP = Fmemq (TOP, v1); 535 TOP = Fmemq (TOP, v1);
566 NEXT; 536 NEXT;
567 } 537 }
568 538
569 CASE (Bcdr): 539 CASE (Bcdr):
570 { 540 {
571 Lisp_Object v1; 541 if (CONSP (TOP))
572 v1 = TOP; 542 TOP = XCDR (TOP);
573 if (CONSP (v1)) 543 else if (!NILP (TOP))
574 TOP = XCDR (v1); 544 wrong_type_argument (Qlistp, TOP);
575 else if (NILP (v1))
576 TOP = Qnil;
577 else
578 {
579 wrong_type_argument (Qlistp, v1);
580 }
581 NEXT; 545 NEXT;
582 } 546 }
583 547
@@ -598,10 +562,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
598 op = FETCH; 562 op = FETCH;
599 varset: 563 varset:
600 { 564 {
601 Lisp_Object sym, val; 565 Lisp_Object sym = vectorp[op];
602 566 Lisp_Object val = POP;
603 sym = vectorp[op];
604 val = TOP;
605 567
606 /* Inline the most common case. */ 568 /* Inline the most common case. */
607 if (SYMBOLP (sym) 569 if (SYMBOLP (sym)
@@ -610,17 +572,13 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
610 && !SYMBOL_CONSTANT_P (sym)) 572 && !SYMBOL_CONSTANT_P (sym))
611 SET_SYMBOL_VAL (XSYMBOL (sym), val); 573 SET_SYMBOL_VAL (XSYMBOL (sym), val);
612 else 574 else
613 { 575 set_internal (sym, val, Qnil, false);
614 set_internal (sym, val, Qnil, 0);
615 }
616 } 576 }
617 (void) POP;
618 NEXT; 577 NEXT;
619 578
620 CASE (Bdup): 579 CASE (Bdup):
621 { 580 {
622 Lisp_Object v1; 581 Lisp_Object v1 = TOP;
623 v1 = TOP;
624 PUSH (v1); 582 PUSH (v1);
625 NEXT; 583 NEXT;
626 } 584 }
@@ -668,10 +626,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
668#ifdef BYTE_CODE_METER 626#ifdef BYTE_CODE_METER
669 if (byte_metering_on && SYMBOLP (TOP)) 627 if (byte_metering_on && SYMBOLP (TOP))
670 { 628 {
671 Lisp_Object v1, v2; 629 Lisp_Object v1 = TOP;
672 630 Lisp_Object v2 = Fget (v1, Qbyte_code_meter);
673 v1 = TOP;
674 v2 = Fget (v1, Qbyte_code_meter);
675 if (INTEGERP (v2) 631 if (INTEGERP (v2)
676 && XINT (v2) < MOST_POSITIVE_FIXNUM) 632 && XINT (v2) < MOST_POSITIVE_FIXNUM)
677 { 633 {
@@ -729,14 +685,10 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
729 NEXT; 685 NEXT;
730 686
731 CASE (Bgotoifnonnil): 687 CASE (Bgotoifnonnil):
732 { 688 op = FETCH2;
733 Lisp_Object v1; 689 if (!NILP (POP))
734 op = FETCH2; 690 goto op_branch;
735 v1 = POP; 691 NEXT;
736 if (!NILP (v1))
737 goto op_branch;
738 NEXT;
739 }
740 692
741 CASE (Bgotoifnilelsepop): 693 CASE (Bgotoifnilelsepop):
742 op = FETCH2; 694 op = FETCH2;
@@ -757,24 +709,16 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
757 goto op_relative_branch; 709 goto op_relative_branch;
758 710
759 CASE (BRgotoifnil): 711 CASE (BRgotoifnil):
760 { 712 op = FETCH - 128;
761 Lisp_Object v1; 713 if (NILP (POP))
762 v1 = POP; 714 goto op_relative_branch;
763 op = FETCH - 128; 715 NEXT;
764 if (NILP (v1))
765 goto op_relative_branch;
766 NEXT;
767 }
768 716
769 CASE (BRgotoifnonnil): 717 CASE (BRgotoifnonnil):
770 { 718 op = FETCH - 128;
771 Lisp_Object v1; 719 if (!NILP (POP))
772 v1 = POP; 720 goto op_relative_branch;
773 op = FETCH - 128; 721 NEXT;
774 if (!NILP (v1))
775 goto op_relative_branch;
776 NEXT;
777 }
778 722
779 CASE (BRgotoifnilelsepop): 723 CASE (BRgotoifnilelsepop):
780 op = FETCH - 128; 724 op = FETCH - 128;
@@ -791,7 +735,6 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
791 NEXT; 735 NEXT;
792 736
793 CASE (Breturn): 737 CASE (Breturn):
794 result = POP;
795 goto exit; 738 goto exit;
796 739
797 CASE (Bdiscard): 740 CASE (Bdiscard):
@@ -829,8 +772,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
829 772
830 CASE (Bcatch): /* Obsolete since 24.4. */ 773 CASE (Bcatch): /* Obsolete since 24.4. */
831 { 774 {
832 Lisp_Object v1; 775 Lisp_Object v1 = POP;
833 v1 = POP;
834 TOP = internal_catch (TOP, eval_sub, v1); 776 TOP = internal_catch (TOP, eval_sub, v1);
835 NEXT; 777 NEXT;
836 } 778 }
@@ -842,11 +784,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
842 type = CONDITION_CASE; 784 type = CONDITION_CASE;
843 pushhandler: 785 pushhandler:
844 { 786 {
845 Lisp_Object tag = POP; 787 struct handler *c = push_handler (POP, type);
846 int dest = FETCH2; 788 c->bytecode_dest = FETCH2;
847
848 struct handler *c = push_handler (tag, type);
849 c->bytecode_dest = dest;
850 c->bytecode_top = top; 789 c->bytecode_top = top;
851 790
852 if (sys_setjmp (c->jmp)) 791 if (sys_setjmp (c->jmp))
@@ -863,26 +802,22 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
863 } 802 }
864 803
865 CASE (Bpophandler): /* New in 24.4. */ 804 CASE (Bpophandler): /* New in 24.4. */
866 { 805 handlerlist = handlerlist->next;
867 handlerlist = handlerlist->next; 806 NEXT;
868 NEXT;
869 }
870 807
871 CASE (Bunwind_protect): /* FIXME: avoid closure for lexbind. */ 808 CASE (Bunwind_protect): /* FIXME: avoid closure for lexbind. */
872 { 809 {
873 Lisp_Object handler = POP; 810 Lisp_Object handler = POP;
874 /* Support for a function here is new in 24.4. */ 811 /* Support for a function here is new in 24.4. */
875 record_unwind_protect (NILP (Ffunctionp (handler)) 812 record_unwind_protect ((NILP (Ffunctionp (handler))
876 ? unwind_body : bcall0, 813 ? unwind_body : bcall0),
877 handler); 814 handler);
878 NEXT; 815 NEXT;
879 } 816 }
880 817
881 CASE (Bcondition_case): /* Obsolete since 24.4. */ 818 CASE (Bcondition_case): /* Obsolete since 24.4. */
882 { 819 {
883 Lisp_Object handlers, body; 820 Lisp_Object handlers = POP, body = POP;
884 handlers = POP;
885 body = POP;
886 TOP = internal_lisp_condition_case (TOP, body, handlers); 821 TOP = internal_lisp_condition_case (TOP, body, handlers);
887 NEXT; 822 NEXT;
888 } 823 }
@@ -895,8 +830,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
895 830
896 CASE (Btemp_output_buffer_show): /* Obsolete since 24.1. */ 831 CASE (Btemp_output_buffer_show): /* Obsolete since 24.1. */
897 { 832 {
898 Lisp_Object v1; 833 Lisp_Object v1 = POP;
899 v1 = POP;
900 temp_output_buffer_show (TOP); 834 temp_output_buffer_show (TOP);
901 TOP = v1; 835 TOP = v1;
902 /* pop binding of standard-output */ 836 /* pop binding of standard-output */
@@ -906,17 +840,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
906 840
907 CASE (Bnth): 841 CASE (Bnth):
908 { 842 {
909 Lisp_Object v1, v2; 843 Lisp_Object v2 = POP, v1 = TOP;
910 EMACS_INT n; 844 CHECK_NUMBER (v1);
911 v1 = POP; 845 EMACS_INT n = XINT (v1);
912 v2 = TOP; 846 immediate_quit = true;
913 CHECK_NUMBER (v2); 847 while (--n >= 0 && CONSP (v2))
914 n = XINT (v2); 848 v2 = XCDR (v2);
915 immediate_quit = 1; 849 immediate_quit = false;
916 while (--n >= 0 && CONSP (v1)) 850 TOP = CAR (v2);
917 v1 = XCDR (v1);
918 immediate_quit = 0;
919 TOP = CAR (v1);
920 NEXT; 851 NEXT;
921 } 852 }
922 853
@@ -942,8 +873,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
942 873
943 CASE (Bcons): 874 CASE (Bcons):
944 { 875 {
945 Lisp_Object v1; 876 Lisp_Object v1 = POP;
946 v1 = POP;
947 TOP = Fcons (TOP, v1); 877 TOP = Fcons (TOP, v1);
948 NEXT; 878 NEXT;
949 } 879 }
@@ -954,8 +884,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
954 884
955 CASE (Blist2): 885 CASE (Blist2):
956 { 886 {
957 Lisp_Object v1; 887 Lisp_Object v1 = POP;
958 v1 = POP;
959 TOP = list2 (TOP, v1); 888 TOP = list2 (TOP, v1);
960 NEXT; 889 NEXT;
961 } 890 }
@@ -982,16 +911,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
982 911
983 CASE (Baref): 912 CASE (Baref):
984 { 913 {
985 Lisp_Object v1; 914 Lisp_Object v1 = POP;
986 v1 = POP;
987 TOP = Faref (TOP, v1); 915 TOP = Faref (TOP, v1);
988 NEXT; 916 NEXT;
989 } 917 }
990 918
991 CASE (Baset): 919 CASE (Baset):
992 { 920 {
993 Lisp_Object v1, v2; 921 Lisp_Object v2 = POP, v1 = POP;
994 v2 = POP; v1 = POP;
995 TOP = Faset (TOP, v1, v2); 922 TOP = Faset (TOP, v1, v2);
996 NEXT; 923 NEXT;
997 } 924 }
@@ -1006,32 +933,28 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1006 933
1007 CASE (Bset): 934 CASE (Bset):
1008 { 935 {
1009 Lisp_Object v1; 936 Lisp_Object v1 = POP;
1010 v1 = POP;
1011 TOP = Fset (TOP, v1); 937 TOP = Fset (TOP, v1);
1012 NEXT; 938 NEXT;
1013 } 939 }
1014 940
1015 CASE (Bfset): 941 CASE (Bfset):
1016 { 942 {
1017 Lisp_Object v1; 943 Lisp_Object v1 = POP;
1018 v1 = POP;
1019 TOP = Ffset (TOP, v1); 944 TOP = Ffset (TOP, v1);
1020 NEXT; 945 NEXT;
1021 } 946 }
1022 947
1023 CASE (Bget): 948 CASE (Bget):
1024 { 949 {
1025 Lisp_Object v1; 950 Lisp_Object v1 = POP;
1026 v1 = POP;
1027 TOP = Fget (TOP, v1); 951 TOP = Fget (TOP, v1);
1028 NEXT; 952 NEXT;
1029 } 953 }
1030 954
1031 CASE (Bsubstring): 955 CASE (Bsubstring):
1032 { 956 {
1033 Lisp_Object v1, v2; 957 Lisp_Object v2 = POP, v1 = POP;
1034 v2 = POP; v1 = POP;
1035 TOP = Fsubstring (TOP, v1, v2); 958 TOP = Fsubstring (TOP, v1, v2);
1036 NEXT; 959 NEXT;
1037 } 960 }
@@ -1058,84 +981,55 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1058 NEXT; 981 NEXT;
1059 982
1060 CASE (Bsub1): 983 CASE (Bsub1):
1061 { 984 TOP = INTEGERP (TOP) ? make_number (XINT (TOP) - 1) : Fsub1 (TOP);
1062 Lisp_Object v1; 985 NEXT;
1063 v1 = TOP;
1064 if (INTEGERP (v1))
1065 {
1066 XSETINT (v1, XINT (v1) - 1);
1067 TOP = v1;
1068 }
1069 else
1070 {
1071 TOP = Fsub1 (v1);
1072 }
1073 NEXT;
1074 }
1075 986
1076 CASE (Badd1): 987 CASE (Badd1):
1077 { 988 TOP = INTEGERP (TOP) ? make_number (XINT (TOP) + 1) : Fadd1 (TOP);
1078 Lisp_Object v1; 989 NEXT;
1079 v1 = TOP;
1080 if (INTEGERP (v1))
1081 {
1082 XSETINT (v1, XINT (v1) + 1);
1083 TOP = v1;
1084 }
1085 else
1086 {
1087 TOP = Fadd1 (v1);
1088 }
1089 NEXT;
1090 }
1091 990
1092 CASE (Beqlsign): 991 CASE (Beqlsign):
1093 { 992 {
1094 Lisp_Object v1, v2; 993 Lisp_Object v2 = POP, v1 = TOP;
1095 v2 = POP; v1 = TOP;
1096 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v1); 994 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v1);
1097 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v2); 995 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v2);
996 bool equal;
1098 if (FLOATP (v1) || FLOATP (v2)) 997 if (FLOATP (v1) || FLOATP (v2))
1099 { 998 {
1100 double f1, f2; 999 double f1 = FLOATP (v1) ? XFLOAT_DATA (v1) : XINT (v1);
1101 1000 double f2 = FLOATP (v2) ? XFLOAT_DATA (v2) : XINT (v2);
1102 f1 = (FLOATP (v1) ? XFLOAT_DATA (v1) : XINT (v1)); 1001 equal = f1 == f2;
1103 f2 = (FLOATP (v2) ? XFLOAT_DATA (v2) : XINT (v2));
1104 TOP = (f1 == f2 ? Qt : Qnil);
1105 } 1002 }
1106 else 1003 else
1107 TOP = (XINT (v1) == XINT (v2) ? Qt : Qnil); 1004 equal = XINT (v1) == XINT (v2);
1005 TOP = equal ? Qt : Qnil;
1108 NEXT; 1006 NEXT;
1109 } 1007 }
1110 1008
1111 CASE (Bgtr): 1009 CASE (Bgtr):
1112 { 1010 {
1113 Lisp_Object v1; 1011 Lisp_Object v1 = POP;
1114 v1 = POP;
1115 TOP = arithcompare (TOP, v1, ARITH_GRTR); 1012 TOP = arithcompare (TOP, v1, ARITH_GRTR);
1116 NEXT; 1013 NEXT;
1117 } 1014 }
1118 1015
1119 CASE (Blss): 1016 CASE (Blss):
1120 { 1017 {
1121 Lisp_Object v1; 1018 Lisp_Object v1 = POP;
1122 v1 = POP;
1123 TOP = arithcompare (TOP, v1, ARITH_LESS); 1019 TOP = arithcompare (TOP, v1, ARITH_LESS);
1124 NEXT; 1020 NEXT;
1125 } 1021 }
1126 1022
1127 CASE (Bleq): 1023 CASE (Bleq):
1128 { 1024 {
1129 Lisp_Object v1; 1025 Lisp_Object v1 = POP;
1130 v1 = POP;
1131 TOP = arithcompare (TOP, v1, ARITH_LESS_OR_EQUAL); 1026 TOP = arithcompare (TOP, v1, ARITH_LESS_OR_EQUAL);
1132 NEXT; 1027 NEXT;
1133 } 1028 }
1134 1029
1135 CASE (Bgeq): 1030 CASE (Bgeq):
1136 { 1031 {
1137 Lisp_Object v1; 1032 Lisp_Object v1 = POP;
1138 v1 = POP;
1139 TOP = arithcompare (TOP, v1, ARITH_GRTR_OR_EQUAL); 1033 TOP = arithcompare (TOP, v1, ARITH_GRTR_OR_EQUAL);
1140 NEXT; 1034 NEXT;
1141 } 1035 }
@@ -1146,20 +1040,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1146 NEXT; 1040 NEXT;
1147 1041
1148 CASE (Bnegate): 1042 CASE (Bnegate):
1149 { 1043 TOP = INTEGERP (TOP) ? make_number (- XINT (TOP)) : Fminus (1, &TOP);
1150 Lisp_Object v1; 1044 NEXT;
1151 v1 = TOP;
1152 if (INTEGERP (v1))
1153 {
1154 XSETINT (v1, - XINT (v1));
1155 TOP = v1;
1156 }
1157 else
1158 {
1159 TOP = Fminus (1, &TOP);
1160 }
1161 NEXT;
1162 }
1163 1045
1164 CASE (Bplus): 1046 CASE (Bplus):
1165 DISCARD (1); 1047 DISCARD (1);
@@ -1188,19 +1070,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1188 1070
1189 CASE (Brem): 1071 CASE (Brem):
1190 { 1072 {
1191 Lisp_Object v1; 1073 Lisp_Object v1 = POP;
1192 v1 = POP;
1193 TOP = Frem (TOP, v1); 1074 TOP = Frem (TOP, v1);
1194 NEXT; 1075 NEXT;
1195 } 1076 }
1196 1077
1197 CASE (Bpoint): 1078 CASE (Bpoint):
1198 { 1079 PUSH (make_natnum (PT));
1199 Lisp_Object v1; 1080 NEXT;
1200 XSETFASTINT (v1, PT);
1201 PUSH (v1);
1202 NEXT;
1203 }
1204 1081
1205 CASE (Bgoto_char): 1082 CASE (Bgoto_char):
1206 TOP = Fgoto_char (TOP); 1083 TOP = Fgoto_char (TOP);
@@ -1225,40 +1102,24 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1225 } 1102 }
1226 1103
1227 CASE (Bpoint_min): 1104 CASE (Bpoint_min):
1228 { 1105 PUSH (make_natnum (BEGV));
1229 Lisp_Object v1; 1106 NEXT;
1230 XSETFASTINT (v1, BEGV);
1231 PUSH (v1);
1232 NEXT;
1233 }
1234 1107
1235 CASE (Bchar_after): 1108 CASE (Bchar_after):
1236 TOP = Fchar_after (TOP); 1109 TOP = Fchar_after (TOP);
1237 NEXT; 1110 NEXT;
1238 1111
1239 CASE (Bfollowing_char): 1112 CASE (Bfollowing_char):
1240 { 1113 PUSH (Ffollowing_char ());
1241 Lisp_Object v1; 1114 NEXT;
1242 v1 = Ffollowing_char ();
1243 PUSH (v1);
1244 NEXT;
1245 }
1246 1115
1247 CASE (Bpreceding_char): 1116 CASE (Bpreceding_char):
1248 { 1117 PUSH (Fprevious_char ());
1249 Lisp_Object v1; 1118 NEXT;
1250 v1 = Fprevious_char ();
1251 PUSH (v1);
1252 NEXT;
1253 }
1254 1119
1255 CASE (Bcurrent_column): 1120 CASE (Bcurrent_column):
1256 { 1121 PUSH (make_natnum (current_column ()));
1257 Lisp_Object v1; 1122 NEXT;
1258 XSETFASTINT (v1, current_column ());
1259 PUSH (v1);
1260 NEXT;
1261 }
1262 1123
1263 CASE (Bindent_to): 1124 CASE (Bindent_to):
1264 TOP = Findent_to (TOP, Qnil); 1125 TOP = Findent_to (TOP, Qnil);
@@ -1302,16 +1163,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1302 1163
1303 CASE (Bskip_chars_forward): 1164 CASE (Bskip_chars_forward):
1304 { 1165 {
1305 Lisp_Object v1; 1166 Lisp_Object v1 = POP;
1306 v1 = POP;
1307 TOP = Fskip_chars_forward (TOP, v1); 1167 TOP = Fskip_chars_forward (TOP, v1);
1308 NEXT; 1168 NEXT;
1309 } 1169 }
1310 1170
1311 CASE (Bskip_chars_backward): 1171 CASE (Bskip_chars_backward):
1312 { 1172 {
1313 Lisp_Object v1; 1173 Lisp_Object v1 = POP;
1314 v1 = POP;
1315 TOP = Fskip_chars_backward (TOP, v1); 1174 TOP = Fskip_chars_backward (TOP, v1);
1316 NEXT; 1175 NEXT;
1317 } 1176 }
@@ -1322,10 +1181,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1322 1181
1323 CASE (Bchar_syntax): 1182 CASE (Bchar_syntax):
1324 { 1183 {
1325 int c;
1326
1327 CHECK_CHARACTER (TOP); 1184 CHECK_CHARACTER (TOP);
1328 c = XFASTINT (TOP); 1185 int c = XFASTINT (TOP);
1329 if (NILP (BVAR (current_buffer, enable_multibyte_characters))) 1186 if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
1330 MAKE_CHAR_MULTIBYTE (c); 1187 MAKE_CHAR_MULTIBYTE (c);
1331 XSETFASTINT (TOP, syntax_code_spec[SYNTAX (c)]); 1188 XSETFASTINT (TOP, syntax_code_spec[SYNTAX (c)]);
@@ -1334,24 +1191,21 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1334 1191
1335 CASE (Bbuffer_substring): 1192 CASE (Bbuffer_substring):
1336 { 1193 {
1337 Lisp_Object v1; 1194 Lisp_Object v1 = POP;
1338 v1 = POP;
1339 TOP = Fbuffer_substring (TOP, v1); 1195 TOP = Fbuffer_substring (TOP, v1);
1340 NEXT; 1196 NEXT;
1341 } 1197 }
1342 1198
1343 CASE (Bdelete_region): 1199 CASE (Bdelete_region):
1344 { 1200 {
1345 Lisp_Object v1; 1201 Lisp_Object v1 = POP;
1346 v1 = POP;
1347 TOP = Fdelete_region (TOP, v1); 1202 TOP = Fdelete_region (TOP, v1);
1348 NEXT; 1203 NEXT;
1349 } 1204 }
1350 1205
1351 CASE (Bnarrow_to_region): 1206 CASE (Bnarrow_to_region):
1352 { 1207 {
1353 Lisp_Object v1; 1208 Lisp_Object v1 = POP;
1354 v1 = POP;
1355 TOP = Fnarrow_to_region (TOP, v1); 1209 TOP = Fnarrow_to_region (TOP, v1);
1356 NEXT; 1210 NEXT;
1357 } 1211 }
@@ -1366,10 +1220,8 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1366 1220
1367 CASE (Bset_marker): 1221 CASE (Bset_marker):
1368 { 1222 {
1369 Lisp_Object v1, v2; 1223 Lisp_Object v2 = POP, v1 = POP;
1370 v1 = POP; 1224 TOP = Fset_marker (TOP, v1, v2);
1371 v2 = POP;
1372 TOP = Fset_marker (TOP, v2, v1);
1373 NEXT; 1225 NEXT;
1374 } 1226 }
1375 1227
@@ -1391,56 +1243,49 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1391 1243
1392 CASE (Bstringeqlsign): 1244 CASE (Bstringeqlsign):
1393 { 1245 {
1394 Lisp_Object v1; 1246 Lisp_Object v1 = POP;
1395 v1 = POP;
1396 TOP = Fstring_equal (TOP, v1); 1247 TOP = Fstring_equal (TOP, v1);
1397 NEXT; 1248 NEXT;
1398 } 1249 }
1399 1250
1400 CASE (Bstringlss): 1251 CASE (Bstringlss):
1401 { 1252 {
1402 Lisp_Object v1; 1253 Lisp_Object v1 = POP;
1403 v1 = POP;
1404 TOP = Fstring_lessp (TOP, v1); 1254 TOP = Fstring_lessp (TOP, v1);
1405 NEXT; 1255 NEXT;
1406 } 1256 }
1407 1257
1408 CASE (Bequal): 1258 CASE (Bequal):
1409 { 1259 {
1410 Lisp_Object v1; 1260 Lisp_Object v1 = POP;
1411 v1 = POP;
1412 TOP = Fequal (TOP, v1); 1261 TOP = Fequal (TOP, v1);
1413 NEXT; 1262 NEXT;
1414 } 1263 }
1415 1264
1416 CASE (Bnthcdr): 1265 CASE (Bnthcdr):
1417 { 1266 {
1418 Lisp_Object v1; 1267 Lisp_Object v1 = POP;
1419 v1 = POP;
1420 TOP = Fnthcdr (TOP, v1); 1268 TOP = Fnthcdr (TOP, v1);
1421 NEXT; 1269 NEXT;
1422 } 1270 }
1423 1271
1424 CASE (Belt): 1272 CASE (Belt):
1425 { 1273 {
1426 Lisp_Object v1, v2;
1427 if (CONSP (TOP)) 1274 if (CONSP (TOP))
1428 { 1275 {
1429 /* Exchange args and then do nth. */ 1276 /* Exchange args and then do nth. */
1430 EMACS_INT n; 1277 Lisp_Object v2 = POP, v1 = TOP;
1431 v2 = POP;
1432 v1 = TOP;
1433 CHECK_NUMBER (v2); 1278 CHECK_NUMBER (v2);
1434 n = XINT (v2); 1279 EMACS_INT n = XINT (v2);
1435 immediate_quit = 1; 1280 immediate_quit = true;
1436 while (--n >= 0 && CONSP (v1)) 1281 while (--n >= 0 && CONSP (v1))
1437 v1 = XCDR (v1); 1282 v1 = XCDR (v1);
1438 immediate_quit = 0; 1283 immediate_quit = false;
1439 TOP = CAR (v1); 1284 TOP = CAR (v1);
1440 } 1285 }
1441 else 1286 else
1442 { 1287 {
1443 v1 = POP; 1288 Lisp_Object v1 = POP;
1444 TOP = Felt (TOP, v1); 1289 TOP = Felt (TOP, v1);
1445 } 1290 }
1446 NEXT; 1291 NEXT;
@@ -1448,16 +1293,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1448 1293
1449 CASE (Bmember): 1294 CASE (Bmember):
1450 { 1295 {
1451 Lisp_Object v1; 1296 Lisp_Object v1 = POP;
1452 v1 = POP;
1453 TOP = Fmember (TOP, v1); 1297 TOP = Fmember (TOP, v1);
1454 NEXT; 1298 NEXT;
1455 } 1299 }
1456 1300
1457 CASE (Bassq): 1301 CASE (Bassq):
1458 { 1302 {
1459 Lisp_Object v1; 1303 Lisp_Object v1 = POP;
1460 v1 = POP;
1461 TOP = Fassq (TOP, v1); 1304 TOP = Fassq (TOP, v1);
1462 NEXT; 1305 NEXT;
1463 } 1306 }
@@ -1468,35 +1311,25 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1468 1311
1469 CASE (Bsetcar): 1312 CASE (Bsetcar):
1470 { 1313 {
1471 Lisp_Object v1; 1314 Lisp_Object v1 = POP;
1472 v1 = POP;
1473 TOP = Fsetcar (TOP, v1); 1315 TOP = Fsetcar (TOP, v1);
1474 NEXT; 1316 NEXT;
1475 } 1317 }
1476 1318
1477 CASE (Bsetcdr): 1319 CASE (Bsetcdr):
1478 { 1320 {
1479 Lisp_Object v1; 1321 Lisp_Object v1 = POP;
1480 v1 = POP;
1481 TOP = Fsetcdr (TOP, v1); 1322 TOP = Fsetcdr (TOP, v1);
1482 NEXT; 1323 NEXT;
1483 } 1324 }
1484 1325
1485 CASE (Bcar_safe): 1326 CASE (Bcar_safe):
1486 { 1327 TOP = CAR_SAFE (TOP);
1487 Lisp_Object v1; 1328 NEXT;
1488 v1 = TOP;
1489 TOP = CAR_SAFE (v1);
1490 NEXT;
1491 }
1492 1329
1493 CASE (Bcdr_safe): 1330 CASE (Bcdr_safe):
1494 { 1331 TOP = CDR_SAFE (TOP);
1495 Lisp_Object v1; 1332 NEXT;
1496 v1 = TOP;
1497 TOP = CDR_SAFE (v1);
1498 NEXT;
1499 }
1500 1333
1501 CASE (Bnconc): 1334 CASE (Bnconc):
1502 DISCARD (1); 1335 DISCARD (1);
@@ -1504,7 +1337,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1504 NEXT; 1337 NEXT;
1505 1338
1506 CASE (Bnumberp): 1339 CASE (Bnumberp):
1507 TOP = (NUMBERP (TOP) ? Qt : Qnil); 1340 TOP = NUMBERP (TOP) ? Qt : Qnil;
1508 NEXT; 1341 NEXT;
1509 1342
1510 CASE (Bintegerp): 1343 CASE (Bintegerp):
@@ -1540,32 +1373,32 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1540 CASE (Bstack_ref4): 1373 CASE (Bstack_ref4):
1541 CASE (Bstack_ref5): 1374 CASE (Bstack_ref5):
1542 { 1375 {
1543 Lisp_Object *ptr = top - (op - Bstack_ref); 1376 Lisp_Object v1 = top[Bstack_ref - op];
1544 PUSH (*ptr); 1377 PUSH (v1);
1545 NEXT; 1378 NEXT;
1546 } 1379 }
1547 CASE (Bstack_ref6): 1380 CASE (Bstack_ref6):
1548 { 1381 {
1549 Lisp_Object *ptr = top - (FETCH); 1382 Lisp_Object v1 = top[- FETCH];
1550 PUSH (*ptr); 1383 PUSH (v1);
1551 NEXT; 1384 NEXT;
1552 } 1385 }
1553 CASE (Bstack_ref7): 1386 CASE (Bstack_ref7):
1554 { 1387 {
1555 Lisp_Object *ptr = top - (FETCH2); 1388 Lisp_Object v1 = top[- FETCH2];
1556 PUSH (*ptr); 1389 PUSH (v1);
1557 NEXT; 1390 NEXT;
1558 } 1391 }
1559 CASE (Bstack_set): 1392 CASE (Bstack_set):
1560 /* stack-set-0 = discard; stack-set-1 = discard-1-preserve-tos. */ 1393 /* stack-set-0 = discard; stack-set-1 = discard-1-preserve-tos. */
1561 { 1394 {
1562 Lisp_Object *ptr = top - (FETCH); 1395 Lisp_Object *ptr = top - FETCH;
1563 *ptr = POP; 1396 *ptr = POP;
1564 NEXT; 1397 NEXT;
1565 } 1398 }
1566 CASE (Bstack_set2): 1399 CASE (Bstack_set2):
1567 { 1400 {
1568 Lisp_Object *ptr = top - (FETCH2); 1401 Lisp_Object *ptr = top - FETCH2;
1569 *ptr = POP; 1402 *ptr = POP;
1570 NEXT; 1403 NEXT;
1571 } 1404 }
@@ -1599,6 +1432,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
1599 error ("binding stack not balanced (serious byte compiler bug)"); 1432 error ("binding stack not balanced (serious byte compiler bug)");
1600 } 1433 }
1601 1434
1435 Lisp_Object result = TOP;
1602 SAFE_FREE (); 1436 SAFE_FREE ();
1603 return result; 1437 return result;
1604} 1438}
@@ -1638,7 +1472,7 @@ The variable byte-code-meter indicates how often each byte opcode is used.
1638If a symbol has a property named `byte-code-meter' whose value is an 1472If a symbol has a property named `byte-code-meter' whose value is an
1639integer, it is incremented each time that symbol's function is called. */); 1473integer, it is incremented each time that symbol's function is called. */);
1640 1474
1641 byte_metering_on = 0; 1475 byte_metering_on = false;
1642 Vbyte_code_meter = Fmake_vector (make_number (256), make_number (0)); 1476 Vbyte_code_meter = Fmake_vector (make_number (256), make_number (0));
1643 DEFSYM (Qbyte_code_meter, "byte-code-meter"); 1477 DEFSYM (Qbyte_code_meter, "byte-code-meter");
1644 { 1478 {