go noextend 源码

  • 2022-07-15
  • 浏览 (885)

golang noextend 代码

文件路径:/test/codegen/noextend.go

// asmcheck

// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package codegen

var sval64 [8]int64
var sval32 [8]int32
var sval16 [8]int16
var sval8 [8]int8
var val64 [8]uint64
var val32 [8]uint32
var val16 [8]uint16
var val8 [8]uint8

// Avoid zero/sign extensions following a load
// which has extended the value correctly.
// Note: No tests are done for int8 since
// an extra extension is usually needed due to
// no signed byte load.

func set16(x8 int8, u8 *uint8, y8 int8, z8 uint8) {
	// Truncate not needed, load does sign/zero extend

	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
	val16[0] = uint16(*u8)

	// AND not needed due to size
	// ppc64:-"ANDCC"
	// ppc64le:-"ANDCC"
	sval16[1] = 255 & int16(x8+y8)

	// ppc64:-"ANDCC"
	// ppc64le:-"ANDCC"
	val16[1] = 255 & uint16(*u8+z8)

}
func shiftidx(u8 *uint8, x16 *int16, u16 *uint16) {

	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
	val16[0] = uint16(sval16[*u8>>2])

	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
	sval16[1] = int16(val16[*x16>>1])

	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
	val16[1] = uint16(sval16[*u16>>2])

}

func setnox(x8 int8, u8 *uint8, y8 *int8, z8 *uint8, x16 *int16, u16 *uint16, x32 *int32, u32 *uint32) {

	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
	val16[0] = uint16(*u8)

	// AND not needed due to size
	// ppc64:-"ANDCC"
	// ppc64le:-"ANDCC"
	sval16[1] = 255 & int16(x8+*y8)

	// ppc64:-"ANDCC"
	// ppc64le:-"ANDCC"
	val16[1] = 255 & uint16(*u8+*z8)

	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
	sval32[1] = int32(*x16)

	//ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
	//ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
	val32[0] = uint32(*u8)

	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
	val32[1] = uint32(*u16)

	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
	sval64[1] = int64(*x16)

	// ppc64:-"MOVW\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVW\tR\\d+,\\sR\\d+"
	sval64[2] = int64(*x32)

	//ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
	//ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
	val64[0] = uint64(*u8)

	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
	val64[1] = uint64(*u16)

	// ppc64:-"MOVWZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVWZ\tR\\d+,\\sR\\d+"
	val64[2] = uint64(*u32)
}

func cmp16(u8 *uint8, x32 *int32, u32 *uint32, x64 *int64, u64 *uint64) bool {

	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
	if uint16(*u8) == val16[0] {
		return true
	}

	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
	if uint16(*u32>>16) == val16[0] {
		return true
	}

	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
	if uint16(*u64>>48) == val16[0] {
		return true
	}

	// Verify the truncates are using the correct sign.
	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
	if int16(*x32) == sval16[0] {
		return true
	}

	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
	if uint16(*u32) == val16[0] {
		return true
	}

	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
	if int16(*x64) == sval16[0] {
		return true
	}

	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
	if uint16(*u64) == val16[0] {
		return true
	}

	return false
}

func cmp32(u8 *uint8, x16 *int16, u16 *uint16, x64 *int64, u64 *uint64) bool {

	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
	if uint32(*u8) == val32[0] {
		return true
	}

	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
	if int32(*x16) == sval32[0] {
		return true
	}

	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
	if uint32(*u16) == val32[0] {
		return true
	}

	// Verify the truncates are using the correct sign.
	// ppc64:-"MOVWZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVWZ\tR\\d+,\\sR\\d+"
	if int32(*x64) == sval32[0] {
		return true
	}

	// ppc64:-"MOVW\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVW\tR\\d+,\\sR\\d+"
	if uint32(*u64) == val32[0] {
		return true
	}

	return false
}

func cmp64(u8 *uint8, x16 *int16, u16 *uint16, x32 *int32, u32 *uint32) bool {

	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
	if uint64(*u8) == val64[0] {
		return true
	}

	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
	if int64(*x16) == sval64[0] {
		return true
	}

	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
	if uint64(*u16) == val64[0] {
		return true
	}

	// ppc64:-"MOVW\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVW\tR\\d+,\\sR\\d+"
	if int64(*x32) == sval64[0] {
		return true
	}

	// ppc64:-"MOVWZ\tR\\d+,\\sR\\d+"
	// ppc64le:-"MOVWZ\tR\\d+,\\sR\\d+"
	if uint64(*u32) == val64[0] {
		return true
	}
	return false
}

相关信息

go 源码目录

相关文章

go addrcalc 源码

go alloc 源码

go arithmetic 源码

go bitfield 源码

go bits 源码

go bmi 源码

go bool 源码

go clobberdead 源码

go clobberdeadreg 源码

go compare_and_branch 源码

0  赞