|
624 | 624 | <a href="#623" id="623">623</a>
|
625 | 625 | <a href="#624" id="624">624</a>
|
626 | 626 | <a href="#625" id="625">625</a>
|
627 |
| -<a href="#626" id="626">626</a> |
628 |
| -<a href="#627" id="627">627</a> |
629 |
| -<a href="#628" id="628">628</a> |
630 |
| -<a href="#629" id="629">629</a> |
631 |
| -<a href="#630" id="630">630</a> |
632 |
| -<a href="#631" id="631">631</a> |
633 |
| -<a href="#632" id="632">632</a> |
634 |
| -<a href="#633" id="633">633</a> |
635 |
| -<a href="#634" id="634">634</a> |
636 |
| -<a href="#635" id="635">635</a> |
637 |
| -<a href="#636" id="636">636</a> |
638 |
| -<a href="#637" id="637">637</a> |
639 |
| -<a href="#638" id="638">638</a> |
640 |
| -<a href="#639" id="639">639</a> |
641 |
| -<a href="#640" id="640">640</a></pre></div><pre class="rust"><code><span class="comment">// HACK(eddyb) avoids rewriting all of the imports (see `lib.rs` and `build.rs`). |
| 627 | +<a href="#626" id="626">626</a></pre></div><pre class="rust"><code><span class="comment">// HACK(eddyb) avoids rewriting all of the imports (see `lib.rs` and `build.rs`). |
642 | 628 | </span><span class="kw">use </span><span class="kw">crate</span>::maybe_pqp_cg_ssa <span class="kw">as </span>rustc_codegen_ssa;
|
643 | 629 |
|
644 | 630 | <span class="kw">use </span><span class="kw">super</span>::Builder;
|
|
932 | 918 | <span class="kw">let </span>res3 = <span class="self">self</span>.or(res3, res4);
|
933 | 919 | <span class="self">self</span>.or(res1, res3)
|
934 | 920 | }
|
935 |
| - other => { |
936 |
| - <span class="kw">let </span>undef = <span class="self">self</span>.undef(ret_ty); |
937 |
| - <span class="self">self</span>.zombie( |
938 |
| - undef.def(<span class="self">self</span>), |
939 |
| - <span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"bswap not implemented for int width {other}"</span>), |
940 |
| - ); |
941 |
| - undef |
942 |
| - } |
| 921 | + other => <span class="self">self</span>.undef_zombie( |
| 922 | + ret_ty, |
| 923 | + <span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"bswap not implemented for int width {other}"</span>), |
| 924 | + ), |
943 | 925 | };
|
944 | 926 |
|
945 | 927 | <span class="comment">// Cast back to the original signed type if necessary
|
|
950 | 932 | }
|
951 | 933 | }
|
952 | 934 |
|
953 |
| - sym::compare_bytes => { |
954 |
| - <span class="kw">let </span>undef = <span class="self">self</span>.undef(ret_ty); |
955 |
| - <span class="self">self</span>.zombie(undef.def(<span class="self">self</span>), <span class="string">"memcmp not implemented"</span>); |
956 |
| - undef |
957 |
| - } |
| 935 | + sym::compare_bytes => <span class="self">self</span>.undef_zombie(ret_ty, <span class="string">"memcmp not implemented"</span>), |
958 | 936 |
|
959 | 937 | <span class="kw">_ </span>=> {
|
960 | 938 | <span class="comment">// Call the fallback body instead of generating the intrinsic code
|
|
1037 | 1015 | .unwrap()
|
1038 | 1016 | }
|
1039 | 1017 | <span class="kw">_ </span>=> {
|
1040 |
| - <span class="kw">let </span>undef = <span class="self">self</span>.undef(ty).def(<span class="self">self</span>); |
1041 |
| - <span class="self">self</span>.zombie( |
1042 |
| - undef, |
| 1018 | + <span class="kw">return </span><span class="self">self</span>.undef_zombie( |
| 1019 | + ty, |
1043 | 1020 | <span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"count_ones() on unsupported {ty:?} bit integer type"</span>),
|
1044 | 1021 | );
|
1045 |
| - undef |
1046 | 1022 | }
|
1047 | 1023 | }
|
1048 | 1024 | .with_type(u32)
|
|
1101 | 1077 | .unwrap()
|
1102 | 1078 | }
|
1103 | 1079 | <span class="kw">_ </span>=> {
|
1104 |
| - <span class="kw">let </span>undef = <span class="self">self</span>.undef(ty).def(<span class="self">self</span>); |
1105 |
| - <span class="self">self</span>.zombie( |
1106 |
| - undef, |
| 1080 | + <span class="kw">return </span><span class="self">self</span>.undef_zombie( |
| 1081 | + ty, |
1107 | 1082 | <span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"bit_reverse() on unsupported {ty:?} bit integer type"</span>),
|
1108 | 1083 | );
|
1109 |
| - undef |
1110 | 1084 | }
|
1111 | 1085 | }
|
1112 | 1086 | .with_type(ty)
|
|
1131 | 1105 | <span class="kw">let </span>u32 = SpirvType::Integer(<span class="number">32</span>, <span class="bool-val">false</span>).def(<span class="self">self</span>.span(), <span class="self">self</span>);
|
1132 | 1106 |
|
1133 | 1107 | <span class="kw">let </span>glsl = <span class="self">self</span>.ext_inst.borrow_mut().import_glsl(<span class="self">self</span>);
|
1134 |
| - <span class="kw">let </span>find_xsb = |arg| { |
| 1108 | + <span class="kw">let </span>find_xsb = |arg, offset: i32| { |
1135 | 1109 | <span class="kw">if </span>trailing {
|
1136 |
| - <span class="self">self</span>.emit() |
| 1110 | + <span class="kw">let </span>lsb = <span class="self">self |
| 1111 | + </span>.emit() |
1137 | 1112 | .ext_inst(u32, <span class="prelude-val">None</span>, glsl, GLOp::FindILsb <span class="kw">as </span>u32, [Operand::IdRef(
|
1138 | 1113 | arg,
|
1139 | 1114 | )])
|
1140 |
| - .unwrap() |
| 1115 | + .unwrap(); |
| 1116 | + <span class="kw">if </span>offset == <span class="number">0 </span>{ |
| 1117 | + lsb |
| 1118 | + } <span class="kw">else </span>{ |
| 1119 | + <span class="kw">let </span>const_offset = <span class="self">self</span>.constant_i32(<span class="self">self</span>.span(), offset).def(<span class="self">self</span>); |
| 1120 | + <span class="self">self</span>.emit().i_add(u32, <span class="prelude-val">None</span>, const_offset, lsb).unwrap() |
| 1121 | + } |
1141 | 1122 | } <span class="kw">else </span>{
|
1142 | 1123 | <span class="comment">// rust is always unsigned, so FindUMsb
|
1143 | 1124 | </span><span class="kw">let </span>msb_bit = <span class="self">self
|
|
1148 | 1129 | .unwrap();
|
1149 | 1130 | <span class="comment">// the glsl op returns the Msb bit, not the amount of leading zeros of this u32
|
1150 | 1131 | // leading zeros = 31 - Msb bit
|
1151 |
| - </span><span class="kw">let </span>u32_31 = <span class="self">self</span>.constant_u32(<span class="self">self</span>.span(), <span class="number">31</span>).def(<span class="self">self</span>); |
1152 |
| - <span class="self">self</span>.emit().i_sub(u32, <span class="prelude-val">None</span>, u32_31, msb_bit).unwrap() |
| 1132 | + </span><span class="kw">let </span>const_offset = <span class="self">self</span>.constant_i32(<span class="self">self</span>.span(), <span class="number">31 </span>- offset).def(<span class="self">self</span>); |
| 1133 | + <span class="self">self</span>.emit().i_sub(u32, <span class="prelude-val">None</span>, const_offset, msb_bit).unwrap() |
1153 | 1134 | }
|
1154 | 1135 | };
|
1155 | 1136 |
|
1156 | 1137 | <span class="kw">let </span>converted = <span class="kw">match </span>bits {
|
1157 | 1138 | <span class="number">8 </span>| <span class="number">16 </span>=> {
|
| 1139 | + <span class="kw">let </span>arg = <span class="self">self</span>.emit().u_convert(u32, <span class="prelude-val">None</span>, arg.def(<span class="self">self</span>)).unwrap(); |
1158 | 1140 | <span class="kw">if </span>trailing {
|
1159 |
| - <span class="kw">let </span>arg = <span class="self">self</span>.emit().u_convert(u32, <span class="prelude-val">None</span>, arg.def(<span class="self">self</span>)).unwrap(); |
1160 |
| - find_xsb(arg) |
| 1141 | + find_xsb(arg, <span class="number">0</span>) |
1161 | 1142 | } <span class="kw">else </span>{
|
1162 |
| - <span class="kw">let </span>arg = arg.def(<span class="self">self</span>); |
1163 |
| - <span class="kw">let </span>arg = <span class="self">self</span>.emit().u_convert(u32, <span class="prelude-val">None</span>, arg).unwrap(); |
1164 |
| - <span class="kw">let </span>xsb = find_xsb(arg); |
1165 |
| - <span class="kw">let </span>subtrahend = <span class="self">self</span>.constant_u32(<span class="self">self</span>.span(), <span class="number">32 </span>- bits).def(<span class="self">self</span>); |
1166 |
| - <span class="self">self</span>.emit().i_sub(u32, <span class="prelude-val">None</span>, xsb, subtrahend).unwrap() |
| 1143 | + find_xsb(arg, bits <span class="kw">as </span>i32 - <span class="number">32</span>) |
1167 | 1144 | }
|
1168 | 1145 | }
|
1169 |
| - <span class="number">32 </span>=> find_xsb(arg.def(<span class="self">self</span>)), |
| 1146 | + <span class="number">32 </span>=> find_xsb(arg.def(<span class="self">self</span>), <span class="number">0</span>), |
1170 | 1147 | <span class="number">64 </span>=> {
|
1171 | 1148 | <span class="kw">let </span>u32_0 = <span class="self">self</span>.constant_int(u32, <span class="number">0</span>).def(<span class="self">self</span>);
|
1172 | 1149 | <span class="kw">let </span>u32_32 = <span class="self">self</span>.constant_u32(<span class="self">self</span>.span(), <span class="number">32</span>).def(<span class="self">self</span>);
|
|
1179 | 1156 | .unwrap();
|
1180 | 1157 | <span class="kw">let </span>higher = <span class="self">self</span>.emit().u_convert(u32, <span class="prelude-val">None</span>, higher).unwrap();
|
1181 | 1158 |
|
1182 |
| - <span class="kw">let </span>lower_bits = find_xsb(lower); |
1183 |
| - <span class="kw">let </span>higher_bits = find_xsb(higher); |
1184 |
| - |
1185 | 1159 | <span class="kw">if </span>trailing {
|
1186 | 1160 | <span class="kw">let </span>use_lower = <span class="self">self</span>.emit().i_equal(bool, <span class="prelude-val">None</span>, higher, u32_0).unwrap();
|
1187 |
| - <span class="kw">let </span>lower_bits = |
1188 |
| - <span class="self">self</span>.emit().i_add(u32, <span class="prelude-val">None</span>, lower_bits, u32_32).unwrap(); |
| 1161 | + <span class="kw">let </span>lower_bits = find_xsb(lower, <span class="number">32</span>); |
| 1162 | + <span class="kw">let </span>higher_bits = find_xsb(higher, <span class="number">0</span>); |
1189 | 1163 | <span class="self">self</span>.emit()
|
1190 | 1164 | .select(u32, <span class="prelude-val">None</span>, use_lower, lower_bits, higher_bits)
|
1191 | 1165 | .unwrap()
|
1192 | 1166 | } <span class="kw">else </span>{
|
1193 | 1167 | <span class="kw">let </span>use_higher = <span class="self">self</span>.emit().i_equal(bool, <span class="prelude-val">None</span>, lower, u32_0).unwrap();
|
1194 |
| - <span class="kw">let </span>higher_bits = |
1195 |
| - <span class="self">self</span>.emit().i_add(u32, <span class="prelude-val">None</span>, higher_bits, u32_32).unwrap(); |
| 1168 | + <span class="kw">let </span>lower_bits = find_xsb(lower, <span class="number">0</span>); |
| 1169 | + <span class="kw">let </span>higher_bits = find_xsb(higher, <span class="number">32</span>); |
1196 | 1170 | <span class="self">self</span>.emit()
|
1197 | 1171 | .select(u32, <span class="prelude-val">None</span>, use_higher, higher_bits, lower_bits)
|
1198 | 1172 | .unwrap()
|
1199 | 1173 | }
|
1200 | 1174 | }
|
1201 | 1175 | <span class="kw">_ </span>=> {
|
1202 |
| - <span class="kw">let </span>undef = <span class="self">self</span>.undef(ty).def(<span class="self">self</span>); |
1203 |
| - <span class="self">self</span>.zombie(undef, <span class="kw-2">&</span><span class="macro">format!</span>( |
| 1176 | + <span class="kw">return </span><span class="self">self</span>.undef_zombie(ty, <span class="kw-2">&</span><span class="macro">format!</span>( |
1204 | 1177 | <span class="string">"count_leading_trailing_zeros() on unsupported {ty:?} bit integer type"
|
1205 | 1178 | </span>));
|
1206 |
| - undef |
1207 | 1179 | }
|
1208 | 1180 | };
|
1209 | 1181 |
|
|
0 commit comments