gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

condition_code.go (3213B)


      1 // Copyright 2019 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package s390x
      6 
      7 import (
      8 	"fmt"
      9 )
     10 
     11 // CCMask represents a 4-bit condition code mask. Bits that
     12 // are not part of the mask should be 0.
     13 //
     14 // Condition code masks represent the 4 possible values of
     15 // the 2-bit condition code as individual bits. Since IBM Z
     16 // is a big-endian platform bits are numbered from left to
     17 // right. The lowest value, 0, is represented by 8 (0b1000)
     18 // and the highest value, 3, is represented by 1 (0b0001).
     19 //
     20 // Note that condition code values have different semantics
     21 // depending on the instruction that set the condition code.
     22 // The names given here assume that the condition code was
     23 // set by an integer or floating point comparison. Other
     24 // instructions may use these same codes to indicate
     25 // different results such as a carry or overflow.
     26 type CCMask uint8
     27 
     28 const (
     29 	Never CCMask = 0 // no-op
     30 
     31 	// 1-bit masks
     32 	Equal     CCMask = 1 << 3
     33 	Less      CCMask = 1 << 2
     34 	Greater   CCMask = 1 << 1
     35 	Unordered CCMask = 1 << 0
     36 
     37 	// 2-bit masks
     38 	EqualOrUnordered   CCMask = Equal | Unordered   // not less and not greater
     39 	LessOrEqual        CCMask = Less | Equal        // ordered and not greater
     40 	LessOrGreater      CCMask = Less | Greater      // ordered and not equal
     41 	LessOrUnordered    CCMask = Less | Unordered    // not greater and not equal
     42 	GreaterOrEqual     CCMask = Greater | Equal     // ordered and not less
     43 	GreaterOrUnordered CCMask = Greater | Unordered // not less and not equal
     44 
     45 	// 3-bit masks
     46 	NotEqual     CCMask = Always ^ Equal
     47 	NotLess      CCMask = Always ^ Less
     48 	NotGreater   CCMask = Always ^ Greater
     49 	NotUnordered CCMask = Always ^ Unordered
     50 
     51 	// 4-bit mask
     52 	Always CCMask = Equal | Less | Greater | Unordered
     53 
     54 	// useful aliases
     55 	Carry    CCMask = GreaterOrUnordered
     56 	NoCarry  CCMask = LessOrEqual
     57 	Borrow   CCMask = NoCarry
     58 	NoBorrow CCMask = Carry
     59 )
     60 
     61 // Inverse returns the complement of the condition code mask.
     62 func (c CCMask) Inverse() CCMask {
     63 	return c ^ Always
     64 }
     65 
     66 // ReverseComparison swaps the bits at 0b0100 and 0b0010 in the mask,
     67 // reversing the behavior of greater than and less than conditions.
     68 func (c CCMask) ReverseComparison() CCMask {
     69 	r := c & EqualOrUnordered
     70 	if c&Less != 0 {
     71 		r |= Greater
     72 	}
     73 	if c&Greater != 0 {
     74 		r |= Less
     75 	}
     76 	return r
     77 }
     78 
     79 func (c CCMask) String() string {
     80 	switch c {
     81 	// 0-bit mask
     82 	case Never:
     83 		return "Never"
     84 
     85 	// 1-bit masks
     86 	case Equal:
     87 		return "Equal"
     88 	case Less:
     89 		return "Less"
     90 	case Greater:
     91 		return "Greater"
     92 	case Unordered:
     93 		return "Unordered"
     94 
     95 	// 2-bit masks
     96 	case EqualOrUnordered:
     97 		return "EqualOrUnordered"
     98 	case LessOrEqual:
     99 		return "LessOrEqual"
    100 	case LessOrGreater:
    101 		return "LessOrGreater"
    102 	case LessOrUnordered:
    103 		return "LessOrUnordered"
    104 	case GreaterOrEqual:
    105 		return "GreaterOrEqual"
    106 	case GreaterOrUnordered:
    107 		return "GreaterOrUnordered"
    108 
    109 	// 3-bit masks
    110 	case NotEqual:
    111 		return "NotEqual"
    112 	case NotLess:
    113 		return "NotLess"
    114 	case NotGreater:
    115 		return "NotGreater"
    116 	case NotUnordered:
    117 		return "NotUnordered"
    118 
    119 	// 4-bit mask
    120 	case Always:
    121 		return "Always"
    122 	}
    123 
    124 	// invalid
    125 	return fmt.Sprintf("Invalid (%#x)", c)
    126 }