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);