func loadMapIndexExpr(e *ExprIndex) {
	_map := e.collection
	emit("# emit mapData head address")
	_map.emit()
	labelNil := makeLabel()
	labelEnd := makeLabel()
	emit("cmpq $0, %%rax # map && map (check if map is nil)")
	emit("je %s # jump if map is nil", labelNil)
	emit("# not nil")
	emit("LOAD_8_BY_DEREF")
	emit("PUSH_8 # map head")
	_map.emit()
	emit("movq 8(%%rax), %%rax")
	emit("PUSH_8 # len")
	var isKeyString bool = e.index.getGtype().isString()
	e.index.emit()
	if isKeyString {
		emit("PUSH_SLICE")
		emit("popq %%rdi # index value")
		emit("popq %%rdx # index value")
		emit("popq %%rcx # index value")
	} else {
		emit("PUSH_8 # index value")
		emit("popq %%rcx # index value")
	}
	emit("popq %%rbx # len")
	emit("popq %%rax # heap")
	emit("jmp %s", labelEnd)
	emit("%s:", labelNil)
	emit("LOAD_EMPTY_8")
	emit("movq $0, %%rbx")
	emit("movq $0, %%rcx")
	emit("movq $0, %%rdx")
	emit("movq $0, %%rdi")
	emit("%s:", labelEnd)
	emit("pushq %%rax")
	emit("pushq %%rbx")
	if isKeyString {
		emit("pushq %%rcx")
		emit("pushq %%rdx")
		emit("pushq %%rdi")
	} else {
		emit("pushq %%rcx")
	}
	emitMapGet(_map.getGtype(), isKeyString)
}
emit map index expr
package main
const MAX_METHODS_PER_TYPE int = 128
type IrMapInitializer struct {
	tok      *Token
	gtype    *Gtype
	elements []*MapElement  
	lenArg   Expr           
}
func (e *IrMapInitializer) token() *Token {
	return e.tok
}
func (e *IrMapInitializer) dump() {
	panic("implement me")
}
func (e *IrMapInitializer) getGtype() *Gtype {
	return e.gtype
}
func (call *IrInterfaceMethodCall) emit() {
	receiver := call.receiver
	methodName := call.methodName
	emit("# emit interface method call \"%s\"", methodName)
	mapType := &Gtype{
		kind: G_MAP,
		mapKey: &Gtype{
			kind: G_POINTER,
		},
		mapValue: &Gtype{
			kind: G_POINTER,
		},
	}
	emit("# emit receiverTypeId of %s", receiver.getGtype().String())
	emitOffsetLoad(receiver, ptrSize, ptrSize)
	emit("IMUL_NUMBER 8")
	emit("PUSH_8")
	emit("leaq receiverTypes(%%rip), %%rax")
	emit("PUSH_8")
	emit("SUM_FROM_STACK")
	emit("# find method %s", methodName)
	emit("movq (%%rax), %%rax")  
	emit("PUSH_8 # map head")
	emit("LOAD_NUMBER %d", MAX_METHODS_PER_TYPE)  
	emit("PUSH_8 # len")
	emit("leaq .S.%s, %%rax", methodName)  
	emit("PUSH_8 # map index value")
	emitMapGet(mapType, false)
	emit("PUSH_8 # funcref")
	emit("LOAD_EMPTY_8")
	receiverType := receiver.getGtype()
	assert(receiverType.getKind() == G_INTERFACE, nil, "should be interface")
	_call := &IrCall{
		isInterfaceMethodCall: true,
		symbol:                "",
		icallee:                call.callee,
		receiver:              call.receiver,
		args:                  call.args,
	}
	_call.emit()
}