comparison dmd/backend/iasm.d @ 20:1628b221808d

Fleshed out more unimplemented methods.
author Robert Clipsham <robert@octarineparrot.com>
date Wed, 07 Apr 2010 00:29:13 +0100
parents 2cc604139636
children fd4acc376c45
comparison
equal deleted inserted replaced
19:01cadcfa4842 20:1628b221808d
1033 auchOpcode[usIdx-1] += popnd1.base.val; 1033 auchOpcode[usIdx-1] += popnd1.base.val;
1034 } 1034 }
1035 } 1035 }
1036 else 1036 else
1037 { 1037 {
1038 asm_make_modrm_byte( 1038 debug asm_make_modrm_byte(
1039 ///debug {
1040 auchOpcode, &usIdx, 1039 auchOpcode, &usIdx,
1041 ///} 1040 pc,
1041 ptb.pptb1.usFlags,
1042 popnd1, null);
1043 else asm_make_modrm_byte(
1042 pc, 1044 pc,
1043 ptb.pptb1.usFlags, 1045 ptb.pptb1.usFlags,
1044 popnd1, null); 1046 popnd1, null);
1045 } 1047 }
1046 1048
1126 } 1128 }
1127 if (ptb.pptb0.usOpcode == 0x0F7E || // MOVD _rm32,_mm 1129 if (ptb.pptb0.usOpcode == 0x0F7E || // MOVD _rm32,_mm
1128 ptb.pptb0.usOpcode == 0x660F7E // MOVD _rm32,_xmm 1130 ptb.pptb0.usOpcode == 0x660F7E // MOVD _rm32,_xmm
1129 ) 1131 )
1130 { 1132 {
1131 asm_make_modrm_byte( 1133 debug asm_make_modrm_byte(
1132 ///debug { 1134 auchOpcode, &usIdx,
1133 auchOpcode, &usIdx, 1135 pc,
1134 ///} 1136 ptb.pptb1.usFlags,
1135 pc, 1137 popnd1, popnd2);
1136 ptb.pptb1.usFlags, 1138 else asm_make_modrm_byte(pc, ptb.pptb1.usFlags, popnd1, popnd2);
1137 popnd1, popnd2);
1138 } 1139 }
1139 else 1140 else
1140 { 1141 {
1141 asm_make_modrm_byte( 1142 debug asm_make_modrm_byte(
1142 ///debug { 1143 auchOpcode, &usIdx,
1143 auchOpcode, &usIdx, 1144 pc,
1144 ///} 1145 ptb.pptb1.usFlags,
1145 pc, 1146 popnd2, popnd1);
1146 ptb.pptb1.usFlags, 1147 else asm_make_modrm_byte(pc, ptb.pptb1.usFlags, popnd2, popnd1);
1147 popnd2, popnd1);
1148 } 1148 }
1149 popndTmp = popnd1; 1149 popndTmp = popnd1;
1150 aoptyTmp = aoptyTable1; 1150 aoptyTmp = aoptyTable1;
1151 uSizemaskTmp = cast(ushort)uSizemaskTable1; 1151 uSizemaskTmp = cast(ushort)uSizemaskTable1;
1152 } 1152 }
1186 ptb.pptb0.usOpcode == 0x660F50 || 1186 ptb.pptb0.usOpcode == 0x660F50 ||
1187 ptb.pptb0.usOpcode == 0x0F50 || 1187 ptb.pptb0.usOpcode == 0x0F50 ||
1188 ptb.pptb0.usOpcode == 0x660FD7 || 1188 ptb.pptb0.usOpcode == 0x660FD7 ||
1189 ptb.pptb0.usOpcode == 0x0FD7) 1189 ptb.pptb0.usOpcode == 0x0FD7)
1190 { 1190 {
1191 asm_make_modrm_byte( 1191 debug asm_make_modrm_byte(
1192 ///debug { 1192 ///debug {
1193 auchOpcode, &usIdx, 1193 auchOpcode, &usIdx,
1194 ///} 1194 ///}
1195 pc, 1195 pc,
1196 ptb.pptb1.usFlags, 1196 ptb.pptb1.usFlags,
1197 popnd2, popnd1); 1197 popnd2, popnd1);
1198 else asm_make_modrm_byte(
1199 pc,
1200 ptb.pptb1.usFlags,
1201 popnd2, popnd1);
1198 } 1202 }
1199 else 1203 else
1200 { 1204 {
1201 asm_make_modrm_byte( 1205 debug asm_make_modrm_byte(
1202 ///debug { 1206 ///debug {
1203 auchOpcode, &usIdx, 1207 auchOpcode, &usIdx,
1204 ///} 1208 ///}
1205 pc, 1209 pc,
1206 ptb.pptb1.usFlags, 1210 ptb.pptb1.usFlags,
1207 popnd1, popnd2); 1211 popnd1, popnd2);
1212 else asm_make_modrm_byte(
1213 pc,
1214 ptb.pptb1.usFlags,
1215 popnd1, popnd2);
1208 1216
1209 } 1217 }
1210 if (aoptyTable1 == ASM_OPERAND_TYPE._imm) 1218 if (aoptyTable1 == ASM_OPERAND_TYPE._imm)
1211 { 1219 {
1212 popndTmp = popnd1; 1220 popndTmp = popnd1;
1224 1232
1225 case 3: 1233 case 3:
1226 if (aoptyTable2 == ASM_OPERAND_TYPE._m || aoptyTable2 == ASM_OPERAND_TYPE._rm || 1234 if (aoptyTable2 == ASM_OPERAND_TYPE._m || aoptyTable2 == ASM_OPERAND_TYPE._rm ||
1227 usOpcode == 0x0FC5) // PEXTRW 1235 usOpcode == 0x0FC5) // PEXTRW
1228 { 1236 {
1229 asm_make_modrm_byte( 1237 debug asm_make_modrm_byte(
1230 ///debug { 1238 ///debug {
1231 auchOpcode, &usIdx, 1239 auchOpcode, &usIdx,
1232 ///} 1240 ///}
1233 pc, 1241 pc,
1234 ptb.pptb1.usFlags, 1242 ptb.pptb1.usFlags,
1235 popnd2, popnd1); 1243 popnd2, popnd1);
1244 else asm_make_modrm_byte(
1245 pc,
1246 ptb.pptb1.usFlags,
1247 popnd2, popnd1);
1236 popndTmp = popnd3; 1248 popndTmp = popnd3;
1237 aoptyTmp = aoptyTable3; 1249 aoptyTmp = aoptyTable3;
1238 uSizemaskTmp = cast(ushort)uSizemaskTable3; 1250 uSizemaskTmp = cast(ushort)uSizemaskTable3;
1239 } else { 1251 } else {
1240 if (((aoptyTable1 == ASM_OPERAND_TYPE._reg || aoptyTable1 == ASM_OPERAND_TYPE._float) && 1252 if (((aoptyTable1 == ASM_OPERAND_TYPE._reg || aoptyTable1 == ASM_OPERAND_TYPE._float) &&
1264 debug { 1276 debug {
1265 auchOpcode[usIdx-1] += popnd2.base.val; 1277 auchOpcode[usIdx-1] += popnd2.base.val;
1266 } 1278 }
1267 } 1279 }
1268 else 1280 else
1269 asm_make_modrm_byte( 1281 {
1282 debug asm_make_modrm_byte(
1270 ///debug { 1283 ///debug {
1271 auchOpcode, &usIdx, 1284 auchOpcode, &usIdx,
1272 ///} 1285 ///}
1273 pc, 1286 pc,
1274 ptb.pptb1.usFlags, 1287 ptb.pptb1.usFlags,
1275 popnd1, popnd2); 1288 popnd1, popnd2);
1276 1289 else asm_make_modrm_byte(
1290 pc,
1291 ptb.pptb1.usFlags,
1292 popnd1, popnd2);
1293 }
1277 popndTmp = popnd3; 1294 popndTmp = popnd3;
1278 aoptyTmp = aoptyTable3; 1295 aoptyTmp = aoptyTable3;
1279 uSizemaskTmp = cast(ushort)uSizemaskTable3; 1296 uSizemaskTmp = cast(ushort)uSizemaskTable3;
1280 } 1297 }
1281 goto L1; 1298 goto L1;
2228 2245
2229 uint Y(ubyte r1) { 2246 uint Y(ubyte r1) {
2230 return X(r1, 9); 2247 return X(r1, 9);
2231 } 2248 }
2232 2249
2233 void asm_make_modrm_byte( 2250 // Save a copy/pasted function
2234 ///debug { 2251 template Tuple(T...) { alias T Tuple; }
2235 ubyte[] puchOpcode, uint* pusIdx, 2252 debug alias Tuple!(ubyte[], uint*) asm_make_modrm_args;
2236 ///} 2253 else alias Tuple!() asm_make_modrm_args;
2237 code *pc, 2254
2238 ushort usFlags, 2255 void asm_make_modrm_byte(asm_make_modrm_args ocidx, code *pc, ushort usFlags, OPND *popnd, OPND *popnd2)
2239 OPND *popnd, OPND *popnd2)
2240 { 2256 {
2241 /// #undef modregrm 2257 /// #undef modregrm
2242 2258 debug alias ocidx[0] puchOpcode;
2259 debug alias ocidx[1] pusIdx;
2243 union MODRM_BYTE // mrmb 2260 union MODRM_BYTE // mrmb
2244 { 2261 {
2245 struct MODRM 2262 struct MODRM
2246 { 2263 {
2247 mixin(bitfields!( 2264 mixin(bitfields!(