commit ec816a9977f76e037f2b0c981790c82b1ec631b0
parent 82420586a2b2b28786afd2e32fd9136d9654aa00
Author: erai <erai@omiltem.net>
Date: Sun, 9 Feb 2025 04:45:59 +0000
fold bit and
Diffstat:
M | cc0.c | | | 418 | +++++++++++++++++++++++++++++++++++++++++-------------------------------------- |
M | ir.om | | | 2 | ++ |
2 files changed, 217 insertions(+), 203 deletions(-)
diff --git a/cc0.c b/cc0.c
@@ -1490,7 +1490,7 @@ b7: if (!v4) goto b1;
v7 = (u)zdie;
v8 = (u)"invalid reg";
v9 = ((u(*)())v7)(v8);
-b1: if (vop == (131327UL & 65535UL)) goto b28;
+b1: if (vop == 255) goto b28;
if ((vop & -16UL) == 3984) goto b28;
v11 = 1;
b30: if (!v11) goto b24;
@@ -19285,6 +19285,11 @@ u zirexpr_fold(u vic, u vo) {
u v168 = 0;
u v169 = 0;
u v170 = 0;
+ u v171 = 0;
+ u v172 = 0;
+ u v173 = 0;
+ u v174 = 0;
+ u v175 = 0;
if (!*(u*)(vo + 8)) goto b4;
v8 = (u)zirexpr_fold;
v9 = vic;
@@ -19315,216 +19320,216 @@ b16: if (!v16) goto b10;
*(u*)(vret + 80) = *(u*)(vo + 80);
return vret;
b10: if (*(u*)va == 3) goto b18;
-b1: if (!va) goto b89;
- if (*(u*)va != 3) goto b89;
- v110 = 1;
-b91: if (!v110) goto b85;
+b1: if (!va) goto b92;
+ if (*(u*)va != 3) goto b92;
+ v115 = 1;
+b94: if (!v115) goto b88;
vn = *(u*)(va + 24);
- if (vn != 0) goto b94;
- if (vkind != 11) goto b99;
- v111 = 1;
-b101: if (!v111) goto b95;
+ if (vn != 0) goto b97;
+ if (vkind != 11) goto b102;
+ v116 = 1;
+b104: if (!v116) goto b98;
return vb;
-b95: if (vkind != 20) goto b108;
- v113 = (u)zmkirop;
- v114 = vic;
- v115 = 9;
- v116 = vb;
- v117 = 0;
- v118 = ((u(*)())v113)(v114, v115, v116, v117);
- vret = v118;
+b98: if (vkind != 20) goto b111;
+ v118 = (u)zmkirop;
+ v119 = vic;
+ v120 = 9;
+ v121 = vb;
+ v122 = 0;
+ v123 = ((u(*)())v118)(v119, v120, v121, v122);
+ vret = v123;
*(u*)(vret + 64) = *(u*)(vo + 64);
*(u*)(vret + 72) = *(u*)(vo + 72);
*(u*)(vret + 80) = *(u*)(vo + 80);
return vret;
-b108: if (vkind != 12) goto b116;
- v119 = 1;
-b118: if (!v119) goto b85;
- v122 = (u)zmkirfold;
- v123 = vic;
- v124 = vo;
- v125 = 0;
- v126 = ((u(*)())v122)(v123, v124, v125);
- return v126;
-b85: if (!vb) goto b153;
- if (*(u*)vb != 3) goto b153;
- v139 = 1;
-b155: if (!v139) goto b149;
+b111: if (vkind != 12) goto b119;
+ v124 = 1;
+b121: if (!v124) goto b88;
+ v127 = (u)zmkirfold;
+ v128 = vic;
+ v129 = vo;
+ v130 = 0;
+ v131 = ((u(*)())v127)(v128, v129, v130);
+ return v131;
+b88: if (!vb) goto b156;
+ if (*(u*)vb != 3) goto b156;
+ v144 = 1;
+b158: if (!v144) goto b152;
vn = *(u*)(vb + 24);
- if (vn != 0) goto b158;
- if (vkind != 11) goto b163;
- v140 = 1;
-b165: if (!v140) goto b159;
- return va;
-b159: if (vkind != 12) goto b191;
+ if (vn != 0) goto b161;
+ if (vkind != 11) goto b166;
v145 = 1;
-b193: if (!v145) goto b149;
- v146 = (u)zmkirfold;
- v147 = vic;
- v148 = vo;
- v149 = 0;
- v150 = ((u(*)())v146)(v147, v148, v149);
- return v150;
-b149: if (*(u*)(vo + 8) != va) goto b223;
- if (*(u*)(vo + 16) != vb) goto b223;
- v164 = 1;
-b225: if (!v164) goto b219;
+b168: if (!v145) goto b162;
+ return va;
+b162: if (vkind != 12) goto b194;
+ v150 = 1;
+b196: if (!v150) goto b152;
+ v151 = (u)zmkirfold;
+ v152 = vic;
+ v153 = vo;
+ v154 = 0;
+ v155 = ((u(*)())v151)(v152, v153, v154);
+ return v155;
+b152: if (*(u*)(vo + 8) != va) goto b226;
+ if (*(u*)(vo + 16) != vb) goto b226;
+ v169 = 1;
+b228: if (!v169) goto b222;
return vo;
-b219: v165 = (u)zmkirop;
- v166 = vic;
- v167 = vkind;
- v168 = va;
- v169 = vb;
- v170 = ((u(*)())v165)(v166, v167, v168, v169);
- vret = v170;
+b222: v170 = (u)zmkirop;
+ v171 = vic;
+ v172 = vkind;
+ v173 = va;
+ v174 = vb;
+ v175 = ((u(*)())v170)(v171, v172, v173, v174);
+ vret = v175;
*(u*)(vret + 64) = *(u*)(vo + 64);
*(u*)(vret + 72) = *(u*)(vo + 72);
*(u*)(vret + 80) = *(u*)(vo + 80);
*(u*)(vret + 48) = *(u*)(vo + 48);
*(u*)(vret + 24) = *(u*)(vo + 24);
return vret;
-b223: v164 = 0;
- goto b225;
-b191: if (vkind != 19) goto b194;
+b226: v169 = 0;
+ goto b228;
+b194: if (vkind != 19) goto b197;
+ v150 = 1;
+ goto b196;
+b197: v150 = 0;
+ goto b196;
+b166: if (vkind != 13) goto b171;
+ v146 = 1;
+b173: if (!v146) goto b169;
v145 = 1;
- goto b193;
-b194: v145 = 0;
- goto b193;
-b163: if (vkind != 13) goto b168;
- v141 = 1;
-b170: if (!v141) goto b166;
- v140 = 1;
- goto b165;
-b166: v140 = 0;
- goto b165;
-b168: if (vkind != 14) goto b173;
- v142 = 1;
-b175: if (!v142) goto b171;
- v141 = 1;
- goto b170;
-b171: v141 = 0;
- goto b170;
-b173: if (vkind != 20) goto b178;
- v143 = 1;
-b180: if (!v143) goto b176;
- v142 = 1;
- goto b175;
-b176: v142 = 0;
- goto b175;
-b178: if (vkind != 17) goto b183;
- v144 = 1;
-b185: if (!v144) goto b181;
- v143 = 1;
- goto b180;
-b181: v143 = 0;
- goto b180;
-b183: if (vkind != 18) goto b186;
- v144 = 1;
- goto b185;
-b186: v144 = 0;
- goto b185;
-b158: if (vn != 1) goto b197;
- if (vkind != 15) goto b202;
- v151 = 1;
-b204: if (!v151) goto b149;
+ goto b168;
+b169: v145 = 0;
+ goto b168;
+b171: if (vkind != 14) goto b176;
+ v147 = 1;
+b178: if (!v147) goto b174;
+ v146 = 1;
+ goto b173;
+b174: v146 = 0;
+ goto b173;
+b176: if (vkind != 20) goto b181;
+ v148 = 1;
+b183: if (!v148) goto b179;
+ v147 = 1;
+ goto b178;
+b179: v147 = 0;
+ goto b178;
+b181: if (vkind != 17) goto b186;
+ v149 = 1;
+b188: if (!v149) goto b184;
+ v148 = 1;
+ goto b183;
+b184: v148 = 0;
+ goto b183;
+b186: if (vkind != 18) goto b189;
+ v149 = 1;
+ goto b188;
+b189: v149 = 0;
+ goto b188;
+b161: if (vn != 1) goto b200;
+ if (vkind != 15) goto b205;
+ v156 = 1;
+b207: if (!v156) goto b152;
return va;
-b202: if (vkind != 19) goto b205;
- v151 = 1;
- goto b204;
-b205: v151 = 0;
- goto b204;
-b197: if (vn != -1UL) goto b149;
- if (vkind != 19) goto b208;
- v152 = (u)zmkirop;
- v153 = vic;
- v154 = 9;
- v155 = va;
- v156 = 0;
- v157 = ((u(*)())v152)(v153, v154, v155, v156);
- vret = v157;
+b205: if (vkind != 19) goto b208;
+ v156 = 1;
+ goto b207;
+b208: v156 = 0;
+ goto b207;
+b200: if (vn != -1UL) goto b152;
+ if (vkind != 19) goto b211;
+ v157 = (u)zmkirop;
+ v158 = vic;
+ v159 = 9;
+ v160 = va;
+ v161 = 0;
+ v162 = ((u(*)())v157)(v158, v159, v160, v161);
+ vret = v162;
*(u*)(vret + 64) = *(u*)(vo + 64);
*(u*)(vret + 72) = *(u*)(vo + 72);
*(u*)(vret + 80) = *(u*)(vo + 80);
return vret;
-b208: if (vkind != 14) goto b212;
- v158 = (u)zmkirop;
- v159 = vic;
- v160 = 10;
- v161 = va;
- v162 = 0;
- v163 = ((u(*)())v158)(v159, v160, v161, v162);
- vret = v163;
+b211: if (vkind != 14) goto b215;
+ v163 = (u)zmkirop;
+ v164 = vic;
+ v165 = 10;
+ v166 = va;
+ v167 = 0;
+ v168 = ((u(*)())v163)(v164, v165, v166, v167);
+ vret = v168;
*(u*)(vret + 64) = *(u*)(vo + 64);
*(u*)(vret + 72) = *(u*)(vo + 72);
*(u*)(vret + 80) = *(u*)(vo + 80);
return vret;
-b212: if (vkind != 12) goto b149;
+b215: if (vkind != 12) goto b152;
return va;
-b153: v139 = 0;
- goto b155;
-b116: if (vkind != 19) goto b121;
- v120 = 1;
-b123: if (!v120) goto b119;
- v119 = 1;
- goto b118;
-b119: v119 = 0;
- goto b118;
-b121: if (vkind != 17) goto b126;
- v121 = 1;
-b128: if (!v121) goto b124;
- v120 = 1;
- goto b123;
-b124: v120 = 0;
- goto b123;
-b126: if (vkind != 18) goto b129;
- v121 = 1;
- goto b128;
-b129: v121 = 0;
- goto b128;
-b99: if (vkind != 13) goto b104;
- v112 = 1;
-b106: if (!v112) goto b102;
- v111 = 1;
- goto b101;
-b102: v111 = 0;
- goto b101;
-b104: if (vkind != 14) goto b107;
- v112 = 1;
- goto b106;
-b107: v112 = 0;
- goto b106;
-b94: if (vn != 1) goto b132;
- if (vkind != 19) goto b85;
+b156: v144 = 0;
+ goto b158;
+b119: if (vkind != 19) goto b124;
+ v125 = 1;
+b126: if (!v125) goto b122;
+ v124 = 1;
+ goto b121;
+b122: v124 = 0;
+ goto b121;
+b124: if (vkind != 17) goto b129;
+ v126 = 1;
+b131: if (!v126) goto b127;
+ v125 = 1;
+ goto b126;
+b127: v125 = 0;
+ goto b126;
+b129: if (vkind != 18) goto b132;
+ v126 = 1;
+ goto b131;
+b132: v126 = 0;
+ goto b131;
+b102: if (vkind != 13) goto b107;
+ v117 = 1;
+b109: if (!v117) goto b105;
+ v116 = 1;
+ goto b104;
+b105: v116 = 0;
+ goto b104;
+b107: if (vkind != 14) goto b110;
+ v117 = 1;
+ goto b109;
+b110: v117 = 0;
+ goto b109;
+b97: if (vn != 1) goto b135;
+ if (vkind != 19) goto b88;
return vb;
-b132: if (vn != -1UL) goto b85;
- if (vkind != 19) goto b138;
- v127 = (u)zmkirop;
- v128 = vic;
- v129 = 9;
- v130 = vb;
- v131 = 0;
- v132 = ((u(*)())v127)(v128, v129, v130, v131);
- vret = v132;
+b135: if (vn != -1UL) goto b88;
+ if (vkind != 19) goto b141;
+ v132 = (u)zmkirop;
+ v133 = vic;
+ v134 = 9;
+ v135 = vb;
+ v136 = 0;
+ v137 = ((u(*)())v132)(v133, v134, v135, v136);
+ vret = v137;
*(u*)(vret + 64) = *(u*)(vo + 64);
*(u*)(vret + 72) = *(u*)(vo + 72);
*(u*)(vret + 80) = *(u*)(vo + 80);
return vret;
-b138: if (vkind != 14) goto b142;
- v133 = (u)zmkirop;
- v134 = vic;
- v135 = 10;
- v136 = vb;
- v137 = 0;
- v138 = ((u(*)())v133)(v134, v135, v136, v137);
- vret = v138;
+b141: if (vkind != 14) goto b145;
+ v138 = (u)zmkirop;
+ v139 = vic;
+ v140 = 10;
+ v141 = vb;
+ v142 = 0;
+ v143 = ((u(*)())v138)(v139, v140, v141, v142);
+ vret = v143;
*(u*)(vret + 64) = *(u*)(vo + 64);
*(u*)(vret + 72) = *(u*)(vo + 72);
*(u*)(vret + 80) = *(u*)(vo + 80);
return vret;
-b142: if (vkind != 12) goto b85;
+b145: if (vkind != 12) goto b88;
return vb;
-b89: v110 = 0;
- goto b91;
+b92: v115 = 0;
+ goto b94;
b18: if (vkind != 9) goto b23;
v23 = (u)zmkirfold;
v24 = vic;
@@ -19552,104 +19557,111 @@ b28: if (vkind != 11) goto b41;
v38 = *(u*)(va + 24) + *(u*)(vb + 24);
v39 = ((u(*)())v35)(v36, v37, v38);
return v39;
-b41: if (vkind != 13) goto b44;
+b41: if (vkind != 12) goto b44;
v40 = (u)zmkirfold;
v41 = vic;
v42 = vo;
- v43 = *(u*)(va + 24) | *(u*)(vb + 24);
+ v43 = *(u*)(va + 24) & *(u*)(vb + 24);
v44 = ((u(*)())v40)(v41, v42, v43);
return v44;
-b44: if (vkind != 14) goto b47;
+b44: if (vkind != 13) goto b47;
v45 = (u)zmkirfold;
v46 = vic;
v47 = vo;
- v48 = *(u*)(va + 24) ^ *(u*)(vb + 24);
+ v48 = *(u*)(va + 24) | *(u*)(vb + 24);
v49 = ((u(*)())v45)(v46, v47, v48);
return v49;
-b47: if (vkind != 15) goto b50;
+b47: if (vkind != 14) goto b50;
v50 = (u)zmkirfold;
v51 = vic;
v52 = vo;
- v53 = (u)((s)*(u*)(va + 24) / (s)*(u*)(vb + 24));
+ v53 = *(u*)(va + 24) ^ *(u*)(vb + 24);
v54 = ((u(*)())v50)(v51, v52, v53);
return v54;
-b50: if (vkind != 16) goto b53;
+b50: if (vkind != 15) goto b53;
v55 = (u)zmkirfold;
v56 = vic;
v57 = vo;
- v58 = (u)((s)*(u*)(va + 24) % (s)*(u*)(vb + 24));
+ v58 = (u)((s)*(u*)(va + 24) / (s)*(u*)(vb + 24));
v59 = ((u(*)())v55)(v56, v57, v58);
return v59;
-b53: if (vkind != 17) goto b56;
+b53: if (vkind != 16) goto b56;
v60 = (u)zmkirfold;
v61 = vic;
v62 = vo;
- v63 = *(u*)(va + 24) << *(u*)(vb + 24);
+ v63 = (u)((s)*(u*)(va + 24) % (s)*(u*)(vb + 24));
v64 = ((u(*)())v60)(v61, v62, v63);
return v64;
-b56: if (vkind != 18) goto b59;
+b56: if (vkind != 17) goto b59;
v65 = (u)zmkirfold;
v66 = vic;
v67 = vo;
- v68 = *(u*)(va + 24) >> *(u*)(vb + 24);
+ v68 = *(u*)(va + 24) << *(u*)(vb + 24);
v69 = ((u(*)())v65)(v66, v67, v68);
return v69;
-b59: if (vkind != 19) goto b62;
+b59: if (vkind != 18) goto b62;
v70 = (u)zmkirfold;
v71 = vic;
v72 = vo;
- v73 = *(u*)(va + 24) * *(u*)(vb + 24);
+ v73 = *(u*)(va + 24) >> *(u*)(vb + 24);
v74 = ((u(*)())v70)(v71, v72, v73);
return v74;
-b62: if (vkind != 20) goto b65;
+b62: if (vkind != 19) goto b65;
v75 = (u)zmkirfold;
v76 = vic;
v77 = vo;
- v78 = *(u*)(va + 24) - *(u*)(vb + 24);
+ v78 = *(u*)(va + 24) * *(u*)(vb + 24);
v79 = ((u(*)())v75)(v76, v77, v78);
return v79;
-b65: if (vkind != 21) goto b68;
+b65: if (vkind != 20) goto b68;
v80 = (u)zmkirfold;
v81 = vic;
v82 = vo;
- v83 = (u)(*(u*)(va + 24) == *(u*)(vb + 24));
+ v83 = *(u*)(va + 24) - *(u*)(vb + 24);
v84 = ((u(*)())v80)(v81, v82, v83);
return v84;
-b68: if (vkind != 22) goto b71;
+b68: if (vkind != 21) goto b71;
v85 = (u)zmkirfold;
v86 = vic;
v87 = vo;
- v88 = (u)(*(u*)(va + 24) != *(u*)(vb + 24));
+ v88 = (u)(*(u*)(va + 24) == *(u*)(vb + 24));
v89 = ((u(*)())v85)(v86, v87, v88);
return v89;
-b71: if (vkind != 23) goto b74;
+b71: if (vkind != 22) goto b74;
v90 = (u)zmkirfold;
v91 = vic;
v92 = vo;
- v93 = (u)((s)*(u*)(va + 24) > (s)*(u*)(vb + 24));
+ v93 = (u)(*(u*)(va + 24) != *(u*)(vb + 24));
v94 = ((u(*)())v90)(v91, v92, v93);
return v94;
-b74: if (vkind != 24) goto b77;
+b74: if (vkind != 23) goto b77;
v95 = (u)zmkirfold;
v96 = vic;
v97 = vo;
- v98 = (u)((s)*(u*)(va + 24) >= (s)*(u*)(vb + 24));
+ v98 = (u)((s)*(u*)(va + 24) > (s)*(u*)(vb + 24));
v99 = ((u(*)())v95)(v96, v97, v98);
return v99;
-b77: if (vkind != 25) goto b80;
+b77: if (vkind != 24) goto b80;
v100 = (u)zmkirfold;
v101 = vic;
v102 = vo;
- v103 = (u)((s)*(u*)(va + 24) < (s)*(u*)(vb + 24));
+ v103 = (u)((s)*(u*)(va + 24) >= (s)*(u*)(vb + 24));
v104 = ((u(*)())v100)(v101, v102, v103);
return v104;
-b80: if (vkind != 26) goto b1;
+b80: if (vkind != 25) goto b83;
v105 = (u)zmkirfold;
v106 = vic;
v107 = vo;
- v108 = (u)((s)*(u*)(va + 24) <= (s)*(u*)(vb + 24));
+ v108 = (u)((s)*(u*)(va + 24) < (s)*(u*)(vb + 24));
v109 = ((u(*)())v105)(v106, v107, v108);
return v109;
+b83: if (vkind != 26) goto b1;
+ v110 = (u)zmkirfold;
+ v111 = vic;
+ v112 = vo;
+ v113 = (u)((s)*(u*)(va + 24) <= (s)*(u*)(vb + 24));
+ v114 = ((u(*)())v110)(v111, v112, v113);
+ return v114;
b32: if (*(u*)vb == 3) goto b38;
v33 = 1;
goto b34;
diff --git a/ir.om b/ir.om
@@ -2256,6 +2256,8 @@ func irexpr_fold(ic: *irfunc, o: *irop): *irop {
// Simplify binary operations
if kind == IOP_ADD {
return mkirfold(ic, o, a.n + b.n);
+ } else if kind == IOP_AND {
+ return mkirfold(ic, o, a.n & b.n);
} else if kind == IOP_OR {
return mkirfold(ic, o, a.n | b.n);
} else if kind == IOP_XOR {