package llvm

import (
	"fmt"

	"github.com/marzeq/qk/types"
)

type win64ABIGenerator struct{}

func (win64ABIGenerator) aggregateParamChunks(e *Emitter, aggregate types.Type) []abiChunk {
	size, _ := e.typeSizeAlign(aggregate)
	switch size {
	case 1, 2, 4, 8:
		return []abiChunk{{typeName: fmt.Sprintf("i%d", size*8), size: size}}
	default:
		return []abiChunk{{typeName: "ptr", offset: -1}}
	}
}

func (g win64ABIGenerator) aggregateReturnChunks(e *Emitter, aggregate types.Type) []abiChunk {
	return g.aggregateParamChunks(e, aggregate)
}

func (win64ABIGenerator) requiresSRet(e *Emitter, aggregate types.Type) bool {
	size, _ := e.typeSizeAlign(aggregate)
	return size != 1 && size != 2 && size != 4 && size != 8
}