| 1048 | } |
| 1049 | |
| 1050 | static unique_ptr<Instr> parse_fcmp(string_view name) { |
| 1051 | // fcmp cond ty %a, &b |
| 1052 | FCmp::Cond cond = FCmp::OEQ; |
| 1053 | auto cond_t = *tokenizer; |
| 1054 | switch (cond_t) { |
| 1055 | case OEQ: cond = FCmp::OEQ; break; |
| 1056 | case OGT: cond = FCmp::OGT; break; |
| 1057 | case OGE: cond = FCmp::OGE; break; |
| 1058 | case OLT: cond = FCmp::OLT; break; |
| 1059 | case OLE: cond = FCmp::OLE; break; |
| 1060 | case ONE: cond = FCmp::ONE; break; |
| 1061 | case ORD: cond = FCmp::ORD; break; |
| 1062 | case UEQ: cond = FCmp::UEQ; break; |
| 1063 | case UGT: cond = FCmp::UGT; break; |
| 1064 | case UGE: cond = FCmp::UGE; break; |
| 1065 | case ULT: cond = FCmp::ULT; break; |
| 1066 | case ULE: cond = FCmp::ULE; break; |
| 1067 | case UNE: cond = FCmp::UNE; break; |
| 1068 | case UNO: cond = FCmp::UNO; break; |
| 1069 | case TRUE: break; |
| 1070 | case FALSE: break; |
| 1071 | default: |
| 1072 | error("Expected fcmp cond", cond_t); |
| 1073 | } |
| 1074 | |
| 1075 | auto &ty = parse_type(); |
| 1076 | auto &a = parse_operand(ty); |
| 1077 | parse_comma(); |
| 1078 | auto &b = parse_operand(ty); |
| 1079 | auto &bool_ty = *int_types[1].get(); |
| 1080 | |
| 1081 | switch (cond_t) { |
| 1082 | case TRUE: |
| 1083 | case FALSE: |
| 1084 | return make_unique<UnaryOp>(bool_ty, string(name), |
| 1085 | get_constant(cond_t == TRUE, bool_ty), |
| 1086 | UnaryOp::Copy); |
| 1087 | default: |
| 1088 | return make_unique<FCmp>(bool_ty, string(name), cond, a, b, |
| 1089 | parse_fast_math(FCMP), FpExceptionMode(), false); |
| 1090 | } |
| 1091 | UNREACHABLE(); |
| 1092 | } |
| 1093 | |
| 1094 | static unique_ptr<Instr> parse_freeze(string_view name) { |
| 1095 | // freeze ty %op |
no test coverage detected