56 uint64_t old_pc, low_pc = ((size_t)
ic - (
size_t)
57 cpu->
cd.
alpha.cur_ic_page) /
sizeof(
struct alpha_instr_call);
68 }
else if (
cpu->
pc != old_pc) {
72 alpha_pc_to_pointers(
cpu);
85 uint64_t old_pc =
cpu->
pc, low_pc;
90 low_pc = ((size_t)
ic - (
size_t)
91 cpu->
cd.
alpha.cur_ic_page) /
sizeof(
struct alpha_instr_call);
96 *((int64_t *)
ic->arg[0]) =
cpu->
pc;
97 cpu->
pc = *((int64_t *)
ic->arg[1]);
103 if ((old_pc & ~mask_within_page) == (
cpu->
pc & ~mask_within_page)) {
105 ((
cpu->
pc & mask_within_page) >> 2);
108 alpha_pc_to_pointers(
cpu);
133 uint64_t old_pc =
cpu->
pc;
138 cpu->
pc = *((int64_t *)
ic->arg[1]);
144 if ((old_pc & ~mask_within_page) == (
cpu->
pc & ~mask_within_page)) {
146 ((
cpu->
pc & mask_within_page) >> 2);
149 alpha_pc_to_pointers(
cpu);
176 low_pc = ((size_t)
ic - (
size_t)
177 cpu->
cd.
alpha.cur_ic_page) /
sizeof(
struct alpha_instr_call);
181 cpu->
pc += (int32_t)
ic->arg[0];
184 alpha_pc_to_pointers(
cpu);
199 low_pc = ((size_t)
ic - (
size_t)
200 cpu->
cd.
alpha.cur_ic_page) /
sizeof(
struct alpha_instr_call);
206 *((int64_t *)
ic->arg[1]) =
cpu->
pc + 4;
208 cpu->
pc += (int32_t)
ic->arg[0];
211 alpha_pc_to_pointers(
cpu);
223 if (*((int64_t *)
ic->arg[1]) == 0)
236 if (*((int64_t *)
ic->arg[1]) & 1)
249 if (!(*((int64_t *)
ic->arg[1]) & 1))
262 if (*((int64_t *)
ic->arg[1]) != 0)
275 if (*((int64_t *)
ic->arg[1]) <= 0)
288 if (*((int64_t *)
ic->arg[1]) < 0)
301 if (*((int64_t *)
ic->arg[1]) >= 0)
314 if (*((int64_t *)
ic->arg[1]) > 0)
326 cpu->
cd.
alpha.next_ic = (
struct alpha_instr_call *)
ic->arg[0];
337 X(br_return_samepage)
341 low_pc = ((size_t)
ic - (
size_t)
342 cpu->
cd.
alpha.cur_ic_page) /
sizeof(
struct alpha_instr_call);
346 *((int64_t *)
ic->arg[1]) =
cpu->
pc + 4;
348 cpu->
cd.
alpha.next_ic = (
struct alpha_instr_call *)
ic->arg[0];
360 if (*((int64_t *)
ic->arg[1]) == 0)
373 if (*((int64_t *)
ic->arg[1]) & 1)
386 if (!(*((int64_t *)
ic->arg[1]) & 1))
399 if (*((int64_t *)
ic->arg[1]) != 0)
412 if (*((int64_t *)
ic->arg[1]) <= 0)
425 if (*((int64_t *)
ic->arg[1]) < 0)
439 if (*((int64_t *)
ic->arg[1]) >= 0)
452 if (*((int64_t *)
ic->arg[1]) > 0)
491 reg(
ic->arg[0]) =
reg(
ic->arg[2]) & 0x7fffffffffffffffULL;
495 reg(
ic->arg[0]) =
reg(
ic->arg[2]) ^ 0x8000000000000000ULL;
544 reg(
ic->arg[0]) = res;
556 reg(
ic->arg[0]) = res;
568 reg(
ic->arg[0]) = res;
592 int32_t a =
reg(
ic->arg[1]);
593 int32_t b =
reg(
ic->arg[2]);
594 reg(
ic->arg[0]) = (int64_t)(int32_t)(a * b);
598 int32_t a =
reg(
ic->arg[1]);
599 int32_t b =
ic->arg[2];
600 reg(
ic->arg[0]) = (int64_t)(int32_t)(a * b);
630 uint64_t reshi = 0, reslo = 0;
631 uint64_t s1 =
reg(
ic->arg[1]), s2 =
reg(
ic->arg[2]);
634 for (i=0; i<64; i++) {
635 bit = (s1 & 0x8000000000000000ULL)? 1 : 0;
640 uint64_t old_reslo = reslo;
642 if (reslo < old_reslo)
648 reshi += (reslo & 0x8000000000000000ULL? 1 : 0);
653 reg(
ic->arg[0]) = reshi;
666 reg(
ic->arg[0]) =
reg(
ic->arg[1]) + (int64_t)(int32_t)
ic->arg[2];
679 reg(
ic->arg[0]) = (int64_t)(int32_t)
ic->arg[2];
723 alpha_pc_to_pointers(
cpu);
743 uint64_t
addr, low_pc;
747 void (*samepage_function)(
struct cpu *,
struct alpha_instr_call *);
748 int opcode, ra, rb, func, rc, imm,
load, loadstore_type, fp, llsc;
751 low_pc = ((size_t)
ic - (
size_t)
cpu->
cd.
alpha.cur_ic_page)
752 /
sizeof(
struct alpha_instr_call);
770 page = l3->host_load[x3];
775 memcpy(ib,
page + (
addr & 8191),
sizeof(ib));
780 fatal(
"to_be_translated(): read failed: TODO\n");
788 uint32_t *p = (uint32_t *) ib;
792 #define DYNTRANS_TO_BE_TRANSLATED_HEAD
794 #undef DYNTRANS_TO_BE_TRANSLATED_HEAD
797 opcode = (iword >> 26) & 63;
798 ra = (iword >> 21) & 31;
799 rb = (iword >> 16) & 31;
800 func = (iword >> 5) & 0x7ff;
802 imm = iword & 0xffff;
807 ic->arg[0] = (size_t) (iword & 0x3ffffff);
822 ic->arg[2] = (ssize_t)(int16_t)imm;
838 ic->arg[2] = (ssize_t)(int16_t)imm;
856 loadstore_type = 0; fp = 0;
load = 0; llsc = 0;
858 case 0x0a: loadstore_type = 0;
load = 1;
break;
859 case 0x0c: loadstore_type = 1;
load = 1;
break;
860 case 0x0d: loadstore_type = 1;
break;
861 case 0x0e: loadstore_type = 0;
break;
862 case 0x22: loadstore_type = 2;
load = 1; fp = 1;
break;
863 case 0x23: loadstore_type = 3;
load = 1; fp = 1;
break;
864 case 0x26: loadstore_type = 2; fp = 1;
break;
865 case 0x27: loadstore_type = 3; fp = 1;
break;
866 case 0x28: loadstore_type = 2;
load = 1;
break;
867 case 0x29: loadstore_type = 3;
load = 1;
break;
868 case 0x2a: loadstore_type = 2;
load = llsc = 1;
break;
869 case 0x2b: loadstore_type = 3;
load = llsc = 1;
break;
870 case 0x2c: loadstore_type = 2;
break;
871 case 0x2d: loadstore_type = 3;
break;
872 case 0x2e: loadstore_type = 2; llsc = 1;
break;
873 case 0x2f: loadstore_type = 3; llsc = 1;
break;
876 loadstore_type + (imm==0? 4 : 0) + 8 *
load
889 ic->arg[2] = (ssize_t)(int16_t)imm;
899 ic->arg[2] = (size_t)((rb << 3) + (func >> 8));
902 switch (func & 0xff) {
903 case 0x00:
ic->f =
instr(addl);
break;
904 case 0x02:
ic->f =
instr(s4addl);
break;
905 case 0x09:
ic->f =
instr(subl);
break;
906 case 0x0b:
ic->f =
instr(s4subl);
break;
907 case 0x0f:
ic->f =
instr(cmpbge);
break;
908 case 0x12:
ic->f =
instr(s8addl);
break;
909 case 0x1b:
ic->f =
instr(s8subl);
break;
910 case 0x1d:
ic->f =
instr(cmpult);
break;
911 case 0x20:
ic->f =
instr(addq);
break;
912 case 0x22:
ic->f =
instr(s4addq);
break;
913 case 0x29:
ic->f =
instr(subq);
break;
914 case 0x2b:
ic->f =
instr(s4subq);
break;
915 case 0x2d:
ic->f =
instr(cmpeq);
break;
916 case 0x32:
ic->f =
instr(s8addq);
break;
917 case 0x3b:
ic->f =
instr(s8subq);
break;
918 case 0x3d:
ic->f =
instr(cmpule);
break;
919 case 0x4d:
ic->f =
instr(cmplt);
break;
921 case 0x6d:
ic->f =
instr(cmple);
break;
923 case 0x80:
ic->f =
instr(addl_imm);
break;
924 case 0x82:
ic->f =
instr(s4addl_imm);
break;
925 case 0x89:
ic->f =
instr(subl_imm);
break;
926 case 0x8b:
ic->f =
instr(s4subl_imm);
break;
927 case 0x8f:
ic->f =
instr(cmpbge_imm);
break;
928 case 0x92:
ic->f =
instr(s8addl_imm);
break;
929 case 0x9b:
ic->f =
instr(s8subl_imm);
break;
930 case 0x9d:
ic->f =
instr(cmpult_imm);
break;
931 case 0xa0:
ic->f =
instr(addq_imm);
break;
932 case 0xa2:
ic->f =
instr(s4addq_imm);
break;
933 case 0xa9:
ic->f =
instr(subq_imm);
break;
934 case 0xab:
ic->f =
instr(s4subq_imm);
break;
935 case 0xad:
ic->f =
instr(cmpeq_imm);
break;
936 case 0xb2:
ic->f =
instr(s8addq_imm);
break;
937 case 0xbb:
ic->f =
instr(s8subq_imm);
break;
938 case 0xbd:
ic->f =
instr(cmpule_imm);
break;
939 case 0xcd:
ic->f =
instr(cmplt_imm);
break;
940 case 0xed:
ic->f =
instr(cmple_imm);
break;
943 fatal(
"[ Alpha: unimplemented function 0x%03x "
944 "for opcode 0x%02x ]\n", func, opcode);
956 ic->arg[2] = (size_t)((rb << 3) + (func >> 8));
959 switch (func & 0xff) {
960 case 0x00:
ic->f =
instr(and);
break;
961 case 0x08:
ic->f =
instr(andnot);
break;
962 case 0x14:
ic->f =
instr(cmovlbs);
break;
963 case 0x16:
ic->f =
instr(cmovlbc);
break;
971 case 0x24:
ic->f =
instr(cmoveq);
break;
972 case 0x26:
ic->f =
instr(cmovne);
break;
973 case 0x28:
ic->f =
instr(ornot);
break;
974 case 0x40:
ic->f =
instr(xor);
break;
975 case 0x44:
ic->f =
instr(cmovlt);
break;
976 case 0x46:
ic->f =
instr(cmovge);
break;
977 case 0x48:
ic->f =
instr(xornot);
break;
978 case 0x64:
ic->f =
instr(cmovle);
break;
979 case 0x66:
ic->f =
instr(cmovgt);
break;
980 case 0x80:
ic->f =
instr(and_imm);
break;
981 case 0x88:
ic->f =
instr(andnot_imm);
break;
982 case 0x94:
ic->f =
instr(cmovlbs_imm);
break;
983 case 0x96:
ic->f =
instr(cmovlbc_imm);
break;
984 case 0xa0:
ic->f =
instr(or_imm);
break;
985 case 0xa4:
ic->f =
instr(cmoveq_imm);
break;
986 case 0xa6:
ic->f =
instr(cmovne_imm);
break;
987 case 0xa8:
ic->f =
instr(ornot_imm);
break;
988 case 0xc0:
ic->f =
instr(xor_imm);
break;
989 case 0xc4:
ic->f =
instr(cmovlt_imm);
break;
990 case 0xc6:
ic->f =
instr(cmovge_imm);
break;
991 case 0xc8:
ic->f =
instr(xornot_imm);
break;
992 case 0xe4:
ic->f =
instr(cmovle_imm);
break;
993 case 0xe6:
ic->f =
instr(cmovgt_imm);
break;
994 case 0xec:
ic->f =
instr(implver);
break;
996 fatal(
"[ Alpha: unimplemented function 0x%03x "
997 "for opcode 0x%02x ]\n", func, opcode);
1009 ic->arg[2] = (size_t)((rb << 3) + (func >> 8));
1012 switch (func & 0xff) {
1013 case 0x02:
ic->f =
instr(mskbl);
break;
1014 case 0x06:
ic->f =
instr(extbl);
break;
1015 case 0x0b:
ic->f =
instr(insbl);
break;
1016 case 0x12:
ic->f =
instr(mskwl);
break;
1017 case 0x16:
ic->f =
instr(extwl);
break;
1018 case 0x1b:
ic->f =
instr(inswl);
break;
1019 case 0x22:
ic->f =
instr(mskll);
break;
1020 case 0x26:
ic->f =
instr(extll);
break;
1021 case 0x2b:
ic->f =
instr(insll);
break;
1022 case 0x30:
ic->f =
instr(zap);
break;
1023 case 0x31:
ic->f =
instr(zapnot);
break;
1024 case 0x32:
ic->f =
instr(mskql);
break;
1025 case 0x34:
ic->f =
instr(srl);
break;
1026 case 0x36:
ic->f =
instr(extql);
break;
1028 case 0x3b:
ic->f =
instr(insql);
break;
1029 case 0x3c:
ic->f =
instr(sra);
break;
1030 case 0x52:
ic->f =
instr(mskwh);
break;
1031 case 0x57:
ic->f =
instr(inswh);
break;
1032 case 0x5a:
ic->f =
instr(extwh);
break;
1033 case 0x62:
ic->f =
instr(msklh);
break;
1034 case 0x67:
ic->f =
instr(inslh);
break;
1035 case 0x6a:
ic->f =
instr(extlh);
break;
1036 case 0x72:
ic->f =
instr(mskqh);
break;
1037 case 0x77:
ic->f =
instr(insqh);
break;
1038 case 0x7a:
ic->f =
instr(extqh);
break;
1039 case 0x82:
ic->f =
instr(mskbl_imm);
break;
1040 case 0x86:
ic->f =
instr(extbl_imm);
break;
1041 case 0x8b:
ic->f =
instr(insbl_imm);
break;
1042 case 0x92:
ic->f =
instr(mskwl_imm);
break;
1043 case 0x96:
ic->f =
instr(extwl_imm);
break;
1044 case 0x9b:
ic->f =
instr(inswl_imm);
break;
1045 case 0xa2:
ic->f =
instr(mskll_imm);
break;
1046 case 0xa6:
ic->f =
instr(extll_imm);
break;
1047 case 0xab:
ic->f =
instr(insll_imm);
break;
1048 case 0xb0:
ic->f =
instr(zap_imm);
break;
1049 case 0xb1:
ic->f =
instr(zapnot_imm);
break;
1050 case 0xb2:
ic->f =
instr(mskql_imm);
break;
1051 case 0xb4:
ic->f =
instr(srl_imm);
break;
1052 case 0xb6:
ic->f =
instr(extql_imm);
break;
1053 case 0xb9:
ic->f =
instr(sll_imm);
break;
1054 case 0xbb:
ic->f =
instr(insql_imm);
break;
1055 case 0xbc:
ic->f =
instr(sra_imm);
break;
1056 case 0xd2:
ic->f =
instr(mskwh_imm);
break;
1057 case 0xd7:
ic->f =
instr(inswh_imm);
break;
1058 case 0xda:
ic->f =
instr(extwh_imm);
break;
1059 case 0xe2:
ic->f =
instr(msklh_imm);
break;
1060 case 0xe7:
ic->f =
instr(inslh_imm);
break;
1061 case 0xea:
ic->f =
instr(extlh_imm);
break;
1062 case 0xf2:
ic->f =
instr(mskqh_imm);
break;
1063 case 0xf7:
ic->f =
instr(insqh_imm);
break;
1064 case 0xfa:
ic->f =
instr(extqh_imm);
break;
1066 fatal(
"[ Alpha: unimplemented function 0x%03x "
1067 "for opcode 0x%02x ]\n", func, opcode);
1079 ic->arg[2] = (size_t)((rb << 3) + (func >> 8));
1084 switch (func & 0xff) {
1085 case 0x00:
ic->f =
instr(mull);
break;
1086 case 0x20:
ic->f =
instr(mulq);
break;
1087 case 0x30:
ic->f =
instr(umulh);
break;
1088 case 0x80:
ic->f =
instr(mull_imm);
break;
1089 case 0xa0:
ic->f =
instr(mulq_imm);
break;
1091 fatal(
"[ Alpha: unimplemented function 0x%03x "
1092 "for opcode 0x%02x ]\n", func, opcode);
1104 switch (func & 0x7ff) {
1105 case 0x02f:
ic->f =
instr(cvttq_c);
break;
1106 case 0x0a0:
ic->f =
instr(addt);
break;
1107 case 0x0a1:
ic->f =
instr(subt);
break;
1108 case 0x0a2:
ic->f =
instr(mult);
break;
1109 case 0x0a3:
ic->f =
instr(divt);
break;
1110 case 0x0a5:
ic->f =
instr(cmpteq);
break;
1111 case 0x0a6:
ic->f =
instr(cmptlt);
break;
1112 case 0x0a7:
ic->f =
instr(cmptle);
break;
1113 case 0x0be:
ic->f =
instr(cvtqt);
break;
1115 fatal(
"[ Alpha: unimplemented function 0x%03x "
1116 "for opcode 0x%02x ]\n", func, opcode);
1128 switch (func & 0x7ff) {
1131 if (ra == 31 && rb == 31)
1140 fatal(
"[ Alpha: unimplemented function 0x%03x "
1141 "for opcode 0x%02x ]\n", func, opcode);
1146 switch (iword & 0xffff) {
1160 fatal(
"[ Alpha: unimplemented function 0x%03x "
1161 "for opcode 0x%02x ]\n", func, opcode);
1166 switch ((iword >> 14) & 3) {
1186 fatal(
"[ Alpha: unimpl JSR type %i, ra=%i "
1187 "rb=%i ]\n", ((iword >> 14) & 3), ra, rb);
1210 samepage_function =
instr(br_samepage);
1213 samepage_function =
instr(br_return_samepage);
1218 samepage_function =
instr(blbc_samepage);
1224 samepage_function =
instr(beq_samepage);
1228 samepage_function =
instr(blt_samepage);
1232 samepage_function =
instr(ble_samepage);
1236 samepage_function =
instr(blbs_samepage);
1242 samepage_function =
instr(bne_samepage);
1246 samepage_function =
instr(bge_samepage);
1250 samepage_function =
instr(bgt_samepage);
1257 ic->arg[0] = (iword & 0x001fffff) << 2;
1259 if (
ic->arg[0] & 0x00400000)
1260 ic->arg[0] |= 0xffffffffff800000ULL;
1262 ic->arg[0] = (size_t)(
ic->arg[0] + 4);
1265 uint64_t mask_within_page =
1267 uint64_t old_pc =
addr;
1268 uint64_t new_pc = old_pc + (int32_t)
ic->arg[0];
1269 if ((old_pc & ~mask_within_page) ==
1270 (new_pc & ~mask_within_page)) {
1271 ic->f = samepage_function;
1272 ic->arg[0] = (size_t) (
1274 ((new_pc & mask_within_page) >> 2));
1279 fatal(
"[ UNIMPLEMENTED Alpha opcode 0x%x ]\n", opcode);
1284 #define DYNTRANS_TO_BE_TRANSLATED_TAIL
1286 #undef DYNTRANS_TO_BE_TRANSLATED_TAIL