--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/asm/AJx86RegisterTests.st Tue Dec 15 23:18:02 2015 +0000
@@ -0,0 +1,165 @@
+"{ Package: 'jv:dragonfly/asm' }"
+
+"{ NameSpace: Smalltalk }"
+
+TestCase subclass:#AJx86RegisterTests
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:'AJx86Registers'
+ category:'AsmJit-Tests'
+!
+
+AJx86RegisterTests comment:''
+!
+
+!AJx86RegisterTests methodsFor:'as yet unclassified'!
+
+testAsHighByte
+ | highByteRegs lowByteRegs otherGPRegs |
+ highByteRegs := {AH.
+ CH.
+ DH.
+ BH}.
+ lowByteRegs := {AL.
+ CL.
+ DL.
+ BL}.
+ otherGPRegs := AJx86Registers generalPurpose reject: [ :r | r isHighByte | r isLowByte ].
+ self assert: (highByteRegs collect: [ :r | r asHighByte ]) equals: highByteRegs.
+ self assert: (lowByteRegs collect: [ :r | r asHighByte ]) equals: highByteRegs.
+ self assert: otherGPRegs size equals: 60. "16 of each size, less the lowByteRegs"
+ otherGPRegs do: [ :r | self should: [ r asHighByte ] raise: Error ]
+!
+
+testAsLowByte
+ | highByteRegs lowByteRegs otherGPRegs |
+ highByteRegs := {AH.
+ CH.
+ DH.
+ BH}.
+ lowByteRegs := {AL.
+ CL.
+ DL.
+ BL}.
+ otherGPRegs := AJx86Registers generalPurpose reject: [ :r | r isHighByte | r isLowByte ].
+ self assert: (highByteRegs collect: [ :r | r asLowByte ]) equals: lowByteRegs.
+ self assert: (lowByteRegs collect: [ :r | r asLowByte ]) equals: lowByteRegs.
+ self assert: otherGPRegs size equals: 60. "16 of each size, less the lowByteRegs"
+ otherGPRegs do: [ :r | self should: [ r asLowByte ] raise: Error ]
+!
+
+testRegisterWidthConversions
+ "Test the generalPurpose register methods #as8, #as16, #as32, #as64.
+ Some resulting registers are not valid except in 64-bit mode, but that is not checked until you try to use the register in an instruction."
+
+ | regs8 regs16 regs32 regs64 highByteRegs |
+ regs8 := {AL.
+ CL.
+ DL.
+ BL.
+ SPL.
+ BPL.
+ SIL.
+ DIL.
+ R8B.
+ R9B.
+ R10B.
+ R11B.
+ R12B.
+ R13B.
+ R14B.
+ R15B}.
+ regs16 := {AX.
+ CX.
+ DX.
+ BX.
+ SP.
+ BP.
+ SI.
+ DI.
+ R8W.
+ R9W.
+ R10W.
+ R11W.
+ R12W.
+ R13W.
+ R14W.
+ R15W}.
+ regs32 := {EAX.
+ ECX.
+ EDX.
+ EBX.
+ ESP.
+ EBP.
+ ESI.
+ EDI.
+ R8D.
+ R9D.
+ R10D.
+ R11D.
+ R12D.
+ R13D.
+ R14D.
+ R15D}.
+ regs64 := {RAX.
+ RCX.
+ RDX.
+ RBX.
+ RSP.
+ RBP.
+ RSI.
+ RDI.
+ R8.
+ R9.
+ R10.
+ R11.
+ R12.
+ R13.
+ R14.
+ R15}.
+ highByteRegs := {AH.
+ CH.
+ DH.
+ BH}.
+ self
+ assert: (regs8 collect: [ :r | r as8 ]) equals: regs8;
+ assert: (regs16 collect: [ :r | r as8 ]) equals: regs8;
+ assert: (regs32 collect: [ :r | r as8 ]) equals: regs8;
+ assert: (regs64 collect: [ :r | r as8 ]) equals: regs8.
+ self
+ assert: (regs8 collect: [ :r | r as16 ]) equals: regs16;
+ assert: (regs16 collect: [ :r | r as16 ]) equals: regs16;
+ assert: (regs32 collect: [ :r | r as16 ]) equals: regs16;
+ assert: (regs64 collect: [ :r | r as16 ]) equals: regs16.
+ self
+ assert: (regs8 collect: [ :r | r as32 ]) equals: regs32;
+ assert: (regs16 collect: [ :r | r as32 ]) equals: regs32;
+ assert: (regs32 collect: [ :r | r as32 ]) equals: regs32;
+ assert: (regs64 collect: [ :r | r as32 ]) equals: regs32.
+ self
+ assert: (regs8 collect: [ :r | r as64 ]) equals: regs64;
+ assert: (regs16 collect: [ :r | r as64 ]) equals: regs64;
+ assert: (regs32 collect: [ :r | r as64 ]) equals: regs64;
+ assert: (regs64 collect: [ :r | r as64 ]) equals: regs64.
+ self
+ assert: (highByteRegs collect: [ :r | r as8 ]) equals: highByteRegs;
+ assert: (highByteRegs collect: [ :r | r as16 ])
+ equals:
+ {AX.
+ CX.
+ DX.
+ BX};
+ assert: (highByteRegs collect: [ :r | r as32 ])
+ equals:
+ {EAX.
+ ECX.
+ EDX.
+ EBX};
+ assert: (highByteRegs collect: [ :r | r as64 ])
+ equals:
+ {RAX.
+ RCX.
+ RDX.
+ RBX}
+! !
+