From: Nicholas N. <nj...@ca...> - 2003-01-28 08:25:05
|
On Tue, 28 Jan 2003, Julian Seward wrote: > > I just noticed that the UCode for the x86 instruction 'leave' is made > > like this: > > > > case 0xC9: /* LEAVE */ > > t1 = newTemp(cb); t2 = newTemp(cb); > > uInstr2(cb, GET, 4, ArchReg, R_EBP, TempReg, t1); > > uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, R_ESP); // (1) > > uInstr2(cb, LOAD, 4, TempReg, t1, TempReg, t2); > > uInstr2(cb, PUT, 4, TempReg, t2, ArchReg, R_EBP); > > uInstr2(cb, ADD, 4, Literal, 0, TempReg, t1); > > uLiteral(cb, 4); > > uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, R_ESP); // (2) > > if (dis) VG_(printf)("leave"); > > break; > > > > AFAICT, UInstruction (1) is redundant due to (2)... right? > Interesting. I think you're right. Did you find that with your > spot-multiple-writes-without-intervening-reads skin, that you > mentioned on Friday? No, it only looks at LOADs and STOREs. Just spotted it when looking through some UCode in detail. > I guess this should be fixed; I can do so if you like. I'll do it... it's not hard. N |