Mercurial > projects > ddmd
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!( |