Mercurial > repos > blastem
comparison gen_x86.c @ 123:bd3858121ab0
Implement the rest of the bit instructions
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 29 Dec 2012 21:10:07 -0800 |
parents | fb7944d3ed5c |
children | dc5fc3adf705 |
comparison
equal
deleted
inserted
replaced
122:0a6da6c7c463 | 123:bd3858121ab0 |
---|---|
41 #define OP_SINGLE_EA 0xFF | 41 #define OP_SINGLE_EA 0xFF |
42 | 42 |
43 #define OP2_JCC 0x80 | 43 #define OP2_JCC 0x80 |
44 #define OP2_SETCC 0x90 | 44 #define OP2_SETCC 0x90 |
45 #define OP2_BT 0xA3 | 45 #define OP2_BT 0xA3 |
46 #define OP2_BTS 0xAB | |
47 #define OP2_BTR 0xB3 | |
46 #define OP2_BTX_I 0xBA | 48 #define OP2_BTX_I 0xBA |
49 #define OP2_BTC 0xBB | |
47 #define OP2_MOVSX 0xBE | 50 #define OP2_MOVSX 0xBE |
48 | 51 |
49 #define OP_EX_ADDI 0x0 | 52 #define OP_EX_ADDI 0x0 |
50 #define OP_EX_ORI 0x1 | 53 #define OP_EX_ORI 0x1 |
51 #define OP_EX_ADCI 0x2 | 54 #define OP_EX_ADCI 0x2 |
1080 *(out++) = MODE_REG_DISPLACE8 | dst; | 1083 *(out++) = MODE_REG_DISPLACE8 | dst; |
1081 *(out++) = disp; | 1084 *(out++) = disp; |
1082 return out; | 1085 return out; |
1083 } | 1086 } |
1084 | 1087 |
1085 uint8_t * bt_rr(uint8_t * out, uint8_t src, uint8_t dst, uint8_t size) | 1088 uint8_t * bit_rr(uint8_t * out, uint8_t op2, uint8_t src, uint8_t dst, uint8_t size) |
1086 { | 1089 { |
1087 if (size == SZ_W) { | 1090 if (size == SZ_W) { |
1088 *(out++) = PRE_SIZE; | 1091 *(out++) = PRE_SIZE; |
1089 } | 1092 } |
1090 if (size == SZ_Q || src >= R8 || dst >= R8) { | 1093 if (size == SZ_Q || src >= R8 || dst >= R8) { |
1101 dst -= (R8 - X86_R8); | 1104 dst -= (R8 - X86_R8); |
1102 } | 1105 } |
1103 out++; | 1106 out++; |
1104 } | 1107 } |
1105 *(out++) = PRE_2BYTE; | 1108 *(out++) = PRE_2BYTE; |
1106 *(out++) = OP2_BT; | 1109 *(out++) = op2; |
1107 *(out++) = MODE_REG_DIRECT | dst | (src << 3); | 1110 *(out++) = MODE_REG_DIRECT | dst | (src << 3); |
1108 return out; | 1111 return out; |
1109 } | 1112 } |
1110 | 1113 |
1111 uint8_t * bt_rrdisp8(uint8_t * out, uint8_t src, uint8_t dst_base, int8_t dst_disp, uint8_t size) | 1114 uint8_t * bit_rrdisp8(uint8_t * out, uint8_t op2, uint8_t src, uint8_t dst_base, int8_t dst_disp, uint8_t size) |
1112 { | 1115 { |
1113 if (size == SZ_W) { | 1116 if (size == SZ_W) { |
1114 *(out++) = PRE_SIZE; | 1117 *(out++) = PRE_SIZE; |
1115 } | 1118 } |
1116 if (size == SZ_Q || src >= R8 || dst_base >= R8) { | 1119 if (size == SZ_Q || src >= R8 || dst_base >= R8) { |
1127 dst_base -= (R8 - X86_R8); | 1130 dst_base -= (R8 - X86_R8); |
1128 } | 1131 } |
1129 out++; | 1132 out++; |
1130 } | 1133 } |
1131 *(out++) = PRE_2BYTE; | 1134 *(out++) = PRE_2BYTE; |
1132 *(out++) = OP2_BT; | 1135 *(out++) = op2; |
1133 *(out++) = MODE_REG_DISPLACE8 | dst_base | (src << 3); | 1136 *(out++) = MODE_REG_DISPLACE8 | dst_base | (src << 3); |
1134 *(out++) = dst_disp; | 1137 *(out++) = dst_disp; |
1135 return out; | 1138 return out; |
1136 } | 1139 } |
1137 | 1140 |
1138 uint8_t * bt_ir(uint8_t * out, uint8_t val, uint8_t dst, uint8_t size) | 1141 uint8_t * bit_ir(uint8_t * out, uint8_t op_ex, uint8_t val, uint8_t dst, uint8_t size) |
1139 { | 1142 { |
1140 if (size == SZ_W) { | 1143 if (size == SZ_W) { |
1141 *(out++) = PRE_SIZE; | 1144 *(out++) = PRE_SIZE; |
1142 } | 1145 } |
1143 if (size == SZ_Q || dst >= R8) { | 1146 if (size == SZ_Q || dst >= R8) { |
1151 } | 1154 } |
1152 out++; | 1155 out++; |
1153 } | 1156 } |
1154 *(out++) = PRE_2BYTE; | 1157 *(out++) = PRE_2BYTE; |
1155 *(out++) = OP2_BTX_I; | 1158 *(out++) = OP2_BTX_I; |
1156 *(out++) = MODE_REG_DIRECT | dst | (OP_EX_BT << 3); | 1159 *(out++) = MODE_REG_DIRECT | dst | (op_ex << 3); |
1157 *(out++) = val; | 1160 *(out++) = val; |
1158 return out; | 1161 return out; |
1159 } | 1162 } |
1160 | 1163 |
1161 uint8_t * bt_irdisp8(uint8_t * out, uint8_t val, uint8_t dst_base, int8_t dst_disp, uint8_t size) | 1164 uint8_t * bit_irdisp8(uint8_t * out, uint8_t op_ex, uint8_t val, uint8_t dst_base, int8_t dst_disp, uint8_t size) |
1162 { | 1165 { |
1163 if (size == SZ_W) { | 1166 if (size == SZ_W) { |
1164 *(out++) = PRE_SIZE; | 1167 *(out++) = PRE_SIZE; |
1165 } | 1168 } |
1166 if (size == SZ_Q || dst_base >= R8) { | 1169 if (size == SZ_Q || dst_base >= R8) { |
1174 } | 1177 } |
1175 out++; | 1178 out++; |
1176 } | 1179 } |
1177 *(out++) = PRE_2BYTE; | 1180 *(out++) = PRE_2BYTE; |
1178 *(out++) = OP2_BTX_I; | 1181 *(out++) = OP2_BTX_I; |
1179 *(out++) = MODE_REG_DISPLACE8 | dst_base | (OP_EX_BT << 3); | 1182 *(out++) = MODE_REG_DISPLACE8 | dst_base | (op_ex << 3); |
1180 *(out++) = dst_disp; | 1183 *(out++) = dst_disp; |
1181 *(out++) = val; | 1184 *(out++) = val; |
1182 return out; | 1185 return out; |
1186 } | |
1187 | |
1188 uint8_t * bt_rr(uint8_t * out, uint8_t src, uint8_t dst, uint8_t size) | |
1189 { | |
1190 return bit_rr(out, OP2_BT, src, dst, size); | |
1191 } | |
1192 | |
1193 uint8_t * bt_rrdisp8(uint8_t * out, uint8_t src, uint8_t dst_base, int8_t dst_disp, uint8_t size) | |
1194 { | |
1195 return bit_rrdisp8(out, OP2_BT, src, dst_base, dst_disp, size); | |
1196 } | |
1197 | |
1198 uint8_t * bt_ir(uint8_t * out, uint8_t val, uint8_t dst, uint8_t size) | |
1199 { | |
1200 return bit_ir(out, OP_EX_BT, val, dst, size); | |
1201 } | |
1202 | |
1203 uint8_t * bt_irdisp8(uint8_t * out, uint8_t val, uint8_t dst_base, int8_t dst_disp, uint8_t size) | |
1204 { | |
1205 return bit_irdisp8(out, OP_EX_BT, val, dst_base, dst_disp, size); | |
1206 } | |
1207 | |
1208 uint8_t * bts_rr(uint8_t * out, uint8_t src, uint8_t dst, uint8_t size) | |
1209 { | |
1210 return bit_rr(out, OP2_BT, src, dst, size); | |
1211 } | |
1212 | |
1213 uint8_t * bts_rrdisp8(uint8_t * out, uint8_t src, uint8_t dst_base, int8_t dst_disp, uint8_t size) | |
1214 { | |
1215 return bit_rrdisp8(out, OP2_BT, src, dst_base, dst_disp, size); | |
1216 } | |
1217 | |
1218 uint8_t * bts_ir(uint8_t * out, uint8_t val, uint8_t dst, uint8_t size) | |
1219 { | |
1220 return bit_ir(out, OP_EX_BTS, val, dst, size); | |
1221 } | |
1222 | |
1223 uint8_t * bts_irdisp8(uint8_t * out, uint8_t val, uint8_t dst_base, int8_t dst_disp, uint8_t size) | |
1224 { | |
1225 return bit_irdisp8(out, OP_EX_BTS, val, dst_base, dst_disp, size); | |
1226 } | |
1227 | |
1228 uint8_t * btr_rr(uint8_t * out, uint8_t src, uint8_t dst, uint8_t size) | |
1229 { | |
1230 return bit_rr(out, OP2_BTR, src, dst, size); | |
1231 } | |
1232 | |
1233 uint8_t * btr_rrdisp8(uint8_t * out, uint8_t src, uint8_t dst_base, int8_t dst_disp, uint8_t size) | |
1234 { | |
1235 return bit_rrdisp8(out, OP2_BTR, src, dst_base, dst_disp, size); | |
1236 } | |
1237 | |
1238 uint8_t * btr_ir(uint8_t * out, uint8_t val, uint8_t dst, uint8_t size) | |
1239 { | |
1240 return bit_ir(out, OP_EX_BTR, val, dst, size); | |
1241 } | |
1242 | |
1243 uint8_t * btr_irdisp8(uint8_t * out, uint8_t val, uint8_t dst_base, int8_t dst_disp, uint8_t size) | |
1244 { | |
1245 return bit_irdisp8(out, OP_EX_BTR, val, dst_base, dst_disp, size); | |
1246 } | |
1247 | |
1248 uint8_t * btc_rr(uint8_t * out, uint8_t src, uint8_t dst, uint8_t size) | |
1249 { | |
1250 return bit_rr(out, OP2_BTC, src, dst, size); | |
1251 } | |
1252 | |
1253 uint8_t * btc_rrdisp8(uint8_t * out, uint8_t src, uint8_t dst_base, int8_t dst_disp, uint8_t size) | |
1254 { | |
1255 return bit_rrdisp8(out, OP2_BTC, src, dst_base, dst_disp, size); | |
1256 } | |
1257 | |
1258 uint8_t * btc_ir(uint8_t * out, uint8_t val, uint8_t dst, uint8_t size) | |
1259 { | |
1260 return bit_ir(out, OP_EX_BTC, val, dst, size); | |
1261 } | |
1262 | |
1263 uint8_t * btc_irdisp8(uint8_t * out, uint8_t val, uint8_t dst_base, int8_t dst_disp, uint8_t size) | |
1264 { | |
1265 return bit_irdisp8(out, OP_EX_BTC, val, dst_base, dst_disp, size); | |
1183 } | 1266 } |
1184 | 1267 |
1185 uint8_t * jcc(uint8_t * out, uint8_t cc, uint8_t * dest) | 1268 uint8_t * jcc(uint8_t * out, uint8_t cc, uint8_t * dest) |
1186 { | 1269 { |
1187 ptrdiff_t disp = dest-(out+2); | 1270 ptrdiff_t disp = dest-(out+2); |