package llvm

import (
	"fmt"

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

type win32ABIGenerator struct{}

func (win32ABIGenerator) aggregateParamChunks(e *Emitter, aggregate types.Type) []abiChunk {
	size, _ := e.typeSizeAlign(aggregate)
	switch size {
	case 4:
		return []abiChunk{{typeName: "i32", size: 4}}
	case 8:
		return []abiChunk{{typeName: "i32", size: 4}, {typeName: "i32", offset: 4, size: 4}}
	default:
		return []abiChunk{{
			typeName:   "ptr",
			attributes: fmt.Sprintf(" byval(%s) align 4", e.TypeEmit(aggregate)),
			offset:     -1,
		}}
	}
}

func (win32ABIGenerator) aggregateReturnChunks(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 nil
	}
}

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