@@ -1870,68 +1870,40 @@ iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj)
1870
1870
VALUE block = OPERAND_AT (iobj , 2 );
1871
1871
VALUE flag = OPERAND_AT (iobj , 3 );
1872
1872
1873
- /* TODO: should be more sophisticated search */
1873
+ #define SP_INSN (opt ) insn_set_specialized_instruction(iseq, iobj, BIN(opt_##opt))
1874
+
1874
1875
if (block == 0 && flag == INT2FIX (0 )) {
1875
- if (argc == 0 ) {
1876
- if (mid == idLength ) {
1877
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_length ));
1878
- }
1879
- else if (mid == idSize ) {
1880
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_size ));
1881
- }
1882
- else if (mid == idSucc ) {
1883
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_succ ));
1884
- }
1885
- else if (mid == idNot ) {
1886
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_not ));
1887
- }
1888
- }
1889
- else if (argc == 1 ) {
1890
- if (0 ) {
1891
- }
1892
- else if (mid == idPLUS ) {
1893
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_plus ));
1894
- }
1895
- else if (mid == idMINUS ) {
1896
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_minus ));
1897
- }
1898
- else if (mid == idMULT ) {
1899
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_mult ));
1900
- }
1901
- else if (mid == idDIV ) {
1902
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_div ));
1876
+ switch (argc ) {
1877
+ case 0 :
1878
+ switch (mid ) {
1879
+ case idLength : SP_INSN (length ); break ;
1880
+ case idSize : SP_INSN (size ); break ;
1881
+ case idSucc : SP_INSN (succ ); break ;
1882
+ case idNot : SP_INSN (not ); break ;
1903
1883
}
1904
- else if (mid == idMOD ) {
1905
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_mod ));
1906
- }
1907
- else if (mid == idEq ) {
1908
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_eq ));
1909
- }
1910
- else if (mid == idNeq ) {
1911
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_neq ));
1912
- }
1913
- else if (mid == idLT ) {
1914
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_lt ));
1915
- }
1916
- else if (mid == idLE ) {
1917
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_le ));
1918
- }
1919
- else if (mid == idGT ) {
1920
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_gt ));
1921
- }
1922
- else if (mid == idGE ) {
1923
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_ge ));
1924
- }
1925
- else if (mid == idLTLT ) {
1926
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_ltlt ));
1927
- }
1928
- else if (mid == idAREF ) {
1929
- insn_set_specialized_instruction (iseq , iobj , BIN (opt_aref ));
1884
+ break ;
1885
+ case 1 :
1886
+ switch (mid ) {
1887
+ case idPLUS : SP_INSN (plus ); break ;
1888
+ case idMINUS : SP_INSN (minus ); break ;
1889
+ case idMULT : SP_INSN (mult ); break ;
1890
+ case idDIV : SP_INSN (div ); break ;
1891
+ case idMOD : SP_INSN (mod ); break ;
1892
+ case idEq : SP_INSN (eq ); break ;
1893
+ case idNeq : SP_INSN (neq ); break ;
1894
+ case idLT : SP_INSN (lt ); break ;
1895
+ case idLE : SP_INSN (le ); break ;
1896
+ case idGT : SP_INSN (gt ); break ;
1897
+ case idGE : SP_INSN (ge ); break ;
1898
+ case idLTLT : SP_INSN (ltlt ); break ;
1899
+ case idAREF : SP_INSN (aref ); break ;
1930
1900
}
1901
+ break ;
1931
1902
}
1932
1903
}
1933
1904
}
1934
1905
return COMPILE_OK ;
1906
+ #undef SP_INSN
1935
1907
}
1936
1908
1937
1909
static int
0 commit comments