Lines Matching refs:buf
629 static inline void emit_2_bytes(u8 *buf, u16 bytes) in emit_2_bytes() argument
631 *((u16 *)buf) = bytes; in emit_2_bytes()
634 static inline void emit_4_bytes(u8 *buf, u32 bytes) in emit_4_bytes() argument
636 emit_2_bytes(buf, bytes >> 16); in emit_4_bytes()
637 emit_2_bytes(buf + 2, bytes & 0xffff); in emit_4_bytes()
659 static u8 arc_movi_r(u8 *buf, u8 reg, s16 imm) in arc_movi_r() argument
663 if (buf) in arc_movi_r()
664 emit_4_bytes(buf, insn); in arc_movi_r()
669 static u8 arc_mov_r(u8 *buf, u8 rd, u8 rs) in arc_mov_r() argument
673 if (buf) in arc_mov_r()
674 emit_4_bytes(buf, insn); in arc_mov_r()
679 static u8 arc_mov_i(u8 *buf, u8 rd, s32 imm) in arc_mov_i() argument
684 return arc_movi_r(buf, rd, imm); in arc_mov_i()
686 if (buf) { in arc_mov_i()
687 emit_4_bytes(buf, insn); in arc_mov_i()
688 emit_4_bytes(buf + INSN_len_normal, imm); in arc_mov_i()
694 static u8 arc_mov_i_fixed(u8 *buf, u8 rd, s32 imm) in arc_mov_i_fixed() argument
698 if (buf) { in arc_mov_i_fixed()
699 emit_4_bytes(buf, insn); in arc_mov_i_fixed()
700 emit_4_bytes(buf + INSN_len_normal, imm); in arc_mov_i_fixed()
706 static u8 arc_mov_cc_r(u8 *buf, u8 cc, u8 rd, u8 rs) in arc_mov_cc_r() argument
710 if (buf) in arc_mov_cc_r()
711 emit_4_bytes(buf, insn); in arc_mov_cc_r()
716 static u8 arc_movu_cc_r(u8 *buf, u8 cc, u8 rd, u8 imm) in arc_movu_cc_r() argument
720 if (buf) in arc_movu_cc_r()
721 emit_4_bytes(buf, insn); in arc_movu_cc_r()
726 static u8 arc_sexb_r(u8 *buf, u8 rd, u8 rs) in arc_sexb_r() argument
730 if (buf) in arc_sexb_r()
731 emit_4_bytes(buf, insn); in arc_sexb_r()
736 static u8 arc_sexh_r(u8 *buf, u8 rd, u8 rs) in arc_sexh_r() argument
740 if (buf) in arc_sexh_r()
741 emit_4_bytes(buf, insn); in arc_sexh_r()
746 static u8 arc_st_r(u8 *buf, u8 reg, u8 reg_mem, s16 off, u8 zz) in arc_st_r() argument
751 if (buf) in arc_st_r()
752 emit_4_bytes(buf, insn); in arc_st_r()
757 static u8 arc_push_r(u8 *buf, u8 reg) in arc_push_r() argument
761 if (buf) in arc_push_r()
762 emit_4_bytes(buf, insn); in arc_push_r()
767 static u8 arc_ld_r(u8 *buf, u8 reg, u8 reg_mem, s16 off, u8 zz) in arc_ld_r() argument
772 if (buf) in arc_ld_r()
773 emit_4_bytes(buf, insn); in arc_ld_r()
778 static u8 arc_ldx_r(u8 *buf, u8 reg, u8 reg_mem, s16 off, u8 zz) in arc_ldx_r() argument
783 if (buf) in arc_ldx_r()
784 emit_4_bytes(buf, insn); in arc_ldx_r()
789 static u8 arc_pop_r(u8 *buf, u8 reg) in arc_pop_r() argument
793 if (buf) in arc_pop_r()
794 emit_4_bytes(buf, insn); in arc_pop_r()
799 static u8 arc_add_r(u8 *buf, u8 ra, u8 rc) in arc_add_r() argument
803 if (buf) in arc_add_r()
804 emit_4_bytes(buf, insn); in arc_add_r()
809 static u8 arc_addf_r(u8 *buf, u8 ra, u8 rc) in arc_addf_r() argument
813 if (buf) in arc_addf_r()
814 emit_4_bytes(buf, insn); in arc_addf_r()
819 static u8 arc_addif_r(u8 *buf, u8 ra, u8 u6) in arc_addif_r() argument
823 if (buf) in arc_addif_r()
824 emit_4_bytes(buf, insn); in arc_addif_r()
829 static u8 arc_addi_r(u8 *buf, u8 ra, u8 u6) in arc_addi_r() argument
833 if (buf) in arc_addi_r()
834 emit_4_bytes(buf, insn); in arc_addi_r()
839 static u8 arc_add_i(u8 *buf, u8 ra, u8 rb, s32 imm) in arc_add_i() argument
843 if (buf) { in arc_add_i()
844 emit_4_bytes(buf, insn); in arc_add_i()
845 emit_4_bytes(buf + INSN_len_normal, imm); in arc_add_i()
851 static u8 arc_adc_r(u8 *buf, u8 ra, u8 rc) in arc_adc_r() argument
855 if (buf) in arc_adc_r()
856 emit_4_bytes(buf, insn); in arc_adc_r()
861 static u8 arc_adci_r(u8 *buf, u8 ra, u8 u6) in arc_adci_r() argument
865 if (buf) in arc_adci_r()
866 emit_4_bytes(buf, insn); in arc_adci_r()
871 static u8 arc_sub_r(u8 *buf, u8 ra, u8 rc) in arc_sub_r() argument
875 if (buf) in arc_sub_r()
876 emit_4_bytes(buf, insn); in arc_sub_r()
881 static u8 arc_subf_r(u8 *buf, u8 ra, u8 rc) in arc_subf_r() argument
885 if (buf) in arc_subf_r()
886 emit_4_bytes(buf, insn); in arc_subf_r()
891 static u8 arc_subi_r(u8 *buf, u8 ra, u8 u6) in arc_subi_r() argument
895 if (buf) in arc_subi_r()
896 emit_4_bytes(buf, insn); in arc_subi_r()
901 static u8 arc_sub_i(u8 *buf, u8 ra, s32 imm) in arc_sub_i() argument
905 if (buf) { in arc_sub_i()
906 emit_4_bytes(buf, insn); in arc_sub_i()
907 emit_4_bytes(buf + INSN_len_normal, imm); in arc_sub_i()
913 static u8 arc_sbc_r(u8 *buf, u8 ra, u8 rc) in arc_sbc_r() argument
917 if (buf) in arc_sbc_r()
918 emit_4_bytes(buf, insn); in arc_sbc_r()
923 static u8 arc_cmp_r(u8 *buf, u8 rb, u8 rc) in arc_cmp_r() argument
927 if (buf) in arc_cmp_r()
928 emit_4_bytes(buf, insn); in arc_cmp_r()
940 static u8 arc_cmpz_r(u8 *buf, u8 rb, u8 rc) in arc_cmpz_r() argument
944 if (buf) in arc_cmpz_r()
945 emit_4_bytes(buf, insn); in arc_cmpz_r()
950 static u8 arc_neg_r(u8 *buf, u8 ra, u8 rb) in arc_neg_r() argument
954 if (buf) in arc_neg_r()
955 emit_4_bytes(buf, insn); in arc_neg_r()
960 static u8 arc_mpy_r(u8 *buf, u8 ra, u8 rb, u8 rc) in arc_mpy_r() argument
964 if (buf) in arc_mpy_r()
965 emit_4_bytes(buf, insn); in arc_mpy_r()
970 static u8 arc_mpy_i(u8 *buf, u8 ra, u8 rb, s32 imm) in arc_mpy_i() argument
974 if (buf) { in arc_mpy_i()
975 emit_4_bytes(buf, insn); in arc_mpy_i()
976 emit_4_bytes(buf + INSN_len_normal, imm); in arc_mpy_i()
982 static u8 arc_mpydu_r(u8 *buf, u8 ra, u8 rc) in arc_mpydu_r() argument
986 if (buf) in arc_mpydu_r()
987 emit_4_bytes(buf, insn); in arc_mpydu_r()
992 static u8 arc_mpydu_i(u8 *buf, u8 ra, s32 imm) in arc_mpydu_i() argument
996 if (buf) { in arc_mpydu_i()
997 emit_4_bytes(buf, insn); in arc_mpydu_i()
998 emit_4_bytes(buf + INSN_len_normal, imm); in arc_mpydu_i()
1004 static u8 arc_divu_r(u8 *buf, u8 rd, u8 rs) in arc_divu_r() argument
1008 if (buf) in arc_divu_r()
1009 emit_4_bytes(buf, insn); in arc_divu_r()
1014 static u8 arc_divu_i(u8 *buf, u8 rd, s32 imm) in arc_divu_i() argument
1018 if (buf) { in arc_divu_i()
1019 emit_4_bytes(buf, insn); in arc_divu_i()
1020 emit_4_bytes(buf + INSN_len_normal, imm); in arc_divu_i()
1026 static u8 arc_divs_r(u8 *buf, u8 rd, u8 rs) in arc_divs_r() argument
1030 if (buf) in arc_divs_r()
1031 emit_4_bytes(buf, insn); in arc_divs_r()
1036 static u8 arc_divs_i(u8 *buf, u8 rd, s32 imm) in arc_divs_i() argument
1040 if (buf) { in arc_divs_i()
1041 emit_4_bytes(buf, insn); in arc_divs_i()
1042 emit_4_bytes(buf + INSN_len_normal, imm); in arc_divs_i()
1048 static u8 arc_remu_r(u8 *buf, u8 rd, u8 rs) in arc_remu_r() argument
1052 if (buf) in arc_remu_r()
1053 emit_4_bytes(buf, insn); in arc_remu_r()
1058 static u8 arc_remu_i(u8 *buf, u8 rd, s32 imm) in arc_remu_i() argument
1062 if (buf) { in arc_remu_i()
1063 emit_4_bytes(buf, insn); in arc_remu_i()
1064 emit_4_bytes(buf + INSN_len_normal, imm); in arc_remu_i()
1070 static u8 arc_rems_r(u8 *buf, u8 rd, u8 rs) in arc_rems_r() argument
1074 if (buf) in arc_rems_r()
1075 emit_4_bytes(buf, insn); in arc_rems_r()
1080 static u8 arc_rems_i(u8 *buf, u8 rd, s32 imm) in arc_rems_i() argument
1084 if (buf) { in arc_rems_i()
1085 emit_4_bytes(buf, insn); in arc_rems_i()
1086 emit_4_bytes(buf + INSN_len_normal, imm); in arc_rems_i()
1092 static u8 arc_and_r(u8 *buf, u8 rd, u8 rs) in arc_and_r() argument
1096 if (buf) in arc_and_r()
1097 emit_4_bytes(buf, insn); in arc_and_r()
1102 static u8 arc_and_i(u8 *buf, u8 rd, s32 imm) in arc_and_i() argument
1106 if (buf) { in arc_and_i()
1107 emit_4_bytes(buf, insn); in arc_and_i()
1108 emit_4_bytes(buf + INSN_len_normal, imm); in arc_and_i()
1114 static u8 arc_tst_r(u8 *buf, u8 rd, u8 rs) in arc_tst_r() argument
1118 if (buf) in arc_tst_r()
1119 emit_4_bytes(buf, insn); in arc_tst_r()
1129 static u8 arc_tstz_r(u8 *buf, u8 rd, u8 rs) in arc_tstz_r() argument
1133 if (buf) in arc_tstz_r()
1134 emit_4_bytes(buf, insn); in arc_tstz_r()
1138 static u8 arc_or_r(u8 *buf, u8 rd, u8 rs1, u8 rs2) in arc_or_r() argument
1142 if (buf) in arc_or_r()
1143 emit_4_bytes(buf, insn); in arc_or_r()
1147 static u8 arc_or_i(u8 *buf, u8 rd, s32 imm) in arc_or_i() argument
1151 if (buf) { in arc_or_i()
1152 emit_4_bytes(buf, insn); in arc_or_i()
1153 emit_4_bytes(buf + INSN_len_normal, imm); in arc_or_i()
1158 static u8 arc_xor_r(u8 *buf, u8 rd, u8 rs) in arc_xor_r() argument
1162 if (buf) in arc_xor_r()
1163 emit_4_bytes(buf, insn); in arc_xor_r()
1167 static u8 arc_xor_i(u8 *buf, u8 rd, s32 imm) in arc_xor_i() argument
1171 if (buf) { in arc_xor_i()
1172 emit_4_bytes(buf, insn); in arc_xor_i()
1173 emit_4_bytes(buf + INSN_len_normal, imm); in arc_xor_i()
1178 static u8 arc_not_r(u8 *buf, u8 rd, u8 rs) in arc_not_r() argument
1182 if (buf) in arc_not_r()
1183 emit_4_bytes(buf, insn); in arc_not_r()
1187 static u8 arc_btst_i(u8 *buf, u8 rs, u8 imm) in arc_btst_i() argument
1191 if (buf) in arc_btst_i()
1192 emit_4_bytes(buf, insn); in arc_btst_i()
1196 static u8 arc_asl_r(u8 *buf, u8 rd, u8 rs1, u8 rs2) in arc_asl_r() argument
1200 if (buf) in arc_asl_r()
1201 emit_4_bytes(buf, insn); in arc_asl_r()
1205 static u8 arc_asli_r(u8 *buf, u8 rd, u8 rs, u8 imm) in arc_asli_r() argument
1209 if (buf) in arc_asli_r()
1210 emit_4_bytes(buf, insn); in arc_asli_r()
1214 static u8 arc_asr_r(u8 *buf, u8 rd, u8 rs1, u8 rs2) in arc_asr_r() argument
1218 if (buf) in arc_asr_r()
1219 emit_4_bytes(buf, insn); in arc_asr_r()
1223 static u8 arc_asri_r(u8 *buf, u8 rd, u8 rs, u8 imm) in arc_asri_r() argument
1227 if (buf) in arc_asri_r()
1228 emit_4_bytes(buf, insn); in arc_asri_r()
1232 static u8 arc_lsr_r(u8 *buf, u8 rd, u8 rs1, u8 rs2) in arc_lsr_r() argument
1236 if (buf) in arc_lsr_r()
1237 emit_4_bytes(buf, insn); in arc_lsr_r()
1241 static u8 arc_lsri_r(u8 *buf, u8 rd, u8 rs, u8 imm) in arc_lsri_r() argument
1245 if (buf) in arc_lsri_r()
1246 emit_4_bytes(buf, insn); in arc_lsri_r()
1250 static u8 arc_swape_r(u8 *buf, u8 r) in arc_swape_r() argument
1254 if (buf) in arc_swape_r()
1255 emit_4_bytes(buf, insn); in arc_swape_r()
1259 static u8 arc_jmp_return(u8 *buf) in arc_jmp_return() argument
1261 if (buf) in arc_jmp_return()
1262 emit_4_bytes(buf, OPC_J_BLINK); in arc_jmp_return()
1266 static u8 arc_jl(u8 *buf, u8 reg) in arc_jl() argument
1270 if (buf) in arc_jl()
1271 emit_4_bytes(buf, insn); in arc_jl()
1280 static u8 arc_bcc(u8 *buf, u8 cc, int offset) in arc_bcc() argument
1284 if (buf) in arc_bcc()
1285 emit_4_bytes(buf, insn); in arc_bcc()
1294 static u8 arc_b(u8 *buf, s32 offset) in arc_b() argument
1298 if (buf) in arc_b()
1299 emit_4_bytes(buf, insn); in arc_b()
1305 u8 zext(u8 *buf, u8 rd) in zext() argument
1308 return arc_movi_r(buf, REG_HI(rd), 0); in zext()
1313 u8 mov_r32(u8 *buf, u8 rd, u8 rs, u8 sign_ext) in mov_r32() argument
1319 len = arc_sexb_r(buf, REG_LO(rd), REG_LO(rs)); in mov_r32()
1321 len = arc_sexh_r(buf, REG_LO(rd), REG_LO(rs)); in mov_r32()
1323 len = arc_mov_r(buf, REG_LO(rd), REG_LO(rs)); in mov_r32()
1331 len = arc_mov_r(buf, REG_LO(rd), REG_LO(rs)); in mov_r32()
1336 u8 mov_r32_i32(u8 *buf, u8 reg, s32 imm) in mov_r32_i32() argument
1338 return arc_mov_i(buf, REG_LO(reg), imm); in mov_r32_i32()
1341 u8 mov_r64(u8 *buf, u8 rd, u8 rs, u8 sign_ext) in mov_r64() argument
1347 len = mov_r32(buf, rd, rs, sign_ext); in mov_r64()
1351 len += arc_asri_r(BUF(buf, len), in mov_r64()
1363 len = arc_mov_r(buf, REG_LO(rd), REG_LO(rs)); in mov_r64()
1366 len += arc_mov_r(BUF(buf, len), REG_HI(rd), REG_HI(rs)); in mov_r64()
1369 len += arc_movi_r(BUF(buf, len), REG_HI(rd), 0); in mov_r64()
1375 u8 mov_r64_i32(u8 *buf, u8 reg, s32 imm) in mov_r64_i32() argument
1379 len = arc_mov_i(buf, REG_LO(reg), imm); in mov_r64_i32()
1384 len += arc_movi_r(BUF(buf, len), REG_HI(reg), 0); in mov_r64_i32()
1386 len += arc_movi_r(BUF(buf, len), REG_HI(reg), -1); in mov_r64_i32()
1419 u8 mov_r64_i64(u8 *buf, u8 reg, u32 lo, u32 hi) in mov_r64_i64() argument
1423 len = arc_mov_i_fixed(buf, REG_LO(reg), lo); in mov_r64_i64()
1424 len += arc_mov_i_fixed(BUF(buf, len), REG_HI(reg), hi); in mov_r64_i64()
1442 static u8 adjust_mem_access(u8 *buf, s16 *off, u8 size, in adjust_mem_access() argument
1450 len += arc_add_i(BUF(buf, len), in adjust_mem_access()
1460 u8 store_r(u8 *buf, u8 rs, u8 rd, s16 off, u8 size) in store_r() argument
1464 len = adjust_mem_access(buf, &off, size, rd, &arc_reg_mem); in store_r()
1467 len += arc_st_r(BUF(buf, len), REG_LO(rs), arc_reg_mem, in store_r()
1469 len += arc_st_r(BUF(buf, len), REG_HI(rs), arc_reg_mem, in store_r()
1474 len += arc_st_r(BUF(buf, len), REG_LO(rs), arc_reg_mem, in store_r()
1491 u8 store_i(u8 *buf, s32 imm, u8 rd, s16 off, u8 size) in store_i() argument
1497 len = adjust_mem_access(buf, &off, size, rd, &arc_reg_mem); in store_i()
1500 len += arc_mov_i(BUF(buf, len), arc_rs, imm); in store_i()
1501 len += arc_st_r(BUF(buf, len), arc_rs, arc_reg_mem, in store_i()
1504 len += arc_mov_i(BUF(buf, len), arc_rs, imm); in store_i()
1505 len += arc_st_r(BUF(buf, len), arc_rs, arc_reg_mem, in store_i()
1510 len += arc_mov_i(BUF(buf, len), arc_rs, imm); in store_i()
1511 len += arc_st_r(BUF(buf, len), arc_rs, arc_reg_mem, off, zz); in store_i()
1521 static u8 push_r64(u8 *buf, u8 reg) in push_r64() argument
1528 len += arc_push_r(BUF(buf, len), REG_HI(reg)); in push_r64()
1529 len += arc_push_r(BUF(buf, len), REG_LO(reg)); in push_r64()
1531 len += arc_push_r(BUF(buf, len), REG_LO(reg)); in push_r64()
1533 len += arc_push_r(BUF(buf, len), REG_HI(reg)); in push_r64()
1540 u8 load_r(u8 *buf, u8 rd, u8 rs, s16 off, u8 size, bool sign_ext) in load_r() argument
1544 len = adjust_mem_access(buf, &off, size, rs, &arc_reg_mem); in load_r()
1551 len += arc_ldx_r(BUF(buf, len), REG_LO(rd), in load_r()
1554 len += arc_ld_r(BUF(buf, len), REG_LO(rd), in load_r()
1560 len += arc_asri_r(BUF(buf, len), in load_r()
1563 len += arc_movi_r(BUF(buf, len), REG_HI(rd), 0); in load_r()
1580 len += arc_ld_r(BUF(buf, len), REG_LO(rd), arc_reg_mem, in load_r()
1582 len += arc_ld_r(BUF(buf, len), REG_HI(rd), arc_reg_mem, in load_r()
1585 len += arc_ld_r(BUF(buf, len), REG_HI(rd), arc_reg_mem, in load_r()
1587 len += arc_ld_r(BUF(buf, len), REG_LO(rd), arc_reg_mem, in load_r()
1595 u8 add_r32(u8 *buf, u8 rd, u8 rs) in add_r32() argument
1597 return arc_add_r(buf, REG_LO(rd), REG_LO(rs)); in add_r32()
1600 u8 add_r32_i32(u8 *buf, u8 rd, s32 imm) in add_r32_i32() argument
1603 return arc_addi_r(buf, REG_LO(rd), imm); in add_r32_i32()
1605 return arc_add_i(buf, REG_LO(rd), REG_LO(rd), imm); in add_r32_i32()
1608 u8 add_r64(u8 *buf, u8 rd, u8 rs) in add_r64() argument
1612 len = arc_addf_r(buf, REG_LO(rd), REG_LO(rs)); in add_r64()
1613 len += arc_adc_r(BUF(buf, len), REG_HI(rd), REG_HI(rs)); in add_r64()
1617 u8 add_r64_i32(u8 *buf, u8 rd, s32 imm) in add_r64_i32() argument
1622 len = arc_addif_r(buf, REG_LO(rd), imm); in add_r64_i32()
1623 len += arc_adci_r(BUF(buf, len), REG_HI(rd), 0); in add_r64_i32()
1625 len = mov_r64_i32(buf, JIT_REG_TMP, imm); in add_r64_i32()
1626 len += add_r64(BUF(buf, len), rd, JIT_REG_TMP); in add_r64_i32()
1631 u8 sub_r32(u8 *buf, u8 rd, u8 rs) in sub_r32() argument
1633 return arc_sub_r(buf, REG_LO(rd), REG_LO(rs)); in sub_r32()
1636 u8 sub_r32_i32(u8 *buf, u8 rd, s32 imm) in sub_r32_i32() argument
1639 return arc_subi_r(buf, REG_LO(rd), imm); in sub_r32_i32()
1641 return arc_sub_i(buf, REG_LO(rd), imm); in sub_r32_i32()
1644 u8 sub_r64(u8 *buf, u8 rd, u8 rs) in sub_r64() argument
1648 len = arc_subf_r(buf, REG_LO(rd), REG_LO(rs)); in sub_r64()
1649 len += arc_sbc_r(BUF(buf, len), REG_HI(rd), REG_HI(rs)); in sub_r64()
1653 u8 sub_r64_i32(u8 *buf, u8 rd, s32 imm) in sub_r64_i32() argument
1657 len = mov_r64_i32(buf, JIT_REG_TMP, imm); in sub_r64_i32()
1658 len += sub_r64(BUF(buf, len), rd, JIT_REG_TMP); in sub_r64_i32()
1662 static u8 cmp_r32(u8 *buf, u8 rd, u8 rs) in cmp_r32() argument
1664 return arc_cmp_r(buf, REG_LO(rd), REG_LO(rs)); in cmp_r32()
1667 u8 neg_r32(u8 *buf, u8 r) in neg_r32() argument
1669 return arc_neg_r(buf, REG_LO(r), REG_LO(r)); in neg_r32()
1673 u8 neg_r64(u8 *buf, u8 r) in neg_r64() argument
1677 len = arc_not_r(buf, REG_LO(r), REG_LO(r)); in neg_r64()
1678 len += arc_not_r(BUF(buf, len), REG_HI(r), REG_HI(r)); in neg_r64()
1679 len += add_r64_i32(BUF(buf, len), r, 1); in neg_r64()
1683 u8 mul_r32(u8 *buf, u8 rd, u8 rs) in mul_r32() argument
1685 return arc_mpy_r(buf, REG_LO(rd), REG_LO(rd), REG_LO(rs)); in mul_r32()
1688 u8 mul_r32_i32(u8 *buf, u8 rd, s32 imm) in mul_r32_i32() argument
1690 return arc_mpy_i(buf, REG_LO(rd), REG_LO(rd), imm); in mul_r32_i32()
1702 u8 mul_r64(u8 *buf, u8 rd, u8 rs) in mul_r64() argument
1712 len = arc_mpy_r(buf, t0, B_hi, C_lo); in mul_r64()
1713 len += arc_mpy_r(BUF(buf, len), t1, B_lo, C_hi); in mul_r64()
1714 len += arc_mpydu_r(BUF(buf, len), B_lo, C_lo); in mul_r64()
1715 len += arc_add_r(BUF(buf, len), B_hi, t0); in mul_r64()
1716 len += arc_add_r(BUF(buf, len), B_hi, t1); in mul_r64()
1748 u8 mul_r64_i32(u8 *buf, u8 rd, s32 imm) in mul_r64_i32() argument
1761 len += arc_neg_r(BUF(buf, len), t1, B_lo); in mul_r64_i32()
1763 len += arc_mpy_i(BUF(buf, len), t0, B_hi, imm); in mul_r64_i32()
1764 len += arc_mpydu_i(BUF(buf, len), B_lo, imm); in mul_r64_i32()
1765 len += arc_add_r(BUF(buf, len), B_hi, t0); in mul_r64_i32()
1769 len += arc_add_r(BUF(buf, len), B_hi, t1); in mul_r64_i32()
1774 u8 div_r32(u8 *buf, u8 rd, u8 rs, bool sign_ext) in div_r32() argument
1777 return arc_divs_r(buf, REG_LO(rd), REG_LO(rs)); in div_r32()
1779 return arc_divu_r(buf, REG_LO(rd), REG_LO(rs)); in div_r32()
1782 u8 div_r32_i32(u8 *buf, u8 rd, s32 imm, bool sign_ext) in div_r32_i32() argument
1788 return arc_divs_i(buf, REG_LO(rd), imm); in div_r32_i32()
1790 return arc_divu_i(buf, REG_LO(rd), imm); in div_r32_i32()
1793 u8 mod_r32(u8 *buf, u8 rd, u8 rs, bool sign_ext) in mod_r32() argument
1796 return arc_rems_r(buf, REG_LO(rd), REG_LO(rs)); in mod_r32()
1798 return arc_remu_r(buf, REG_LO(rd), REG_LO(rs)); in mod_r32()
1801 u8 mod_r32_i32(u8 *buf, u8 rd, s32 imm, bool sign_ext) in mod_r32_i32() argument
1807 return arc_rems_i(buf, REG_LO(rd), imm); in mod_r32_i32()
1809 return arc_remu_i(buf, REG_LO(rd), imm); in mod_r32_i32()
1812 u8 and_r32(u8 *buf, u8 rd, u8 rs) in and_r32() argument
1814 return arc_and_r(buf, REG_LO(rd), REG_LO(rs)); in and_r32()
1817 u8 and_r32_i32(u8 *buf, u8 rd, s32 imm) in and_r32_i32() argument
1819 return arc_and_i(buf, REG_LO(rd), imm); in and_r32_i32()
1822 u8 and_r64(u8 *buf, u8 rd, u8 rs) in and_r64() argument
1826 len = arc_and_r(buf, REG_LO(rd), REG_LO(rs)); in and_r64()
1827 len += arc_and_r(BUF(buf, len), REG_HI(rd), REG_HI(rs)); in and_r64()
1831 u8 and_r64_i32(u8 *buf, u8 rd, s32 imm) in and_r64_i32() argument
1835 len = mov_r64_i32(buf, JIT_REG_TMP, imm); in and_r64_i32()
1836 len += and_r64(BUF(buf, len), rd, JIT_REG_TMP); in and_r64_i32()
1840 static u8 tst_r32(u8 *buf, u8 rd, u8 rs) in tst_r32() argument
1842 return arc_tst_r(buf, REG_LO(rd), REG_LO(rs)); in tst_r32()
1845 u8 or_r32(u8 *buf, u8 rd, u8 rs) in or_r32() argument
1847 return arc_or_r(buf, REG_LO(rd), REG_LO(rd), REG_LO(rs)); in or_r32()
1850 u8 or_r32_i32(u8 *buf, u8 rd, s32 imm) in or_r32_i32() argument
1852 return arc_or_i(buf, REG_LO(rd), imm); in or_r32_i32()
1855 u8 or_r64(u8 *buf, u8 rd, u8 rs) in or_r64() argument
1859 len = arc_or_r(buf, REG_LO(rd), REG_LO(rd), REG_LO(rs)); in or_r64()
1860 len += arc_or_r(BUF(buf, len), REG_HI(rd), REG_HI(rd), REG_HI(rs)); in or_r64()
1864 u8 or_r64_i32(u8 *buf, u8 rd, s32 imm) in or_r64_i32() argument
1868 len = mov_r64_i32(buf, JIT_REG_TMP, imm); in or_r64_i32()
1869 len += or_r64(BUF(buf, len), rd, JIT_REG_TMP); in or_r64_i32()
1873 u8 xor_r32(u8 *buf, u8 rd, u8 rs) in xor_r32() argument
1875 return arc_xor_r(buf, REG_LO(rd), REG_LO(rs)); in xor_r32()
1878 u8 xor_r32_i32(u8 *buf, u8 rd, s32 imm) in xor_r32_i32() argument
1880 return arc_xor_i(buf, REG_LO(rd), imm); in xor_r32_i32()
1883 u8 xor_r64(u8 *buf, u8 rd, u8 rs) in xor_r64() argument
1887 len = arc_xor_r(buf, REG_LO(rd), REG_LO(rs)); in xor_r64()
1888 len += arc_xor_r(BUF(buf, len), REG_HI(rd), REG_HI(rs)); in xor_r64()
1892 u8 xor_r64_i32(u8 *buf, u8 rd, s32 imm) in xor_r64_i32() argument
1896 len = mov_r64_i32(buf, JIT_REG_TMP, imm); in xor_r64_i32()
1897 len += xor_r64(BUF(buf, len), rd, JIT_REG_TMP); in xor_r64_i32()
1902 u8 lsh_r32(u8 *buf, u8 rd, u8 rs) in lsh_r32() argument
1904 return arc_asl_r(buf, REG_LO(rd), REG_LO(rd), REG_LO(rs)); in lsh_r32()
1907 u8 lsh_r32_i32(u8 *buf, u8 rd, u8 imm) in lsh_r32_i32() argument
1909 return arc_asli_r(buf, REG_LO(rd), REG_LO(rd), imm); in lsh_r32_i32()
1948 u8 lsh_r64(u8 *buf, u8 rd, u8 rs) in lsh_r64() argument
1957 len = arc_not_r(buf, t0, C_lo); in lsh_r64()
1958 len += arc_lsri_r(BUF(buf, len), t1, B_lo, 1); in lsh_r64()
1959 len += arc_lsr_r(BUF(buf, len), t1, t1, t0); in lsh_r64()
1960 len += arc_mov_r(BUF(buf, len), t0, C_lo); in lsh_r64()
1961 len += arc_asl_r(BUF(buf, len), B_lo, B_lo, t0); in lsh_r64()
1962 len += arc_asl_r(BUF(buf, len), B_hi, B_hi, t0); in lsh_r64()
1963 len += arc_or_r(BUF(buf, len), B_hi, B_hi, t1); in lsh_r64()
1964 len += arc_btst_i(BUF(buf, len), t0, 5); in lsh_r64()
1965 len += arc_mov_cc_r(BUF(buf, len), CC_unequal, B_hi, B_lo); in lsh_r64()
1966 len += arc_movu_cc_r(BUF(buf, len), CC_unequal, B_lo, 0); in lsh_r64()
1981 u8 lsh_r64_i32(u8 *buf, u8 rd, s32 imm) in lsh_r64_i32() argument
1992 len = arc_lsri_r(buf, t0, B_lo, 32 - n); in lsh_r64_i32()
1993 len += arc_asli_r(BUF(buf, len), B_lo, B_lo, n); in lsh_r64_i32()
1994 len += arc_asli_r(BUF(buf, len), B_hi, B_hi, n); in lsh_r64_i32()
1995 len += arc_or_r(BUF(buf, len), B_hi, B_hi, t0); in lsh_r64_i32()
1997 len = arc_asli_r(buf, B_hi, B_lo, n - 32); in lsh_r64_i32()
1998 len += arc_movi_r(BUF(buf, len), B_lo, 0); in lsh_r64_i32()
2006 u8 rsh_r32(u8 *buf, u8 rd, u8 rs) in rsh_r32() argument
2008 return arc_lsr_r(buf, REG_LO(rd), REG_LO(rd), REG_LO(rs)); in rsh_r32()
2011 u8 rsh_r32_i32(u8 *buf, u8 rd, u8 imm) in rsh_r32_i32() argument
2013 return arc_lsri_r(buf, REG_LO(rd), REG_LO(rd), imm); in rsh_r32_i32()
2043 u8 rsh_r64(u8 *buf, u8 rd, u8 rs) in rsh_r64() argument
2052 len = arc_not_r(buf, t0, C_lo); in rsh_r64()
2053 len += arc_asli_r(BUF(buf, len), t1, B_hi, 1); in rsh_r64()
2054 len += arc_asl_r(BUF(buf, len), t1, t1, t0); in rsh_r64()
2055 len += arc_mov_r(BUF(buf, len), t0, C_lo); in rsh_r64()
2056 len += arc_lsr_r(BUF(buf, len), B_hi, B_hi, t0); in rsh_r64()
2057 len += arc_lsr_r(BUF(buf, len), B_lo, B_lo, t0); in rsh_r64()
2058 len += arc_or_r(BUF(buf, len), B_lo, B_lo, t1); in rsh_r64()
2059 len += arc_btst_i(BUF(buf, len), t0, 5); in rsh_r64()
2060 len += arc_mov_cc_r(BUF(buf, len), CC_unequal, B_lo, B_hi); in rsh_r64()
2061 len += arc_movu_cc_r(BUF(buf, len), CC_unequal, B_hi, 0); in rsh_r64()
2076 u8 rsh_r64_i32(u8 *buf, u8 rd, s32 imm) in rsh_r64_i32() argument
2087 len = arc_asli_r(buf, t0, B_hi, 32 - n); in rsh_r64_i32()
2088 len += arc_lsri_r(BUF(buf, len), B_lo, B_lo, n); in rsh_r64_i32()
2089 len += arc_lsri_r(BUF(buf, len), B_hi, B_hi, n); in rsh_r64_i32()
2090 len += arc_or_r(BUF(buf, len), B_lo, B_lo, t0); in rsh_r64_i32()
2092 len = arc_lsri_r(buf, B_lo, B_hi, n - 32); in rsh_r64_i32()
2093 len += arc_movi_r(BUF(buf, len), B_hi, 0); in rsh_r64_i32()
2101 u8 arsh_r32(u8 *buf, u8 rd, u8 rs) in arsh_r32() argument
2103 return arc_asr_r(buf, REG_LO(rd), REG_LO(rd), REG_LO(rs)); in arsh_r32()
2106 u8 arsh_r32_i32(u8 *buf, u8 rd, u8 imm) in arsh_r32_i32() argument
2108 return arc_asri_r(buf, REG_LO(rd), REG_LO(rd), imm); in arsh_r32_i32()
2140 u8 arsh_r64(u8 *buf, u8 rd, u8 rs) in arsh_r64() argument
2149 len = arc_not_r(buf, t0, C_lo); in arsh_r64()
2150 len += arc_asli_r(BUF(buf, len), t1, B_hi, 1); in arsh_r64()
2151 len += arc_asl_r(BUF(buf, len), t1, t1, t0); in arsh_r64()
2152 len += arc_mov_r(BUF(buf, len), t0, C_lo); in arsh_r64()
2153 len += arc_asr_r(BUF(buf, len), B_hi, B_hi, t0); in arsh_r64()
2154 len += arc_lsr_r(BUF(buf, len), B_lo, B_lo, t0); in arsh_r64()
2155 len += arc_or_r(BUF(buf, len), B_lo, B_lo, t1); in arsh_r64()
2156 len += arc_btst_i(BUF(buf, len), t0, 5); in arsh_r64()
2157 len += arc_asri_r(BUF(buf, len), t0, B_hi, 31); in arsh_r64()
2158 len += arc_mov_cc_r(BUF(buf, len), CC_unequal, B_lo, B_hi); in arsh_r64()
2159 len += arc_mov_cc_r(BUF(buf, len), CC_unequal, B_hi, t0); in arsh_r64()
2174 u8 arsh_r64_i32(u8 *buf, u8 rd, s32 imm) in arsh_r64_i32() argument
2185 len = arc_asli_r(buf, t0, B_hi, 32 - n); in arsh_r64_i32()
2186 len += arc_lsri_r(BUF(buf, len), B_lo, B_lo, n); in arsh_r64_i32()
2187 len += arc_asri_r(BUF(buf, len), B_hi, B_hi, n); in arsh_r64_i32()
2188 len += arc_or_r(BUF(buf, len), B_lo, B_lo, t0); in arsh_r64_i32()
2190 len = arc_asri_r(buf, B_lo, B_hi, n - 32); in arsh_r64_i32()
2191 len += arc_movi_r(BUF(buf, len), B_hi, -1); in arsh_r64_i32()
2192 len += arc_btst_i(BUF(buf, len), B_lo, 31); in arsh_r64_i32()
2193 len += arc_movu_cc_r(BUF(buf, len), CC_equal, B_hi, 0); in arsh_r64_i32()
2200 u8 gen_swap(u8 *buf, u8 rd, u8 size, u8 endian, bool force, bool do_zext) in gen_swap() argument
2215 len = arc_asli_r(buf, REG_LO(rd), REG_LO(rd), 16); in gen_swap()
2218 len += arc_swape_r(BUF(buf, len), REG_LO(rd)); in gen_swap()
2220 len += zext(BUF(buf, len), rd); in gen_swap()
2230 len = arc_xor_r(buf, REG_HI(rd), REG_LO(rd)); in gen_swap()
2231 len += arc_xor_r(BUF(buf, len), REG_LO(rd), REG_HI(rd)); in gen_swap()
2232 len += arc_xor_r(BUF(buf, len), REG_HI(rd), REG_LO(rd)); in gen_swap()
2233 len += arc_swape_r(BUF(buf, len), REG_LO(rd)); in gen_swap()
2234 len += arc_swape_r(BUF(buf, len), REG_HI(rd)); in gen_swap()
2247 len = arc_and_i(buf, REG_LO(rd), 0xffff); in gen_swap()
2251 len += zext(BUF(buf, len), rd); in gen_swap()
2275 static inline u8 frame_create(u8 *buf, u16 size) in frame_create() argument
2279 len = arc_mov_r(buf, ARC_R_FP, ARC_R_SP); in frame_create()
2281 len += arc_subi_r(BUF(buf, len), ARC_R_SP, size); in frame_create()
2283 len += arc_sub_i(BUF(buf, len), ARC_R_SP, size); in frame_create()
2292 static inline u8 frame_restore(u8 *buf) in frame_restore() argument
2294 return arc_mov_r(buf, ARC_R_SP, ARC_R_FP); in frame_restore()
2303 static u8 bpf_to_arc_return(u8 *buf) in bpf_to_arc_return() argument
2307 len = arc_mov_r(buf, ARC_R_0, REG_LO(BPF_REG_0)); in bpf_to_arc_return()
2308 len += arc_mov_r(BUF(buf, len), ARC_R_1, REG_HI(BPF_REG_0)); in bpf_to_arc_return()
2318 u8 arc_to_bpf_return(u8 *buf) in arc_to_bpf_return() argument
2322 len = arc_mov_r(buf, REG_LO(BPF_REG_0), ARC_R_0); in arc_to_bpf_return()
2323 len += arc_mov_r(BUF(buf, len), REG_HI(BPF_REG_0), ARC_R_1); in arc_to_bpf_return()
2347 static u8 jump_and_link(u8 *buf, u32 addr) in jump_and_link() argument
2351 len = arc_mov_i_fixed(buf, REG_LO(JIT_REG_TMP), addr); in jump_and_link()
2352 len += arc_jl(BUF(buf, len), REG_LO(JIT_REG_TMP)); in jump_and_link()
2404 u8 arc_prologue(u8 *buf, u32 usage, u16 frame_size) in arc_prologue() argument
2411 len += arc_push_r(BUF(buf, len), ARC_R_BLINK); in arc_prologue()
2417 len += arc_push_r(BUF(buf, len), reg); in arc_prologue()
2423 len += arc_push_r(BUF(buf, len), ARC_R_FP); in arc_prologue()
2426 len += frame_create(BUF(buf, len), frame_size); in arc_prologue()
2450 u8 arc_epilogue(u8 *buf, u32 usage, u16 frame_size) in arc_epilogue() argument
2463 len += frame_restore(BUF(buf, len)); in arc_epilogue()
2467 len += arc_pop_r(BUF(buf, len), ARC_R_FP); in arc_epilogue()
2474 len += arc_pop_r(BUF(buf, len), reg); in arc_epilogue()
2480 len += arc_pop_r(BUF(buf, len), ARC_R_BLINK); in arc_epilogue()
2483 len += bpf_to_arc_return(BUF(buf, len)); in arc_epilogue()
2484 len += arc_jmp_return(BUF(buf, len)); in arc_epilogue()
2676 static int gen_j_eq_64(u8 *buf, u8 rd, u8 rs, bool eq, in gen_j_eq_64() argument
2682 len += arc_cmp_r(BUF(buf, len), REG_HI(rd), REG_HI(rs)); in gen_j_eq_64()
2683 len += arc_cmpz_r(BUF(buf, len), REG_LO(rd), REG_LO(rs)); in gen_j_eq_64()
2685 len += arc_bcc(BUF(buf, len), eq ? CC_equal : CC_unequal, disp); in gen_j_eq_64()
2695 static u8 gen_jset_64(u8 *buf, u8 rd, u8 rs, u32 curr_off, u32 targ_off) in gen_jset_64() argument
2700 len += arc_tst_r(BUF(buf, len), REG_HI(rd), REG_HI(rs)); in gen_jset_64()
2701 len += arc_tstz_r(BUF(buf, len), REG_LO(rd), REG_LO(rs)); in gen_jset_64()
2703 len += arc_bcc(BUF(buf, len), CC_unequal, disp); in gen_jset_64()
2804 static u8 gen_jcc_64(u8 *buf, u8 rd, u8 rs, u8 cond, in gen_jcc_64() argument
2813 len += arc_cmp_r(buf, REG_HI(rd), REG_HI(rs)); in gen_jcc_64()
2817 len += arc_bcc(BUF(buf, len), cc[0], disp); in gen_jcc_64()
2822 len += arc_bcc(BUF(buf, len), cc[1], disp); in gen_jcc_64()
2825 len += arc_cmp_r(BUF(buf, len), REG_LO(rd), REG_LO(rs)); in gen_jcc_64()
2829 len += arc_bcc(BUF(buf, len), cc[2], disp); in gen_jcc_64()
2839 u8 gen_jmp_64(u8 *buf, u8 rd, u8 rs, u8 cond, u32 curr_off, u32 targ_off) in gen_jmp_64() argument
2848 len = arc_b(buf, disp); in gen_jmp_64()
2858 len = gen_jcc_64(buf, rd, rs, cond, curr_off, targ_off); in gen_jmp_64()
2864 len = gen_j_eq_64(buf, rd, rs, eq, curr_off, targ_off); in gen_jmp_64()
2867 len = gen_jset_64(buf, rd, rs, curr_off, targ_off); in gen_jmp_64()
2939 u8 gen_jmp_32(u8 *buf, u8 rd, u8 rs, u8 cond, u32 curr_off, u32 targ_off) in gen_jmp_32() argument
2960 len = tst_r32(buf, rd, rs); in gen_jmp_32()
2962 len = cmp_r32(buf, rd, rs); in gen_jmp_32()
2969 len += arc_bcc(BUF(buf, len), arcv2_32_jmps[cond], disp); in gen_jmp_32()
2973 len = arc_b(buf, disp); in gen_jmp_32()
2988 u8 gen_func_call(u8 *buf, ARC_ADDR func_addr, bool external_func) in gen_func_call() argument
2999 len += push_r64(BUF(buf, len), BPF_REG_5); in gen_func_call()
3001 len += jump_and_link(BUF(buf, len), func_addr); in gen_func_call()
3004 len += arc_add_i(BUF(buf, len), ARC_R_SP, ARC_R_SP, ARG5_SIZE); in gen_func_call()