@@ -48,6 +48,60 @@ pub const CValue = union(enum) {
48
48
payload_identifier : []const u8 ,
49
49
/// Rendered with fmtCTypePoolString
50
50
ctype_pool_string : CType.Pool.String ,
51
+
52
+ fn eql (lhs : CValue , rhs : CValue ) bool {
53
+ return switch (lhs ) {
54
+ .none = > rhs == .none ,
55
+ .new_local , .local = > | lhs_local | switch (rhs ) {
56
+ .new_local , .local = > | rhs_local | lhs_local == rhs_local ,
57
+ else = > false ,
58
+ },
59
+ .local_ref = > | lhs_local | switch (rhs ) {
60
+ .local_ref = > | rhs_local | lhs_local == rhs_local ,
61
+ else = > false ,
62
+ },
63
+ .constant = > | lhs_val | switch (rhs ) {
64
+ .constant = > | rhs_val | lhs_val .toIntern () == rhs_val .toIntern (),
65
+ else = > false ,
66
+ },
67
+ .arg = > | lhs_arg_index | switch (rhs ) {
68
+ .arg = > | rhs_arg_index | lhs_arg_index == rhs_arg_index ,
69
+ else = > false ,
70
+ },
71
+ .arg_array = > | lhs_arg_index | switch (rhs ) {
72
+ .arg_array = > | rhs_arg_index | lhs_arg_index == rhs_arg_index ,
73
+ else = > false ,
74
+ },
75
+ .field = > | lhs_field_index | switch (rhs ) {
76
+ .field = > | rhs_field_index | lhs_field_index == rhs_field_index ,
77
+ else = > false ,
78
+ },
79
+ .nav = > | lhs_nav | switch (rhs ) {
80
+ .nav = > | rhs_nav | lhs_nav == rhs_nav ,
81
+ else = > false ,
82
+ },
83
+ .nav_ref = > | lhs_nav | switch (rhs ) {
84
+ .nav_ref = > | rhs_nav | lhs_nav == rhs_nav ,
85
+ else = > false ,
86
+ },
87
+ .undef = > | lhs_ty | switch (rhs ) {
88
+ .undef = > | rhs_ty | lhs_ty .toIntern () == rhs_ty .toIntern (),
89
+ else = > false ,
90
+ },
91
+ .identifier = > | lhs_id | switch (rhs ) {
92
+ .identifier = > | rhs_id | std .mem .eql (u8 , lhs_id , rhs_id ),
93
+ else = > false ,
94
+ },
95
+ .payload_identifier = > | lhs_id | switch (rhs ) {
96
+ .payload_identifier = > | rhs_id | std .mem .eql (u8 , lhs_id , rhs_id ),
97
+ else = > false ,
98
+ },
99
+ .ctype_pool_string = > | lhs_str | switch (rhs ) {
100
+ .ctype_pool_string = > | rhs_str | lhs_str .index == rhs_str .index ,
101
+ else = > false ,
102
+ },
103
+ };
104
+ }
51
105
};
52
106
53
107
const BlockData = struct {
@@ -4219,17 +4273,23 @@ fn airCmpOp(
4219
4273
const writer = f.object.writer();
4220
4274
const local = try f.allocLocal(inst, inst_ty);
4221
4275
const v = try Vectorize.start(f, inst, writer, lhs_ty);
4276
+ const a = try Assignment.start(f, writer, try f.ctypeFromType(scalar_ty, .complete));
4222
4277
try f.writeCValue(writer, local, .Other);
4223
4278
try v.elem(f, writer);
4224
- try writer.writeAll(" = ");
4225
- if (need_cast) try writer.writeAll(" (void * )");
4226
- try f.writeCValue(writer, lhs, .Other);
4227
- try v.elem(f, writer);
4228
- try writer.writeAll(compareOperatorC(operator));
4229
- if (need_cast) try writer.writeAll(" (void * )");
4230
- try f.writeCValue(writer, rhs, .Other);
4231
- try v.elem(f, writer);
4232
- try writer.writeAll(" ;\n ");
4279
+ try a.assign(f, writer);
4280
+ if (lhs != .undef and lhs.eql(rhs)) try writer.writeAll(switch (operator) {
4281
+ .lt, .neq, .gt => " false ",
4282
+ .lte, .eq, .gte => " true ",
4283
+ }) else {
4284
+ if (need_cast) try writer.writeAll(" (void * )");
4285
+ try f.writeCValue(writer, lhs, .Other);
4286
+ try v.elem(f, writer);
4287
+ try writer.writeAll(compareOperatorC(operator));
4288
+ if (need_cast) try writer.writeAll(" (void * )");
4289
+ try f.writeCValue(writer, rhs, .Other);
4290
+ try v.elem(f, writer);
4291
+ }
4292
+ try a.end(f, writer);
4233
4293
try v.end(f, inst, writer);
4234
4294
4235
4295
return local;
@@ -4270,7 +4330,11 @@ fn airEquality(
4270
4330
try a.assign(f, writer);
4271
4331
4272
4332
const operand_ctype = try f.ctypeFromType(operand_ty, .complete);
4273
- switch (operand_ctype.info(ctype_pool)) {
4333
+ if (lhs != .undef and lhs.eql(rhs)) try writer.writeAll(switch (operator) {
4334
+ .lt, .lte, .gte, .gt => unreachable,
4335
+ .neq => " false ",
4336
+ .eq => " true ",
4337
+ }) else switch (operand_ctype.info(ctype_pool)) {
4274
4338
.basic, .pointer => {
4275
4339
try f.writeCValue(writer, lhs, .Other);
4276
4340
try writer.writeAll(compareOperatorC(operator));
0 commit comments