| End of Uniprocessor Era | 
| 
 | 
 | |
| 
 | 
 | |
| 
 | 
 | |
| 
 | 
 | |
| 
 | 
 | 
| Target | Magic instruction | ||
| x86 | xchg %bx, %bx | encoding: 66 87 DB | |
| ARM | orreq rn, rn, rn | 0 <= n < 15 | |
| PowerPC 32-bit | mr n, n | 0 <= n < 32 | |
| PowerPC 64-bit | fmr n, n | 0 <= n < 32 | |
| SPARC | sethi n, %g0 | 1 <= n < 0x400000 | |
CogIA32Compiler>concretizeMagic
CogIA32Compiler>dispatchConcretize
CogRTLOpcodes>>initializeAdd "Magic" to the end and send #initialize. Now our abstract RTL has the magic instruction.
Cogit>>Magic <inline:true> <returnTypeC:#'AbstractInstruction*'> ^self gen: Magic
NB: What we are doing is adding to the code emission code, but the actual magic instruction will be part of the emitted N-code, so the break will NOT happen in #genGetClassFormatOfNonInt:into:scratchReg:.
./NBCog --nodisplay simple.image eval '2+3'
32-bit legacy protected mode eax = 0x00000001, ax = 0x0001, ah = 0x00, al = 0x01 ecx = 0x00000006, cx = 0x0006, ch = 0x00, cl = 0x06 edx = 0x944f9540, dx = 0x9540, dh = 0x95, dl = 0x40 ebx = 0x00000004, bx = 0x0004, bh = 0x00, bl = 0x04 esp = 0xbf869670, sp = 0x9670 ebp = 0xbf869680, bp = 0x9680 esi = 0x00000003, si = 0x0003 edi = 0x00000003, di = 0x0003 eip = 0x93cff260, linear = 0x93cff260 eflags = 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 = 0x00000202receiver in %EDX
l:0x944f9540 1d04 9a12 <- receiver's object header
class oop in header word 2, offset -4:
simics> x l:0x944f953C 4l:0x944f9530 813e 1194 <- class oop
def print_class_of_oop(oop):
    if ((oop & 1)==1):
       print "SmallInteger"
    else:
       headerType = smalltalk_headerType(oop)
       if (headerType==3):
          print "...looks like compact class..."
       else:
          word2 = read_virt_value(oop-4, 4)
          classOop = word2&0xFFFFFFFC
          print "class oop: ", hex(classOop)
          classNameOop = read_virt_value(classOop+32, 4)
          print "class name oop: ", hex(classNameOop)
          str=""
          for offset in range(smalltalk_objByteSize(classNameOop)):
              str += "%c" % read_virt_value(classNameOop + 4 + offset, 1)
          print str
new_command("print-class-of-oop", print_class_of_oop,
            [arg(int_t, "oop")],
            type = "Debugging",
            see_also = [],
            short = "describe an oop",
            doc = """
Print the class of oop.""")
class oop: 0x94113E80L class name oop: 0x93F401CCL WeakAnnouncementSubscriptionsimics> print-class-of-oop 0x93F401CC
class oop: 0x940FB4B4L class name oop: 0x93E94140L ByteSymbol
 
