CompuServe Messages

#asm code

    20-Jul-93 14:16:32
Sb: #asm code
Fm: Peter H. Teeson 72647,3674
To: All
The following function in THINK C compiles fine: short Foo(register short x) { asm {rol.w #1, x} return (x ^ 0x1021); } it generates the following disassembled code Foo: 00000000: 4E56 0000 LINK A6,#$0000 00000004: 2F07 MOVE.L D7,-(A7) 00000006: 3E2E 0008 MOVE.W $0008(A6),D7 0000000A: E35F ROL.W #$1,D7 0000000C: 3007 MOVE.W D7,D0 0000000E: 0A40 1021 EORI.W #$1021,D0 00000012: 2E1F MOVE.L (A7)+,D7 00000014: 4E5E UNLK A6 00000016: 4E75 RTS 00000018 so I thought to convert it to C++ by doing short Foo(register short x) { return ((x<<1) ^ 0x1021); } which seems to compile OK and generates the following (longer and different) disassembled code: Foo(short): 00000000: 4E56 0000 LINK A6,#$0000 00000004: 2F03 MOVE.L D3,-(A7) 00000006: 362E 0008 MOVE.W $0008(A6),D3 0000000A: 3003 MOVE.W D3,D0 0000000C: E340 ASL.W #$1,D0 0000000E: 0A40 1021 EORI.W #$1021,D0 00000012: 261F MOVE.L (A7)+,D3 00000014: 4E5E UNLK A6 00000016: 205F MOVEA.L (A7)+,A0 00000018: 544F ADDQ.W #$2,A7 0000001A: 4ED0 JMP (A0) 0000001C: 8746 6F6F 5F5F DC.B $80+$07, 'Foo__Fs' 4673 00000024: 0000 DC.W 0 ; size of literals 00000026 My goal was to remove the asm so here are my questions: (0) Please show me the correct way to do this in C++ so I do not need the asm. (1) If I do need the asm should I be using #pragma parameter ….. e.g. to force use of d0 (3) Finally my assembler days are long over and furthermore were on 370. But I am guessing ASL is Arithmetic Shift Left and ROL is Rotate Left. Am I correct? If so would ASL preserve the sign bit but ROL shift it? Finally do both ASL and ROL right fill with zeroes? Or does ROL really rotate the shifted bit around to the right hand end?