[AArch64] Don't try to custom lower fp16 selects with nofp (#129492) · llvm/llvm-project@1d4d84c (original) (raw)

`@@ -29,3 +29,94 @@ entry:

`

29

29

`ret bfloat %0

`

30

30

`}

`

31

31

``

``

32

`+

define double @select_f64(double %a, double %b, i1 %c) {

`

``

33

`+

; CHECK-LABEL: select_f64:

`

``

34

`+

; CHECK: // %bb.0: // %entry

`

``

35

`+

; CHECK-NEXT: tst w2, #0x1

`

``

36

`+

; CHECK-NEXT: csel x0, x0, x1, ne

`

``

37

`+

; CHECK-NEXT: ret

`

``

38

`+

entry:

`

``

39

`+

%0 = select i1 %c, double %a, double %b

`

``

40

`+

ret double %0

`

``

41

`+

}

`

``

42

+

``

43

`+

define float @select_f32(float %a, float %b, i1 %c) {

`

``

44

`+

; CHECK-LABEL: select_f32:

`

``

45

`+

; CHECK: // %bb.0: // %entry

`

``

46

`+

; CHECK-NEXT: tst w2, #0x1

`

``

47

`+

; CHECK-NEXT: csel w0, w0, w1, ne

`

``

48

`+

; CHECK-NEXT: ret

`

``

49

`+

entry:

`

``

50

`+

%0 = select i1 %c, float %a, float %b

`

``

51

`+

ret float %0

`

``

52

`+

}

`

``

53

+

``

54

`+

define half @select_f16(half %a, half %b, i1 %c) {

`

``

55

`+

; CHECK-LABEL: select_f16:

`

``

56

`+

; CHECK: // %bb.0: // %entry

`

``

57

`+

; CHECK-NEXT: tst w2, #0x1

`

``

58

`+

; CHECK-NEXT: csel w0, w0, w1, ne

`

``

59

`+

; CHECK-NEXT: ret

`

``

60

`+

entry:

`

``

61

`+

%0 = select i1 %c, half %a, half %b

`

``

62

`+

ret half %0

`

``

63

`+

}

`

``

64

+

``

65

`+

define bfloat @select_bf16(bfloat %a, bfloat %b, i1 %c) {

`

``

66

`+

; CHECK-LABEL: select_bf16:

`

``

67

`+

; CHECK: // %bb.0: // %entry

`

``

68

`+

; CHECK-NEXT: tst w2, #0x1

`

``

69

`+

; CHECK-NEXT: csel w0, w0, w1, ne

`

``

70

`+

; CHECK-NEXT: ret

`

``

71

`+

entry:

`

``

72

`+

%0 = select i1 %c, bfloat %a, bfloat %b

`

``

73

`+

ret bfloat %0

`

``

74

`+

}

`

``

75

+

``

76

`+

define double @selectcc_f64(double %a, double %b, i32 %d) {

`

``

77

`+

; CHECK-LABEL: selectcc_f64:

`

``

78

`+

; CHECK: // %bb.0: // %entry

`

``

79

`+

; CHECK-NEXT: cmp w2, #0

`

``

80

`+

; CHECK-NEXT: csel x0, x0, x1, lt

`

``

81

`+

; CHECK-NEXT: ret

`

``

82

`+

entry:

`

``

83

`+

%c = icmp slt i32 %d, 0

`

``

84

`+

%0 = select i1 %c, double %a, double %b

`

``

85

`+

ret double %0

`

``

86

`+

}

`

``

87

+

``

88

`+

define float @selectcc_f32(float %a, float %b, i32 %d) {

`

``

89

`+

; CHECK-LABEL: selectcc_f32:

`

``

90

`+

; CHECK: // %bb.0: // %entry

`

``

91

`+

; CHECK-NEXT: cmp w2, #0

`

``

92

`+

; CHECK-NEXT: csel w0, w0, w1, lt

`

``

93

`+

; CHECK-NEXT: ret

`

``

94

`+

entry:

`

``

95

`+

%c = icmp slt i32 %d, 0

`

``

96

`+

%0 = select i1 %c, float %a, float %b

`

``

97

`+

ret float %0

`

``

98

`+

}

`

``

99

+

``

100

`+

define half @selectcc_f16(half %a, half %b, i32 %d) {

`

``

101

`+

; CHECK-LABEL: selectcc_f16:

`

``

102

`+

; CHECK: // %bb.0: // %entry

`

``

103

`+

; CHECK-NEXT: cmp w2, #0

`

``

104

`+

; CHECK-NEXT: csel w0, w0, w1, lt

`

``

105

`+

; CHECK-NEXT: ret

`

``

106

`+

entry:

`

``

107

`+

%c = icmp slt i32 %d, 0

`

``

108

`+

%0 = select i1 %c, half %a, half %b

`

``

109

`+

ret half %0

`

``

110

`+

}

`

``

111

+

``

112

`+

define bfloat @selectcc_bf16(bfloat %a, bfloat %b, i32 %d) {

`

``

113

`+

; CHECK-LABEL: selectcc_bf16:

`

``

114

`+

; CHECK: // %bb.0: // %entry

`

``

115

`+

; CHECK-NEXT: cmp w2, #0

`

``

116

`+

; CHECK-NEXT: csel w0, w0, w1, lt

`

``

117

`+

; CHECK-NEXT: ret

`

``

118

`+

entry:

`

``

119

`+

%c = icmp slt i32 %d, 0

`

``

120

`+

%0 = select i1 %c, bfloat %a, bfloat %b

`

``

121

`+

ret bfloat %0

`

``

122

`+

}

`