@@ -1007,3 +1007,127 @@ func.func @sitofp_i64_f64_vector(%a : vector<3xi64>) -> vector<3xf64> {
1007
1007
%r = arith.sitofp %a : vector <3 xi64 > to vector <3 xf64 >
1008
1008
return %r : vector <3 xf64 >
1009
1009
}
1010
+
1011
+ // CHECK-LABEL: func @fptoui_i64_f64
1012
+ // CHECK-SAME: ([[ARG:%.+]]: f64) -> vector<2xi32>
1013
+ // CHECK-NEXT: [[POW:%.+]] = arith.constant 0x41F0000000000000 : f64
1014
+ // CHECK-NEXT: [[DIV:%.+]] = arith.divf [[ARG]], [[POW]] : f64
1015
+ // CHECK-NEXT: [[HIGHHALF:%.+]] = arith.fptoui [[DIV]] : f64 to i32
1016
+ // CHECK-NEXT: [[REM:%.+]] = arith.remf [[ARG]], [[POW]] : f64
1017
+ // CHECK-NEXT: [[LOWHALF:%.+]] = arith.fptoui [[REM]] : f64 to i32
1018
+ // CHECK: %{{.+}} = vector.insert [[LOWHALF]], %{{.+}} [0]
1019
+ // CHECK-NEXT: [[RESVEC:%.+]] = vector.insert [[HIGHHALF]], %{{.+}} [1]
1020
+ // CHECK: return [[RESVEC]] : vector<2xi32>
1021
+ func.func @fptoui_i64_f64 (%a : f64 ) -> i64 {
1022
+ %r = arith.fptoui %a : f64 to i64
1023
+ return %r : i64
1024
+ }
1025
+
1026
+ // CHECK-LABEL: func @fptoui_i64_f64_vector
1027
+ // CHECK-SAME: ([[ARG:%.+]]: vector<3xf64>) -> vector<3x2xi32>
1028
+ // CHECK-NEXT: [[POW:%.+]] = arith.constant dense<0x41F0000000000000> : vector<3xf64>
1029
+ // CHECK-NEXT: [[DIV:%.+]] = arith.divf [[ARG]], [[POW]] : vector<3xf64>
1030
+ // CHECK-NEXT: [[HIGHHALF:%.+]] = arith.fptoui [[DIV]] : vector<3xf64> to vector<3xi32>
1031
+ // CHECK-NEXT: [[REM:%.+]] = arith.remf [[ARG]], [[POW]] : vector<3xf64>
1032
+ // CHECK-NEXT: [[LOWHALF:%.+]] = arith.fptoui [[REM]] : vector<3xf64> to vector<3xi32>
1033
+ // CHECK-DAG: [[HIGHHALFX1:%.+]] = vector.shape_cast [[HIGHHALF]] : vector<3xi32> to vector<3x1xi32>
1034
+ // CHECK-DAG: [[LOWHALFX1:%.+]] = vector.shape_cast [[LOWHALF]] : vector<3xi32> to vector<3x1xi32>
1035
+ // CHECK: %{{.+}} = vector.insert_strided_slice [[LOWHALFX1]], %{{.+}} {offsets = [0, 0], strides = [1, 1]}
1036
+ // CHECK-NEXT: [[RESVEC:%.+]] = vector.insert_strided_slice [[HIGHHALFX1]], %{{.+}} {offsets = [0, 1], strides = [1, 1]}
1037
+ // CHECK: return [[RESVEC]] : vector<3x2xi32>
1038
+ func.func @fptoui_i64_f64_vector (%a : vector <3 xf64 >) -> vector <3 xi64 > {
1039
+ %r = arith.fptoui %a : vector <3 xf64 > to vector <3 xi64 >
1040
+ return %r : vector <3 xi64 >
1041
+ }
1042
+
1043
+ // This generates lines that are already verified by other patterns
1044
+ // We do not re-verify these and just check for the wrapper around fptoui by following its low part
1045
+ // CHECK-LABEL: func @fptosi_i64_f64
1046
+ // CHECK-SAME: ([[ARG:%.+]]: f64) -> vector<2xi32>
1047
+ // CHECK: [[ZEROCST:%.+]] = arith.constant 0.000000e+00 : f64
1048
+ // CHECK: [[ONECST:%.+]] = arith.constant dense<[1, 0]> : vector<2xi32>
1049
+ // CHECK: [[ALLONECST:%.+]] = arith.constant dense<-1> : vector<2xi32>
1050
+ // CHECK-NEXT: [[ISNEGATIVE:%.+]] = arith.cmpf olt, [[ARG]], [[ZEROCST]] : f64
1051
+ // CHECK-NEXT: [[NEGATED:%.+]] = arith.negf [[ARG]] : f64
1052
+ // CHECK-NEXT: [[ABSVALUE:%.+]] = arith.select [[ISNEGATIVE]], [[NEGATED]], [[ARG]] : f64
1053
+ // CHECK-NEXT: [[POW:%.+]] = arith.constant 0x41F0000000000000 : f64
1054
+ // CHECK-NEXT: [[DIV:%.+]] = arith.divf [[ABSVALUE]], [[POW]] : f64
1055
+ // CHECK-NEXT: [[HIGHHALF:%.+]] = arith.fptoui [[DIV]] : f64 to i32
1056
+ // CHECK-NEXT: [[REM:%.+]] = arith.remf [[ABSVALUE]], [[POW]] : f64
1057
+ // CHECK-NEXT: [[LOWHALF:%.+]] = arith.fptoui [[REM]] : f64 to i32
1058
+ // CHECK: vector.insert [[LOWHALF]], %{{.+}} [0] : i32 into vector<2xi32>
1059
+ // CHECK-NEXT: [[FPTOUIRESVEC:%.+]] = vector.insert [[HIGHHALF]]
1060
+ // CHECK: [[ALLONECSTHALF:%.+]] = vector.extract [[ALLONECST]][0] : i32 from vector<2xi32>
1061
+ // CHECK: [[XOR:%.+]] = arith.xori %{{.+}}, [[ALLONECSTHALF]] : i32
1062
+ // CHECK-NEXT: arith.xori
1063
+ // CHECK: vector.insert [[XOR]]
1064
+ // CHECK-NEXT: [[XORVEC:%.+]] = vector.insert
1065
+ // CHECK: [[XOR:%.+]] = vector.extract [[XORVEC]][0] : i32 from vector<2xi32>
1066
+ // CHECK: [[ONECSTHALF:%.+]] = vector.extract [[ONECST]][0] : i32 from vector<2xi32>
1067
+ // CHECK: [[SUM:%.+]], %{{.+}} = arith.addui_extended [[XOR]], [[ONECSTHALF]] : i32, i1
1068
+ // CHECK-NEXT: arith.extui
1069
+ // CHECK-NEXT: arith.addi
1070
+ // CHECK-NEXT: arith.addi
1071
+ // CHECK: vector.insert [[SUM]]
1072
+ // CHECK-NEXT: [[SUMVEC:%.+]] = vector.insert
1073
+ // CHECK: [[NEGATEDRES:%.+]] = vector.extract [[SUMVEC]][0] : i32 from vector<2xi32>
1074
+ // CHECK: [[LOWRES:%.+]] = vector.extract [[FPTOUIRESVEC]][0] : i32 from vector<2xi32>
1075
+ // CHECK: [[ABSRES:%.+]] = arith.select [[ISNEGATIVE]], [[NEGATEDRES]], [[LOWRES]] : i32
1076
+ // CHECK-NEXT: arith.select [[ISNEGATIVE]]
1077
+ // CHECK: vector.insert [[ABSRES]]
1078
+ // CHECK-NEXT: [[ABSRESVEC:%.+]] = vector.insert
1079
+ // CHECK-NEXT: return [[ABSRESVEC]] : vector<2xi32>
1080
+ func.func @fptosi_i64_f64 (%a : f64 ) -> i64 {
1081
+ %r = arith.fptosi %a : f64 to i64
1082
+ return %r : i64
1083
+ }
1084
+
1085
+ // Same as the non-vector one, we don't re-verify
1086
+ // CHECK-LABEL: func @fptosi_i64_f64_vector
1087
+ // CHECK-SAME: ([[ARG:%.+]]: vector<3xf64>) -> vector<3x2xi32>
1088
+ // CHECK-NEXT: [[ZEROCST:%.+]] = arith.constant dense<0.000000e+00> : vector<3xf64>
1089
+ // CHECK-NEXT: [[ONECST:%.+]] = arith.constant
1090
+ // CHECK-SAME{LITERAL} dense<[[1, 0], [1, 0], [1, 0]]> : vector<3x2xi32>
1091
+ // CHECK-NEXT: [[ALLONECST:%.+]] = arith.constant dense<-1> : vector<3x2xi32>
1092
+ // CHECK-NEXT: [[ISNEGATIVE:%.+]] = arith.cmpf olt, [[ARG]], [[ZEROCST]] : vector<3xf64>
1093
+ // CHECK-NEXT: [[NEGATED:%.+]] = arith.negf [[ARG]] : vector<3xf64>
1094
+ // CHECK-NEXT: [[ABSVALUE:%.+]] = arith.select [[ISNEGATIVE]], [[NEGATED]], [[ARG]] : vector<3xi1>, vector<3xf64>
1095
+ // CHECK-NEXT: [[POW:%.+]] = arith.constant dense<0x41F0000000000000> : vector<3xf64>
1096
+ // CHECK-NEXT: [[DIV:%.+]] = arith.divf [[ABSVALUE]], [[POW]] : vector<3xf64>
1097
+ // CHECK-NEXT: [[HIGHHALF:%.+]] = arith.fptoui [[DIV]] : vector<3xf64> to vector<3xi32>
1098
+ // CHECK-NEXT: [[REM:%.+]] = arith.remf [[ABSVALUE]], [[POW]] : vector<3xf64>
1099
+ // CHECK-NEXT: [[LOWHALF:%.+]] = arith.fptoui [[REM]] : vector<3xf64> to vector<3xi32>
1100
+ // CHECK-NEXT: [[HIGHHALFX1:%.+]] = vector.shape_cast [[HIGHHALF]] : vector<3xi32> to vector<3x1xi32>
1101
+ // CHECK-NEXT: [[LOWHALFX1:%.+]] = vector.shape_cast [[LOWHALF]] : vector<3xi32> to vector<3x1xi32>
1102
+ // CHECK: vector.insert_strided_slice [[LOWHALFX1]], %{{.+}} {offsets = [0, 0], strides = [1, 1]} : vector<3x1xi32> into vector<3x2xi32>
1103
+ // CHECK-NEXT: [[FPTOUIRESVEC:%.+]] = vector.insert_strided_slice [[HIGHHALFX1]]
1104
+ // CHECK: [[ALLONECSTHALF:%.+]] = vector.extract_strided_slice [[ALLONECST]]
1105
+ // CHECK-SAME: {offsets = [0, 0], sizes = [3, 1], strides = [1, 1]} : vector<3x2xi32> to vector<3x1xi32>
1106
+ // CHECK: [[XOR:%.+]] = arith.xori %{{.+}}, [[ALLONECSTHALF]] : vector<3x1xi32>
1107
+ // CHECK-NEXT: arith.xori
1108
+ // CHECK: vector.insert_strided_slice [[XOR]]
1109
+ // CHECK-NEXT: [[XORVEC:%.+]] = vector.insert_strided_slice
1110
+ // CHECK: [[XOR:%.+]] = vector.extract_strided_slice [[XORVEC]]
1111
+ // CHECK-SAME: {offsets = [0, 0], sizes = [3, 1], strides = [1, 1]} : vector<3x2xi32> to vector<3x1xi32>
1112
+ // CHECK: [[ONECSTHALF:%.+]] = vector.extract_strided_slice [[ONECST]]
1113
+ // CHECK-SAME: {offsets = [0, 0], sizes = [3, 1], strides = [1, 1]} : vector<3x2xi32> to vector<3x1xi32>
1114
+ // CHECK: [[SUM:%.+]], %{{.+}} = arith.addui_extended [[XOR]], [[ONECSTHALF]] : vector<3x1xi32>, vector<3x1xi1>
1115
+ // CHECK-NEXT: arith.extui
1116
+ // CHECK-NEXT: arith.addi
1117
+ // CHECK-NEXT: arith.addi
1118
+ // CHECK: vector.insert_strided_slice [[SUM]]
1119
+ // CHECK-NEXT: [[SUMVEC:%.+]] = vector.insert_strided_slice
1120
+ // CHECK: [[NEGATEDRES:%.+]] = vector.extract_strided_slice [[SUMVEC]]
1121
+ // CHECK-SAME: {offsets = [0, 0], sizes = [3, 1], strides = [1, 1]} : vector<3x2xi32> to vector<3x1xi32>
1122
+ // CHECK: [[LOWRES:%.+]] = vector.extract_strided_slice [[FPTOUIRESVEC]]
1123
+ // CHECK-SAME: {offsets = [0, 0], sizes = [3, 1], strides = [1, 1]} : vector<3x2xi32> to vector<3x1xi32>
1124
+ // CHECK: [[ISNEGATIVEX1:%.+]] = vector.shape_cast [[ISNEGATIVE]] : vector<3xi1> to vector<3x1xi1>
1125
+ // CHECK: [[ABSRES:%.+]] = arith.select [[ISNEGATIVEX1]], [[NEGATEDRES]], [[LOWRES]] : vector<3x1xi1>, vector<3x1xi32>
1126
+ // CHECK-NEXT: arith.select [[ISNEGATIVEX1]]
1127
+ // CHECK: vector.insert_strided_slice [[ABSRES]]
1128
+ // CHECK-NEXT: [[ABSRESVEC:%.+]] = vector.insert_strided_slice
1129
+ // CHECK-NEXT: return [[ABSRESVEC]] : vector<3x2xi32>
1130
+ func.func @fptosi_i64_f64_vector (%a : vector <3 xf64 >) -> vector <3 xi64 > {
1131
+ %r = arith.fptosi %a : vector <3 xf64 > to vector <3 xi64 >
1132
+ return %r : vector <3 xi64 >
1133
+ }
0 commit comments