13 changes: 7 additions & 6 deletions compiler-rt/lib/builtins/arm/fp_mode.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,24 +23,25 @@
#ifndef __ARM_FP
// For soft float targets, allow changing rounding mode by overriding the weak
// __arm_fe_default_rmode symbol.
FE_ROUND_MODE __attribute__((weak)) __arm_fe_default_rmode = FE_TONEAREST;
CRT_FE_ROUND_MODE __attribute__((weak)) __arm_fe_default_rmode =
CRT_FE_TONEAREST;
#endif

FE_ROUND_MODE __fe_getround() {
CRT_FE_ROUND_MODE __fe_getround() {
#ifdef __ARM_FP
uint32_t fpscr;
__asm__ __volatile__("vmrs %0, fpscr" : "=r" (fpscr));
fpscr = fpscr >> ARM_RMODE_SHIFT & ARM_RMODE_MASK;
switch (fpscr) {
case ARM_UPWARD:
return FE_UPWARD;
return CRT_FE_UPWARD;
case ARM_DOWNWARD:
return FE_DOWNWARD;
return CRT_FE_DOWNWARD;
case ARM_TOWARDZERO:
return FE_TOWARDZERO;
return CRT_FE_TOWARDZERO;
case ARM_TONEAREST:
default:
return FE_TONEAREST;
return CRT_FE_TONEAREST;
}
#else
return __arm_fe_default_rmode;
Expand Down
8 changes: 4 additions & 4 deletions compiler-rt/lib/builtins/fp_add_impl.inc
Original file line number Diff line number Diff line change
Expand Up @@ -151,19 +151,19 @@ static __inline fp_t __addXf3__(fp_t a, fp_t b) {
// Perform the final rounding. The result may overflow to infinity, but
// that is the correct result in that case.
switch (__fe_getround()) {
case FE_TONEAREST:
case CRT_FE_TONEAREST:
if (roundGuardSticky > 0x4)
result++;
if (roundGuardSticky == 0x4)
result += result & 1;
break;
case FE_DOWNWARD:
case CRT_FE_DOWNWARD:
if (resultSign && roundGuardSticky) result++;
break;
case FE_UPWARD:
case CRT_FE_UPWARD:
if (!resultSign && roundGuardSticky) result++;
break;
case FE_TOWARDZERO:
case CRT_FE_TOWARDZERO:
break;
}
if (roundGuardSticky)
Expand Down
4 changes: 1 addition & 3 deletions compiler-rt/lib/builtins/fp_mode.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@
#include "fp_mode.h"

// IEEE-754 default rounding (to nearest, ties to even).
FE_ROUND_MODE __fe_getround() {
return FE_TONEAREST;
}
CRT_FE_ROUND_MODE __fe_getround() { return CRT_FE_TONEAREST; }

int __fe_raise_inexact() {
return 0;
Expand Down
12 changes: 6 additions & 6 deletions compiler-rt/lib/builtins/fp_mode.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@
#define FP_MODE

typedef enum {
FE_TONEAREST,
FE_DOWNWARD,
FE_UPWARD,
FE_TOWARDZERO
} FE_ROUND_MODE;
CRT_FE_TONEAREST,
CRT_FE_DOWNWARD,
CRT_FE_UPWARD,
CRT_FE_TOWARDZERO
} CRT_FE_ROUND_MODE;

FE_ROUND_MODE __fe_getround(void);
CRT_FE_ROUND_MODE __fe_getround(void);
int __fe_raise_inexact(void);

#endif // FP_MODE_H
12 changes: 6 additions & 6 deletions compiler-rt/lib/builtins/i386/fp_mode.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,22 @@
#define X87_TOWARDZERO 0x0c00
#define X87_RMODE_MASK (X87_TONEAREST | X87_UPWARD | X87_DOWNWARD | X87_TOWARDZERO)

FE_ROUND_MODE __fe_getround() {
CRT_FE_ROUND_MODE __fe_getround() {
// Assume that the rounding mode state for the fpu agrees with the SSE unit.
unsigned short cw;
__asm__ __volatile__ ("fnstcw %0" : "=m" (cw));

switch (cw & X87_RMODE_MASK) {
case X87_TONEAREST:
return FE_TONEAREST;
return CRT_FE_TONEAREST;
case X87_DOWNWARD:
return FE_DOWNWARD;
return CRT_FE_DOWNWARD;
case X87_UPWARD:
return FE_UPWARD;
return CRT_FE_UPWARD;
case X87_TOWARDZERO:
return FE_TOWARDZERO;
return CRT_FE_TOWARDZERO;
}
return FE_TONEAREST;
return CRT_FE_TONEAREST;
}

int __fe_raise_inexact() {
Expand Down
6 changes: 3 additions & 3 deletions llvm/lib/TableGen/TGParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2539,9 +2539,9 @@ bool TGParser::ParseTemplateArgValueList(SmallVectorImpl<Init *> &Result,

if (consume(tgtok::greater)) // end of argument list?
return false;
if (!consume(tgtok::comma)) // must be comma
return true;
++ArgIndex;
if (!consume(tgtok::comma))
return TokError("Expected comma before next argument");
++ArgIndex;
}
}

Expand Down
11 changes: 11 additions & 0 deletions llvm/test/TableGen/template-args.td
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
// RUN: not llvm-tblgen -DERROR4 %s 2>&1 | FileCheck --check-prefix=ERROR4 %s
// RUN: not llvm-tblgen -DERROR5 %s 2>&1 | FileCheck --check-prefix=ERROR5 %s
// RUN: not llvm-tblgen -DERROR6 %s 2>&1 | FileCheck --check-prefix=ERROR6 %s
// RUN: not llvm-tblgen -DERROR7 %s 2>&1 | FileCheck --check-prefix=ERROR7 %s

// This file tests that template arguments are type-checked and cast
// if necessary.
Expand Down Expand Up @@ -140,3 +141,13 @@ defm RecMC3 : MC2<42>;

defm RecMC4 : MC2<"Bob">;
#endif

#ifdef ERROR7
multiclass TwoArgs<bits<8> a, string b> {
def _1 { bits<8> A = a; }
def _2 { string B = b; }
}
defm Good : TwoArgs<1, "one">;
defm MissingComma : TwoArgs<2 "two">;
// ERROR7: [[#@LINE-1]]:31: error: Expected comma before next argument
#endif